diff --git a/test/es-module/test-defer-import-eval-with-tla.mjs b/test/es-module/test-defer-import-eval-with-tla.mjs new file mode 100644 index 00000000000000..0a821f39c40070 --- /dev/null +++ b/test/es-module/test-defer-import-eval-with-tla.mjs @@ -0,0 +1,25 @@ +// Flags: --js-defer-import-eval + +// Tests that defer import of a module with top-level await +// eagerly evaluates the imported module. + +import '../common/index.mjs'; +import * as assert from 'assert'; + +// The importing module will only execute once its dependency containing +// top-level await has its promises resolved, as per +// https://github.com/tc39/proposal-top-level-await#what-exactly-is-blocked-by-a-top-level-await +if (!globalThis.eval_list) { + globalThis.eval_list = []; +} + +import defer * as ns from '../fixtures/es-modules/dep-module-top-level-await.mjs'; + +// Check that the module has already been evaluated. +assert.strictEqual(globalThis.eval_list.length, 1); +assert.strictEqual(ns.foo, 42); +assert.strictEqual(globalThis.eval_list.length, 1); +assert.partialDeepStrictEqual(['defer-tla-1'], globalThis.eval_list); + +// Clean-up +delete globalThis.eval_list; diff --git a/test/es-module/test-defer-import-with-regular-import.mjs b/test/es-module/test-defer-import-with-regular-import.mjs new file mode 100644 index 00000000000000..6fd033446f819d --- /dev/null +++ b/test/es-module/test-defer-import-with-regular-import.mjs @@ -0,0 +1,24 @@ +// Flags: --js-defer-import-eval + +// Tests that defer import of a module that is also eagerly imported +// from another dependency gets executed synchronously, and gets +// executed exactly once. + +import '../common/index.mjs'; +import * as assert from 'assert'; + +globalThis.eval_list ||= []; + +import * as non_deferred from '../fixtures/es-modules/module-with-module-tree.mjs'; +import defer * as deferred from '../fixtures/es-modules/module-deferred-eval.mjs'; + +// Check that the module has been evaluated exactly once. +assert.strictEqual(globalThis.eval_list.length, 1); +assert.strictEqual(deferred.foo, 42); +assert.partialDeepStrictEqual(['defer-1'], globalThis.eval_list); + +// Skip linter warning +assert.strictEqual(non_deferred.bar, 64); + +// Clean-up +delete globalThis.eval_list; diff --git a/test/fixtures/es-modules/dep-module-top-level-await.mjs b/test/fixtures/es-modules/dep-module-top-level-await.mjs new file mode 100644 index 00000000000000..e78c38f4db6e07 --- /dev/null +++ b/test/fixtures/es-modules/dep-module-top-level-await.mjs @@ -0,0 +1,10 @@ +import { setTimeout } from 'node:timers/promises'; + +if (!globalThis.eval_list) { + globalThis.eval_list = []; +} + +export const foo = 42; + +await setTimeout(1); +globalThis.eval_list.push('defer-tla-1'); diff --git a/test/fixtures/es-modules/module-deferred-eval.mjs b/test/fixtures/es-modules/module-deferred-eval.mjs index 181ac4c07f0600..afa9cbf1e52466 100644 --- a/test/fixtures/es-modules/module-deferred-eval.mjs +++ b/test/fixtures/es-modules/module-deferred-eval.mjs @@ -1,8 +1,6 @@ if (!globalThis.eval_list) { globalThis.eval_list = []; } -globalThis.eval_list.push('defer-1'); export const foo = 42; - -console.log('executed'); +globalThis.eval_list.push('defer-1');