Skip to content
Merged
Prev Previous commit
Next Next commit
repair hasTopLevelAwait & tests
  • Loading branch information
mertcanaltin committed Jun 3, 2025
commit f9bd37301d5edfa6847032934adeb03462c3813a
8 changes: 4 additions & 4 deletions lib/internal/modules/esm/module_job.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@ const isCommonJSGlobalLikeNotDefinedError = (errorMessage) =>
* @param {string} url
* @returns {void}
*/
const explainCommonJSGlobalLikeNotDefinedError = (e, url) => {
const explainCommonJSGlobalLikeNotDefinedError = (e, url, hasTopLevelAwait) => {
if (e?.name === 'ReferenceError' &&
isCommonJSGlobalLikeNotDefinedError(e.message)) {

if (this.module.hasTopLevelAwait) {
if (hasTopLevelAwait) {
e.message = `ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module. CommonJS error: await is only valid in async functions. ES Module error: require is not defined in ES module scope. If you meant to use CommonJS, wrap top-level await in async function. If you meant to use ESM, do not use require().';
e.code = 'ERR_AMBIGUOUS_MODULE_SYNTAX`;
return;
Expand Down Expand Up @@ -365,7 +365,7 @@ class ModuleJob extends ModuleJobBase {
try {
await this.module.evaluate(timeout, breakOnSigint);
} catch (e) {
explainCommonJSGlobalLikeNotDefinedError(e, this.module.url);
explainCommonJSGlobalLikeNotDefinedError(e, this.module.url, this.module.hasTopLevelAwait());
throw e;
}
return { __proto__: null, module: this.module };
Expand Down Expand Up @@ -499,7 +499,7 @@ class ModuleJobSync extends ModuleJobBase {
const namespace = this.module.evaluateSync(filename, parentFilename);
return { __proto__: null, module: this.module, namespace };
} catch (e) {
explainCommonJSGlobalLikeNotDefinedError(e, this.module.url);
explainCommonJSGlobalLikeNotDefinedError(e, this.module.url, this.module.hasTopLevelAwait());
throw e;
}
}
Expand Down
2 changes: 1 addition & 1 deletion test/es-module/test-esm-detect-ambiguous.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL },
'const fs = require("node:fs"); await Promise.resolve();',
]);

match(stderr, /ERR_AMBIGUOUS_MODULE_SYNTAX: This file cannot be parsed as either CommonJS or ES Module/);
match(stderr, /ReferenceError: require is not defined in ES module scope/);
strictEqual(stdout, '');
strictEqual(code, 1);
strictEqual(signal, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { pathToFileURL } = require('url');

assert.rejects(
import('data:text/javascript,require;'),
/require is not defined in ES module scope/
/require is not defined in ES module scope, you can use import instead$/
).then(common.mustCall());
assert.rejects(
import('data:text/javascript,exports={};'),
Expand Down Expand Up @@ -38,5 +38,5 @@ assert.rejects(

assert.rejects(
import('data:text/javascript,require;//.js'),
/^(?:(?!use the '\.cjs' file extension).)*$/s
/^(?!use the '\.cjs' file extension).*$/
).then(common.mustCall());
2 changes: 1 addition & 1 deletion test/es-module/test-typescript-eval.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ test('expect fail eval TypeScript CommonJS syntax with input-type module-typescr
console.log(util.styleText('red', text));`]);

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

Expand Down
2 changes: 1 addition & 1 deletion test/es-module/test-typescript-module.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ test('expect failure of a .mts file with CommonJS syntax', async () => {
]);

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

Expand Down
Loading