'use strict'; const { ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING, } = require('internal/errors').codes; const assert = require('internal/assert'); const { Loader } = require('internal/modules/esm/loader'); const { pathToFileURL } = require('internal/url'); const { getModuleFromWrap, } = require('internal/vm/module'); const { getOptionValue } = require('internal/options'); const userLoader = getOptionValue('--experimental-loader'); exports.initializeImportMetaObject = function(wrap, meta) { const { callbackMap } = internalBinding('module_wrap'); if (callbackMap.has(wrap)) { const { initializeImportMeta } = callbackMap.get(wrap); if (initializeImportMeta !== undefined) { initializeImportMeta(meta, getModuleFromWrap(wrap) || wrap); } } }; exports.importModuleDynamicallyCallback = async function(wrap, specifier) { assert(calledInitialize === true || !userLoader); if (!calledInitialize) { process.emitWarning( 'The ESM module loader is experimental.', 'ExperimentalWarning', undefined); calledInitialize = true; } const { callbackMap } = internalBinding('module_wrap'); if (callbackMap.has(wrap)) { const { importModuleDynamically } = callbackMap.get(wrap); if (importModuleDynamically !== undefined) { return importModuleDynamically( specifier, getModuleFromWrap(wrap) || wrap); } } throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING(); }; let ESMLoader = new Loader(); exports.ESMLoader = ESMLoader; let calledInitialize = false; exports.initializeLoader = initializeLoader; async function initializeLoader() { assert(calledInitialize === false); process.emitWarning( 'The ESM module loader is experimental.', 'ExperimentalWarning', undefined); calledInitialize = true; if (!userLoader) return; let cwd; try { cwd = process.cwd() + '/'; } catch { cwd = 'file:///'; } // If --experimental-loader is specified, create a loader with user hooks. // Otherwise create the default loader. const { emitExperimentalWarning } = require('internal/util'); emitExperimentalWarning('--experimental-loader'); return (async () => { const hooks = await ESMLoader.import(userLoader, pathToFileURL(cwd).href); ESMLoader = new Loader(); ESMLoader.hook(hooks); return exports.ESMLoader = ESMLoader; })(); }