From 3f81ce63d636aa50fcab3604c7cadaafab8af4f3 Mon Sep 17 00:00:00 2001 From: Jonathan Giroux Date: Mon, 13 Jun 2022 13:18:16 +0200 Subject: [PATCH] Fix `evaluateCause` loosing access to `err` --- lib/err-helpers.js | 12 ++++++------ lib/err.js | 2 +- test/err.test.js | 22 ++++++++++++++++------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lib/err-helpers.js b/lib/err-helpers.js index d00c201..1164a33 100644 --- a/lib/err-helpers.js +++ b/lib/err-helpers.js @@ -12,7 +12,7 @@ const getErrorCause = (err) => { if (!err) return - const cause = evaluateCause(err.cause) + const cause = evaluateCause(err) return cause instanceof Error ? cause @@ -20,14 +20,14 @@ const getErrorCause = (err) => { } /** - * @param {unknown|(()=>err)} cause + * @param {Error|{ cause?: unknown|(()=>err)}} err * @returns {Error|undefined} */ -const evaluateCause = (cause) => { +const evaluateCause = (err) => { // VError / NError style causes are functions - return typeof cause === 'function' - ? cause() - : cause + return typeof err.cause === 'function' + ? err.cause() + : err.cause } /** diff --git a/lib/err.js b/lib/err.js index fd63e23..665bba2 100644 --- a/lib/err.js +++ b/lib/err.js @@ -66,7 +66,7 @@ function errSerializer (err) { } if (err.cause) { - const cause = evaluateCause(err.cause) + const cause = evaluateCause(err) _err.cause = errSerializer(cause) } diff --git a/test/err.test.js b/test/err.test.js index 0ca4a58..7b5bb0a 100644 --- a/test/err.test.js +++ b/test/err.test.js @@ -223,16 +223,26 @@ test('serializes causes with VError support', function (t) { t.plan(11) // Fake VError-style setup - const err = Error('foo: bar') - err.cause = () => { - const err = Error('bar') - err.cause = Error('abc') - return err + class VError extends Error { + constructor (message, cause) { + super(message + ': ' + cause.message) + this._cause = cause + } + + // Ensure `cause` references `this` (see https://github.com/pinojs/pino-std-serializers/pull/109) + cause () { + return this._cause + } } + const causeErr = Error('bar') + causeErr.cause = Error('abc') + + const err = new VError('foo', causeErr) + const serialized = serializer(err) - t.equal(serialized.type, 'Error') + t.equal(serialized.type, 'VError') t.equal(serialized.message, 'foo: bar: abc') // message serialization already walks cause-chain t.match(serialized.stack, /err\.test\.js:/)