summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2020-05-16 16:31:15 +0200
committerMyles Borins <mylesborins@github.com>2020-07-16 17:09:12 -0400
commit73d6792a059f7968c2535397b59d95eee5de7bb4 (patch)
treecaa856ad9a6bd93bd53d52e577b5884d151079c2
parent16160e654f2018df2a496cdfb7b1d5e32cd49887 (diff)
downloadnode-new-73d6792a059f7968c2535397b59d95eee5de7bb4.tar.gz
repl: support --loader option in builtin REPL
Fixes: https://github.com/nodejs/node/issues/33435 PR-URL: https://github.com/nodejs/node/pull/33437 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
-rw-r--r--lib/internal/main/repl.js49
-rw-r--r--lib/internal/modules/run_main.js15
-rw-r--r--lib/internal/process/esm_loader.js20
-rw-r--r--test/message/esm_display_syntax_error_import.out1
-rw-r--r--test/message/esm_display_syntax_error_import_module.out1
-rw-r--r--test/message/esm_loader_not_found.out8
-rw-r--r--test/message/esm_loader_not_found_cjs_hint_bare.out2
-rw-r--r--test/message/esm_loader_not_found_cjs_hint_relative.out8
8 files changed, 58 insertions, 46 deletions
diff --git a/lib/internal/main/repl.js b/lib/internal/main/repl.js
index 693b7048a3..a8356687cc 100644
--- a/lib/internal/main/repl.js
+++ b/lib/internal/main/repl.js
@@ -7,6 +7,7 @@ const {
prepareMainThreadExecution
} = require('internal/bootstrap/pre_execution');
+const esmLoader = require('internal/process/esm_loader');
const {
evalScript
} = require('internal/process/execution');
@@ -32,31 +33,33 @@ if (process.env.NODE_REPL_EXTERNAL_MODULE) {
process.exit(1);
}
- console.log(`Welcome to Node.js ${process.version}.\n` +
- 'Type ".help" for more information.');
+ esmLoader.loadESM(() => {
+ console.log(`Welcome to Node.js ${process.version}.\n` +
+ 'Type ".help" for more information.');
- const cliRepl = require('internal/repl');
- cliRepl.createInternalRepl(process.env, (err, repl) => {
- if (err) {
- throw err;
- }
- repl.on('exit', () => {
- if (repl._flushing) {
- repl.pause();
- return repl.once('flushHistory', () => {
- process.exit();
- });
+ const cliRepl = require('internal/repl');
+ cliRepl.createInternalRepl(process.env, (err, repl) => {
+ if (err) {
+ throw err;
}
- process.exit();
+ repl.on('exit', () => {
+ if (repl._flushing) {
+ repl.pause();
+ return repl.once('flushHistory', () => {
+ process.exit();
+ });
+ }
+ process.exit();
+ });
});
- });
- // If user passed '-e' or '--eval' along with `-i` or `--interactive`,
- // evaluate the code in the current context.
- if (getOptionValue('[has_eval_string]')) {
- evalScript('[eval]',
- getOptionValue('--eval'),
- getOptionValue('--inspect-brk'),
- getOptionValue('--print'));
- }
+ // If user passed '-e' or '--eval' along with `-i` or `--interactive`,
+ // evaluate the code in the current context.
+ if (getOptionValue('[has_eval_string]')) {
+ evalScript('[eval]',
+ getOptionValue('--eval'),
+ getOptionValue('--inspect-brk'),
+ getOptionValue('--print'));
+ }
+ });
}
diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js
index 5f8b1f53d3..0967ef539c 100644
--- a/lib/internal/modules/run_main.js
+++ b/lib/internal/modules/run_main.js
@@ -40,21 +40,10 @@ function shouldUseESMLoader(mainPath) {
function runMainESM(mainPath) {
const esmLoader = require('internal/process/esm_loader');
const { pathToFileURL } = require('internal/url');
- const { hasUncaughtExceptionCaptureCallback } =
- require('internal/process/execution');
- return esmLoader.initializeLoader().then(() => {
+ esmLoader.loadESM((ESMLoader) => {
const main = path.isAbsolute(mainPath) ?
pathToFileURL(mainPath).href : mainPath;
- return esmLoader.ESMLoader.import(main);
- }).catch((e) => {
- if (hasUncaughtExceptionCaptureCallback()) {
- process._fatalException(e);
- return;
- }
- internalBinding('errors').triggerUncaughtException(
- e,
- true /* fromPromise */
- );
+ return ESMLoader.import(main);
});
}
diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js
index fe47098fde..8f076b3ef3 100644
--- a/lib/internal/process/esm_loader.js
+++ b/lib/internal/process/esm_loader.js
@@ -4,6 +4,9 @@ const {
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING,
} = require('internal/errors').codes;
const { Loader } = require('internal/modules/esm/loader');
+const {
+ hasUncaughtExceptionCaptureCallback,
+} = require('internal/process/execution');
const { pathToFileURL } = require('internal/url');
const {
getModuleFromWrap,
@@ -34,7 +37,6 @@ exports.importModuleDynamicallyCallback = async function(wrap, specifier) {
let ESMLoader = new Loader();
exports.ESMLoader = ESMLoader;
-exports.initializeLoader = initializeLoader;
async function initializeLoader() {
const { getOptionValue } = require('internal/options');
const userLoader = getOptionValue('--experimental-loader');
@@ -59,3 +61,19 @@ async function initializeLoader() {
return exports.ESMLoader = ESMLoader;
})();
}
+
+exports.loadESM = async function loadESM(callback) {
+ try {
+ await initializeLoader();
+ await callback(ESMLoader);
+ } catch (err) {
+ if (hasUncaughtExceptionCaptureCallback()) {
+ process._fatalException(err);
+ return;
+ }
+ internalBinding('errors').triggerUncaughtException(
+ err,
+ true /* fromPromise */
+ );
+ }
+};
diff --git a/test/message/esm_display_syntax_error_import.out b/test/message/esm_display_syntax_error_import.out
index 387a63a734..fe174d54a5 100644
--- a/test/message/esm_display_syntax_error_import.out
+++ b/test/message/esm_display_syntax_error_import.out
@@ -5,3 +5,4 @@ SyntaxError: The requested module '../fixtures/es-module-loaders/module-named-ex
at ModuleJob._instantiate (internal/modules/esm/module_job.js:*:*)
at async ModuleJob.run (internal/modules/esm/module_job.js:*:*)
at async Loader.import (internal/modules/esm/loader.js:*:*)
+ at async Object.loadESM (internal/process/esm_loader.js:*:*)
diff --git a/test/message/esm_display_syntax_error_import_module.out b/test/message/esm_display_syntax_error_import_module.out
index ae8b99d55f..d220627bd0 100644
--- a/test/message/esm_display_syntax_error_import_module.out
+++ b/test/message/esm_display_syntax_error_import_module.out
@@ -5,3 +5,4 @@ SyntaxError: The requested module './module-named-exports.mjs' does not provide
at ModuleJob._instantiate (internal/modules/esm/module_job.js:*:*)
at async ModuleJob.run (internal/modules/esm/module_job.js:*:*)
at async Loader.import (internal/modules/esm/loader.js:*:*)
+ at async Object.loadESM (internal/process/esm_loader.js:*:*)
diff --git a/test/message/esm_loader_not_found.out b/test/message/esm_loader_not_found.out
index 1d2aa95715..60abb529a3 100644
--- a/test/message/esm_loader_not_found.out
+++ b/test/message/esm_loader_not_found.out
@@ -1,6 +1,6 @@
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
-internal/modules/run_main.js:*
+internal/process/esm_loader.js:*
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'i-dont-exist' imported from *
@@ -11,8 +11,8 @@ Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'i-dont-exist' imported from *
at Loader.getModuleJob (internal/modules/esm/loader.js:*:*)
at Loader.import (internal/modules/esm/loader.js:*:*)
at internal/process/esm_loader.js:*:*
- at Object.initializeLoader (internal/process/esm_loader.js:*:*)
- at runMainESM (internal/modules/run_main.js:*:*)
- at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:*:*) {
+ at initializeLoader (internal/process/esm_loader.js:*:*)
+ at Object.loadESM (internal/process/esm_loader.js:*:*)
+ at runMainESM (internal/modules/run_main.js:*:*) {
code: 'ERR_MODULE_NOT_FOUND'
}
diff --git a/test/message/esm_loader_not_found_cjs_hint_bare.out b/test/message/esm_loader_not_found_cjs_hint_bare.out
index e56f1da0f6..51a99cb298 100644
--- a/test/message/esm_loader_not_found_cjs_hint_bare.out
+++ b/test/message/esm_loader_not_found_cjs_hint_bare.out
@@ -1,4 +1,4 @@
-internal/modules/run_main.js:*
+internal/process/esm_loader.js:*
internalBinding('errors').triggerUncaughtException(
^
diff --git a/test/message/esm_loader_not_found_cjs_hint_relative.out b/test/message/esm_loader_not_found_cjs_hint_relative.out
index 76df3163bb..f7460c3141 100644
--- a/test/message/esm_loader_not_found_cjs_hint_relative.out
+++ b/test/message/esm_loader_not_found_cjs_hint_relative.out
@@ -1,6 +1,6 @@
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
-internal/modules/run_main.js:*
+internal/process/esm_loader.js:*
internalBinding('errors').triggerUncaughtException(
^
@@ -13,8 +13,8 @@ Did you mean to import ./test/common/fixtures.js?
at Loader.getModuleJob (internal/modules/esm/loader.js:*:*)
at Loader.import (internal/modules/esm/loader.js:*:*)
at internal/process/esm_loader.js:*:*
- at Object.initializeLoader (internal/process/esm_loader.js:*:*)
- at runMainESM (internal/modules/run_main.js:*:*)
- at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:*:*) {
+ at initializeLoader (internal/process/esm_loader.js:*:*)
+ at Object.loadESM (internal/process/esm_loader.js:*:*)
+ at runMainESM (internal/modules/run_main.js:*:*) {
code: 'ERR_MODULE_NOT_FOUND'
}