From 463f075c5aa2ce7980d985c4c9f8255036d846e7 Mon Sep 17 00:00:00 2001 From: Mathias Klippinge Date: Thu, 28 Oct 2021 11:58:05 +0200 Subject: [PATCH 1/2] GraphQLError: Fixed a regression for extensions before the refactoring --- src/error/GraphQLError.js | 7 +-- src/error/__tests__/GraphQLError-test.js | 60 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/error/GraphQLError.js b/src/error/GraphQLError.js index d3068adacb..7c5e74e73d 100644 --- a/src/error/GraphQLError.js +++ b/src/error/GraphQLError.js @@ -102,11 +102,12 @@ export class GraphQLError extends Error { this.path = path ?? undefined; - this.extensions = extensions ?? {}; - const originalExtensions = originalError?.extensions; - if (isObjectLike(originalExtensions)) { + + if (extensions == null && isObjectLike(originalExtensions)) { this.extensions = { ...originalExtensions }; + } else { + this.extensions = extensions ?? {}; } // By being enumerable, JSON.stringify will include bellow properties in the resulting output. diff --git a/src/error/__tests__/GraphQLError-test.js b/src/error/__tests__/GraphQLError-test.js index 44fb505e12..ff73d0e68c 100644 --- a/src/error/__tests__/GraphQLError-test.js +++ b/src/error/__tests__/GraphQLError-test.js @@ -164,6 +164,66 @@ describe('GraphQLError', () => { } `); }); + + it('uses the provided extensions when original extensions are undefined', () => { + const original = new Error('original'); + const graphqlError = new GraphQLError( + 'msg', + null, + null, + null, + null, + original, + { + someKey: 'someValue', + }, + ); + + const e = new GraphQLError( + graphqlError.message, + null, + null, + null, + null, + graphqlError, + { correlationId: '123-echo-tango-delta' }, + ); + + expect(JSON.stringify(e.extensions, null, 2) + '\n').to.equal(dedent` + { + "correlationId": "123-echo-tango-delta" + } + `); + }); + + it('uses the provided extensions when original extensions are empty object', () => { + const original = new Error('original'); + const graphqlError = new GraphQLError( + 'msg', + null, + null, + null, + null, + original, + {}, + ); + + const e = new GraphQLError( + graphqlError.message, + null, + null, + null, + null, + graphqlError, + { correlationId: '123-echo-tango-delta' }, + ); + + expect(JSON.stringify(e.extensions, null, 2) + '\n').to.equal(dedent` + { + "correlationId": "123-echo-tango-delta" + } + `); + }); }); describe('printError', () => { From defac38d0791e8e2f36f88c8945219eb77c0ce73 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Thu, 28 Oct 2021 17:19:22 +0300 Subject: [PATCH 2/2] review changes --- src/error/__tests__/GraphQLError-test.js | 120 +++++++++++------------ 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/src/error/__tests__/GraphQLError-test.js b/src/error/__tests__/GraphQLError-test.js index ff73d0e68c..ef1964fc82 100644 --- a/src/error/__tests__/GraphQLError-test.js +++ b/src/error/__tests__/GraphQLError-test.js @@ -122,6 +122,66 @@ describe('GraphQLError', () => { }); }); + it('defaults to original error extension only if extensions argument is not passed', () => { + class ErrorWithExtensions extends Error { + extensions: mixed; + + constructor(message: string) { + super(message); + this.extensions = { original: 'extensions' }; + } + } + + const original = new ErrorWithExtensions('original'); + const inheritedExtensions = new GraphQLError( + 'InheritedExtensions', + undefined, + undefined, + undefined, + undefined, + original, + undefined, + ); + + expect(inheritedExtensions).to.deep.include({ + message: 'InheritedExtensions', + originalError: original, + extensions: { original: 'extensions' }, + }); + + const ownExtensions = new GraphQLError( + 'OwnExtensions', + undefined, + undefined, + undefined, + undefined, + original, + { own: 'extensions' }, + ); + + expect(ownExtensions).to.deep.include({ + message: 'OwnExtensions', + originalError: original, + extensions: { own: 'extensions' }, + }); + + const ownEmptyExtensions = new GraphQLError( + 'OwnEmptyExtensions', + undefined, + undefined, + undefined, + undefined, + original, + {}, + ); + + expect(ownEmptyExtensions).to.deep.include({ + message: 'OwnEmptyExtensions', + originalError: original, + extensions: {}, + }); + }); + it('serializes to include all standard fields', () => { const eShort = new GraphQLError('msg'); expect(JSON.stringify(eShort, null, 2) + '\n').to.equal(dedent` @@ -164,66 +224,6 @@ describe('GraphQLError', () => { } `); }); - - it('uses the provided extensions when original extensions are undefined', () => { - const original = new Error('original'); - const graphqlError = new GraphQLError( - 'msg', - null, - null, - null, - null, - original, - { - someKey: 'someValue', - }, - ); - - const e = new GraphQLError( - graphqlError.message, - null, - null, - null, - null, - graphqlError, - { correlationId: '123-echo-tango-delta' }, - ); - - expect(JSON.stringify(e.extensions, null, 2) + '\n').to.equal(dedent` - { - "correlationId": "123-echo-tango-delta" - } - `); - }); - - it('uses the provided extensions when original extensions are empty object', () => { - const original = new Error('original'); - const graphqlError = new GraphQLError( - 'msg', - null, - null, - null, - null, - original, - {}, - ); - - const e = new GraphQLError( - graphqlError.message, - null, - null, - null, - null, - graphqlError, - { correlationId: '123-echo-tango-delta' }, - ); - - expect(JSON.stringify(e.extensions, null, 2) + '\n').to.equal(dedent` - { - "correlationId": "123-echo-tango-delta" - } - `); - }); }); describe('printError', () => {