From 0f656925eca384fec1364014be29e789aa4f9df5 Mon Sep 17 00:00:00 2001 From: TheGuildBot <59414373+theguild-bot@users.noreply.github.com> Date: Mon, 6 Jan 2025 07:10:11 -0500 Subject: [PATCH 01/35] chore(release): update monorepo packages versions (#6826) Co-authored-by: github-actions[bot] From 33e8b5d5a5b996013917fcc689d95e989f9b868c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:45:50 +0300 Subject: [PATCH 02/35] Bump webpack from 5.99.1 to 5.99.2 in the actions-deps group (#7101) Bumps the actions-deps group with 1 update: [webpack](https://github.com/webpack/webpack). Updates `webpack` from 5.99.1 to 5.99.2 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.99.1...v5.99.2) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.99.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: actions-deps ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From bf72affe8f5a954a773582c49af8bbf8a40f84a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 01:43:34 +0300 Subject: [PATCH 03/35] chore(deps): update dependency svelte to v5.25.9 (#7108) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> From dba7f2a11a041b0db582b5bd73e385716fb29f36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 04:17:25 +0300 Subject: [PATCH 04/35] build(deps): bump next from 15.4.2 to 15.4.3 (#7317) Bumps [next](https://github.com/vercel/next.js) from 15.4.2 to 15.4.3. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.3) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From c7d857064104f4fb1cb29eee009510a682c93e14 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Tue, 14 Oct 2025 17:26:03 +0200 Subject: [PATCH 05/35] feat(executor): add schema coordinates extension to graphql errors --- packages/executor/src/execution/execute.ts | 30 +++++++++---------- .../executor/src/execution/locatedError.ts | 14 +++++++++ packages/utils/src/errors.ts | 9 +++++- 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 packages/executor/src/execution/locatedError.ts diff --git a/packages/executor/src/execution/execute.ts b/packages/executor/src/execution/execute.ts index b05d5e60900..a545fde984a 100644 --- a/packages/executor/src/execution/execute.ts +++ b/packages/executor/src/execution/execute.ts @@ -21,7 +21,6 @@ import { isNonNullType, isObjectType, Kind, - locatedError, OperationDefinitionNode, SchemaMetaFieldDef, TypeMetaFieldDef, @@ -58,6 +57,7 @@ import { createDeferredPromise, handleMaybePromise } from '@whatwg-node/promise- import { coerceError } from './coerceError.js'; import { flattenAsyncIterable } from './flattenAsyncIterable.js'; import { invariant } from './invariant.js'; +import { locatedError } from './locatedError.js'; import { promiseForObject } from './promiseForObject.js'; import { getVariableValues } from './values.js'; @@ -746,14 +746,14 @@ function executeField( let result: unknown; for (let rawErrorItem of rawError.errors) { rawErrorItem = coerceError(rawErrorItem); - const error = locatedError(rawErrorItem, fieldNodes, pathToArray(path)); + const error = locatedError(rawErrorItem, fieldNodes, pathToArray(path), info); result = handleFieldError(error, returnType, errors); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); } return result; } rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(path)); + const error = locatedError(rawError, fieldNodes, pathToArray(path), info); const handledError = handleFieldError(error, returnType, errors); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); return handledError; @@ -765,14 +765,14 @@ function executeField( let result: unknown; for (let rawErrorItem of rawError.errors) { rawErrorItem = coerceError(rawErrorItem); - const error = locatedError(rawErrorItem, fieldNodes, pathToArray(path)); + const error = locatedError(rawErrorItem, fieldNodes, pathToArray(path), info); result = handleFieldError(error, returnType, errors); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); } return result; } const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(path)); + const error = locatedError(coercedError, fieldNodes, pathToArray(path), info); const handledError = handleFieldError(error, returnType, errors); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); return handledError; @@ -1041,7 +1041,7 @@ async function completeAsyncIteratorValue( } } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); completedResults.push(handleFieldError(error, itemType, errors)); break; } @@ -1201,7 +1201,7 @@ function completeListItemValue( completedResults.push( completedItem.then(undefined, rawError => { rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); const handledError = handleFieldError(error, itemType, errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -1214,7 +1214,7 @@ function completeListItemValue( completedResults.push(completedItem); } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); const handledError = handleFieldError(error, itemType, errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); completedResults.push(handledError); @@ -1789,13 +1789,13 @@ function executeSubscription(exeContext: ExecutionContext): MaybePromise assertEventStream(result, exeContext.signal, exeContext.onSignalAbort)) .then(undefined, error => { - throw locatedError(error, fieldNodes, pathToArray(path)); + throw locatedError(error, fieldNodes, pathToArray(path), info); }); } return assertEventStream(result, exeContext.signal, exeContext.onSignalAbort); } catch (error) { - throw locatedError(error, fieldNodes, pathToArray(path)); + throw locatedError(error, fieldNodes, pathToArray(path), info); } } @@ -1921,7 +1921,7 @@ function executeStreamField( // to take a second callback for the error case. completedItem = completedItem.then(undefined, rawError => { rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); const handledError = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -1929,7 +1929,7 @@ function executeStreamField( } } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); completedItem = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); } @@ -1977,7 +1977,7 @@ async function executeStreamIteratorItem( item = value; } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); // don't continue if iterator throws return { done: true, value }; @@ -1996,7 +1996,7 @@ async function executeStreamIteratorItem( if (isPromise(completedItem)) { completedItem = completedItem.then(undefined, rawError => { - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); const handledError = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -2004,7 +2004,7 @@ async function executeStreamIteratorItem( } return { done: false, value: completedItem }; } catch (rawError) { - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); + const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return { done: false, value }; diff --git a/packages/executor/src/execution/locatedError.ts b/packages/executor/src/execution/locatedError.ts new file mode 100644 index 00000000000..edd40019d6c --- /dev/null +++ b/packages/executor/src/execution/locatedError.ts @@ -0,0 +1,14 @@ +import type { ASTNode } from 'graphql'; +import { locatedError as _locatedError } from 'graphql/error/locatedError'; +import { GraphQLResolveInfo, Maybe } from '@graphql-tools/utils'; + +export function locatedError( + rawError: unknown, + nodes: ASTNode | ReadonlyArray | null | undefined, + path: Maybe>, + info: GraphQLResolveInfo, +) { + const error = _locatedError(rawError, nodes, path); + error.extensions['schemaCoordinates'] = `${info.parentType.name}.${info.fieldName}`; + return error; +} diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 61b26a10baa..d55580c52e2 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -1,4 +1,5 @@ import { ASTNode, GraphQLError, Source, versionInfo } from 'graphql'; +import { GraphQLResolveInfo } from './Interfaces.js'; import { Maybe } from './types.js'; interface GraphQLErrorOptions { @@ -63,6 +64,7 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption export function relocatedError( originalError: GraphQLError, path?: ReadonlyArray, + info?: Maybe, ): GraphQLError { return createGraphQLError(originalError.message, { nodes: originalError.nodes, @@ -70,6 +72,11 @@ export function relocatedError( positions: originalError.positions, path: path == null ? originalError.path : path, originalError, - extensions: originalError.extensions, + extensions: info + ? { + ...originalError.extensions, + schemaCoordinates: `${info.parentType.name}.${info.fieldName}`, + } + : originalError.extensions, }); } From 0f67a7b8444a72fb9f3cda9a34a4908519ac7475 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Thu, 16 Oct 2025 11:35:49 +0200 Subject: [PATCH 06/35] make error coordinate schema extension opt-in and non-serializable --- packages/executor/src/execution/execute.ts | 102 +++++++++++++++--- .../executor/src/execution/locatedError.ts | 14 --- .../src/execution/normalizedExecutor.ts | 1 + packages/utils/src/Interfaces.ts | 7 ++ packages/utils/src/errors.ts | 35 +++++- 5 files changed, 127 insertions(+), 32 deletions(-) delete mode 100644 packages/executor/src/execution/locatedError.ts diff --git a/packages/executor/src/execution/execute.ts b/packages/executor/src/execution/execute.ts index a545fde984a..75d91c1ce5e 100644 --- a/packages/executor/src/execution/execute.ts +++ b/packages/executor/src/execution/execute.ts @@ -127,6 +127,7 @@ export interface ExecutionContext { signal?: AbortSignal; onSignalAbort?(handler: () => void): void; signalPromise?: Promise; + schemaCoordinateInErrors?: boolean; } export interface FormattedExecutionResult< @@ -247,6 +248,7 @@ export interface ExecutionArgs { typeResolver?: Maybe>; subscribeFieldResolver?: Maybe>; signal?: AbortSignal; + schemaCoordinateInErrors?: boolean; } /** @@ -419,6 +421,7 @@ export function buildExecutionContext { rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const handledError = handleFieldError(error, itemType, errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -1214,7 +1248,12 @@ function completeListItemValue( completedResults.push(completedItem); } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + coercedError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const handledError = handleFieldError(error, itemType, errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); completedResults.push(handledError); @@ -1789,13 +1828,23 @@ function executeSubscription(exeContext: ExecutionContext): MaybePromise assertEventStream(result, exeContext.signal, exeContext.onSignalAbort)) .then(undefined, error => { - throw locatedError(error, fieldNodes, pathToArray(path), info); + throw locatedError( + error, + fieldNodes, + pathToArray(path), + exeContext.schemaCoordinateInErrors && info, + ); }); } return assertEventStream(result, exeContext.signal, exeContext.onSignalAbort); } catch (error) { - throw locatedError(error, fieldNodes, pathToArray(path), info); + throw locatedError( + error, + fieldNodes, + pathToArray(path), + exeContext.schemaCoordinateInErrors && info, + ); } } @@ -1921,7 +1970,12 @@ function executeStreamField( // to take a second callback for the error case. completedItem = completedItem.then(undefined, rawError => { rawError = coerceError(rawError); - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const handledError = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -1929,7 +1983,12 @@ function executeStreamField( } } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + coercedError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); completedItem = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); } @@ -1977,7 +2036,12 @@ async function executeStreamIteratorItem( item = value; } catch (rawError) { const coercedError = coerceError(rawError); - const error = locatedError(coercedError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + coercedError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); // don't continue if iterator throws return { done: true, value }; @@ -1996,7 +2060,12 @@ async function executeStreamIteratorItem( if (isPromise(completedItem)) { completedItem = completedItem.then(undefined, rawError => { - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const handledError = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return handledError; @@ -2004,7 +2073,12 @@ async function executeStreamIteratorItem( } return { done: false, value: completedItem }; } catch (rawError) { - const error = locatedError(rawError, fieldNodes, pathToArray(itemPath), info); + const error = locatedError( + rawError, + fieldNodes, + pathToArray(itemPath), + exeContext.schemaCoordinateInErrors && info, + ); const value = handleFieldError(error, itemType, asyncPayloadRecord.errors); filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); return { done: false, value }; diff --git a/packages/executor/src/execution/locatedError.ts b/packages/executor/src/execution/locatedError.ts deleted file mode 100644 index edd40019d6c..00000000000 --- a/packages/executor/src/execution/locatedError.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ASTNode } from 'graphql'; -import { locatedError as _locatedError } from 'graphql/error/locatedError'; -import { GraphQLResolveInfo, Maybe } from '@graphql-tools/utils'; - -export function locatedError( - rawError: unknown, - nodes: ASTNode | ReadonlyArray | null | undefined, - path: Maybe>, - info: GraphQLResolveInfo, -) { - const error = _locatedError(rawError, nodes, path); - error.extensions['schemaCoordinates'] = `${info.parentType.name}.${info.fieldName}`; - return error; -} diff --git a/packages/executor/src/execution/normalizedExecutor.ts b/packages/executor/src/execution/normalizedExecutor.ts index 3658d2e5514..2cdda0e2a76 100644 --- a/packages/executor/src/execution/normalizedExecutor.ts +++ b/packages/executor/src/execution/normalizedExecutor.ts @@ -49,6 +49,7 @@ export const executorFromSchema = memoize1(function executorFromSchema( rootValue: request.rootValue, contextValue: request.context, signal: request.signal || request.info?.signal, + schemaCoordinateInErrors: request.schemaCoordinateInErrors, }); }; }); diff --git a/packages/utils/src/Interfaces.ts b/packages/utils/src/Interfaces.ts index 1b77834df33..8e77616795a 100644 --- a/packages/utils/src/Interfaces.ts +++ b/packages/utils/src/Interfaces.ts @@ -93,6 +93,13 @@ export interface ExecutionRequest< subgraphName?: string; info?: GraphQLResolveInfo; signal?: AbortSignal; + /** + * Enable/Disable the addition of field schema coordinate in GraphQL Errors extension + * + * Note: Schema Coordinate are exposed using Symbol.for('schemaCoordinate') so that it's not + * serialized. Exposing schema coordinate can ease the discovery of private schemas. + */ + schemaCoordinateInErrors?: boolean; } // graphql-js non-exported typings diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index d55580c52e2..9dfd8946ec9 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -1,5 +1,4 @@ -import { ASTNode, GraphQLError, Source, versionInfo } from 'graphql'; -import { GraphQLResolveInfo } from './Interfaces.js'; +import { locatedError as _locatedError, ASTNode, GraphQLError, Source, versionInfo } from 'graphql'; import { Maybe } from './types.js'; interface GraphQLErrorOptions { @@ -61,12 +60,34 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption ); } +type SchemaCoordinateInfo = { fieldName: string; parentType: { name: string } }; +export const ERROR_EXTENSION_SCHEMA_COORDINATE = Symbol.for('graphql.error.schemaCoordinate'); +function addSchemaCoordinateToError(error: GraphQLError, info: SchemaCoordinateInfo): void { + // @ts-expect-error extensions can't be Symbol in official GraphQL Error type + error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE] = `${info.parentType.name}.${info.fieldName}`; +} + +export function locatedError( + rawError: unknown, + nodes: ASTNode | ReadonlyArray | null | undefined, + path: Maybe>, + info: SchemaCoordinateInfo | false | null | undefined, +) { + const error = _locatedError(rawError, nodes, path); + + if (info) { + addSchemaCoordinateToError(error, info); + } + + return error; +} + export function relocatedError( originalError: GraphQLError, path?: ReadonlyArray, - info?: Maybe, + info?: SchemaCoordinateInfo | false | null | undefined, ): GraphQLError { - return createGraphQLError(originalError.message, { + const error = createGraphQLError(originalError.message, { nodes: originalError.nodes, source: originalError.source, positions: originalError.positions, @@ -79,4 +100,10 @@ export function relocatedError( } : originalError.extensions, }); + + if (info) { + addSchemaCoordinateToError(error, info); + } + + return error; } From 91a9a5e4edf46b8bb2f740a2e6f5bda50dbd9cdd Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 10:57:45 +0100 Subject: [PATCH 07/35] fix import --- packages/executor/src/execution/execute.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/executor/src/execution/execute.ts b/packages/executor/src/execution/execute.ts index 75d91c1ce5e..2a10e0c1d28 100644 --- a/packages/executor/src/execution/execute.ts +++ b/packages/executor/src/execution/execute.ts @@ -42,6 +42,7 @@ import { isIterableObject, isObjectLike, isPromise, + locatedError, mapAsyncIterator, Maybe, MaybePromise, @@ -57,7 +58,6 @@ import { createDeferredPromise, handleMaybePromise } from '@whatwg-node/promise- import { coerceError } from './coerceError.js'; import { flattenAsyncIterable } from './flattenAsyncIterable.js'; import { invariant } from './invariant.js'; -import { locatedError } from './locatedError.js'; import { promiseForObject } from './promiseForObject.js'; import { getVariableValues } from './values.js'; From cafb4175dce554db1eed05385cf359e86e185d44 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 11:09:40 +0100 Subject: [PATCH 08/35] remove `null` for nodes --- packages/utils/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 9dfd8946ec9..807f2bf12b9 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -69,7 +69,7 @@ function addSchemaCoordinateToError(error: GraphQLError, info: SchemaCoordinateI export function locatedError( rawError: unknown, - nodes: ASTNode | ReadonlyArray | null | undefined, + nodes: ASTNode | ReadonlyArray | undefined, path: Maybe>, info: SchemaCoordinateInfo | false | null | undefined, ) { From 7922d3f3e2207ae961dc3f25fecc6de62dbfd37b Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 11:33:21 +0100 Subject: [PATCH 09/35] fix --- packages/utils/src/errors.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 807f2bf12b9..7d98dd8e7a8 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -93,12 +93,7 @@ export function relocatedError( positions: originalError.positions, path: path == null ? originalError.path : path, originalError, - extensions: info - ? { - ...originalError.extensions, - schemaCoordinates: `${info.parentType.name}.${info.fieldName}`, - } - : originalError.extensions, + extensions: originalError.extensions, }); if (info) { From ce2817a7a0e45d372e5ee9302504c29b0307e59f Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 13:50:30 +0100 Subject: [PATCH 10/35] add changeset --- .changeset/floppy-women-poke.md | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .changeset/floppy-women-poke.md diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md new file mode 100644 index 00000000000..4c756db552f --- /dev/null +++ b/.changeset/floppy-women-poke.md @@ -0,0 +1,37 @@ +--- +'@graphql-tools/executor': minor +--- + +Add optional schema coordinate in error extensions. This extension allows to precisely identify the +source of the error by automated tools like tracing or monitoring. + +This new feature is opt-in, you have to enable it using `schemaCoordinateInErrors` executor option. + +To avoid leaking schema information to the client, the extension key is a `Symbol` (which is not serializable). +To forward it to the client, copy it to a custom extension with a serializable key. + +```ts +import { ERROR_EXTENSION_SCHEMA_COORDINATE } from '@graphql-tools/utils' +import { normalizedExecutor } from '@graphql-tools/executor' +import { parse } from 'graphql' +import schema from './schema' + +// You can also use `Symbol.for('graphql.error.schemaCoordinate')` to get the symbol if you don't +// want to depend on `@graphql-tools/utils` + +const result = await normalizedExecutor({ + schema, + document: parse(gql`...`), + schemaCoordinateInErrors: true, // enable adding schema coordinate to graphql errors +}); + +if (result.errors) { + for (error of result.errors) { + console.log( + 'Error in resolver ', + error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE], ':', + error.message + ) + } +} +``` From 6bc6c4f345db94ef49a6842e021fa94ad74cb687 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 14:08:43 +0100 Subject: [PATCH 11/35] try fix CI snapshot message --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 154ec3ac119..ab4997e67a0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -19,6 +19,7 @@ jobs: permissions: contents: read id-token: write + pull-requests: write uses: the-guild-org/shared-config/.github/workflows/release-snapshot.yml@v1 if: ${{ github.event.pull_request.title != 'Upcoming Release Changes' }} with: From e38dabd5cd8c78a6ec62429e765f3a5a1a80fc8a Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 17:26:04 +0100 Subject: [PATCH 12/35] export getter --- .changeset/floppy-women-poke.md | 4 +-- package-lock.json | 46 ++------------------------------- packages/utils/src/errors.ts | 5 ++++ 3 files changed, 9 insertions(+), 46 deletions(-) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index 4c756db552f..e40fcca654c 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -11,7 +11,7 @@ To avoid leaking schema information to the client, the extension key is a `Symbo To forward it to the client, copy it to a custom extension with a serializable key. ```ts -import { ERROR_EXTENSION_SCHEMA_COORDINATE } from '@graphql-tools/utils' +import { getSchemaCoordinate } from '@graphql-tools/utils' import { normalizedExecutor } from '@graphql-tools/executor' import { parse } from 'graphql' import schema from './schema' @@ -29,7 +29,7 @@ if (result.errors) { for (error of result.errors) { console.log( 'Error in resolver ', - error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE], ':', + getSchemaCoordinate(error), ':', error.message ) } diff --git a/package-lock.json b/package-lock.json index 77e3fe3a243..5a5be3456ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -123,7 +123,6 @@ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.0.9.tgz", "integrity": "sha512-Lh2drMzFE9x5jVS8RKmlGL5SORkvpyUJIT+wTErxDUR2HpWePiBfhhcHHRSlZFiCR866ewCv4euTc4IDF0GWxw==", "license": "MIT", - "peer": true, "workspaces": [ "dist", "codegen", @@ -190,8 +189,7 @@ "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@babel/code-frame": { "version": "7.27.1", @@ -221,7 +219,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2591,7 +2588,6 @@ "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.4.0.tgz", "integrity": "sha512-/1fat63pySE8rw/dZZArEVytLD90JApY85deDJ0/34gm+yhQ3k70CloSUevxoOE4YCGveG3s9SJJfQeeB4NAtQ==", "license": "MIT", - "peer": true, "dependencies": { "@envelop/instrumentation": "^1.0.0", "@envelop/types": "^5.2.1", @@ -6703,7 +6699,6 @@ "resolved": "https://registry.npmjs.org/@theguild/tailwind-config/-/tailwind-config-0.6.4.tgz", "integrity": "sha512-7zscZk+L9x0Z8tMQGtVBC+1usAJ6Nz7hJYCmKzwXyMA4paXr/ghCeMArF9hkIkBp/GH+gKpR+ERaHwmqmvqfVg==", "license": "MIT", - "peer": true, "dependencies": { "@tailwindcss/container-queries": "^0.1.1" }, @@ -7138,7 +7133,6 @@ "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -7360,7 +7354,6 @@ "integrity": "sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -7525,7 +7518,6 @@ "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.4", "@typescript-eslint/types": "8.46.4", @@ -8438,7 +8430,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -9554,7 +9545,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -9860,7 +9850,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -10597,7 +10586,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -11019,7 +11007,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -11410,8 +11397,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", "integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/didyoumean": { "version": "1.2.2", @@ -11919,7 +11905,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -12127,7 +12112,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -12196,7 +12180,6 @@ "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", @@ -12260,7 +12243,6 @@ "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, @@ -13622,7 +13604,6 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -13759,7 +13740,6 @@ "integrity": "sha512-heaD8ejapeEZ8+8CxB6DbYzkvMfC4gHEXr1Gc2CQCXEb5PVaDcEnQfiThBNic1KLPpuZixqQdJJ0pjcEVc9H7g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@envelop/core": "^5.3.0", "@envelop/instrumentation": "^1.0.0", @@ -15255,7 +15235,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -16030,7 +16009,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -19085,7 +19063,6 @@ "resolved": "https://registry.npmjs.org/next/-/next-15.5.6.tgz", "integrity": "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==", "license": "MIT", - "peer": true, "dependencies": { "@next/env": "15.5.6", "@swc/helpers": "0.5.15", @@ -19317,7 +19294,6 @@ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", "license": "MIT", - "peer": true, "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", @@ -20270,7 +20246,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -20285,7 +20260,6 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.1.tgz", "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", "license": "MIT", - "peer": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -20328,7 +20302,6 @@ "resolved": "https://registry.npmjs.org/postcss-lightningcss/-/postcss-lightningcss-1.0.2.tgz", "integrity": "sha512-jI9gBe/2/ZEDYGDAHEHKbGLA3Dfn2uUTUCVsP3mDxpvmX6ifDdFqYB00GNRdny676gTcfo7XUCQoc4OYz20/TA==", "license": "MIT", - "peer": true, "dependencies": { "browserslist": "^4.19.1", "lightningcss": "^1.22.0" @@ -20442,7 +20415,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -20865,7 +20837,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -20884,7 +20855,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -21861,7 +21831,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -21980,7 +21949,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -23027,7 +22995,6 @@ "integrity": "sha512-RnyO9VXI85Bmsf4b8AuQFBKFYL3LKUl+ZrifOjvlrQoboAROj5IITVLK1yOXBjwUWUn2BI5cfmurktgCzuZ5QA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -23163,7 +23130,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -23776,7 +23742,6 @@ "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -23952,7 +23917,6 @@ "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "lunr": "^2.3.9", "marked": "^4.3.0", @@ -24026,7 +23990,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24122,7 +24085,6 @@ "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pathe": "^2.0.3" } @@ -24694,7 +24656,6 @@ "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -25016,7 +24977,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "bin": { "workerd": "bin/workerd" }, @@ -25678,7 +25638,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -25844,7 +25803,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 7d98dd8e7a8..02b686accb5 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -67,6 +67,11 @@ function addSchemaCoordinateToError(error: GraphQLError, info: SchemaCoordinateI error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE] = `${info.parentType.name}.${info.fieldName}`; } +export function getSchemaCoordinate(error: GraphQLError): string | undefined { + // @ts-expect-error extensions can't be Symbol in official GraphQL Error type + return error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE]; +} + export function locatedError( rawError: unknown, nodes: ASTNode | ReadonlyArray | undefined, From fb45070596a71e44c25d115c7b0b09ed37c10f2e Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 27 Oct 2025 17:29:39 +0100 Subject: [PATCH 13/35] fix example --- .changeset/floppy-women-poke.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index e40fcca654c..588e4559596 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -26,7 +26,7 @@ const result = await normalizedExecutor({ }); if (result.errors) { - for (error of result.errors) { + for (const error of result.errors) { console.log( 'Error in resolver ', getSchemaCoordinate(error), ':', From 0fe02b795a3d50432f80125bc31cb216612dd6b3 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Tue, 28 Oct 2025 21:23:36 +0100 Subject: [PATCH 14/35] update tests --- .../utils/tests/createGraphQLError.test.ts | 19 ----- packages/utils/tests/errors.test.ts | 81 +++++++++++++++++++ packages/utils/tests/relocatedError.test.ts | 16 ---- 3 files changed, 81 insertions(+), 35 deletions(-) delete mode 100644 packages/utils/tests/createGraphQLError.test.ts create mode 100644 packages/utils/tests/errors.test.ts delete mode 100644 packages/utils/tests/relocatedError.test.ts diff --git a/packages/utils/tests/createGraphQLError.test.ts b/packages/utils/tests/createGraphQLError.test.ts deleted file mode 100644 index e8581da03cf..00000000000 --- a/packages/utils/tests/createGraphQLError.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -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' }, - }, - }); -}); diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts new file mode 100644 index 00000000000..c72cfac5272 --- /dev/null +++ b/packages/utils/tests/errors.test.ts @@ -0,0 +1,81 @@ +import { ASTNode, GraphQLError, Kind, versionInfo } from 'graphql'; +import { + createGraphQLError, + ERROR_EXTENSION_SCHEMA_COORDINATE, + locatedError, + relocatedError, +} from '../src/errors'; + +describe('Errors', () => { + describe('relocatedError', () => { + it('should adjust the path of a GraphqlError', () => { + const originalError = createGraphQLError('test', { + path: ['test'], + extensions: { + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }, + }); + const newError = relocatedError(originalError, ['test', 1, 'id'], { + fieldName: 'id', + parentType: { name: 'Test' }, + }); + const expectedError = createGraphQLError('test', { + path: ['test', 1, 'id'], + extensions: { + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }, + }); + expect(newError).toEqual(expectedError); + }); + }); + + describe('locatedError', () => { + it('should add path, nodes and coordinate to error', () => { + const originalError = createGraphQLError('test'); + const nodes: ASTNode[] = [{ kind: Kind.DOCUMENT, definitions: [] }]; + const error = locatedError(originalError, nodes, ['test'], { + fieldName: 'test', + parentType: { name: 'Query' }, + }); + expect(error.nodes).toBe(nodes); + expect(error.path).toEqual(['test']); + if (versionInfo.major !== 16) { + expect(error.extensions).toEqual({ + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }); + } + }); + }); + + describe('createGraphQLError', () => { + 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' }, + }, + }); + }); + + it('should handle coordinate', () => { + if (versionInfo.major !== 16) { + const error = createGraphQLError('message', { + extensions: { + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }, + }); + expect(error.extensions).toMatchObject({ + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }); + } + }); + }); +}); diff --git a/packages/utils/tests/relocatedError.test.ts b/packages/utils/tests/relocatedError.test.ts deleted file mode 100644 index 383922a40f3..00000000000 --- a/packages/utils/tests/relocatedError.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { createGraphQLError, relocatedError } from '../src/errors.js'; - -describe('Errors', () => { - describe('relocatedError', () => { - test('should adjust the path of a GraphqlError', () => { - const originalError = createGraphQLError('test', { - path: ['test'], - }); - const newError = relocatedError(originalError, ['test', 1]); - const expectedError = createGraphQLError('test', { - path: ['test', 1], - }); - expect(newError).toEqual(expectedError); - }); - }); -}); From bfe3e422ecd32dda1d5d22f41af4795d799fb653 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Tue, 28 Oct 2025 22:03:43 +0100 Subject: [PATCH 15/35] remove version guards in tests --- packages/utils/tests/errors.test.ts | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index c72cfac5272..d72892ead31 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -1,4 +1,4 @@ -import { ASTNode, GraphQLError, Kind, versionInfo } from 'graphql'; +import { ASTNode, GraphQLError, Kind } from 'graphql'; import { createGraphQLError, ERROR_EXTENSION_SCHEMA_COORDINATE, @@ -39,11 +39,9 @@ describe('Errors', () => { }); expect(error.nodes).toBe(nodes); expect(error.path).toEqual(['test']); - if (versionInfo.major !== 16) { - expect(error.extensions).toEqual({ - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }); - } + expect(error.extensions).toEqual({ + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }); }); }); @@ -66,16 +64,14 @@ describe('Errors', () => { }); it('should handle coordinate', () => { - if (versionInfo.major !== 16) { - const error = createGraphQLError('message', { - extensions: { - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }, - }); - expect(error.extensions).toMatchObject({ + const error = createGraphQLError('message', { + extensions: { [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }); - } + }, + }); + expect(error.extensions).toMatchObject({ + [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + }); }); }); }); From 37d8ddfb159b7a6e582c0fe1c6721f829bdc3e45 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 31 Oct 2025 18:47:09 +0100 Subject: [PATCH 16/35] fix tests for Bun --- packages/utils/tests/errors.test.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index d72892ead31..b18ac05fd7e 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -2,6 +2,7 @@ import { ASTNode, GraphQLError, Kind } from 'graphql'; import { createGraphQLError, ERROR_EXTENSION_SCHEMA_COORDINATE, + getSchemaCoordinate, locatedError, relocatedError, } from '../src/errors'; @@ -19,13 +20,7 @@ describe('Errors', () => { fieldName: 'id', parentType: { name: 'Test' }, }); - const expectedError = createGraphQLError('test', { - path: ['test', 1, 'id'], - extensions: { - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }, - }); - expect(newError).toEqual(expectedError); + expect(getSchemaCoordinate(newError)).toEqual('Test.id'); }); }); From 751f280126a086160c31cb45b8207875b5636fb8 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 10 Nov 2025 16:34:41 +0100 Subject: [PATCH 17/35] use `coordinate` instead of extensions --- packages/utils/src/errors.ts | 90 ++++++++++++++++++++++------- packages/utils/tests/errors.test.ts | 26 ++++++--- 2 files changed, 86 insertions(+), 30 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 02b686accb5..c4a5e29edd7 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -1,4 +1,11 @@ -import { locatedError as _locatedError, ASTNode, GraphQLError, Source, versionInfo } from 'graphql'; +import { + GraphQLError as _GraphQLError, + locatedError as _locatedError, + ASTNode, + GraphQLErrorExtensions, + Source, + versionInfo, +} from 'graphql'; import { Maybe } from './types.js'; interface GraphQLErrorOptions { @@ -12,6 +19,7 @@ interface GraphQLErrorOptions { } >; extensions?: any; + coordinate?: string; } const possibleGraphQLErrorProperties = [ @@ -25,9 +33,57 @@ const possibleGraphQLErrorProperties = [ 'name', 'stack', 'extensions', + 'coordinate', ]; -function isGraphQLErrorLike(error: any) { +function toNormalizedOptions(args: any): GraphQLErrorOptions { + const firstArg = args[0]; + + if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { + return { + nodes: firstArg, + source: args[1], + positions: args[2], + path: args[3], + originalError: args[4], + extensions: args[5], + coordinate: args[6], + }; + } + + return firstArg; +} + +export class GraphQLError extends _GraphQLError { + readonly coordinate?: string; + + constructor(message: string, options?: Maybe); + /** + * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. + */ + constructor( + message: string, + nodes?: ReadonlyArray | ASTNode | null, + source?: Maybe, + positions?: Maybe>, + path?: Maybe>, + originalError?: Maybe< + Error & { + readonly extensions?: unknown; + } + >, + extensions?: Maybe, + coordinate?: Maybe, + ); + + constructor(message: string, ...args: any) { + const options = toNormalizedOptions(args); + super(message, ...args); + this.coordinate = options.coordinate; + } +} + +export function isGraphQLErrorLike(error: any) { return ( error != null && typeof error === 'object' && @@ -46,7 +102,7 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption options.originalError, ); } - if (versionInfo.major >= 17) { + if (versionInfo.major >= 16) { return new (GraphQLError as any)(message, options); } return new (GraphQLError as any)( @@ -57,19 +113,14 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption options?.path, options?.originalError, options?.extensions, + options?.coordinate, ); } type SchemaCoordinateInfo = { fieldName: string; parentType: { name: string } }; -export const ERROR_EXTENSION_SCHEMA_COORDINATE = Symbol.for('graphql.error.schemaCoordinate'); -function addSchemaCoordinateToError(error: GraphQLError, info: SchemaCoordinateInfo): void { - // @ts-expect-error extensions can't be Symbol in official GraphQL Error type - error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE] = `${info.parentType.name}.${info.fieldName}`; -} export function getSchemaCoordinate(error: GraphQLError): string | undefined { - // @ts-expect-error extensions can't be Symbol in official GraphQL Error type - return error.extensions[ERROR_EXTENSION_SCHEMA_COORDINATE]; + return error.coordinate; } export function locatedError( @@ -77,11 +128,13 @@ export function locatedError( nodes: ASTNode | ReadonlyArray | undefined, path: Maybe>, info: SchemaCoordinateInfo | false | null | undefined, -) { - const error = _locatedError(rawError, nodes, path); +): GraphQLError { + const error = _locatedError(rawError, nodes, path) as GraphQLError; - if (info) { - addSchemaCoordinateToError(error, info); + // `graphql` locatedError is only changing path and nodes if it is not already defined + if (!error.coordinate && info) { + // @ts-expect-error coordinate is readonly, but we don't want to recreate it just to add coordinate + error.coordinate = `${info.parentType.name}.${info.fieldName}`; } return error; @@ -92,18 +145,13 @@ export function relocatedError( path?: ReadonlyArray, info?: SchemaCoordinateInfo | false | null | undefined, ): GraphQLError { - const error = createGraphQLError(originalError.message, { + return createGraphQLError(originalError.message, { nodes: originalError.nodes, source: originalError.source, positions: originalError.positions, path: path == null ? originalError.path : path, originalError, extensions: originalError.extensions, + coordinate: info ? `${info.parentType.name}.${info.fieldName}` : undefined, }); - - if (info) { - addSchemaCoordinateToError(error, info); - } - - return error; } diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index b18ac05fd7e..232abf4a0e4 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -1,7 +1,6 @@ import { ASTNode, GraphQLError, Kind } from 'graphql'; import { createGraphQLError, - ERROR_EXTENSION_SCHEMA_COORDINATE, getSchemaCoordinate, locatedError, relocatedError, @@ -12,9 +11,7 @@ describe('Errors', () => { it('should adjust the path of a GraphqlError', () => { const originalError = createGraphQLError('test', { path: ['test'], - extensions: { - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }, + coordinate: 'Query.test', }); const newError = relocatedError(originalError, ['test', 1, 'id'], { fieldName: 'id', @@ -34,9 +31,20 @@ describe('Errors', () => { }); expect(error.nodes).toBe(nodes); expect(error.path).toEqual(['test']); - expect(error.extensions).toEqual({ - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', - }); + expect(error.coordinate).toEqual('Query.test'); + }); + }); + + describe('getSchemaCoordinate', () => { + it('should always return the schema coordinate, even when typed as original graphql error', () => { + const error = new GraphQLError('test'); + expect(getSchemaCoordinate(error)).toBe(undefined); + // @ts-expect-error coordinate doesn't exists in `graphql` yet. + error.coordinate = 'Query.test'; + expect(getSchemaCoordinate(error)).toBe('Query.test'); + expect(createGraphQLError('test', { coordinate: 'Query.test' }).coordinate).toBe( + 'Query.test', + ); }); }); @@ -61,11 +69,11 @@ describe('Errors', () => { it('should handle coordinate', () => { const error = createGraphQLError('message', { extensions: { - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + coordinate: 'Query.test', }, }); expect(error.extensions).toMatchObject({ - [ERROR_EXTENSION_SCHEMA_COORDINATE]: 'Query.test', + coordinate: 'Query.test', }); }); }); From 7c9f1fc14f6c2e30954702865a83920608889fb7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 10 Nov 2025 15:35:12 +0000 Subject: [PATCH 18/35] chore(dependencies): updated changesets for modified dependencies --- ...raphql-tools_apollo-engine-loader-7588-dependencies.md | 5 +++++ .../@graphql-tools_code-file-loader-7588-dependencies.md | 6 ++++++ .changeset/@graphql-tools_executor-7588-dependencies.md | 5 +++++ ...raphql-tools_executor-apollo-link-7588-dependencies.md | 5 +++++ .../@graphql-tools_executor-envelop-7588-dependencies.md | 5 +++++ ...@graphql-tools_executor-legacy-ws-7588-dependencies.md | 5 +++++ ...phql-tools_executor-urql-exchange-7588-dependencies.md | 5 +++++ .../@graphql-tools_executor-yoga-7588-dependencies.md | 6 ++++++ .changeset/@graphql-tools_git-loader-7588-dependencies.md | 6 ++++++ .../@graphql-tools_github-loader-7588-dependencies.md | 7 +++++++ ...graphql-tools_graphql-file-loader-7588-dependencies.md | 6 ++++++ .../@graphql-tools_graphql-tag-pluck-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_import-7588-dependencies.md | 5 +++++ .../@graphql-tools_json-file-loader-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_links-7588-dependencies.md | 6 ++++++ .changeset/@graphql-tools_load-7588-dependencies.md | 6 ++++++ .changeset/@graphql-tools_merge-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_mock-7588-dependencies.md | 6 ++++++ .../@graphql-tools_module-loader-7588-dependencies.md | 5 +++++ .../@graphql-tools_node-require-7588-dependencies.md | 7 +++++++ ...l-tools_relay-operation-optimizer-7588-dependencies.md | 5 +++++ ...aphql-tools_resolvers-composition-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_schema-7588-dependencies.md | 6 ++++++ .changeset/@graphql-tools_url-loader-7588-dependencies.md | 8 ++++++++ .changeset/graphql-tools-7588-dependencies.md | 5 +++++ 25 files changed, 140 insertions(+) create mode 100644 .changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_code-file-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-envelop-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_executor-yoga-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_git-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_github-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_import-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_json-file-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_links-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_load-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_merge-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_mock-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_module-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_node-require-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_resolvers-composition-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_schema-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_url-loader-7588-dependencies.md create mode 100644 .changeset/graphql-tools-7588-dependencies.md diff --git a/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md b/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md new file mode 100644 index 00000000000..5e87824f617 --- /dev/null +++ b/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/apollo-engine-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md new file mode 100644 index 00000000000..86a89ed5c6e --- /dev/null +++ b/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/code-file-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-7588-dependencies.md b/.changeset/@graphql-tools_executor-7588-dependencies.md new file mode 100644 index 00000000000..9395d1db85a --- /dev/null +++ b/.changeset/@graphql-tools_executor-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/executor": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md b/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md new file mode 100644 index 00000000000..871e47a2cf2 --- /dev/null +++ b/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/executor-apollo-link": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md b/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md new file mode 100644 index 00000000000..11b14283151 --- /dev/null +++ b/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/executor-envelop": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md b/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md new file mode 100644 index 00000000000..5a024afbf0d --- /dev/null +++ b/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/executor-legacy-ws": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md b/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md new file mode 100644 index 00000000000..a43ba73f8e0 --- /dev/null +++ b/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/executor-urql-exchange": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md b/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md new file mode 100644 index 00000000000..f518ba20ed8 --- /dev/null +++ b/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/executor-yoga": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/executor-envelop@^4.0.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-envelop/v/4.0.2) (from `^4.0.1`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_git-loader-7588-dependencies.md b/.changeset/@graphql-tools_git-loader-7588-dependencies.md new file mode 100644 index 00000000000..f152d9de18d --- /dev/null +++ b/.changeset/@graphql-tools_git-loader-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/git-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_github-loader-7588-dependencies.md b/.changeset/@graphql-tools_github-loader-7588-dependencies.md new file mode 100644 index 00000000000..c0f4d0b9cee --- /dev/null +++ b/.changeset/@graphql-tools_github-loader-7588-dependencies.md @@ -0,0 +1,7 @@ +--- +"@graphql-tools/github-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) + - Updated dependency [`@graphql-tools/graphql-tag-pluck@^8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `^8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md new file mode 100644 index 00000000000..7d30241646e --- /dev/null +++ b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/graphql-file-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/import@7.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/import/v/7.1.4) (from `7.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md b/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md new file mode 100644 index 00000000000..fd9280257b8 --- /dev/null +++ b/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/graphql-tag-pluck": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_import-7588-dependencies.md b/.changeset/@graphql-tools_import-7588-dependencies.md new file mode 100644 index 00000000000..62bed57bf30 --- /dev/null +++ b/.changeset/@graphql-tools_import-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/import": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md new file mode 100644 index 00000000000..a09eb75101c --- /dev/null +++ b/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/json-file-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_links-7588-dependencies.md b/.changeset/@graphql-tools_links-7588-dependencies.md new file mode 100644 index 00000000000..eadabdf8b07 --- /dev/null +++ b/.changeset/@graphql-tools_links-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/links": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/delegate@^11.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/delegate/v/11.1.2) (from `^11.1.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_load-7588-dependencies.md b/.changeset/@graphql-tools_load-7588-dependencies.md new file mode 100644 index 00000000000..415f02954f6 --- /dev/null +++ b/.changeset/@graphql-tools_load-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/load": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_merge-7588-dependencies.md b/.changeset/@graphql-tools_merge-7588-dependencies.md new file mode 100644 index 00000000000..fe088af0547 --- /dev/null +++ b/.changeset/@graphql-tools_merge-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/merge": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_mock-7588-dependencies.md b/.changeset/@graphql-tools_mock-7588-dependencies.md new file mode 100644 index 00000000000..8e079d557ef --- /dev/null +++ b/.changeset/@graphql-tools_mock-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/mock": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_module-loader-7588-dependencies.md b/.changeset/@graphql-tools_module-loader-7588-dependencies.md new file mode 100644 index 00000000000..59d7e3e0bf3 --- /dev/null +++ b/.changeset/@graphql-tools_module-loader-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/module-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_node-require-7588-dependencies.md b/.changeset/@graphql-tools_node-require-7588-dependencies.md new file mode 100644 index 00000000000..acd9c4c8e7c --- /dev/null +++ b/.changeset/@graphql-tools_node-require-7588-dependencies.md @@ -0,0 +1,7 @@ +--- +"@graphql-tools/node-require": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/graphql-file-loader@8.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.4) (from `8.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/load@8.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.1.4) (from `8.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md b/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md new file mode 100644 index 00000000000..cec8ed52b06 --- /dev/null +++ b/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/relay-operation-optimizer": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md b/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md new file mode 100644 index 00000000000..c79bc876773 --- /dev/null +++ b/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/resolvers-composition": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_schema-7588-dependencies.md b/.changeset/@graphql-tools_schema-7588-dependencies.md new file mode 100644 index 00000000000..86d9efd323d --- /dev/null +++ b/.changeset/@graphql-tools_schema-7588-dependencies.md @@ -0,0 +1,6 @@ +--- +"@graphql-tools/schema": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/merge@^9.1.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/merge/v/9.1.3) (from `^9.1.2`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_url-loader-7588-dependencies.md b/.changeset/@graphql-tools_url-loader-7588-dependencies.md new file mode 100644 index 00000000000..a4105bc8262 --- /dev/null +++ b/.changeset/@graphql-tools_url-loader-7588-dependencies.md @@ -0,0 +1,8 @@ +--- +"@graphql-tools/url-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/executor-graphql-ws@^3.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-graphql-ws/v/3.1.2) (from `^3.1.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) + - Updated dependency [`@graphql-tools/executor-legacy-ws@^1.1.21` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-legacy-ws/v/1.1.21) (from `^1.1.20`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/graphql-tools-7588-dependencies.md b/.changeset/graphql-tools-7588-dependencies.md new file mode 100644 index 00000000000..8816aafb17e --- /dev/null +++ b/.changeset/graphql-tools-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"graphql-tools": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) From 5663c9bdfb8afbe8c49cc65279af931bbfa28e57 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 10 Nov 2025 17:04:46 +0100 Subject: [PATCH 19/35] do not care about graphql 15 --- packages/utils/src/errors.ts | 3 --- packages/utils/tests/errors.test.ts | 15 ++++++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index c4a5e29edd7..ba7d7e68784 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -47,7 +47,6 @@ function toNormalizedOptions(args: any): GraphQLErrorOptions { path: args[3], originalError: args[4], extensions: args[5], - coordinate: args[6], }; } @@ -73,7 +72,6 @@ export class GraphQLError extends _GraphQLError { } >, extensions?: Maybe, - coordinate?: Maybe, ); constructor(message: string, ...args: any) { @@ -113,7 +111,6 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption options?.path, options?.originalError, options?.extensions, - options?.coordinate, ); } diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index 232abf4a0e4..56b6e80486d 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -1,4 +1,5 @@ -import { ASTNode, GraphQLError, Kind } from 'graphql'; +import { ASTNode, GraphQLError, Kind, versionInfo } from 'graphql'; +import { describeIf, testIf } from '../../../packages/testing/utils'; import { createGraphQLError, getSchemaCoordinate, @@ -17,7 +18,9 @@ describe('Errors', () => { fieldName: 'id', parentType: { name: 'Test' }, }); - expect(getSchemaCoordinate(newError)).toEqual('Test.id'); + if (versionInfo.major >= 16) { + expect(getSchemaCoordinate(newError)).toEqual('Test.id'); + } }); }); @@ -31,11 +34,13 @@ describe('Errors', () => { }); expect(error.nodes).toBe(nodes); expect(error.path).toEqual(['test']); - expect(error.coordinate).toEqual('Query.test'); + if (versionInfo.major >= 16) { + expect(error.coordinate).toEqual('Query.test'); + } }); }); - describe('getSchemaCoordinate', () => { + describeIf(versionInfo.major >= 16)('getSchemaCoordinate', () => { it('should always return the schema coordinate, even when typed as original graphql error', () => { const error = new GraphQLError('test'); expect(getSchemaCoordinate(error)).toBe(undefined); @@ -66,7 +71,7 @@ describe('Errors', () => { }); }); - it('should handle coordinate', () => { + testIf(versionInfo.major >= 16)('should handle coordinate', () => { const error = createGraphQLError('message', { extensions: { coordinate: 'Query.test', From 748556ad6ee2ac7cc1855027ce5475917553f7cc Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 10 Nov 2025 17:41:44 +0100 Subject: [PATCH 20/35] update changeset --- .changeset/floppy-women-poke.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index 588e4559596..65eb2d61dea 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -1,5 +1,6 @@ --- '@graphql-tools/executor': minor +'@graphql-tools/utils': minor --- Add optional schema coordinate in error extensions. This extension allows to precisely identify the @@ -7,13 +8,12 @@ source of the error by automated tools like tracing or monitoring. This new feature is opt-in, you have to enable it using `schemaCoordinateInErrors` executor option. -To avoid leaking schema information to the client, the extension key is a `Symbol` (which is not serializable). -To forward it to the client, copy it to a custom extension with a serializable key. +To avoid leaking schema information to the client, the extension key is a `Symbol` (which is not +serializable). To forward it to the client, copy it to a custom extension with a serializable key. ```ts -import { getSchemaCoordinate } from '@graphql-tools/utils' -import { normalizedExecutor } from '@graphql-tools/executor' import { parse } from 'graphql' +import { normalizedExecutor } from '@graphql-tools/executor' import schema from './schema' // You can also use `Symbol.for('graphql.error.schemaCoordinate')` to get the symbol if you don't @@ -22,16 +22,12 @@ import schema from './schema' const result = await normalizedExecutor({ schema, document: parse(gql`...`), - schemaCoordinateInErrors: true, // enable adding schema coordinate to graphql errors -}); + schemaCoordinateInErrors: true // enable adding schema coordinate to graphql errors +}) if (result.errors) { for (const error of result.errors) { - console.log( - 'Error in resolver ', - getSchemaCoordinate(error), ':', - error.message - ) + console.log('Error in resolver ', error.coordinate, ':', error.message) } } ``` From 0fbfc4dfaada2dbd1997ffc2cdaa5413ab1139cf Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Thu, 13 Nov 2025 16:14:04 +0100 Subject: [PATCH 21/35] do not use class --- packages/utils/src/errors.ts | 98 +++++++++++++----------------------- 1 file changed, 34 insertions(+), 64 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index ba7d7e68784..fd3e5246f67 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -1,11 +1,4 @@ -import { - GraphQLError as _GraphQLError, - locatedError as _locatedError, - ASTNode, - GraphQLErrorExtensions, - Source, - versionInfo, -} from 'graphql'; +import { locatedError as _locatedError, ASTNode, GraphQLError, Source, versionInfo } from 'graphql'; import { Maybe } from './types.js'; interface GraphQLErrorOptions { @@ -22,6 +15,15 @@ interface GraphQLErrorOptions { coordinate?: string; } +declare module 'graphql' { + interface GraphQLError { + /** + * An optional schema coordinate (e.g. "MyType.myField") associated with this error. + */ + readonly coordinate?: string; + } +} + const possibleGraphQLErrorProperties = [ 'message', 'locations', @@ -36,51 +38,6 @@ const possibleGraphQLErrorProperties = [ 'coordinate', ]; -function toNormalizedOptions(args: any): GraphQLErrorOptions { - const firstArg = args[0]; - - if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { - return { - nodes: firstArg, - source: args[1], - positions: args[2], - path: args[3], - originalError: args[4], - extensions: args[5], - }; - } - - return firstArg; -} - -export class GraphQLError extends _GraphQLError { - readonly coordinate?: string; - - constructor(message: string, options?: Maybe); - /** - * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. - */ - constructor( - message: string, - nodes?: ReadonlyArray | ASTNode | null, - source?: Maybe, - positions?: Maybe>, - path?: Maybe>, - originalError?: Maybe< - Error & { - readonly extensions?: unknown; - } - >, - extensions?: Maybe, - ); - - constructor(message: string, ...args: any) { - const options = toNormalizedOptions(args); - super(message, ...args); - this.coordinate = options.coordinate; - } -} - export function isGraphQLErrorLike(error: any) { return ( error != null && @@ -100,18 +57,31 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption options.originalError, ); } - if (versionInfo.major >= 16) { - return new (GraphQLError as any)(message, options); + + // To avoid type error on graphql <16, we have to use an any type here + const Constructor = GraphQLError as any; + const error: GraphQLError = + versionInfo.major >= 16 + ? new Constructor(message, options) + : new Constructor( + message, + options?.nodes, + options?.source, + options?.positions, + options?.path, + options?.originalError, + options?.extensions, + ); + + if (options?.coordinate) { + Object.defineProperty(error, 'coordinate', { + value: options.coordinate, + enumerable: true, + configurable: true, + }); } - return new (GraphQLError as any)( - message, - options?.nodes, - options?.source, - options?.positions, - options?.path, - options?.originalError, - options?.extensions, - ); + + return error; } type SchemaCoordinateInfo = { fieldName: string; parentType: { name: string } }; From b9286d73779be5d0d5e145e7c51b1a280d49ae1d Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Thu, 13 Nov 2025 16:32:46 +0100 Subject: [PATCH 22/35] add executor tests for error coordinates --- .../src/execution/__tests__/executor-test.ts | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/packages/executor/src/execution/__tests__/executor-test.ts b/packages/executor/src/execution/__tests__/executor-test.ts index 80d79c74e1b..7df74a0ed5b 100644 --- a/packages/executor/src/execution/__tests__/executor-test.ts +++ b/packages/executor/src/execution/__tests__/executor-test.ts @@ -1271,4 +1271,92 @@ describe('Execute: Handles basic execution tasks', () => { const [error] = result.errors!; expect(error.originalError?.name).toBe('Error'); }); + + it('should properly add schema coordinate on errors only if enabled', () => { + const schema = new GraphQLSchema({ + query: new GraphQLObjectType({ + name: 'Query', + fields: { + foo: { + type: GraphQLInt, + resolve: () => { + throw new Error('Test Error'); + }, + }, + }, + }), + }); + + const document = parse('{ foo }'); + + expect( + executeSync({ + schema, + document, + schemaCoordinateInErrors: true, + }).errors![0].coordinate, + ).toBe('Query.foo'); + + expect( + executeSync({ + schema, + document, + schemaCoordinateInErrors: false, + }).errors![0].coordinate, + ).toBe(undefined); + }); + + it('should properly add schema coordinate even with abstract types', () => { + const I = new GraphQLInterfaceType({ name: 'I', fields: { f: { type: GraphQLString } } }); + const A = new GraphQLObjectType({ + name: 'A', + interfaces: [I], + fields: { + f: { + type: GraphQLString, + resolve: () => { + throw new Error('Error A'); + }, + }, + }, + }); + + const B = new GraphQLObjectType({ name: 'B', fields: { b: { type: GraphQLString } } }); + + const schema = new GraphQLSchema({ + types: [I, A, B], + query: new GraphQLObjectType({ + name: 'Query', + fields: { + i: { + type: I, + resolve: () => ({ __typename: 'A' }), + }, + u: { + type: new GraphQLUnionType({ + name: 'U', + types: [A, B], + }), + resolve: () => ({ __typename: 'A' }), + }, + }, + }), + }); + + expect( + executeSync({ + schema, + document: parse('{ i { f } }'), + schemaCoordinateInErrors: true, + }).errors![0].coordinate, + ).toBe('A.f'); + + expect( + executeSync({ + schema, + document: parse('{ u { ...on A { f } } }'), + schemaCoordinateInErrors: true, + }).errors![0].coordinate, + ).toBe('A.f'); + }); }); From cd259c992aa23718bfc51350ea5558af9139231d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 13 Nov 2025 15:33:21 +0000 Subject: [PATCH 23/35] chore(dependencies): updated changesets for modified dependencies --- ...@graphql-tools_apollo-engine-loader-7588-dependencies.md | 3 ++- .../@graphql-tools_code-file-loader-7588-dependencies.md | 4 ++-- .changeset/@graphql-tools_executor-7588-dependencies.md | 2 +- ...@graphql-tools_executor-apollo-link-7588-dependencies.md | 2 +- .../@graphql-tools_executor-envelop-7588-dependencies.md | 2 +- .../@graphql-tools_executor-legacy-ws-7588-dependencies.md | 2 +- ...raphql-tools_executor-urql-exchange-7588-dependencies.md | 2 +- .../@graphql-tools_executor-yoga-7588-dependencies.md | 4 ++-- .changeset/@graphql-tools_git-loader-7588-dependencies.md | 4 ++-- .../@graphql-tools_github-loader-7588-dependencies.md | 5 +++-- .../@graphql-tools_graphql-file-loader-7588-dependencies.md | 4 ++-- .../@graphql-tools_graphql-tag-pluck-7588-dependencies.md | 2 +- .changeset/@graphql-tools_import-7588-dependencies.md | 2 +- .../@graphql-tools_json-file-loader-7588-dependencies.md | 2 +- .changeset/@graphql-tools_links-7588-dependencies.md | 2 +- .changeset/@graphql-tools_load-7588-dependencies.md | 4 ++-- .changeset/@graphql-tools_merge-7588-dependencies.md | 2 +- .changeset/@graphql-tools_mock-7588-dependencies.md | 4 ++-- .../@graphql-tools_module-loader-7588-dependencies.md | 2 +- .changeset/@graphql-tools_node-require-7588-dependencies.md | 6 +++--- ...hql-tools_relay-operation-optimizer-7588-dependencies.md | 2 +- ...graphql-tools_resolvers-composition-7588-dependencies.md | 2 +- .changeset/@graphql-tools_schema-7588-dependencies.md | 4 ++-- .changeset/@graphql-tools_url-loader-7588-dependencies.md | 5 +++-- .changeset/graphql-tools-7588-dependencies.md | 2 +- 25 files changed, 39 insertions(+), 36 deletions(-) diff --git a/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md b/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md index 5e87824f617..a2a22b4e76e 100644 --- a/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md @@ -2,4 +2,5 @@ "@graphql-tools/apollo-engine-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md index 86a89ed5c6e..bf507250146 100644 --- a/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/code-file-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-7588-dependencies.md b/.changeset/@graphql-tools_executor-7588-dependencies.md index 9395d1db85a..5691b2b20d4 100644 --- a/.changeset/@graphql-tools_executor-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/executor": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md b/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md index 871e47a2cf2..1dba3197c0e 100644 --- a/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/executor-apollo-link": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md b/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md index 11b14283151..0ea71886b0c 100644 --- a/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/executor-envelop": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md b/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md index 5a024afbf0d..c5dcc4dca25 100644 --- a/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/executor-legacy-ws": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md b/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md index a43ba73f8e0..46c0c725b5f 100644 --- a/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/executor-urql-exchange": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md b/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md index f518ba20ed8..99c4e846594 100644 --- a/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md +++ b/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/executor-yoga": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/executor-envelop@^4.0.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-envelop/v/4.0.2) (from `^4.0.1`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/executor-envelop@^4.0.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-envelop/v/4.0.4) (from `^4.0.1`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_git-loader-7588-dependencies.md b/.changeset/@graphql-tools_git-loader-7588-dependencies.md index f152d9de18d..6572c17ef7e 100644 --- a/.changeset/@graphql-tools_git-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_git-loader-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/git-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_github-loader-7588-dependencies.md b/.changeset/@graphql-tools_github-loader-7588-dependencies.md index c0f4d0b9cee..d9947b685d0 100644 --- a/.changeset/@graphql-tools_github-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_github-loader-7588-dependencies.md @@ -3,5 +3,6 @@ --- dependencies updates: - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) - - Updated dependency [`@graphql-tools/graphql-tag-pluck@^8.3.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.23) (from `^8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/graphql-tag-pluck@^8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `^8.3.22`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md index 7d30241646e..2491db166e6 100644 --- a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/graphql-file-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/import@7.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/import/v/7.1.4) (from `7.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/import@7.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/import/v/7.1.6) (from `7.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md b/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md index fd9280257b8..5359dbd14ff 100644 --- a/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md +++ b/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/graphql-tag-pluck": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_import-7588-dependencies.md b/.changeset/@graphql-tools_import-7588-dependencies.md index 62bed57bf30..5b2df305fb1 100644 --- a/.changeset/@graphql-tools_import-7588-dependencies.md +++ b/.changeset/@graphql-tools_import-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/import": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md index a09eb75101c..2a1e70a57bb 100644 --- a/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/json-file-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_links-7588-dependencies.md b/.changeset/@graphql-tools_links-7588-dependencies.md index eadabdf8b07..93b8961b813 100644 --- a/.changeset/@graphql-tools_links-7588-dependencies.md +++ b/.changeset/@graphql-tools_links-7588-dependencies.md @@ -3,4 +3,4 @@ --- dependencies updates: - Updated dependency [`@graphql-tools/delegate@^11.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/delegate/v/11.1.2) (from `^11.1.0`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_load-7588-dependencies.md b/.changeset/@graphql-tools_load-7588-dependencies.md index 415f02954f6..c1866c10e2b 100644 --- a/.changeset/@graphql-tools_load-7588-dependencies.md +++ b/.changeset/@graphql-tools_load-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/load": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_merge-7588-dependencies.md b/.changeset/@graphql-tools_merge-7588-dependencies.md index fe088af0547..5c0be5bd71e 100644 --- a/.changeset/@graphql-tools_merge-7588-dependencies.md +++ b/.changeset/@graphql-tools_merge-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/merge": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_mock-7588-dependencies.md b/.changeset/@graphql-tools_mock-7588-dependencies.md index 8e079d557ef..0a5cd848c49 100644 --- a/.changeset/@graphql-tools_mock-7588-dependencies.md +++ b/.changeset/@graphql-tools_mock-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/mock": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_module-loader-7588-dependencies.md b/.changeset/@graphql-tools_module-loader-7588-dependencies.md index 59d7e3e0bf3..bbe7153fb6a 100644 --- a/.changeset/@graphql-tools_module-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_module-loader-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/module-loader": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_node-require-7588-dependencies.md b/.changeset/@graphql-tools_node-require-7588-dependencies.md index acd9c4c8e7c..962dc976d57 100644 --- a/.changeset/@graphql-tools_node-require-7588-dependencies.md +++ b/.changeset/@graphql-tools_node-require-7588-dependencies.md @@ -2,6 +2,6 @@ "@graphql-tools/node-require": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/graphql-file-loader@8.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.4) (from `8.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/load@8.1.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.1.4) (from `8.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/graphql-file-loader@8.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.6) (from `8.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/load@8.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.1.6) (from `8.1.3`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md b/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md index cec8ed52b06..bd4e07495b4 100644 --- a/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md +++ b/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/relay-operation-optimizer": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md b/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md index c79bc876773..e825a48aacf 100644 --- a/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md +++ b/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md @@ -2,4 +2,4 @@ "@graphql-tools/resolvers-composition": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_schema-7588-dependencies.md b/.changeset/@graphql-tools_schema-7588-dependencies.md index 86d9efd323d..657c25ceb04 100644 --- a/.changeset/@graphql-tools_schema-7588-dependencies.md +++ b/.changeset/@graphql-tools_schema-7588-dependencies.md @@ -2,5 +2,5 @@ "@graphql-tools/schema": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/merge@^9.1.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/merge/v/9.1.3) (from `^9.1.2`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/merge@^9.1.5` ↗︎](https://www.npmjs.com/package/@graphql-tools/merge/v/9.1.5) (from `^9.1.2`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_url-loader-7588-dependencies.md b/.changeset/@graphql-tools_url-loader-7588-dependencies.md index a4105bc8262..8e19aa53d99 100644 --- a/.changeset/@graphql-tools_url-loader-7588-dependencies.md +++ b/.changeset/@graphql-tools_url-loader-7588-dependencies.md @@ -4,5 +4,6 @@ dependencies updates: - Updated dependency [`@graphql-tools/executor-graphql-ws@^3.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-graphql-ws/v/3.1.2) (from `^3.1.0`, in `dependencies`) - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) - - Updated dependency [`@graphql-tools/executor-legacy-ws@^1.1.21` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-legacy-ws/v/1.1.21) (from `^1.1.20`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.1) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@graphql-tools/executor-legacy-ws@^1.1.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-legacy-ws/v/1.1.23) (from `^1.1.20`, in `dependencies`) + - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) + - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/graphql-tools-7588-dependencies.md b/.changeset/graphql-tools-7588-dependencies.md index 8816aafb17e..24a9dc15290 100644 --- a/.changeset/graphql-tools-7588-dependencies.md +++ b/.changeset/graphql-tools-7588-dependencies.md @@ -2,4 +2,4 @@ "graphql-tools": patch --- dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.27` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.27) (from `^10.0.26`, in `dependencies`) + - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) From 1d4c7bf4fe74ab9828b87647280c74382ccb7350 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Thu, 13 Nov 2025 17:25:19 +0100 Subject: [PATCH 24/35] fix JSON stringify --- packages/utils/src/errors.ts | 15 +++++++++++++++ packages/utils/tests/errors.test.ts | 13 +++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index fd3e5246f67..f7eda274c28 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -22,6 +22,13 @@ declare module 'graphql' { */ readonly coordinate?: string; } + + interface GraphQLFormattedError { + /** + * An optional schema coordinate (e.g. "MyType.myField") associated with this error. + */ + readonly coordinate?: string; + } } const possibleGraphQLErrorProperties = [ @@ -46,6 +53,13 @@ export function isGraphQLErrorLike(error: any) { ); } +export const toJSON: GraphQLError['toJSON'] = function toJSON(this: GraphQLError) { + const formattedError = GraphQLError.prototype.toJSON.apply(this); + // @ts-expect-error coordinate is readonly + formattedError.coordinate = this.coordinate; + return formattedError; +}; + export function createGraphQLError(message: string, options?: GraphQLErrorOptions): GraphQLError { if ( options?.originalError && @@ -79,6 +93,7 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption enumerable: true, configurable: true, }); + error.toJSON = toJSON; } return error; diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index 56b6e80486d..fab45174e15 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -73,13 +73,18 @@ describe('Errors', () => { testIf(versionInfo.major >= 16)('should handle coordinate', () => { const error = createGraphQLError('message', { - extensions: { - coordinate: 'Query.test', - }, + coordinate: 'Query.test', + }); + expect(error).toMatchObject({ + coordinate: 'Query.test', }); - expect(error.extensions).toMatchObject({ + }); + + testIf(versionInfo.major >= 16)('should have coordinate in JSON representation', () => { + const error = createGraphQLError('message', { coordinate: 'Query.test', }); + expect(JSON.stringify(error)).toBe('{"message":"message","coordinate":"Query.test"}'); }); }); }); From 50334a21f604df902e6b53f4a8227a741e1ba527 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 14 Nov 2025 11:35:27 +0100 Subject: [PATCH 25/35] do not override existing coordinate --- packages/utils/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index f7eda274c28..492e69a117e 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -87,7 +87,7 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption options?.extensions, ); - if (options?.coordinate) { + if (options?.coordinate && error.coordinate == null) { Object.defineProperty(error, 'coordinate', { value: options.coordinate, enumerable: true, From 98827236af909db97c174b673515186338995c39 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 14 Nov 2025 11:56:00 +0100 Subject: [PATCH 26/35] use define property and guard against existing coordinate --- packages/utils/src/errors.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 492e69a117e..02eb3b48448 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -114,9 +114,12 @@ export function locatedError( const error = _locatedError(rawError, nodes, path) as GraphQLError; // `graphql` locatedError is only changing path and nodes if it is not already defined - if (!error.coordinate && info) { - // @ts-expect-error coordinate is readonly, but we don't want to recreate it just to add coordinate - error.coordinate = `${info.parentType.name}.${info.fieldName}`; + if (!error.coordinate && info && error.coordinate == null) { + Object.defineProperty(error, 'coordinate', { + value: `${info.parentType.name}.${info.fieldName}`, + enumerable: true, + configurable: true, + }); } return error; From eae3c3166430d65945da6837f875fc7800cc1a26 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 14 Nov 2025 15:24:16 +0100 Subject: [PATCH 27/35] also override toJSON in locatedError --- packages/utils/src/errors.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 02eb3b48448..9d5a128d77c 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -88,12 +88,10 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption ); if (options?.coordinate && error.coordinate == null) { - Object.defineProperty(error, 'coordinate', { - value: options.coordinate, - enumerable: true, - configurable: true, + Object.defineProperties(error, { + coordinate: { value: options.coordinate, enumerable: true, configurable: true }, + toJSON: { value: toJSON }, }); - error.toJSON = toJSON; } return error; @@ -115,10 +113,10 @@ export function locatedError( // `graphql` locatedError is only changing path and nodes if it is not already defined if (!error.coordinate && info && error.coordinate == null) { - Object.defineProperty(error, 'coordinate', { - value: `${info.parentType.name}.${info.fieldName}`, - enumerable: true, - configurable: true, + const coordinate = `${info.parentType.name}.${info.fieldName}`; + Object.defineProperties(error, { + coordinate: { value: coordinate, enumerable: true, configurable: true }, + toJSON: { value: toJSON }, }); } From 1629d64202722c4d12cc52c660e06935360e560f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 14 Nov 2025 14:25:05 +0000 Subject: [PATCH 28/35] chore(dependencies): updated changesets for modified dependencies --- ...aphql-tools_apollo-engine-loader-7588-dependencies.md | 6 ------ .../@graphql-tools_code-file-loader-7588-dependencies.md | 6 ------ .changeset/@graphql-tools_executor-7588-dependencies.md | 5 ----- ...aphql-tools_executor-apollo-link-7588-dependencies.md | 5 ----- .../@graphql-tools_executor-envelop-7588-dependencies.md | 5 ----- ...graphql-tools_executor-legacy-ws-7588-dependencies.md | 5 ----- ...hql-tools_executor-urql-exchange-7588-dependencies.md | 5 ----- .../@graphql-tools_executor-yoga-7588-dependencies.md | 6 ------ .../@graphql-tools_git-loader-7588-dependencies.md | 6 ------ .../@graphql-tools_github-loader-7588-dependencies.md | 8 -------- ...raphql-tools_graphql-file-loader-7588-dependencies.md | 6 ------ ...@graphql-tools_graphql-tag-pluck-7588-dependencies.md | 5 ----- .changeset/@graphql-tools_import-7588-dependencies.md | 5 ----- .../@graphql-tools_json-file-loader-7588-dependencies.md | 5 ----- .changeset/@graphql-tools_links-7588-dependencies.md | 6 ------ .changeset/@graphql-tools_load-7588-dependencies.md | 6 ------ .changeset/@graphql-tools_merge-7588-dependencies.md | 5 ----- .changeset/@graphql-tools_mock-7588-dependencies.md | 6 ------ .../@graphql-tools_module-loader-7588-dependencies.md | 5 ----- .../@graphql-tools_node-require-7588-dependencies.md | 7 ------- ...-tools_relay-operation-optimizer-7588-dependencies.md | 5 ----- ...phql-tools_resolvers-composition-7588-dependencies.md | 5 ----- .changeset/@graphql-tools_schema-7588-dependencies.md | 6 ------ .../@graphql-tools_url-loader-7588-dependencies.md | 9 --------- .changeset/graphql-tools-7588-dependencies.md | 5 ----- 25 files changed, 143 deletions(-) delete mode 100644 .changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_code-file-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-envelop-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_executor-yoga-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_git-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_github-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_import-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_json-file-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_links-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_load-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_merge-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_mock-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_module-loader-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_node-require-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_resolvers-composition-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_schema-7588-dependencies.md delete mode 100644 .changeset/@graphql-tools_url-loader-7588-dependencies.md delete mode 100644 .changeset/graphql-tools-7588-dependencies.md diff --git a/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md b/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md deleted file mode 100644 index a2a22b4e76e..00000000000 --- a/.changeset/@graphql-tools_apollo-engine-loader-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/apollo-engine-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) - - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md deleted file mode 100644 index bf507250146..00000000000 --- a/.changeset/@graphql-tools_code-file-loader-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/code-file-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-7588-dependencies.md b/.changeset/@graphql-tools_executor-7588-dependencies.md deleted file mode 100644 index 5691b2b20d4..00000000000 --- a/.changeset/@graphql-tools_executor-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/executor": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md b/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md deleted file mode 100644 index 1dba3197c0e..00000000000 --- a/.changeset/@graphql-tools_executor-apollo-link-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/executor-apollo-link": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md b/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md deleted file mode 100644 index 0ea71886b0c..00000000000 --- a/.changeset/@graphql-tools_executor-envelop-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/executor-envelop": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md b/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md deleted file mode 100644 index c5dcc4dca25..00000000000 --- a/.changeset/@graphql-tools_executor-legacy-ws-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/executor-legacy-ws": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md b/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md deleted file mode 100644 index 46c0c725b5f..00000000000 --- a/.changeset/@graphql-tools_executor-urql-exchange-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/executor-urql-exchange": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md b/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md deleted file mode 100644 index 99c4e846594..00000000000 --- a/.changeset/@graphql-tools_executor-yoga-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/executor-yoga": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/executor-envelop@^4.0.4` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-envelop/v/4.0.4) (from `^4.0.1`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_git-loader-7588-dependencies.md b/.changeset/@graphql-tools_git-loader-7588-dependencies.md deleted file mode 100644 index 6572c17ef7e..00000000000 --- a/.changeset/@graphql-tools_git-loader-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/git-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/graphql-tag-pluck@8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_github-loader-7588-dependencies.md b/.changeset/@graphql-tools_github-loader-7588-dependencies.md deleted file mode 100644 index d9947b685d0..00000000000 --- a/.changeset/@graphql-tools_github-loader-7588-dependencies.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@graphql-tools/github-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) - - Updated dependency [`@graphql-tools/graphql-tag-pluck@^8.3.25` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-tag-pluck/v/8.3.25) (from `^8.3.22`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) - - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md deleted file mode 100644 index 2491db166e6..00000000000 --- a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/graphql-file-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/import@7.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/import/v/7.1.6) (from `7.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md b/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md deleted file mode 100644 index 5359dbd14ff..00000000000 --- a/.changeset/@graphql-tools_graphql-tag-pluck-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/graphql-tag-pluck": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_import-7588-dependencies.md b/.changeset/@graphql-tools_import-7588-dependencies.md deleted file mode 100644 index 5b2df305fb1..00000000000 --- a/.changeset/@graphql-tools_import-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/import": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md deleted file mode 100644 index 2a1e70a57bb..00000000000 --- a/.changeset/@graphql-tools_json-file-loader-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/json-file-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_links-7588-dependencies.md b/.changeset/@graphql-tools_links-7588-dependencies.md deleted file mode 100644 index 93b8961b813..00000000000 --- a/.changeset/@graphql-tools_links-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/links": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/delegate@^11.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/delegate/v/11.1.2) (from `^11.1.0`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_load-7588-dependencies.md b/.changeset/@graphql-tools_load-7588-dependencies.md deleted file mode 100644 index c1866c10e2b..00000000000 --- a/.changeset/@graphql-tools_load-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/load": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_merge-7588-dependencies.md b/.changeset/@graphql-tools_merge-7588-dependencies.md deleted file mode 100644 index 5c0be5bd71e..00000000000 --- a/.changeset/@graphql-tools_merge-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/merge": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_mock-7588-dependencies.md b/.changeset/@graphql-tools_mock-7588-dependencies.md deleted file mode 100644 index 0a5cd848c49..00000000000 --- a/.changeset/@graphql-tools_mock-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/mock": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_module-loader-7588-dependencies.md b/.changeset/@graphql-tools_module-loader-7588-dependencies.md deleted file mode 100644 index bbe7153fb6a..00000000000 --- a/.changeset/@graphql-tools_module-loader-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/module-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_node-require-7588-dependencies.md b/.changeset/@graphql-tools_node-require-7588-dependencies.md deleted file mode 100644 index 962dc976d57..00000000000 --- a/.changeset/@graphql-tools_node-require-7588-dependencies.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@graphql-tools/node-require": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/graphql-file-loader@8.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.6) (from `8.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/load@8.1.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.1.6) (from `8.1.3`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md b/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md deleted file mode 100644 index bd4e07495b4..00000000000 --- a/.changeset/@graphql-tools_relay-operation-optimizer-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/relay-operation-optimizer": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md b/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md deleted file mode 100644 index e825a48aacf..00000000000 --- a/.changeset/@graphql-tools_resolvers-composition-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphql-tools/resolvers-composition": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_schema-7588-dependencies.md b/.changeset/@graphql-tools_schema-7588-dependencies.md deleted file mode 100644 index 657c25ceb04..00000000000 --- a/.changeset/@graphql-tools_schema-7588-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@graphql-tools/schema": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/merge@^9.1.5` ↗︎](https://www.npmjs.com/package/@graphql-tools/merge/v/9.1.5) (from `^9.1.2`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) diff --git a/.changeset/@graphql-tools_url-loader-7588-dependencies.md b/.changeset/@graphql-tools_url-loader-7588-dependencies.md deleted file mode 100644 index 8e19aa53d99..00000000000 --- a/.changeset/@graphql-tools_url-loader-7588-dependencies.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@graphql-tools/url-loader": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/executor-graphql-ws@^3.1.2` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-graphql-ws/v/3.1.2) (from `^3.1.0`, in `dependencies`) - - Updated dependency [`@graphql-tools/executor-http@^3.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-http/v/3.0.6) (from `^3.0.4`, in `dependencies`) - - Updated dependency [`@graphql-tools/executor-legacy-ws@^1.1.23` ↗︎](https://www.npmjs.com/package/@graphql-tools/executor-legacy-ws/v/1.1.23) (from `^1.1.20`, in `dependencies`) - - Updated dependency [`@graphql-tools/utils@^10.10.3` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.10.3) (from `^10.10.0`, in `dependencies`) - - Updated dependency [`@whatwg-node/fetch@^0.10.13` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.13) (from `^0.10.11`, in `dependencies`) diff --git a/.changeset/graphql-tools-7588-dependencies.md b/.changeset/graphql-tools-7588-dependencies.md deleted file mode 100644 index 24a9dc15290..00000000000 --- a/.changeset/graphql-tools-7588-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"graphql-tools": patch ---- -dependencies updates: - - Updated dependency [`@graphql-tools/schema@^10.0.29` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.29) (from `^10.0.26`, in `dependencies`) From d10ee4a6b33b726bd26c2e4f5d3d5d3924440c76 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 14 Nov 2025 15:32:43 +0100 Subject: [PATCH 29/35] update changeset --- .changeset/floppy-women-poke.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index 65eb2d61dea..678e923ffc2 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -8,8 +8,9 @@ source of the error by automated tools like tracing or monitoring. This new feature is opt-in, you have to enable it using `schemaCoordinateInErrors` executor option. -To avoid leaking schema information to the client, the extension key is a `Symbol` (which is not -serializable). To forward it to the client, copy it to a custom extension with a serializable key. +**Caution:** This feature, when enabled, will expose information about your schema. If you need to +keep you schema private and secret, you should strip this attribute at serialization time before +sending errors to the client. ```ts import { parse } from 'graphql' From 2b67fa69527eca2c25a79f3cf204b3badffa843b Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 14 Nov 2025 16:37:19 +0100 Subject: [PATCH 30/35] fix test --- packages/utils/tests/errors.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index fab45174e15..4e13cd1b283 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -18,6 +18,9 @@ describe('Errors', () => { fieldName: 'id', parentType: { name: 'Test' }, }); + + expect(newError.path).toEqual(['test', 1, 'id']); + if (versionInfo.major >= 16) { expect(getSchemaCoordinate(newError)).toEqual('Test.id'); } From 6fcd4c6ff2d2eb40d5890db29418a15cc4cc3956 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Thu, 20 Nov 2025 15:06:13 +0100 Subject: [PATCH 31/35] never serialize coordinate --- packages/utils/src/errors.ts | 16 ---------------- packages/utils/tests/errors.test.ts | 5 +++-- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 9d5a128d77c..c78ad471268 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -22,13 +22,6 @@ declare module 'graphql' { */ readonly coordinate?: string; } - - interface GraphQLFormattedError { - /** - * An optional schema coordinate (e.g. "MyType.myField") associated with this error. - */ - readonly coordinate?: string; - } } const possibleGraphQLErrorProperties = [ @@ -53,13 +46,6 @@ export function isGraphQLErrorLike(error: any) { ); } -export const toJSON: GraphQLError['toJSON'] = function toJSON(this: GraphQLError) { - const formattedError = GraphQLError.prototype.toJSON.apply(this); - // @ts-expect-error coordinate is readonly - formattedError.coordinate = this.coordinate; - return formattedError; -}; - export function createGraphQLError(message: string, options?: GraphQLErrorOptions): GraphQLError { if ( options?.originalError && @@ -90,7 +76,6 @@ export function createGraphQLError(message: string, options?: GraphQLErrorOption if (options?.coordinate && error.coordinate == null) { Object.defineProperties(error, { coordinate: { value: options.coordinate, enumerable: true, configurable: true }, - toJSON: { value: toJSON }, }); } @@ -116,7 +101,6 @@ export function locatedError( const coordinate = `${info.parentType.name}.${info.fieldName}`; Object.defineProperties(error, { coordinate: { value: coordinate, enumerable: true, configurable: true }, - toJSON: { value: toJSON }, }); } diff --git a/packages/utils/tests/errors.test.ts b/packages/utils/tests/errors.test.ts index 4e13cd1b283..ef3b6590193 100644 --- a/packages/utils/tests/errors.test.ts +++ b/packages/utils/tests/errors.test.ts @@ -83,11 +83,12 @@ describe('Errors', () => { }); }); - testIf(versionInfo.major >= 16)('should have coordinate in JSON representation', () => { + it('should not have coordinate in JSON representation', () => { + // Since this an experiment, we don't want coordinate to leak to the client const error = createGraphQLError('message', { coordinate: 'Query.test', }); - expect(JSON.stringify(error)).toBe('{"message":"message","coordinate":"Query.test"}'); + expect(JSON.stringify(error)).toBe('{"message":"message"}'); }); }); }); From ee00f115cda6d022a8b990c29090f455e6965217 Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 28 Nov 2025 09:57:26 +0100 Subject: [PATCH 32/35] @ardatan review --- packages/utils/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index c78ad471268..3ba97ebe129 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -92,7 +92,7 @@ export function locatedError( rawError: unknown, nodes: ASTNode | ReadonlyArray | undefined, path: Maybe>, - info: SchemaCoordinateInfo | false | null | undefined, + info?: SchemaCoordinateInfo | false | null | undefined, ): GraphQLError { const error = _locatedError(rawError, nodes, path) as GraphQLError; From 2ebdfe189e8f7df1b9be20b541c4cc4831a43c9d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 28 Nov 2025 08:57:55 +0000 Subject: [PATCH 33/35] chore(dependencies): updated changesets for modified dependencies --- .../@graphql-tools_graphql-file-loader-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_import-7588-dependencies.md | 5 +++++ .changeset/@graphql-tools_node-require-7588-dependencies.md | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 .changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_import-7588-dependencies.md create mode 100644 .changeset/@graphql-tools_node-require-7588-dependencies.md diff --git a/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md new file mode 100644 index 00000000000..28aa09d740d --- /dev/null +++ b/.changeset/@graphql-tools_graphql-file-loader-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/graphql-file-loader": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/import@7.1.7` ↗︎](https://www.npmjs.com/package/@graphql-tools/import/v/7.1.7) (from `7.1.6`, in `dependencies`) diff --git a/.changeset/@graphql-tools_import-7588-dependencies.md b/.changeset/@graphql-tools_import-7588-dependencies.md new file mode 100644 index 00000000000..fbc446fa37f --- /dev/null +++ b/.changeset/@graphql-tools_import-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/import": patch +--- +dependencies updates: + - Updated dependency [`@theguild/federation-composition@^0.21.0` ↗︎](https://www.npmjs.com/package/@theguild/federation-composition/v/0.21.0) (from `^0.20.2`, in `dependencies`) diff --git a/.changeset/@graphql-tools_node-require-7588-dependencies.md b/.changeset/@graphql-tools_node-require-7588-dependencies.md new file mode 100644 index 00000000000..2f074d94f8f --- /dev/null +++ b/.changeset/@graphql-tools_node-require-7588-dependencies.md @@ -0,0 +1,5 @@ +--- +"@graphql-tools/node-require": patch +--- +dependencies updates: + - Updated dependency [`@graphql-tools/graphql-file-loader@8.1.7` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.7) (from `8.1.6`, in `dependencies`) From c97b0e70e3d9b1d62ab07bb12bd0252d00da43ef Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 28 Nov 2025 10:15:49 +0100 Subject: [PATCH 34/35] fix changeset --- .changeset/floppy-women-poke.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index 678e923ffc2..2f2ded02c3e 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -9,7 +9,7 @@ source of the error by automated tools like tracing or monitoring. This new feature is opt-in, you have to enable it using `schemaCoordinateInErrors` executor option. **Caution:** This feature, when enabled, will expose information about your schema. If you need to -keep you schema private and secret, you should strip this attribute at serialization time before +keep your schema private and secret, you should strip this attribute at serialization time before sending errors to the client. ```ts @@ -17,18 +17,17 @@ import { parse } from 'graphql' import { normalizedExecutor } from '@graphql-tools/executor' import schema from './schema' -// You can also use `Symbol.for('graphql.error.schemaCoordinate')` to get the symbol if you don't -// want to depend on `@graphql-tools/utils` - const result = await normalizedExecutor({ schema, - document: parse(gql`...`), + document: parse(`...`), schemaCoordinateInErrors: true // enable adding schema coordinate to graphql errors }) if (result.errors) { for (const error of result.errors) { console.log('Error in resolver ', error.coordinate, ':', error.message) + // or with `getSchemaCoordinate` util, to workaround types if needed + console.log('Error in resolver', getSchemaCoordinate(error), ':', error.message) } } ``` From 88a777b54195533c90a874e35012219c1305b82e Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Fri, 28 Nov 2025 10:43:20 +0100 Subject: [PATCH 35/35] fix changeset --- .changeset/floppy-women-poke.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/floppy-women-poke.md b/.changeset/floppy-women-poke.md index 2f2ded02c3e..ce3c38af72d 100644 --- a/.changeset/floppy-women-poke.md +++ b/.changeset/floppy-women-poke.md @@ -15,6 +15,7 @@ sending errors to the client. ```ts import { parse } from 'graphql' import { normalizedExecutor } from '@graphql-tools/executor' +import { getSchemaCoordinate } from '@graphql-tools/utils' import schema from './schema' const result = await normalizedExecutor({