diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 3b48233d636c32..82f8961b16ba0b 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -335,7 +335,7 @@ class ModuleJob extends ModuleJobBase { const parentFilename = urlToFilename(parent?.filename); this.module.hasAsyncGraph ??= this.module.isGraphAsync(); - if (this.module.async && !getOptionValue('--experimental-print-required-tla')) { + if (this.module.hasAsyncGraph && !getOptionValue('--experimental-print-required-tla')) { throw new ERR_REQUIRE_ASYNC_MODULE(filename, parentFilename); } if (status === kInstantiated) { diff --git a/test/es-module/test-import-require-tla-twice.js b/test/es-module/test-import-require-tla-twice.js new file mode 100644 index 00000000000000..a7cb32a983e3c1 --- /dev/null +++ b/test/es-module/test-import-require-tla-twice.js @@ -0,0 +1,21 @@ +'use strict'; +// This tests that in the require() in imported CJS can retry loading an ESM with TLA +// twice and get the correct error both times. + +require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); + +spawnSyncAndAssert( + process.execPath, + ['--import', fixtures.fileURL('es-modules', 'import-require-tla-twice', 'hook.js'), + fixtures.path('es-modules', 'import-require-tla-twice', 'require-tla.js'), + ], + { + stdout(output) { + const matches = output.matchAll(/e\.code === ERR_REQUIRE_ASYNC_MODULE true/g); + assert.strictEqual([...matches].length, 2); + } + } +); diff --git a/test/fixtures/es-modules/import-require-tla-twice/hook.js b/test/fixtures/es-modules/import-require-tla-twice/hook.js new file mode 100644 index 00000000000000..b1a32daad22fda --- /dev/null +++ b/test/fixtures/es-modules/import-require-tla-twice/hook.js @@ -0,0 +1,6 @@ +const { registerHooks } = require('module'); +registerHooks({ + load(url, context, nextLoad) { + return nextLoad(url, context); + } +}); diff --git a/test/fixtures/es-modules/import-require-tla-twice/require-tla.js b/test/fixtures/es-modules/import-require-tla-twice/require-tla.js new file mode 100644 index 00000000000000..1959ac4779bc10 --- /dev/null +++ b/test/fixtures/es-modules/import-require-tla-twice/require-tla.js @@ -0,0 +1,11 @@ +try { + require('./tla.mjs'); +} catch (e) { + console.log('e.code === ERR_REQUIRE_ASYNC_MODULE', e.code === 'ERR_REQUIRE_ASYNC_MODULE'); +} + +try { + require('./tla.mjs'); +} catch (e) { + console.log('e.code === ERR_REQUIRE_ASYNC_MODULE', e.code === 'ERR_REQUIRE_ASYNC_MODULE'); +} diff --git a/test/fixtures/es-modules/import-require-tla-twice/tla.mjs b/test/fixtures/es-modules/import-require-tla-twice/tla.mjs new file mode 100644 index 00000000000000..143bce35866c48 --- /dev/null +++ b/test/fixtures/es-modules/import-require-tla-twice/tla.mjs @@ -0,0 +1 @@ +await Promise.resolve('1');