summaryrefslogtreecommitdiff
path: root/lib/internal/process/esm_loader.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/process/esm_loader.js')
-rw-r--r--lib/internal/process/esm_loader.js50
1 files changed, 30 insertions, 20 deletions
diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js
index 69e1fd0016..49463e284c 100644
--- a/lib/internal/process/esm_loader.js
+++ b/lib/internal/process/esm_loader.js
@@ -3,12 +3,14 @@
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');
@@ -21,6 +23,7 @@ exports.initializeImportMetaObject = function(wrap, meta) {
};
exports.importModuleDynamicallyCallback = async function(wrap, specifier) {
+ assert(calledInitialize === true || !userLoader);
const { callbackMap } = internalBinding('module_wrap');
if (callbackMap.has(wrap)) {
const { importModuleDynamically } = callbackMap.get(wrap);
@@ -32,24 +35,31 @@ exports.importModuleDynamicallyCallback = async function(wrap, specifier) {
throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING();
};
-let loaderResolve;
-exports.loaderPromise = new Promise((resolve) => loaderResolve = resolve);
-
-exports.ESMLoader = undefined;
+let ESMLoader = new Loader();
+exports.ESMLoader = ESMLoader;
-exports.initializeLoader = function(cwd, userLoader) {
- let ESMLoader = new Loader();
- const loaderPromise = (async () => {
- if (userLoader) {
- const hooks = await ESMLoader.import(
- userLoader, pathToFileURL(`${cwd}/`).href);
- ESMLoader = new Loader();
- ESMLoader.hook(hooks);
- exports.ESMLoader = ESMLoader;
- }
- return ESMLoader;
+let calledInitialize = false;
+exports.initializeLoader = initializeLoader;
+async function initializeLoader() {
+ assert(calledInitialize === false);
+ 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;
})();
- loaderResolve(loaderPromise);
-
- exports.ESMLoader = ESMLoader;
-};
+}