diff --git a/src/error/GraphQLError.ts b/src/error/GraphQLError.ts index 80bb9fcba3..59b74e1648 100644 --- a/src/error/GraphQLError.ts +++ b/src/error/GraphQLError.ts @@ -61,7 +61,7 @@ export class GraphQLError extends Error { /** * Extension fields to add to the formatted error. */ - readonly extensions: { [key: string]: unknown } | undefined; + readonly extensions: { [key: string]: unknown }; constructor( message: string, @@ -124,7 +124,7 @@ export class GraphQLError extends Error { ? originalError?.extensions : undefined; // TODO: merge `extensions` and `originalExtensions` - this.extensions = extensions ?? originalExtensions; + this.extensions = extensions ?? originalExtensions ?? Object.create(null); // Include (non-enumerable) stack trace. if (originalError?.stack) { @@ -183,7 +183,7 @@ export class GraphQLError extends Error { formattedError.path = this.path; } - if (this.extensions != null) { + if (this.extensions != null && Object.keys(this.extensions).length > 0) { formattedError.extensions = this.extensions; } diff --git a/src/error/__tests__/GraphQLError-test.ts b/src/error/__tests__/GraphQLError-test.ts index ca5679710e..dc7a887f5b 100644 --- a/src/error/__tests__/GraphQLError-test.ts +++ b/src/error/__tests__/GraphQLError-test.ts @@ -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/tsconfig.json b/tsconfig.json index 7f3fef7346..8dfb0f4794 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "useUnknownInCatchVariables": false, "noEmit": true, "isolatedModules": true, + "importsNotUsedAsValues": "error", "forceConsistentCasingInFileNames": true } }