Skip to content

Commit

Permalink
Fixed knex#4295
Browse files Browse the repository at this point in the history
  • Loading branch information
Richard Simko committed Feb 15, 2021
1 parent b20a31f commit fd093c8
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 4 deletions.
7 changes: 3 additions & 4 deletions lib/migrations/util/import-file.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
// When run via npm, we can leverage the injected environment variables to infer the import type
const isTypeModule = process.env.npm_package_type === 'module';
const isModuleType = require('./is-module-type');

/**
* imports 'mjs', else requires.
* NOTE: require me late!
* @param {string} filepath
* @todo WARN on version 10 and '--experimental-modules' and '--esm'
*/
module.exports = function importFile(filepath) {
return isTypeModule || filepath.endsWith('.mjs')
module.exports = async function importFile(filepath) {
return (await isModuleType(filepath))
? import(require('url').pathToFileURL(filepath))
: require(filepath);
};
16 changes: 16 additions & 0 deletions lib/migrations/util/is-module-type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const { readFile } = require('./fs');

module.exports = async function isModuleType(filepath) {
try {
if (process.env.npm_package_json) {
// npm >= 7.0.0
const packageJson = JSON.parse(await readFile(process.env.npm_package_json, 'utf-8'));
if (packageJson.type === 'module') {
return true;
}
}
} catch (e) {
console.warn('Error reading package.json', e);
}
return process.env.npm_package_type === 'module' || filepath.endsWith('.mjs')
}
1 change: 1 addition & 0 deletions test/db-less-test-suite.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ describe('Util Tests', function () {
// Unit Tests for utilities.
require('./unit/query/string');
require('./unit/migrations/util/fs');
require('./unit/migrations/util/is-module-type');
require('./unit/util/nanoid');
require('./unit/util/save-async-stack');
require('./unit/util/comma-no-paren-regex');
Expand Down
60 changes: 60 additions & 0 deletions test/unit/migrations/util/is-module-type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@

const path = require('path');

const { expect } = require('chai');
const isModuleType = require('../../../../lib/migrations/util/is-module-type.js');
require('../../../util/chai-setup');

describe('isModuleType', () => {
let originalPackgeType;
let originalPackageJson;

before(()=>{
originalPackgeType = process.env.npm_package_type;
originalPackageJson = process.env.npm_package_json;
});

after(() => {
process.env.npm_package_type = originalPackgeType;
process.env.npm_package_json = originalPackageJson;
})

beforeEach(()=>{
delete process.env.npm_package_type;
delete process.env.npm_package_json;
});

it('should return true if the file is a .mjs file', async () => {
expect(await isModuleType('test.mjs')).to.be.true;
});

it('should return true if type=module with npm < 7.0.0', async () => {
process.env.npm_package_type = 'module';
expect(await isModuleType('test.js')).to.be.true;
});

it('should return false if type=commonjs with npm < 7.0.0', async () => {
process.env.npm_package_type = 'commonjs';
expect(await isModuleType('test.js')).to.be.false;
});

it('should return true if type=module with npm >= 7.0.0', async () => {
process.env.npm_package_json = path.normalize(__dirname + '/test/package-module.json');
expect(await isModuleType('test.js')).to.be.true;
});

it('should return false if type=commonjs with npm >= 7.0.0', async () => {
process.env.npm_package_json = path.normalize(__dirname + '/test/package-commonjs.json');
expect(await isModuleType('test.js')).to.be.false;
});

it('should return false if package.json is invalid and file type is js with npm >= 7.0.0', async () => {
process.env.npm_package_json = path.normalize(__dirname + '/test/package-invalid.json');
expect(await isModuleType('test.js')).to.be.false;
});

it('should return true if package.json is invalid and file type is mjs with npm >= 7.0.0', async () => {
process.env.npm_package_json = path.normalize(__dirname + '/test/package-invalid.json');
expect(await isModuleType('test.mjs')).to.be.true;
});
})
3 changes: 3 additions & 0 deletions test/unit/migrations/util/test/package-commonjs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "commonjs"
}
4 changes: 4 additions & 0 deletions test/unit/migrations/util/test/package-invalid.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Intentionally invalid JSON
{
"type": ,
}
3 changes: 3 additions & 0 deletions test/unit/migrations/util/test/package-module.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}

0 comments on commit fd093c8

Please sign in to comment.