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`