From b4c175911bf616e3df6b4fe64c6a169b0dc4d0c7 Mon Sep 17 00:00:00 2001 From: Arda TANRIKULU Date: Tue, 10 Oct 2023 19:19:01 +0300 Subject: [PATCH] fix(utils/createGraphQLError): Convert GraphQLError like originalError property to a GraphQLError --- .changeset/chilly-scissors-wave.md | 5 +++ packages/utils/src/errors.ts | 31 +++++++++++++++++++ .../utils/tests/createGraphQLError.test.ts | 19 ++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 .changeset/chilly-scissors-wave.md create mode 100644 packages/utils/tests/createGraphQLError.test.ts diff --git a/.changeset/chilly-scissors-wave.md b/.changeset/chilly-scissors-wave.md new file mode 100644 index 00000000000..e789d7cd650 --- /dev/null +++ b/.changeset/chilly-scissors-wave.md @@ -0,0 +1,5 @@ +--- +'@graphql-tools/utils': patch +--- + +Convert GraphQLError like originalError property to a GraphQLError diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index f9d13fb0476..61b26a10baa 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -14,7 +14,38 @@ interface GraphQLErrorOptions { extensions?: any; } +const possibleGraphQLErrorProperties = [ + 'message', + 'locations', + 'path', + 'nodes', + 'source', + 'positions', + 'originalError', + 'name', + 'stack', + 'extensions', +]; + +function isGraphQLErrorLike(error: any) { + return ( + error != null && + typeof error === 'object' && + Object.keys(error).every(key => possibleGraphQLErrorProperties.includes(key)) + ); +} + export function createGraphQLError(message: string, options?: GraphQLErrorOptions): GraphQLError { + if ( + options?.originalError && + !(options.originalError instanceof Error) && + isGraphQLErrorLike(options.originalError) + ) { + options.originalError = createGraphQLError( + (options.originalError as any).message, + options.originalError, + ); + } if (versionInfo.major >= 17) { return new (GraphQLError as any)(message, options); } diff --git a/packages/utils/tests/createGraphQLError.test.ts b/packages/utils/tests/createGraphQLError.test.ts new file mode 100644 index 00000000000..e8581da03cf --- /dev/null +++ b/packages/utils/tests/createGraphQLError.test.ts @@ -0,0 +1,19 @@ +import { GraphQLError } from 'graphql'; +import { createGraphQLError } from '../src/errors'; + +it('should handle non Error originalError', () => { + const error = createGraphQLError('message', { + originalError: { + message: 'originalError', + extensions: { code: 'ORIGINAL_ERROR' }, + } as any, + }); + expect(error.originalError).toBeInstanceOf(GraphQLError); + expect(error).toMatchObject({ + message: 'message', + originalError: { + message: 'originalError', + extensions: { code: 'ORIGINAL_ERROR' }, + }, + }); +});