Skip to content

Commit 1b2de5e

Browse files
authored
module: fix --check on ambiguous ESM files
A `.js` file with no `"type"` in the nearest package.json has no format of its own, and `defaultGetFormat()` reports it as null. `--check` passed that null straight to `wrapSafe()`, which parses as CommonJS. Module syntax makes that parse bail out early, so the file was reported as valid and `--check` exited 0 even though it is not valid JavaScript under either goal. At load time the goal for such a file is decided by looking for module syntax in the source. Decide it the same way here, so the file is parsed as a module and its real syntax error is reported. Files whose format is known are unaffected, as are ambiguous files without module syntax, which are still parsed as CommonJS. Fixes: #65202 Signed-off-by: Paul Bouchon <mail@bitpshr.net> PR-URL: #65203 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Aviv Keller <me@aviv.sh>
1 parent 167768f commit 1b2de5e

3 files changed

Lines changed: 17 additions & 0 deletions

File tree

lib/internal/main/check_syntax.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ async function checkSyntax(source, filename) {
6767
format = await defaultGetFormat(new URL(url));
6868
}
6969

70+
// A `.js` file with no `"type"` in the nearest package.json has no format of
71+
// its own. At load time the goal is decided by looking for module syntax in
72+
// the source, so decide it the same way here. Otherwise such a file is only
73+
// ever parsed as CommonJS, where module syntax makes the parse bail out
74+
// before any syntax error in the rest of the file is reported.
75+
if (format === null || format === undefined) {
76+
const { containsModuleSyntax } = internalBinding('contextify');
77+
if (containsModuleSyntax(source, filename)) {
78+
format = 'module';
79+
}
80+
}
81+
7082
if (format === 'module') {
7183
const { ModuleWrap } = internalBinding('module_wrap');
7284
new ModuleWrap(filename, undefined, source, 0, 0);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import fs from 'node:fs';
2+
var = ;

test/sequential/test-cli-syntax-bad.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ const syntaxErrorRE = /^SyntaxError: \b/m;
2121
'syntax/bad_syntax',
2222
'syntax/bad_syntax_shebang.js',
2323
'syntax/bad_syntax_shebang',
24+
// A `.js` file with no `"type"` in the nearest package.json, whose module
25+
// syntax makes it load as ESM. Refs: https://github.com/nodejs/node/issues/65202
26+
'syntax/bad_syntax_esm_ambiguous.js',
2427
].forEach((file) => {
2528
const path = fixtures.path(file);
2629

0 commit comments

Comments
 (0)