Skip to content

Commit 89c1e4f

Browse files
committed
module: implement the "module" exports condition
The "module" exports condition has been used by bundlers in the wild to support require(esm) in bundles targeting the Node.js environment. This patch implements the same condition for the native require(esm) implementation in Node.js to match bundler behaviors in the ecosystem. The tests added in this patch match the output from webpack bundles. Refs: https://gist.github.com/sokra/e032a0f17c1721c71cfced6f14516c62
1 parent 321a14b commit 89c1e4f

32 files changed

+147
-0
lines changed

β€Žlib/internal/modules/esm/utils.js

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ function initializeDefaultConditions() {
7979
defaultConditions = ObjectFreeze([
8080
'node',
8181
'import',
82+
'module',
8283
...addonConditions,
8384
...userConditions,
8485
]);

β€Žlib/internal/modules/helpers.js

+3
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ function initializeCjsConditions() {
8181
...addonConditions,
8282
...userConditions,
8383
]);
84+
if (getOptionValue('--experimental-require-module')) {
85+
cjsConditions.add('module');
86+
}
8487
}
8588

8689
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import '../common/index.mjs';
2+
import assert from 'node:assert';
3+
import * as staticImport from '../fixtures/es-modules/module-condition/import.mjs';
4+
import { import as _import } from '../fixtures/es-modules/module-condition/dynamic_import.js';
5+
6+
async function dynamicImport(id) {
7+
const result = await _import(id);
8+
return result.resolved;
9+
}
10+
11+
assert.deepStrictEqual({ ...staticImport }, {
12+
import_module_require: 'import',
13+
module_and_import: 'module',
14+
module_and_require: 'module',
15+
module_import_require: 'module',
16+
module_only: 'module',
17+
module_require_import: 'module',
18+
require_module_import: 'module',
19+
});
20+
21+
assert.strictEqual(await dynamicImport('import-module-require'), 'import');
22+
assert.strictEqual(await dynamicImport('module-and-import'), 'module');
23+
assert.strictEqual(await dynamicImport('module-and-require'), 'module');
24+
assert.strictEqual(await dynamicImport('module-import-require'), 'module');
25+
assert.strictEqual(await dynamicImport('module-only'), 'module');
26+
assert.strictEqual(await dynamicImport('module-require-import'), 'module');
27+
assert.strictEqual(await dynamicImport('require-module-import'), 'module');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Flags: --experimental-require-module
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
7+
const loader = require('../fixtures/es-modules/module-condition/require.cjs');
8+
9+
assert.strictEqual(loader.require('import-module-require').resolved, 'module');
10+
assert.strictEqual(loader.require('module-and-import').resolved, 'module');
11+
assert.strictEqual(loader.require('module-and-require').resolved, 'module');
12+
assert.strictEqual(loader.require('module-import-require').resolved, 'module');
13+
assert.strictEqual(loader.require('module-only').resolved, 'module');
14+
assert.strictEqual(loader.require('module-require-import').resolved, 'module');
15+
assert.strictEqual(loader.require('require-module-import').resolved, 'require');

β€Žtest/fixtures/es-module-loaders/loader-with-custom-condition.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export async function resolve(specifier, context, defaultResolve) {
55

66
deepStrictEqual([...context.conditions].sort(), [
77
'import',
8+
'module',
89
'node',
910
'node-addons',
1011
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function load(id) {
2+
return import(id);
3+
}
4+
5+
export { load as import };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export { resolved as import_module_require } from 'import-module-require';
2+
export { resolved as module_and_import } from 'module-and-import';
3+
export { resolved as module_and_require } from 'module-and-require';
4+
export { resolved as module_import_require } from 'module-import-require';
5+
export { resolved as module_only } from 'module-only';
6+
export { resolved as module_require_import } from 'module-require-import';
7+
export { resolved as require_module_import } from 'require-module-import';

β€Žtest/fixtures/es-modules/module-condition/node_modules/import-module-require/import.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/import-module-require/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/import-module-require/package.json

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/import-module-require/require.cjs

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-import/import.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-import/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-import/package.json

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-require/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-require/package.json

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-and-require/require.cjs

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-import-require/import.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-import-require/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-import-require/package.json

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-import-require/require.cjs

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-only/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-only/package.json

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-require-import/import.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-require-import/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-require-import/package.json

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/module-require-import/require.cjs

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/require-module-import/import.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/require-module-import/module.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/require-module-import/package.json

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žtest/fixtures/es-modules/module-condition/node_modules/require-module-import/require.cjs

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports.require = require;

0 commit comments

Comments
Β (0)