Skip to content

Commit 983691f

Browse files
authored
fix: handle circular refs in errors (#82)
* fix: handle circular refs in errors Fixes chaijs/chai#1645 We already handle circular references in objects, but do not do the same for `Error` objects. This change adds the same `seen` logic to error inspection as we have in object inspection.
1 parent d8f129d commit 983691f

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

src/error.ts

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const errorKeys = [
1212
'columnNumber',
1313
'number',
1414
'description',
15+
'cause',
1516
]
1617

1718
export default function inspectObject(error: Error, options: Options) {
@@ -26,6 +27,11 @@ export default function inspectObject(error: Error, options: Options) {
2627
}
2728
message = message ? `: ${message}` : ''
2829
options.truncate -= message.length + 5
30+
options.seen = options.seen || []
31+
if (options.seen.includes(error)) {
32+
return '[Circular]'
33+
}
34+
options.seen.push(error)
2935
const propertyContents = inspectList(
3036
properties.map(key => [key, error[key as keyof typeof error]]),
3137
options,

src/object.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export default function inspectObject(object: object, options: Options): string
99
}
1010
options.truncate -= 4
1111
options.seen = options.seen || []
12-
if (options.seen.indexOf(object) >= 0) {
12+
if (options.seen.includes(object)) {
1313
return '[Circular]'
1414
}
1515
options.seen.push(object)

test/errors.js

+14
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,19 @@ describe('errors', () => {
3333
err.message = { code: 404 }
3434
expect(inspect(err)).to.equal('Error { message: { code: 404 } }')
3535
})
36+
37+
it('detects circular references', () => {
38+
const err = new Error('message')
39+
err.fluff = err
40+
expect(inspect(err)).to.equal('Error: message { fluff: [Circular] }')
41+
})
42+
})
43+
44+
describe('ignores built in properties', () => {
45+
it('does not add property to output', () => {
46+
const err = new Error('message')
47+
err.cause = new Error('i caused you')
48+
expect(inspect(err)).to.equal('Error: message')
49+
})
3650
})
3751
})

0 commit comments

Comments
 (0)