From 9823a6057bac9d7c70acc0ef4cef0a9837c76626 Mon Sep 17 00:00:00 2001 From: stewones Date: Fri, 25 Nov 2022 15:48:27 -0300 Subject: [PATCH 1/3] fix: ParseError messages must be string --- src/ParseError.js | 2 +- src/__tests__/ParseError-test.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ParseError.js b/src/ParseError.js index e8d11ad84..172ad5344 100644 --- a/src/ParseError.js +++ b/src/ParseError.js @@ -22,7 +22,7 @@ class ParseError extends Error { this.code = code; Object.defineProperty(this, 'message', { enumerable: true, - value: message, + value: typeof message === 'string' ? message : JSON.stringify(message), }); } diff --git a/src/__tests__/ParseError-test.js b/src/__tests__/ParseError-test.js index 3da9dbbef..564068676 100644 --- a/src/__tests__/ParseError-test.js +++ b/src/__tests__/ParseError-test.js @@ -27,4 +27,13 @@ describe('ParseError', () => { code: 123, }); }); + + it('message must be a string', () => { + const someRandomError = { code: 420, message: 'time to chill' }; + const error = new ParseError(1337, someRandomError); + expect(JSON.parse(JSON.stringify(error))).toEqual({ + message: JSON.stringify(someRandomError), + code: 1337, + }); + }); }); From 3b2a19ecd240b7879eec481da63e80dca0780c18 Mon Sep 17 00:00:00 2001 From: stewones Date: Fri, 25 Nov 2022 20:11:19 -0300 Subject: [PATCH 2/3] fix: add support for Error instances being passed as message --- src/ParseError.js | 9 ++++++++- src/__tests__/ParseError-test.js | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ParseError.js b/src/ParseError.js index 172ad5344..2989341ef 100644 --- a/src/ParseError.js +++ b/src/ParseError.js @@ -22,7 +22,14 @@ class ParseError extends Error { this.code = code; Object.defineProperty(this, 'message', { enumerable: true, - value: typeof message === 'string' ? message : JSON.stringify(message), + value: + typeof message === 'string' + ? message + : typeof message === 'object' && + typeof message.toString === 'function' && + message.toString() !== '[object Object]' + ? message.toString() + : JSON.stringify(message), }); } diff --git a/src/__tests__/ParseError-test.js b/src/__tests__/ParseError-test.js index 564068676..a2a56bf10 100644 --- a/src/__tests__/ParseError-test.js +++ b/src/__tests__/ParseError-test.js @@ -29,11 +29,25 @@ describe('ParseError', () => { }); it('message must be a string', () => { + /** + * error as object + */ const someRandomError = { code: 420, message: 'time to chill' }; const error = new ParseError(1337, someRandomError); expect(JSON.parse(JSON.stringify(error))).toEqual({ message: JSON.stringify(someRandomError), code: 1337, }); + + /** + * error as an Error instance + */ + const someRandomError2 = new Error('time to relax'); + const error2 = new ParseError(420, someRandomError2); + + expect(JSON.parse(JSON.stringify(error2))).toEqual({ + message: 'Error: time to relax', + code: 420, + }); }); }); From 09c54c6120224a9e90f839e49450ccb04c7c8941 Mon Sep 17 00:00:00 2001 From: stewones Date: Sat, 26 Nov 2022 15:23:11 -0300 Subject: [PATCH 3/3] fix: improve error handling and add more tests --- src/ParseError.js | 13 ++++++-- src/__tests__/ParseError-test.js | 52 +++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/ParseError.js b/src/ParseError.js index 2989341ef..38212866e 100644 --- a/src/ParseError.js +++ b/src/ParseError.js @@ -20,6 +20,15 @@ class ParseError extends Error { constructor(code, message) { super(message); this.code = code; + + const stringify = obj => { + let log = ''; + for (const k in obj) { + log += `${obj[k]} `; + } + return log.trim(); + }; + Object.defineProperty(this, 'message', { enumerable: true, value: @@ -27,9 +36,9 @@ class ParseError extends Error { ? message : typeof message === 'object' && typeof message.toString === 'function' && - message.toString() !== '[object Object]' + !message.toString().includes('[object Object]') ? message.toString() - : JSON.stringify(message), + : stringify(message), }); } diff --git a/src/__tests__/ParseError-test.js b/src/__tests__/ParseError-test.js index a2a56bf10..7277d6888 100644 --- a/src/__tests__/ParseError-test.js +++ b/src/__tests__/ParseError-test.js @@ -28,26 +28,50 @@ describe('ParseError', () => { }); }); - it('message must be a string', () => { - /** - * error as object - */ - const someRandomError = { code: 420, message: 'time to chill' }; + it('message can be a string', () => { + const someRandomError = 'oh no'; + + const error = new ParseError(1337, someRandomError); + + expect(JSON.parse(JSON.stringify(error))).toEqual({ + message: someRandomError, + code: 1337, + }); + }); + + it('message can be an object passed trough some external dependency', () => { + const someRandomError = { code: '420', message: 'time to chill', status: '🎮' }; + const error = new ParseError(1337, someRandomError); + expect(JSON.parse(JSON.stringify(error))).toEqual({ - message: JSON.stringify(someRandomError), + message: '420 time to chill 🎮', code: 1337, }); + }); - /** - * error as an Error instance - */ - const someRandomError2 = new Error('time to relax'); - const error2 = new ParseError(420, someRandomError2); + it('message can be an Error instance *receiving a string* passed trough some external dependency', () => { + const someRandomError = new Error('good point'); - expect(JSON.parse(JSON.stringify(error2))).toEqual({ - message: 'Error: time to relax', - code: 420, + const error = new ParseError(1337, someRandomError); + + expect(JSON.parse(JSON.stringify(error))).toEqual({ + message: 'Error: good point', + code: 1337, + }); + }); + + it('message can be an Error instance *receiving an object* passed trough some external dependency', () => { + const someRandomErrorWrong = new Error({ + code: 'WRONG', + message: 'this is not how errors should be handled', + }); + + const error = new ParseError(1337, someRandomErrorWrong); + + expect(JSON.parse(JSON.stringify(error))).toEqual({ + message: '', // <-- Yeah because we can't parse errors used like that + code: 1337, }); }); });