'use strict'; const { ArrayIsArray, SafeSet, SafeWeakMap, ObjectFreeze, } = primordials; const { ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING, ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; const { getOptionValue } = require('internal/options'); const { setImportModuleDynamicallyCallback, setInitializeImportMetaObjectCallback, } = internalBinding('module_wrap'); const { getModuleFromWrap, } = require('internal/vm/module'); const assert = require('internal/assert'); const callbackMap = new SafeWeakMap(); function setCallbackForWrap(wrap, data) { callbackMap.set(wrap, data); } let defaultConditions; function getDefaultConditions() { assert(defaultConditions !== undefined); return defaultConditions; } let defaultConditionsSet; function getDefaultConditionsSet() { assert(defaultConditionsSet !== undefined); return defaultConditionsSet; } // This function is called during pre-execution, before any user code is run. function initializeDefaultConditions() { const userConditions = getOptionValue('--conditions'); const noAddons = getOptionValue('--no-addons'); const addonConditions = noAddons ? [] : ['node-addons']; defaultConditions = ObjectFreeze([ 'node', 'import', ...addonConditions, ...userConditions, ]); defaultConditionsSet = new SafeSet(defaultConditions); } /** * @param {string[]} [conditions] * @returns {Set} */ function getConditionsSet(conditions) { if (conditions !== undefined && conditions !== getDefaultConditions()) { if (!ArrayIsArray(conditions)) { throw new ERR_INVALID_ARG_VALUE('conditions', conditions, 'expected an array'); } return new SafeSet(conditions); } return getDefaultConditionsSet(); } function initializeImportMetaObject(wrap, meta) { if (callbackMap.has(wrap)) { const { initializeImportMeta } = callbackMap.get(wrap); if (initializeImportMeta !== undefined) { initializeImportMeta(meta, getModuleFromWrap(wrap) || wrap); } } } async function importModuleDynamicallyCallback(wrap, specifier, assertions) { if (callbackMap.has(wrap)) { const { importModuleDynamically } = callbackMap.get(wrap); if (importModuleDynamically !== undefined) { return importModuleDynamically( specifier, getModuleFromWrap(wrap) || wrap, assertions); } } throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING(); } function initializeESM() { initializeDefaultConditions(); // Setup per-isolate callbacks that locate data or callbacks that we keep // track of for different ESM modules. setInitializeImportMetaObjectCallback(initializeImportMetaObject); setImportModuleDynamicallyCallback(importModuleDynamicallyCallback); } module.exports = { setCallbackForWrap, initializeESM, getDefaultConditions, getConditionsSet, };