Skip to content

Commit 0b3512f

Browse files
joyeecheungtargos
authored andcommitted
modules: move callbacks and conditions into modules/esm/utils.js
This moves the following utils into modules/esm/utils.js: - Code related to default conditions - The callbackMap (which is now created in the module instead of hanging off the module_wrap binding, since the C++ land does not need it). - Per-isolate module callbacks These are self-contained code that can be included into the built-in snapshot. PR-URL: #45849 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
1 parent f6c6673 commit 0b3512f

11 files changed

+130
-91
lines changed

lib/internal/modules/esm/create_dynamic_module.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ ${ArrayPrototypeJoin(ArrayPrototypeMap(imports, createImport), '\n')}
3535
${ArrayPrototypeJoin(ArrayPrototypeMap(exports, createExport), '\n')}
3636
import.meta.done();
3737
`;
38-
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
38+
const { ModuleWrap } = internalBinding('module_wrap');
3939
const m = new ModuleWrap(`${url}`, undefined, source, 0, 0);
4040

4141
const readyfns = new SafeSet();
@@ -46,8 +46,8 @@ import.meta.done();
4646

4747
if (imports.length)
4848
reflect.imports = ObjectCreate(null);
49-
50-
callbackMap.set(m, {
49+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
50+
setCallbackForWrap(m, {
5151
initializeImportMeta: (meta, wrap) => {
5252
meta.exports = reflect.exports;
5353
if (reflect.imports)

lib/internal/modules/esm/loader.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@ function newModuleMap() {
4747

4848
const {
4949
defaultResolve,
50-
DEFAULT_CONDITIONS,
5150
} = require('internal/modules/esm/resolve');
5251

52+
const {
53+
getDefaultConditions,
54+
} = require('internal/modules/esm/utils');
55+
5356
function getTranslators() {
5457
const { translators } = require('internal/modules/esm/translators');
5558
return translators;
@@ -363,9 +366,10 @@ class ESMLoader {
363366
url = pathToFileURL(`${process.cwd()}/[eval${++this.evalIndex}]`).href
364367
) {
365368
const evalInstance = (url) => {
366-
const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
369+
const { ModuleWrap } = internalBinding('module_wrap');
370+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
367371
const module = new ModuleWrap(url, undefined, source, 0, 0);
368-
callbackMap.set(module, {
372+
setCallbackForWrap(module, {
369373
importModuleDynamically: (specifier, { url }, importAssertions) => {
370374
return this.import(specifier, url, importAssertions);
371375
}
@@ -798,7 +802,7 @@ class ESMLoader {
798802
}
799803
const chain = this.#hooks.resolve;
800804
const context = {
801-
conditions: DEFAULT_CONDITIONS,
805+
conditions: getDefaultConditions(),
802806
importAssertions,
803807
parentURL,
804808
};

lib/internal/modules/esm/resolve.js

+1-31
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const {
66
ArrayPrototypeJoin,
77
ArrayPrototypeShift,
88
JSONStringify,
9-
ObjectFreeze,
109
ObjectGetOwnPropertyNames,
1110
ObjectPrototypeHasOwnProperty,
1211
RegExp,
@@ -45,7 +44,6 @@ const typeFlag = getOptionValue('--input-type');
4544
const { URL, pathToFileURL, fileURLToPath } = require('internal/url');
4645
const {
4746
ERR_INPUT_TYPE_NOT_ALLOWED,
48-
ERR_INVALID_ARG_VALUE,
4947
ERR_INVALID_MODULE_SPECIFIER,
5048
ERR_INVALID_PACKAGE_CONFIG,
5149
ERR_INVALID_PACKAGE_TARGET,
@@ -60,25 +58,13 @@ const {
6058

6159
const { Module: CJSModule } = require('internal/modules/cjs/loader');
6260
const { getPackageConfig, getPackageScopeConfig } = require('internal/modules/esm/package_config');
61+
const { getConditionsSet } = require('internal/modules/esm/utils');
6362

6463
/**
6564
* @typedef {import('internal/modules/esm/package_config.js').PackageConfig} PackageConfig
6665
*/
6766

6867

69-
const userConditions = getOptionValue('--conditions');
70-
const noAddons = getOptionValue('--no-addons');
71-
const addonConditions = noAddons ? [] : ['node-addons'];
72-
73-
const DEFAULT_CONDITIONS = ObjectFreeze([
74-
'node',
75-
'import',
76-
...addonConditions,
77-
...userConditions,
78-
]);
79-
80-
const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS);
81-
8268
const emittedPackageWarnings = new SafeSet();
8369

8470
function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) {
@@ -147,21 +133,6 @@ function emitLegacyIndexDeprecation(url, packageJSONUrl, base, main) {
147133
);
148134
}
149135

150-
/**
151-
* @param {string[]} [conditions]
152-
* @returns {Set<string>}
153-
*/
154-
function getConditionsSet(conditions) {
155-
if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) {
156-
if (!ArrayIsArray(conditions)) {
157-
throw new ERR_INVALID_ARG_VALUE('conditions', conditions,
158-
'expected an array');
159-
}
160-
return new SafeSet(conditions);
161-
}
162-
return DEFAULT_CONDITIONS_SET;
163-
}
164-
165136
const realpathCache = new SafeMap();
166137

167138
/**
@@ -1125,7 +1096,6 @@ async function defaultResolve(specifier, context = {}) {
11251096
}
11261097

11271098
module.exports = {
1128-
DEFAULT_CONDITIONS,
11291099
defaultResolve,
11301100
encodedSepRegEx,
11311101
getPackageScopeConfig,

lib/internal/modules/esm/translators.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ translators.set('module', async function moduleStrategy(url, source, isMain) {
115115
maybeCacheSourceMap(url, source);
116116
debug(`Translating StandardModule ${url}`);
117117
const module = new ModuleWrap(url, undefined, source, 0, 0);
118-
moduleWrap.callbackMap.set(module, {
118+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
119+
setCallbackForWrap(module, {
119120
initializeImportMeta: (meta, wrap) => this.importMetaInitialize(meta, { url }),
120121
importModuleDynamically,
121122
});

lib/internal/modules/esm/utils.js

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
'use strict';
2+
const {
3+
ArrayIsArray,
4+
SafeSet,
5+
SafeWeakMap,
6+
ObjectFreeze,
7+
} = primordials;
8+
9+
const {
10+
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
11+
ERR_INVALID_ARG_VALUE,
12+
} = require('internal/errors').codes;
13+
14+
const { getOptionValue } = require('internal/options');
15+
16+
const {
17+
setImportModuleDynamicallyCallback,
18+
setInitializeImportMetaObjectCallback
19+
} = internalBinding('module_wrap');
20+
const {
21+
getModuleFromWrap,
22+
} = require('internal/vm/module');
23+
const assert = require('internal/assert');
24+
25+
const callbackMap = new SafeWeakMap();
26+
function setCallbackForWrap(wrap, data) {
27+
callbackMap.set(wrap, data);
28+
}
29+
30+
let defaultConditions;
31+
function getDefaultConditions() {
32+
assert(defaultConditions !== undefined);
33+
return defaultConditions;
34+
}
35+
36+
let defaultConditionsSet;
37+
function getDefaultConditionsSet() {
38+
assert(defaultConditionsSet !== undefined);
39+
return defaultConditionsSet;
40+
}
41+
42+
// This function is called during pre-execution, before any user code is run.
43+
function initializeDefaultConditions() {
44+
const userConditions = getOptionValue('--conditions');
45+
const noAddons = getOptionValue('--no-addons');
46+
const addonConditions = noAddons ? [] : ['node-addons'];
47+
48+
defaultConditions = ObjectFreeze([
49+
'node',
50+
'import',
51+
...addonConditions,
52+
...userConditions,
53+
]);
54+
defaultConditionsSet = new SafeSet(defaultConditions);
55+
}
56+
57+
/**
58+
* @param {string[]} [conditions]
59+
* @returns {Set<string>}
60+
*/
61+
function getConditionsSet(conditions) {
62+
if (conditions !== undefined && conditions !== getDefaultConditions()) {
63+
if (!ArrayIsArray(conditions)) {
64+
throw new ERR_INVALID_ARG_VALUE('conditions', conditions,
65+
'expected an array');
66+
}
67+
return new SafeSet(conditions);
68+
}
69+
return getDefaultConditionsSet();
70+
}
71+
72+
function initializeImportMetaObject(wrap, meta) {
73+
if (callbackMap.has(wrap)) {
74+
const { initializeImportMeta } = callbackMap.get(wrap);
75+
if (initializeImportMeta !== undefined) {
76+
initializeImportMeta(meta, getModuleFromWrap(wrap) || wrap);
77+
}
78+
}
79+
}
80+
81+
async function importModuleDynamicallyCallback(wrap, specifier, assertions) {
82+
if (callbackMap.has(wrap)) {
83+
const { importModuleDynamically } = callbackMap.get(wrap);
84+
if (importModuleDynamically !== undefined) {
85+
return importModuleDynamically(
86+
specifier, getModuleFromWrap(wrap) || wrap, assertions);
87+
}
88+
}
89+
throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING();
90+
}
91+
92+
function initializeESM() {
93+
initializeDefaultConditions();
94+
// Setup per-isolate callbacks that locate data or callbacks that we keep
95+
// track of for different ESM modules.
96+
setInitializeImportMetaObjectCallback(initializeImportMetaObject);
97+
setImportModuleDynamicallyCallback(importModuleDynamicallyCallback);
98+
}
99+
100+
module.exports = {
101+
setCallbackForWrap,
102+
initializeESM,
103+
getDefaultConditions,
104+
getConditionsSet,
105+
};

lib/internal/process/esm_loader.js

-29
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,11 @@ const {
55
ObjectCreate,
66
} = primordials;
77

8-
const {
9-
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
10-
} = require('internal/errors').codes;
118
const { ESMLoader } = require('internal/modules/esm/loader');
129
const {
1310
hasUncaughtExceptionCaptureCallback,
1411
} = require('internal/process/execution');
1512
const { pathToFileURL } = require('internal/url');
16-
const {
17-
getModuleFromWrap,
18-
} = require('internal/vm/module');
19-
20-
exports.initializeImportMetaObject = function(wrap, meta) {
21-
const { callbackMap } = internalBinding('module_wrap');
22-
if (callbackMap.has(wrap)) {
23-
const { initializeImportMeta } = callbackMap.get(wrap);
24-
if (initializeImportMeta !== undefined) {
25-
initializeImportMeta(meta, getModuleFromWrap(wrap) || wrap);
26-
}
27-
}
28-
};
29-
30-
exports.importModuleDynamicallyCallback =
31-
async function importModuleDynamicallyCallback(wrap, specifier, assertions) {
32-
const { callbackMap } = internalBinding('module_wrap');
33-
if (callbackMap.has(wrap)) {
34-
const { importModuleDynamically } = callbackMap.get(wrap);
35-
if (importModuleDynamically !== undefined) {
36-
return importModuleDynamically(
37-
specifier, getModuleFromWrap(wrap) || wrap, assertions);
38-
}
39-
}
40-
throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING();
41-
};
4213

4314
const esmLoader = new ESMLoader();
4415
exports.esmLoader = esmLoader;

lib/internal/process/pre_execution.js

+2-13
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const {
66
ObjectDefineProperty,
77
ObjectGetOwnPropertyDescriptor,
88
SafeMap,
9-
SafeWeakMap,
109
StringPrototypeStartsWith,
1110
globalThis,
1211
} = primordials;
@@ -571,20 +570,10 @@ function initializeCJSLoader() {
571570
}
572571

573572
function initializeESMLoader() {
574-
// Create this WeakMap in js-land because V8 has no C++ API for WeakMap.
575-
internalBinding('module_wrap').callbackMap = new SafeWeakMap();
576-
577573
if (getEmbedderOptions().shouldNotRegisterESMLoader) return;
578574

579-
const {
580-
setImportModuleDynamicallyCallback,
581-
setInitializeImportMetaObjectCallback
582-
} = internalBinding('module_wrap');
583-
const esm = require('internal/process/esm_loader');
584-
// Setup per-isolate callbacks that locate data or callbacks that we keep
585-
// track of for different ESM modules.
586-
setInitializeImportMetaObjectCallback(esm.initializeImportMetaObject);
587-
setImportModuleDynamicallyCallback(esm.importModuleDynamicallyCallback);
575+
const { initializeESM } = require('internal/modules/esm/utils');
576+
initializeESM();
588577

589578
// Patch the vm module when --experimental-vm-modules is on.
590579
// Please update the comments in vm.js when this block changes.

lib/internal/vm.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,11 @@ function internalCompileFunction(code, params, options) {
9494
if (importModuleDynamically !== undefined) {
9595
validateFunction(importModuleDynamically,
9696
'options.importModuleDynamically');
97-
const { importModuleDynamicallyWrap } =
98-
require('internal/vm/module');
99-
const { callbackMap } = internalBinding('module_wrap');
97+
const { importModuleDynamicallyWrap } = require('internal/vm/module');
10098
const wrapped = importModuleDynamicallyWrap(importModuleDynamically);
10199
const func = result.function;
102-
callbackMap.set(result.cacheKey, {
100+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
101+
setCallbackForWrap(result.cacheKey, {
103102
importModuleDynamically: (s, _k, i) => wrapped(s, func, i),
104103
});
105104
}

lib/internal/vm/module.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ class Module {
125125
this[kWrap] = new ModuleWrap(identifier, context, sourceText,
126126
options.lineOffset, options.columnOffset,
127127
options.cachedData);
128-
129-
binding.callbackMap.set(this[kWrap], {
128+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
129+
setCallbackForWrap(this[kWrap], {
130130
initializeImportMeta: options.initializeImportMeta,
131131
importModuleDynamically: options.importModuleDynamically ?
132132
importModuleDynamicallyWrap(options.importModuleDynamically) :

lib/vm.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,9 @@ class Script extends ContextifyScript {
111111
if (importModuleDynamically !== undefined) {
112112
validateFunction(importModuleDynamically,
113113
'options.importModuleDynamically');
114-
const { importModuleDynamicallyWrap } =
115-
require('internal/vm/module');
116-
const { callbackMap } = internalBinding('module_wrap');
117-
callbackMap.set(this, {
114+
const { importModuleDynamicallyWrap } = require('internal/vm/module');
115+
const { setCallbackForWrap } = require('internal/modules/esm/utils');
116+
setCallbackForWrap(this, {
118117
importModuleDynamically:
119118
importModuleDynamicallyWrap(importModuleDynamically),
120119
});

test/parallel/test-bootstrap-modules.js

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const expectedModules = new Set([
6565
'NativeModule internal/modules/esm/package_config',
6666
'NativeModule internal/modules/esm/resolve',
6767
'NativeModule internal/modules/esm/translators',
68+
'NativeModule internal/modules/esm/utils',
6869
'NativeModule internal/modules/package_json_reader',
6970
'NativeModule internal/modules/run_main',
7071
'NativeModule internal/net',

0 commit comments

Comments
 (0)