Skip to content

Commit

Permalink
repl: Default useGlobal to false in CLI REPL.
Browse files Browse the repository at this point in the history
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: nodejs#5659
Ref: nodejs#6802
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
PR-URL: nodejs#5703
  • Loading branch information
lance committed Jun 30, 2016
1 parent dc17432 commit 15157c3
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/internal/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function createRepl(env, opts, cb) {
opts = opts || {
ignoreUndefined: false,
terminal: process.stdout.isTTY,
useGlobal: true,
useGlobal: false,
breakEvalOnSigint: true
};

Expand Down
85 changes: 85 additions & 0 deletions test/parallel/test-repl-use-global.js
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));
}

0 comments on commit 15157c3

Please sign in to comment.