repl: Default `useGlobal` to false in CLI REPL.
Documentation for REPL states that the default value of `useGlobal` is `false`. It makes no distinction between a REPL that is created programmatically, and the one a user is dropped into on the command line by executing `node` with no arguments. This change ensures that the CLI REPL uses a default value of `false`. Fixes: https://github.com/nodejs/node/issues/5659 Ref: https://github.com/nodejs/node/issues/6802 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> PR-URL: https://github.com/nodejs/node/pull/5703
This commit is contained in:
Родитель
dc17432208
Коммит
15157c3c3d
|
@ -22,7 +22,7 @@ function createRepl(env, opts, cb) {
|
|||
opts = opts || {
|
||||
ignoreUndefined: false,
|
||||
terminal: process.stdout.isTTY,
|
||||
useGlobal: true,
|
||||
useGlobal: false,
|
||||
breakEvalOnSigint: true
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
'use strict';
|
||||
|
||||
// Flags: --expose-internals
|
||||
|
||||
const common = require('../common');
|
||||
const stream = require('stream');
|
||||
const repl = require('internal/repl');
|
||||
const assert = require('assert');
|
||||
|
||||
common.globalCheck = false;
|
||||
|
||||
// Array of [useGlobal, expectedResult] pairs
|
||||
const globalTestCases = [
|
||||
[false, 'undefined'],
|
||||
[true, '\'tacos\''],
|
||||
[undefined, 'undefined']
|
||||
];
|
||||
|
||||
const globalTest = (useGlobal, cb, output) => (err, repl) => {
|
||||
if (err)
|
||||
return cb(err);
|
||||
|
||||
let str = '';
|
||||
output.on('data', (data) => (str += data));
|
||||
global.lunch = 'tacos';
|
||||
repl.write('global.lunch;\n');
|
||||
repl.close();
|
||||
delete global.lunch;
|
||||
cb(null, str.trim());
|
||||
};
|
||||
|
||||
// Test how the global object behaves in each state for useGlobal
|
||||
for (const [option, expected] of globalTestCases) {
|
||||
runRepl(option, globalTest, common.mustCall((err, output) => {
|
||||
assert.ifError(err);
|
||||
assert.strictEqual(output, expected);
|
||||
}));
|
||||
}
|
||||
|
||||
// Test how shadowing the process object via `let`
|
||||
// behaves in each useGlobal state. Note: we can't
|
||||
// actually test the state when useGlobal is true,
|
||||
// because the exception that's generated is caught
|
||||
// (see below), but errors are printed, and the test
|
||||
// suite is aware of it, causing a failure to be flagged.
|
||||
//
|
||||
const processTestCases = [false, undefined];
|
||||
const processTest = (useGlobal, cb, output) => (err, repl) => {
|
||||
if (err)
|
||||
return cb(err);
|
||||
|
||||
let str = '';
|
||||
output.on('data', (data) => (str += data));
|
||||
|
||||
// if useGlobal is false, then `let process` should work
|
||||
repl.write('let process;\n');
|
||||
repl.write('21 * 2;\n');
|
||||
repl.close();
|
||||
cb(null, str.trim());
|
||||
};
|
||||
|
||||
for (const option of processTestCases) {
|
||||
runRepl(option, processTest, common.mustCall((err, output) => {
|
||||
assert.ifError(err);
|
||||
assert.strictEqual(output, 'undefined\n42');
|
||||
}));
|
||||
}
|
||||
|
||||
function runRepl(useGlobal, testFunc, cb) {
|
||||
const inputStream = new stream.PassThrough();
|
||||
const outputStream = new stream.PassThrough();
|
||||
const opts = {
|
||||
input: inputStream,
|
||||
output: outputStream,
|
||||
useGlobal: useGlobal,
|
||||
useColors: false,
|
||||
terminal: false,
|
||||
prompt: ''
|
||||
};
|
||||
|
||||
repl.createInternalRepl(
|
||||
process.env,
|
||||
opts,
|
||||
testFunc(useGlobal, cb, opts.output));
|
||||
}
|
Загрузка…
Ссылка в новой задаче