Skip to content

Commit

Permalink
This is a fix for nodejs#8640 Multiline input doesn't work if user ov…
Browse files Browse the repository at this point in the history
…errides "eval" in REPL.start

Overriding default eval will stop multiline inputs on syntax errors because of the current error checking in the
finish callback. This fixes that issue and allows for a custom recoverable check function to be passed the the REPL server
  • Loading branch information
Michael Edwards committed Jun 28, 2015
1 parent b436e59 commit 3c31d0b
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 8 deletions.
2 changes: 2 additions & 0 deletions doc/api/repl.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ the following values:

- `eval` - function that will be used to eval each given line. Defaults to
an async wrapper for `eval()`. See below for an example of a custom `eval`.

- `recoverable` - function that will return a `bool` when passed an error and report if it is recoverable. Use if your `eval` returns none standard errors but you still want the benefits of multiline input.

- `useColors` - a boolean which specifies whether or not the `writer` function
should output colors. If a different `writer` function is set then this does
Expand Down
12 changes: 4 additions & 8 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ function REPLServer(prompt, stream, eval_, useGlobal, ignoreUndefined) {
return new REPLServer(prompt, stream, eval_, useGlobal, ignoreUndefined);
}

var options, input, output, dom;
var options, input, output, dom, recoverableCheck;
if (util.isObject(prompt)) {
// an options object was given
options = prompt;
Expand All @@ -94,6 +94,7 @@ function REPLServer(prompt, stream, eval_, useGlobal, ignoreUndefined) {
ignoreUndefined = options.ignoreUndefined;
prompt = options.prompt;
dom = options.domain;
recoverableCheck = options.recoverable || isRecoverableError;
} else if (!util.isString(prompt)) {
throw new Error('An options Object, or a prompt String are required');
} else {
Expand Down Expand Up @@ -298,7 +299,7 @@ function REPLServer(prompt, stream, eval_, useGlobal, ignoreUndefined) {

// If error was SyntaxError and not JSON.parse error
if (e) {
if (e instanceof Recoverable) {
if (recoverableCheck(e)) {
// Start buffering data like that:
// {
// ... x: 1
Expand Down Expand Up @@ -952,9 +953,4 @@ function isRecoverableError(e) {
return e &&
e.name === 'SyntaxError' &&
/^(Unexpected end of input|Unexpected token)/.test(e.message);
}

function Recoverable(err) {
this.err = err;
}
inherits(Recoverable, SyntaxError);
}
2 changes: 2 additions & 0 deletions test/simple/test-repl-options.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ assert.equal(r1.useColors, r1.rli.terminal);
// 2
function writer() {}
function evaler() {}
function recoverTester() {}
var r2 = repl.start({
input: stream,
output: stream,
Expand All @@ -66,6 +67,7 @@ var r2 = repl.start({
useGlobal: true,
ignoreUndefined: true,
eval: evaler,
recover: recoverTester,
writer: writer
});
assert.equal(r2.input, stream);
Expand Down

0 comments on commit 3c31d0b

Please sign in to comment.