diff --git a/doc/api/repl.markdown b/doc/api/repl.markdown index e5081c3c8db..0ae8a9a9320 100644 --- a/doc/api/repl.markdown +++ b/doc/api/repl.markdown @@ -32,8 +32,8 @@ For example, you could add this to your bashrc file: ## repl.start(options) -Returns and starts a `REPLServer` instance, that inherits from -[Readline Interface][]. Accepts an "options" Object that takes +Returns and starts a `REPLServer` instance, that inherits from +[Readline Interface][]. Accepts an "options" Object that takes the following values: - `prompt` - the prompt and `stream` for all I/O. Defaults to `> `. @@ -50,6 +50,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 non-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 nothing. Defaults to the repl's `terminal` value. diff --git a/lib/repl.js b/lib/repl.js index 3bb145bb44f..7a5bec4f049 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -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; @@ -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 { @@ -122,10 +123,7 @@ function REPLServer(prompt, stream, eval_, useGlobal, ignoreUndefined) { }); } catch (e) { debug('parse error %j', code, e); - if (isRecoverableError(e)) - err = new Recoverable(e); - else - err = e; + err = e; } if (!err) { @@ -298,7 +296,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 @@ -953,8 +951,3 @@ function isRecoverableError(e) { e.name === 'SyntaxError' && /^(Unexpected end of input|Unexpected token)/.test(e.message); } - -function Recoverable(err) { - this.err = err; -} -inherits(Recoverable, SyntaxError); diff --git a/test/simple/test-repl-options.js b/test/simple/test-repl-options.js index 94a622da260..9652d69a2dd 100644 --- a/test/simple/test-repl-options.js +++ b/test/simple/test-repl-options.js @@ -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, @@ -66,6 +67,7 @@ var r2 = repl.start({ useGlobal: true, ignoreUndefined: true, eval: evaler, + recoverable: recoverTester, writer: writer }); assert.equal(r2.input, stream);