Skip to content

Commit

Permalink
repl: support --loader option in builtin REPL
Browse files Browse the repository at this point in the history
Fixes: #33435

PR-URL: #33437
Backport-PR-URL: #35394
Reviewed-By: Gus Caplan <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
  • Loading branch information
targos authored and addaleax committed Sep 28, 2020
1 parent 1a8669d commit b7be751
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 51 deletions.
51 changes: 27 additions & 24 deletions lib/internal/main/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const {
prepareMainThreadExecution
} = require('internal/bootstrap/pre_execution');

const esmLoader = require('internal/process/esm_loader');
const {
evalScript
} = require('internal/process/execution');
Expand All @@ -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'));
}
}, false);
}
15 changes: 2 additions & 13 deletions lib/internal/modules/run_main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}

Expand Down
30 changes: 25 additions & 5 deletions lib/internal/process/esm_loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ const {
} = require('internal/errors').codes;
const assert = require('internal/assert');
const { Loader } = require('internal/modules/esm/loader');
const {
hasUncaughtExceptionCaptureCallback,
} = require('internal/process/execution');
const { pathToFileURL } = require('internal/url');
const {
getModuleFromWrap,
Expand Down Expand Up @@ -45,12 +48,13 @@ let ESMLoader = new Loader();
exports.ESMLoader = ESMLoader;

let calledInitialize = false;
exports.initializeLoader = initializeLoader;
async function initializeLoader() {
async function initializeLoader(emitWarning) {
assert(calledInitialize === false);
process.emitWarning(
'The ESM module loader is experimental.',
'ExperimentalWarning', undefined);
if (emitWarning) {
process.emitWarning(
'The ESM module loader is experimental.',
'ExperimentalWarning', undefined);
}
calledInitialize = true;
if (!userLoader)
return;
Expand All @@ -73,3 +77,19 @@ async function initializeLoader() {
return exports.ESMLoader = ESMLoader;
})();
}

exports.loadESM = async function loadESM(callback, emitWarning = true) {
try {
await initializeLoader(emitWarning);
await callback(ESMLoader);
} catch (err) {
if (hasUncaughtExceptionCaptureCallback()) {
process._fatalException(err);
return;
}
internalBinding('errors').triggerUncaughtException(
err,
true /* fromPromise */
);
}
};
1 change: 1 addition & 0 deletions test/message/esm_display_syntax_error_import.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,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:*:*)
1 change: 1 addition & 0 deletions test/message/esm_display_syntax_error_import_module.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,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:*:*)
8 changes: 4 additions & 4 deletions test/message/esm_loader_not_found.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(node:*) ExperimentalWarning: The ESM module loader is experimental.
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
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 *
Expand All @@ -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'
}
2 changes: 1 addition & 1 deletion test/message/esm_loader_not_found_cjs_hint_bare.out
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(node:*) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/run_main.js:*
internal/process/esm_loader.js:*
internalBinding('errors').triggerUncaughtException(
^

Expand Down
8 changes: 4 additions & 4 deletions test/message/esm_loader_not_found_cjs_hint_relative.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(node:*) ExperimentalWarning: The ESM module loader is experimental.
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
internal/modules/run_main.js:*
internal/process/esm_loader.js:*
internalBinding('errors').triggerUncaughtException(
^

Expand All @@ -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'
}

0 comments on commit b7be751

Please sign in to comment.