diff options
author | Michaƫl Zasso <targos@protonmail.com> | 2020-05-16 16:31:15 +0200 |
---|---|---|
committer | Myles Borins <mylesborins@github.com> | 2020-07-16 17:09:12 -0400 |
commit | 73d6792a059f7968c2535397b59d95eee5de7bb4 (patch) | |
tree | caa856ad9a6bd93bd53d52e577b5884d151079c2 | |
parent | 16160e654f2018df2a496cdfb7b1d5e32cd49887 (diff) | |
download | node-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.js | 49 | ||||
-rw-r--r-- | lib/internal/modules/run_main.js | 15 | ||||
-rw-r--r-- | lib/internal/process/esm_loader.js | 20 | ||||
-rw-r--r-- | test/message/esm_display_syntax_error_import.out | 1 | ||||
-rw-r--r-- | test/message/esm_display_syntax_error_import_module.out | 1 | ||||
-rw-r--r-- | test/message/esm_loader_not_found.out | 8 | ||||
-rw-r--r-- | test/message/esm_loader_not_found_cjs_hint_bare.out | 2 | ||||
-rw-r--r-- | test/message/esm_loader_not_found_cjs_hint_relative.out | 8 |
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' } |