summaryrefslogtreecommitdiff
path: root/lib/internal/process
diff options
context:
space:
mode:
authorBradley Farias <bfarias@godaddy.com>2019-09-30 14:55:59 -0500
committerGuy Bedford <guybedford@gmail.com>2019-10-16 21:50:05 -0400
commita6b030d5ac2c4a2d34f6b9eb3f945d252a42843e (patch)
treedfd91dad91d60e90e39db3b5326d509c32a62f5f /lib/internal/process
parent1784b7fafac2755f870db3de9eb45a754b7a6477 (diff)
downloadandroid-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.tar.gz
android-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.tar.bz2
android-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.zip
module: refactor modules bootstrap
PR-URL: https://github.com/nodejs/node/pull/29937 Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'lib/internal/process')
-rw-r--r--lib/internal/process/esm_loader.js50
-rw-r--r--lib/internal/process/execution.js2
2 files changed, 31 insertions, 21 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;
-};
+}
diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js
index 06dfbce295..eed554263c 100644
--- a/lib/internal/process/execution.js
+++ b/lib/internal/process/execution.js
@@ -39,7 +39,7 @@ function evalModule(source, print) {
const { log, error } = require('internal/console/global');
const { decorateErrorStack } = require('internal/util');
const asyncESM = require('internal/process/esm_loader');
- asyncESM.loaderPromise.then(async (loader) => {
+ Promise.resolve(asyncESM.ESMLoader).then(async (loader) => {
const { result } = await loader.eval(source);
if (print) {
log(result);