From cea5fb686bb36572a9edbf49eefde89fbd590736 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Tue, 26 Oct 2021 16:22:44 +0300 Subject: [PATCH] GraphQLError: keep extensions always present Backport #3313 --- src/error/GraphQLError.d.ts | 4 ++-- src/error/GraphQLError.js | 7 ++++--- src/error/__tests__/GraphQLError-test.js | 8 ++++++-- src/error/formatError.js | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/error/GraphQLError.d.ts b/src/error/GraphQLError.d.ts index b9b9b4aba5..bb574f9f05 100644 --- a/src/error/GraphQLError.d.ts +++ b/src/error/GraphQLError.d.ts @@ -31,7 +31,7 @@ export class GraphQLError extends Error { positions?: Maybe>, path?: Maybe>, originalError?: Maybe, - extensions?: Maybe<{ [key: string]: GraphQLErrorExtensions }>, + extensions?: Maybe, ); /** @@ -81,7 +81,7 @@ export class GraphQLError extends Error { /** * Extension fields to add to the formatted error. */ - readonly extensions: { [key: string]: any } | undefined; + readonly extensions: { [key: string]: any }; } /** diff --git a/src/error/GraphQLError.js b/src/error/GraphQLError.js index 3b7fa68146..fc462e5a48 100644 --- a/src/error/GraphQLError.js +++ b/src/error/GraphQLError.js @@ -61,7 +61,7 @@ export class GraphQLError extends Error { /** * Extension fields to add to the formatted error. */ - +extensions: { [key: string]: mixed, ... } | void; + +extensions: { [key: string]: mixed, ... }; constructor( message: string, @@ -101,7 +101,7 @@ export class GraphQLError extends Error { ? positions.map((pos) => getLocation(source, pos)) : nodeLocations?.map((loc) => getLocation(loc.source, loc.start)); - this.extensions = extensions ?? undefined; + this.extensions = extensions ?? {}; const originalExtensions = originalError?.extensions; if (isObjectLike(originalExtensions)) { @@ -119,7 +119,8 @@ export class GraphQLError extends Error { enumerable: this.path != null, }, extensions: { - enumerable: this.extensions != null, + enumerable: + this.extensions != null && Object.keys(this.extensions).length > 0, }, name: { enumerable: false }, nodes: { enumerable: false }, diff --git a/src/error/__tests__/GraphQLError-test.js b/src/error/__tests__/GraphQLError-test.js index ef32e7450e..890525a4d9 100644 --- a/src/error/__tests__/GraphQLError-test.js +++ b/src/error/__tests__/GraphQLError-test.js @@ -28,10 +28,14 @@ describe('GraphQLError', () => { expect(new GraphQLError('str')).to.be.instanceof(GraphQLError); }); - it('has a name, message, and stack trace', () => { + it('has a name, message, extensions, and stack trace', () => { const e = new GraphQLError('msg'); - expect(e).to.include({ name: 'GraphQLError', message: 'msg' }); + expect(e).to.deep.include({ + name: 'GraphQLError', + message: 'msg', + extensions: {}, + }); expect(e.stack).to.be.a('string'); }); diff --git a/src/error/formatError.js b/src/error/formatError.js index d73cc897b0..52fbe47ef9 100644 --- a/src/error/formatError.js +++ b/src/error/formatError.js @@ -15,7 +15,7 @@ export function formatError(error: GraphQLError): GraphQLFormattedError { const path = error.path; const extensions = error.extensions; - return extensions + return extensions && Object.keys(extensions).length > 0 ? { message, locations, path, extensions } : { message, locations, path }; }