From 188122bfd9d0d66b5b4d1ebcd920fe7b41929ba5 Mon Sep 17 00:00:00 2001 From: Mathias Klippinge Date: Thu, 28 Oct 2021 16:31:11 +0200 Subject: [PATCH] GraphQLError: Fixed `originalError.extensions` overriding `extensions` argument to constructor (#3343) Co-authored-by: Ivan Goncharov --- 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..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`