diff --git a/lib/internal/main/repl.js b/lib/internal/main/repl.js index 58afb2be9879fa..b38102a15482fd 100644 --- a/lib/internal/main/repl.js +++ b/lib/internal/main/repl.js @@ -46,10 +46,9 @@ cliRepl.createInternalRepl(process.env, (err, repl) => { // If user passed '-e' or '--eval' along with `-i` or `--interactive`, // evaluate the code in the current context. -const source = getOptionValue('--eval'); -if (source != null) { +if (getOptionValue('[has_eval_string]')) { evalScript('[eval]', - source, + getOptionValue('--eval'), getOptionValue('--inspect-brk'), getOptionValue('--print')); } diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index c95567c506237f..5eda7541c8e4e1 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -55,6 +55,7 @@ function evalScript(name, body, breakFirstLine, printResult) { const { kVmBreakFirstLineSymbol } = require('internal/util'); const cwd = tryGetCwd(); + const origModule = global.module; // Set e.g. when called from the REPL. const module = new CJSModule(name); module.filename = path.join(cwd, name); @@ -79,6 +80,9 @@ function evalScript(name, body, breakFirstLine, printResult) { const { kStdout, print } = require('internal/util/print'); print(kStdout, result); } + + if (origModule !== undefined) + global.module = origModule; } const exceptionHandlerState = { captureFn: null }; diff --git a/test/parallel/test-repl-cli-eval.js b/test/parallel/test-repl-cli-eval.js new file mode 100644 index 00000000000000..6069a20957bd25 --- /dev/null +++ b/test/parallel/test-repl-cli-eval.js @@ -0,0 +1,22 @@ +'use strict'; +const common = require('../common'); +const child_process = require('child_process'); +const assert = require('assert'); + +// Regression test for https://github.com/nodejs/node/issues/27575: +// module.id === '' in the REPL. + +for (const extraFlags of [[], ['-e', '42']]) { + const flags = ['--interactive', ...extraFlags]; + const proc = child_process.spawn(process.execPath, flags, { + stdio: ['pipe', 'pipe', 'inherit'] + }); + proc.stdin.write('module.id\n.exit\n'); + + let stdout = ''; + proc.stdout.setEncoding('utf8'); + proc.stdout.on('data', (chunk) => stdout += chunk); + proc.stdout.on('end', common.mustCall(() => { + assert(stdout.includes(''), `stdout: ${stdout}`); + })); +}