-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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: #5659 Ref: #6802 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> PR-URL: #5703
- Loading branch information
Showing
2 changed files
with
86 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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)); | ||
} |