Skip to content

Commit 6d58dd1

Browse files
authored
[ESM] Detect modules with get-package-type (#201) (#274)
* [ESM] Detect modules with get-package-type (#201) * [ESM] Add test for ESM packages
1 parent a564a0c commit 6d58dd1

10 files changed

Lines changed: 48 additions & 3 deletions

File tree

.eslintrc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,13 @@
1313
"no-trailing-spaces": "error",
1414
"prefer-arrow-callback": "error",
1515
"semi": "error"
16-
}
16+
},
17+
"overrides": [
18+
{
19+
"files": ["./**/*.mjs"],
20+
"parserOptions": {
21+
"sourceType": "module"
22+
}
23+
}
24+
]
1725
}

lib/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { fork } = require('child_process');
22
const filewatcher = require('filewatcher');
33
const { extname } = require('path');
44
const semver = require('semver');
5+
const getPackageType = require('get-package-type');
56

67
const { clearFactory } = require('./clear');
78
const { configureDeps, configureIgnore } = require('./ignore');
@@ -94,7 +95,7 @@ module.exports = function (
9495
isPaused = false;
9596
const cmd = nodeArgs.concat(wrapper, script, scriptArgs);
9697

97-
if (extname(script) === '.mjs') {
98+
if (extname(script) === '.mjs' || getPackageType.sync(script) === 'module') {
9899
if (semver.satisfies(process.version, '>=10 <12.11.1')) {
99100
const resolveLoader = resolveMain(localPath('resolve-loader.mjs'));
100101
cmd.unshift('--experimental-modules', `--loader=${resolveLoader}`);

lib/wrap.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const { dirname, extname } = require('path');
22
const childProcess = require('child_process');
33
const { sync: resolve } = require('resolve');
4+
const getPackageType = require('get-package-type');
45

56
const { getConfig } = require('./cfg');
67
const hook = require('./hook');
@@ -67,4 +68,4 @@ if (typeof mod === 'object' && mod.name) {
6768
}
6869

6970
// Execute the wrapped script
70-
ext === 'mjs' ? import(main) : require(main);
71+
ext === 'mjs' || getPackageType.sync(main) === 'module' ? import(main) : require(main);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"dateformat": "^3.0.3",
3636
"dynamic-dedupe": "^0.3.0",
3737
"filewatcher": "~3.0.0",
38+
"get-package-type": "^0.1.0",
3839
"minimist": "^1.2.5",
3940
"node-notifier": "^8.0.1",
4041
"resolve": "^1.0.0",
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"parserOptions": {
3+
"sourceType": "module"
4+
}
5+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extensions": {}
3+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import message from './message.js';
2+
3+
console.log(message);
4+
5+
// So it doesn't immediately exit.
6+
setTimeout(() => {}, 10000);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'Please touch ecma-script-module-package/message.js now';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}

test/spawn/esmodule.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,19 @@ tap.test('Supports ECMAScript modules', t => {
3535
}
3636
});
3737
});
38+
39+
tap.test('Supports ECMAScript module packages', t => {
40+
if (process.platform === 'win32') return t.skip('ESM support on windows is broken');
41+
42+
spawn('ecma-script-module-package/index.js', out => {
43+
if (out.match(/touch ecma-script-module-package\/message.js/)) {
44+
touchFile('ecma-script-module-package/message.js');
45+
return out2 => {
46+
if (out2.match(/Restarting/)) {
47+
t.match(out2, /\[INFO\] \d{2}:\d{2}:\d{2} Restarting/);
48+
return { exit: t.end.bind(t) };
49+
}
50+
};
51+
}
52+
});
53+
});

0 commit comments

Comments
 (0)