From ccc3ffcb56a3b7c6b533999d9e41069d571de0f3 Mon Sep 17 00:00:00 2001 From: Zignd Date: Fri, 21 Aug 2020 13:53:44 -0300 Subject: [PATCH] stringify: add support for nested errors with multiple properties --- package-lock.json | 23 +++++++++++++++++++---- package.json | 3 ++- src/utils.js | 7 +++---- test/unit/utils.js | 33 +++++++++++++++++++++++++++++++-- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ee1087..4c7c7fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5851,10 +5851,19 @@ } }, "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", - "dev": true + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" + } + } }, "set-blocking": { "version": "2.0.0", @@ -6154,6 +6163,12 @@ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "dev": true + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", diff --git a/package.json b/package.json index 53f39cf..64541f8 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "iron-mask": "1.0.2", "moment-timezone": "^0.5.13", "pokeprop": "^1.0.0", - "ramda": "^0.23.0" + "ramda": "^0.23.0", + "serialize-error": "^7.0.1" }, "devDependencies": { "ava": "^2.4.0", diff --git a/src/utils.js b/src/utils.js index 5a15157..2b613d5 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,18 +1,17 @@ const R = require('ramda') const pokeprop = require('pokeprop') const circularJSON = require('circular-json') +const { serializeError } = require('serialize-error') const parseStringToJSON = chunk => ( Promise.resolve(chunk) .then(JSON.parse) - .catch(err => chunk) + .catch(_ => chunk) ) -const buildErrorObject = R.pick(['message', 'stack']) - const stringify = log => { if (R.is(String, log)) return log - if (R.is(Error, log.message)) log.message = buildErrorObject(log.message) + if (R.is(Error, log.message)) log.message = serializeError(log.message) return circularJSON.stringify(log) } diff --git a/test/unit/utils.js b/test/unit/utils.js index 6dcb05f..92d3c37 100644 --- a/test/unit/utils.js +++ b/test/unit/utils.js @@ -25,18 +25,47 @@ test('stringify: with a invalid JSON object', t => { }) test('stringify: with a valid error object', t => { + const err = new Error('Error Message') + const logStringified = utils.stringify({ id: 1, - message: new Error('Error Message') + message: err }) const logObject = JSON.parse(logStringified) const logError = logObject.message - t.is(logError.message, 'Error Message') + t.is(logError.message, err.message) t.true(logError.stack.includes('Error: Error Message')) }) +test('stringify: with a valid nested error object with multiple properties', t => { + const innerErr = new Error('Inner error message') + innerErr.username = 'foo' + innerErr.isValidUsername = true + + const err = new Error('Error message') + err.cause = innerErr + err.correlationId = '4ac1-b431-cab1-4c1a' + + const logStringified = utils.stringify({ + id: 1, + message: err + }) + + const logObject = JSON.parse(logStringified) + const logError = logObject.message + + t.is(logError.message, err.message) + t.is(logError.correlationId, err.correlationId) + t.true(logError.stack.includes('Error: Error message')) + + t.is(logError.cause.message, innerErr.message) + t.is(logError.cause.username, innerErr.username) + t.is(logError.cause.isValidUsername, innerErr.isValidUsername) + t.true(logError.cause.stack.includes('Error: Inner error message')) +}) + test('generateLogLevel: with status code 400', t => { t.is(utils.generateLogLevel(400), 'warn') })