Skip to content

test: add a simple test for import defer of a CJS module#64694

Open
MayaLekova wants to merge 1 commit into
nodejs:mainfrom
MayaLekova:import-defer-04-cjs
Open

test: add a simple test for import defer of a CJS module#64694
MayaLekova wants to merge 1 commit into
nodejs:mainfrom
MayaLekova:import-defer-04-cjs

Conversation

@MayaLekova

Copy link
Copy Markdown
Contributor

test: add a simple test for import defer of a CJS module

This tests imports a CommonJS modules with the defer modifier.
It ensures that the imported module is not evaluated before
accessing properties form its exports.

@nodejs-github-bot nodejs-github-bot added esm Issues and PRs related to the ECMAScript Modules implementation. needs-ci PRs that need a full CI run. test Issues and PRs related to the tests. labels Jul 23, 2026
@MayaLekova

Copy link
Copy Markdown
Contributor Author

@nicolo-ribaudo and @joyeecheung please take a look, thanks!

This tests imports a CommonJS modules with the `defer` modifier.
It ensures that the imported module is not evaluated before
accessing properties form its exports.

Signed-off-by: Maya Lekova <maya@igalia.com>
@MayaLekova
MayaLekova force-pushed the import-defer-04-cjs branch from de9e5ac to 2d51c34 Compare July 23, 2026 10:24
Comment on lines +22 to +23
assert.equal(imported.default.foo, 42);
assert.equal(imported.default.identifier, 'package-type-commonjs');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert.equal(imported.default.foo, 42);
assert.equal(imported.default.identifier, 'package-type-commonjs');
assert.equal(imported.foo, 42);
assert.deepStrictEqual(['defer-1'], globalThis.eval_list);
assert.equal(imported.identifier, 'package-type-commonjs');

The lexer should recognize these. Also we should test that it only gets evaluated once.

assert.equal(imported.default.identifier, 'package-type-commonjs');

// Check that the module has been evaluated at this point.
assert.partialDeepStrictEqual(['defer-1'], globalThis.eval_list);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert.partialDeepStrictEqual(['defer-1'], globalThis.eval_list);
assert.deepStrictEqual(['defer-1'], globalThis.eval_list);

It shouldn't be partial, if there are anything else, it's a bug.


// Check that the module hasn't been evaluated yet (which is noted
// by adding a property to `globalThis.eval_list`).
assert.strictEqual(globalThis.eval_list.length, 0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert.strictEqual(globalThis.eval_list.length, 0);
assert.deepStrictEqual(globalThis.eval_list, []);

@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.13%. Comparing base (4bec191) to head (2d51c34).
⚠️ Report is 22 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #64694   +/-   ##
=======================================
  Coverage   90.13%   90.13%           
=======================================
  Files         741      741           
  Lines      242106   242112    +6     
  Branches    45551    45595   +44     
=======================================
+ Hits       218211   218221   +10     
+ Misses      15430    15365   -65     
- Partials     8465     8526   +61     

see 50 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment on lines +4 to +6
if (!globalThis.eval_list) {
globalThis.eval_list = [];
}

@jasnell jasnell Jul 23, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tiniest optional nit...

globalThis.eval_list ??= ['defer-1'];

Comment on lines +10 to +14
globalThis.eval_list = [];

// Import the CJS module with the `defer` modifier.
// import defer * as imported from '../fixtures/es-modules/package-type-commonjs/index.js';
import defer * as imported from '../fixtures/es-modules/module-cjs-deferred-eval.js';

@nicolo-ribaudo nicolo-ribaudo Jul 24, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be better to swap these two statements, so that when reading somebody does not mistakenly assume that globalThis.eval_list = [] would be evaluated first (imports are hoisted and executed before code in the file).

This test right now would pass regardless of whether import defer is eager or deferred. If it's eager it passes because:

  • after the eager ../fixtures/es-modules/module-cjs-deferred-eval.js evaluation, this file sets globalThis.eval_list = [];. Then it asserts that its length is 0, which is obviously true because we just set it to an empty array.
  • further down, in assert.partialDeepStrictEqual(['defer-1'], globalThis.eval_list);, we are checking that ['defer-1'] contains all the elements of globalThis.eval_list. If globalThis.eval_list is empty, that's tautologically true.

I have not run this test, but I assume the reason in test/fixtures/es-modules/module-cjs-deferred-eval.js you had to add if (!globalThis.eval_list) { globalThis.eval_list = []; } is because the CJS module is indeed not being deferred, so it's running before that this file defines globalThis.eval_list = [].

Maybe better, either one of this:

  • move the globalThis.eval_list = [] initialization to a separate file that is imported at the beginning of this one, before the other imports, so that we know it runs first
  • use a boolean instead of an array, and then we don't need to pre-initialize it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

esm Issues and PRs related to the ECMAScript Modules implementation. needs-ci PRs that need a full CI run. test Issues and PRs related to the tests.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants