Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

REPL: Fix for multiline input when using custom eval function #25587

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should read non-standard rather than none standard.


- `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;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be better as a ternary based on whether options.recoverable is a function or not.

} 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,
recoverable: recoverTester,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is really enough testing for a new feature.

writer: writer
});
assert.equal(r2.input, stream);
Expand Down