mirror of https://github.com/lukechilds/node.git
Browse Source
When a user executes code in the REPLServer which generates an exception, there is no need to display the REPLServer internal stack frames. PR-URL: https://github.com/nodejs/node/pull/15351 Reviewed-By: Prince John Wesley <princejohnwesley@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Refs: https://github.com/nodejs/node/pull/9601v9.x-staging
Lance Ball
7 years ago
5 changed files with 174 additions and 6 deletions
@ -0,0 +1,19 @@ |
|||
'use strict'; |
|||
|
|||
function a() { |
|||
b(); |
|||
} |
|||
|
|||
function b() { |
|||
c(); |
|||
} |
|||
|
|||
function c() { |
|||
d(function() { throw new Error('Whoops!'); }); |
|||
} |
|||
|
|||
function d(f) { |
|||
f(); |
|||
} |
|||
|
|||
a(); |
@ -0,0 +1,70 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const fixtures = require('../common/fixtures'); |
|||
const assert = require('assert'); |
|||
const repl = require('repl'); |
|||
|
|||
|
|||
function run({ command, expected }) { |
|||
let accum = ''; |
|||
|
|||
const inputStream = new common.ArrayStream(); |
|||
const outputStream = new common.ArrayStream(); |
|||
|
|||
outputStream.write = (data) => accum += data.replace('\r', ''); |
|||
|
|||
const r = repl.start({ |
|||
prompt: '', |
|||
input: inputStream, |
|||
output: outputStream, |
|||
terminal: false, |
|||
useColors: false |
|||
}); |
|||
|
|||
r.write(`${command}\n`); |
|||
assert.strictEqual(accum, expected); |
|||
r.close(); |
|||
} |
|||
|
|||
const origPrepareStackTrace = Error.prepareStackTrace; |
|||
Error.prepareStackTrace = (err, stack) => { |
|||
if (err instanceof SyntaxError) |
|||
return err.toString(); |
|||
stack.push(err); |
|||
return stack.reverse().join('--->\n'); |
|||
}; |
|||
|
|||
process.on('uncaughtException', (e) => { |
|||
Error.prepareStackTrace = origPrepareStackTrace; |
|||
throw e; |
|||
}); |
|||
|
|||
process.on('exit', () => (Error.prepareStackTrace = origPrepareStackTrace)); |
|||
|
|||
const tests = [ |
|||
{ |
|||
// test .load for a file that throws
|
|||
command: `.load ${fixtures.path('repl-pretty-stack.js')}`, |
|||
expected: 'Error: Whoops!--->\nrepl:9:24--->\nd (repl:12:3)--->\nc ' + |
|||
'(repl:9:3)--->\nb (repl:6:3)--->\na (repl:3:3)\n' |
|||
}, |
|||
{ |
|||
command: 'let x y;', |
|||
expected: 'let x y;\n ^\n\nSyntaxError: Unexpected identifier\n' |
|||
}, |
|||
{ |
|||
command: 'throw new Error(\'Whoops!\')', |
|||
expected: 'Error: Whoops!\n' |
|||
}, |
|||
{ |
|||
command: 'foo = bar;', |
|||
expected: 'ReferenceError: bar is not defined\n' |
|||
}, |
|||
// test anonymous IIFE
|
|||
{ |
|||
command: '(function() { throw new Error(\'Whoops!\'); })()', |
|||
expected: 'Error: Whoops!--->\nrepl:1:21\n' |
|||
} |
|||
]; |
|||
|
|||
tests.forEach(run); |
@ -0,0 +1,55 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const fixtures = require('../common/fixtures'); |
|||
const assert = require('assert'); |
|||
const repl = require('repl'); |
|||
|
|||
|
|||
function run({ command, expected }) { |
|||
let accum = ''; |
|||
|
|||
const inputStream = new common.ArrayStream(); |
|||
const outputStream = new common.ArrayStream(); |
|||
|
|||
outputStream.write = (data) => accum += data.replace('\r', ''); |
|||
|
|||
const r = repl.start({ |
|||
prompt: '', |
|||
input: inputStream, |
|||
output: outputStream, |
|||
terminal: false, |
|||
useColors: false |
|||
}); |
|||
|
|||
r.write(`${command}\n`); |
|||
assert.strictEqual(accum, expected); |
|||
r.close(); |
|||
} |
|||
|
|||
const tests = [ |
|||
{ |
|||
// test .load for a file that throws
|
|||
command: `.load ${fixtures.path('repl-pretty-stack.js')}`, |
|||
expected: 'Error: Whoops!\n at repl:9:24\n at d (repl:12:3)\n ' + |
|||
'at c (repl:9:3)\n at b (repl:6:3)\n at a (repl:3:3)\n' |
|||
}, |
|||
{ |
|||
command: 'let x y;', |
|||
expected: 'let x y;\n ^\n\nSyntaxError: Unexpected identifier\n\n' |
|||
}, |
|||
{ |
|||
command: 'throw new Error(\'Whoops!\')', |
|||
expected: 'Error: Whoops!\n' |
|||
}, |
|||
{ |
|||
command: 'foo = bar;', |
|||
expected: 'ReferenceError: bar is not defined\n' |
|||
}, |
|||
// test anonymous IIFE
|
|||
{ |
|||
command: '(function() { throw new Error(\'Whoops!\'); })()', |
|||
expected: 'Error: Whoops!\n at repl:1:21\n' |
|||
} |
|||
]; |
|||
|
|||
tests.forEach(run); |
Loading…
Reference in new issue