NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #3292 most downloaded on npm
A set of utils for faster development of GraphQL tools
Last release 26 days ago
08 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
3654 releases · first in 2020
One column per quarter.
@graphql-tools/delegate@12.2.0
@graphql-tools/delegate@12.2.0
#2604 ee4cc07 Thanks @enisdenjo! - Support GraphQL 16 with @graphql-tools/utils v12
Preserves GraphQL 16 compatibility while upgrading to @graphql-tools/utils v12, @graphql-tools/executor v2, and the compatible @graphql-tools/schema and @graphql-tools/merge releases. Consumers now receive consistent resolver and execution request types without conflicts between different GraphQL Tools versions.
Stitched and delegated operations handle the new executor variable result shape correctly, including variables used by directives. Resolver execution also supports the executor's cancellation and asynchronous work helpers while remaining compatible with the GraphQL 16 GraphQLResolveInfo API.
#2604 ee4cc07 Thanks @enisdenjo! - dependencies updates:
@graphql-tools/executor@^2.0.1 ↗︎ (from ^1.4.13, in dependencies)@graphql-tools/schema@^10.1.1 ↗︎ (from ^10.0.29, in dependencies)@graphql-tools/utils@^12.0.1 ↗︎ (from ^11.0.0, in dependencies)Updated dependencies [ee4cc07, ee4cc07]:
Nothing published for this version
Nothing published for this version
Response keys named __proto__, constructor or prototype, which a client can produce with a field alias, were only filtered at the top level of a merge
#2600 e5ea5f4 Thanks @enisdenjo! - Drop prototype polluting keys from subgraph results before merging them
Response keys named __proto__, constructor or prototype, which a client can produce with a field alias, were only filtered at the top level of a merged result. Nested occurrences were passed to mergeDeep, which walks the prototype chain and could end up writing to Object.prototype or Function.prototype.
Such keys are now removed at every depth of a subgraph result before it takes part in a merge, and projectDataSelectionSet no longer treats an inherited property as an already projected field.
Updated dependencies [8cbdfd0]:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
@graphql-tools/delegate@12.1.3
@graphql-tools/delegate@12.1.3
#2555 eb6569b Thanks @enisdenjo! - Flush deferred merged fields without blocking the initial payload
Deferred fields on merged entity types are now delegated when their deferred resolvers run instead of being included in the initial delegation plan. This allows the initial payload to be delivered before slower merged subgraph fields resolve.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
@graphql-tools/delegate@12.1.2
@graphql-tools/delegate@12.1.2
af2cccb Thanks @egoodwinx! - Create new getCoercedVariableValues to support graphql-js 17Nothing published for this version
Inline enum values now remain enum literals, and original variable definitions are preserved while still referenced by fragments, selections, directiv
#2498 9ff0daf Thanks @enisdenjo! - Fix delegated argument serialization when fields are filtered or renamed
Inline enum values now remain enum literals, and original variable definitions are preserved while still referenced by fragments, selections, directives, or other arguments.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Local fields introduced through typeDefs or resolvers are wrapped by stitchSchemas. When they return a partial merged type containing a usable key, st
#2473 6f2c3b6 Thanks @enisdenjo! - Automatically resolve plain merged-type references returned by local stitching resolvers
Local fields introduced through typeDefs or resolvers are wrapped by stitchSchemas. When they return a partial merged type containing a usable key, stitching performs one initial delegation with type merging enabled. The existing stitching planner then handles computed fields, @requires dependencies, batching, nested entities, and fields owned by other subschemas.
#2473 6f2c3b6 Thanks @enisdenjo! - defaultMergedResolver now falls back to the literal field name when an external object does not have the requested response key
Plain resolver data merged into an external object is keyed by field name, so an aliased request used to resolve to null even though the value was there:
{
person {
fullName: name
}
}
// merged object carries resolver data by field name
{ id: '1', name: 'Local' }
Previously fullName was null because only the alias was looked up. Now it resolves to 'Local' by field name, matching plain graphql-js behavior. When the response key is present (e.g. the field came from a subschema), it is still preferred.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Avoid reusing variables whose types are incompatible with target schema argument types, and create correctly typed variables instead.
#2474 8a08de3 Thanks @enisdenjo! - Fix delegated argument variable type compatibility
Avoid reusing variables whose types are incompatible with target schema argument types, and create correctly typed variables instead.
#2475 65ce370 Thanks @enisdenjo! - Fix enum argument serialization when delegating to a field removed from the transformed schema.
When a delegated query field is filtered from the transformed schema, its arguments now use the original subschema for type lookup. This ensures enum values are sent as typed variables instead of invalid quoted enum literals while preserving input field transforms for fields that remain exposed.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Previously, when a subgraph declared @provides(fields: "...") on a field, the gateway would still:
#2351 0bbdbbc Thanks @ardatan! - Fix @provides so the gateway only requests the provided fields the client actually selected, and stops delegating to the owner subgraph when @provides already covers the request.
Previously, when a subgraph declared @provides(fields: "...") on a field, the gateway would still:
@provides to that subgraph, even when the client never asked for them.@provides-covered fields whenever the providing subgraph declared them as @external, even though the data was already returned.For example with:
# subgraph B (provider)
type Query {
entity: Entity @provides(fields: "name description")
}
type Entity @key(fields: "id") {
id: ID!
name: String! @external
description: String! @external
}
a client query of { entity { id name } } would still cause the gateway to ask subgraph B for description and fetch name again from subgraph A (the owner of Entity).
After this fix:
@provides fields the client actually selected are forwarded to the providing subgraph (request side).@provides declarations at every nested level (e.g. @provides(fields: "nested { nestedNested { name description } }")) and @provides declarations made via inline fragments on union/interface members (e.g. @provides(fields: "... on Book { title }")), so the gateway no longer round-trips to the owner subgraph for fields that the providing subgraph has already returned.@provides-covered fields. Previously, using a fragment spread (e.g. ...MyFrag) for nested @external fields could cause an unnecessary delegation to the owner because selection subtraction compared only the spread name with the explicit @provides fields. The planner now resolves fragment spreads before subtracting provided selections, while preserving the fragment type condition and directives when only part of a fragment remains.Aliases, direct field selections, fragments, fragment spreads, @include/@skip directives wrapping a @provides field, and nested @provides selections are preserved without unnecessary owner delegations.
Nothing published for this version
Nothing published for this version
Updated dependencies [`4311d79`]:
4311d79]:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →