Skip to content

Commit 77c3d19

Browse files
committed
module: update tests for combined ambiguous module syntax error
1 parent b981253 commit 77c3d19

File tree

6 files changed

+43
-6
lines changed

6 files changed

+43
-6
lines changed

lib/internal/modules/esm/module_job.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ const isCommonJSGlobalLikeNotDefinedError = (errorMessage) =>
7575
const explainCommonJSGlobalLikeNotDefinedError = (e, url) => {
7676
if (e?.name === 'ReferenceError' &&
7777
isCommonJSGlobalLikeNotDefinedError(e.message)) {
78+
79+
if (e.message.includes('require is not defined')) {
80+
e.message = [
81+
'ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module.',
82+
'- CommonJS error: await is only valid in async functions.',
83+
'- ES Module error: require is not defined in ES module scope.',
84+
'If you meant to use CommonJS, wrap top-level await in async function.',
85+
'If you meant to use ESM, do not use require().'
86+
].join('\n');
87+
e.code = 'ERR_AMBIGUOUS_MODULE_SYNTAX';
88+
return;
89+
}
90+
7891
e.message += ' in ES module scope';
7992

8093
if (StringPrototypeStartsWith(e.message, 'require ')) {
@@ -96,6 +109,7 @@ const explainCommonJSGlobalLikeNotDefinedError = (e, url) => {
96109
}
97110
};
98111

112+
99113
class ModuleJobBase {
100114
constructor(url, importAttributes, phase, isMain, inspectBrk) {
101115
assert(typeof phase === 'number');

test/es-module/test-esm-detect-ambiguous.mjs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL },
281281
'const fs = require("node:fs"); await Promise.resolve();',
282282
]);
283283

284-
match(stderr, /ReferenceError: require is not defined in ES module scope/);
284+
match(stderr, /ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module/);
285285
strictEqual(stdout, '');
286286
strictEqual(code, 1);
287287
strictEqual(signal, null);
@@ -423,3 +423,26 @@ describe('when working with Worker threads', () => {
423423
strictEqual(signal, null);
424424
});
425425
});
426+
427+
describe('cjs & esm ambiguous syntax case', async () => {
428+
it('should throw an ambiguous syntax error when using top-level await with require', async () => {
429+
const { stdout, stderr, code, signal } = await spawnPromisified(
430+
process.execPath,
431+
[
432+
'--input-type=module',
433+
'--eval',
434+
`await 1;\nconst fs = require('fs');`,
435+
]
436+
);
437+
438+
match(stderr, /ERR_AMBIGUOUS_MODULE_SYNTAX/);
439+
match(stderr, /This file cannot be parsed as either CommonJS or ES Module/);
440+
match(stderr, /await is only valid in async functions/);
441+
match(stderr, /require is not defined in ES module scope/);
442+
match(stderr, /If you meant to use CommonJS/);
443+
match(stderr, /If you meant to use ESM/);
444+
445+
strictEqual(code, 1);
446+
strictEqual(signal, null);
447+
});
448+
});

test/es-module/test-esm-undefined-cjs-global-like-variables.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const { pathToFileURL } = require('url');
66

77
assert.rejects(
88
import('data:text/javascript,require;'),
9-
/require is not defined in ES module scope, you can use import instead$/
9+
/require is not defined in ES module scope/
1010
).then(common.mustCall());
1111
assert.rejects(
1212
import('data:text/javascript,exports={};'),
@@ -38,5 +38,5 @@ assert.rejects(
3838

3939
assert.rejects(
4040
import('data:text/javascript,require;//.js'),
41-
/^(?!use the '\.cjs' file extension).*$/
41+
/^(?:(?!use the '\.cjs' file extension).)*$/s
4242
).then(common.mustCall());

test/es-module/test-typescript-eval.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ test('expect fail eval TypeScript CommonJS syntax with input-type module-typescr
8686
console.log(util.styleText('red', text));`]);
8787

8888
strictEqual(result.stdout, '');
89-
match(result.stderr, /require is not defined in ES module scope, you can use import instead/);
89+
match(result.stderr, /ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module/);
9090
strictEqual(result.code, 1);
9191
});
9292

test/es-module/test-typescript-module.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ test('expect failure of a .mts file with CommonJS syntax', async () => {
1111
]);
1212

1313
strictEqual(result.stdout, '');
14-
match(result.stderr, /require is not defined in ES module scope, you can use import instead/);
14+
match(result.stderr, /ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module/);
1515
strictEqual(result.code, 1);
1616
});
1717

test/parallel/test-worker-eval-typescript.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,5 @@ test('Worker eval commonjs typescript with --input-type=module-typescript', asyn
6363
disableTypeScriptWarningFlag] });
6464
const [err] = await once(w, 'error');
6565
assert.strictEqual(err.name, 'ReferenceError');
66-
assert.match(err.message, /require is not defined in ES module scope, you can use import instead/);
66+
assert.match(err.message, /ERR_AMBIGUOUS_MODULE_SYNTAX|require is not defined in ES module scope/);
6767
});

0 commit comments

Comments
 (0)