fix(deps): update apollo graphql packages (major) #862
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
3.14.0->4.0.104.12.2->5.2.01.45.0->2.0.0v1.61.10->v2.9.04.5.0->5.4.0Release Notes
apollographql/apollo-client (@apollo/client)
v4.0.10Compare Source
Patch Changes
af4acdcThanks @phryneas! - Fix memory leak #13036v4.0.9Compare Source
Patch Changes
8f3bc9bThanks @jerelmiller! - Fix an issue where switching from options withvariablestoskipTokenwithuseSuspenseQueryanduseBackgroundQuerywould create a newObservableQuery. This could cause unintended refetches wherevariableswere absent in the request when the query was referenced withrefetchQueries.v4.0.8Compare Source
Patch Changes
f6d0efaThanks @CarsonF! - Fix cache.modify() mapping readonly arrays to singular referencev4.0.7Compare Source
Patch Changes
5b4f36aThanks @jerelmiller! - Don't sendoperationTypein the payload sent byGraphQLWsLink.v4.0.6Compare Source
Patch Changes
3b0d89bThanks @phryneas! - Fix a problem withfetchMorewhere the loading state wouldn't reset if the result wouldn't result in a data update.v4.0.5Compare Source
Patch Changes
e2fc385Thanks @phryneas! - Fix an invariance type error in theMockedResponsetype.v4.0.4Compare Source
Patch Changes
#12892
db8a04bThanks @jerelmiller! - Prevent unhandled rejections from the promise returned by calling themutatefunction from theuseMutationhook.#12899
5352c12Thanks @phryneas! - Fix an issue wheninvariantis called by external libraries when no dev error message handler is loaded.#12895
71f2517Thanks @jerelmiller! - SupportskipTokenwithuseQueryto provide a more type-safe way to skip query execution.Note: this change is provided as a patch within the 4.0 minor version because the changes to TypeScript validation with required variables in version 4.0 made using the
skipoption more difficult.#12900
c0d5be7Thanks @phryneas! - Use named exportequalinstead of default from"@​wry/equality"v4.0.3Compare Source
Patch Changes
#12887
6f6ca47Thanks @phryneas! - Fix accidental deep re-export from/reactout of/react/internals#12890
019b422Thanks @jerelmiller! - Ensure thevariablesoption foruseMutationprovides proper IntelliSense suggestions.v4.0.2Compare Source
Patch Changes
56fac52Thanks @phryneas! - restoregetMemoryInternalsaccess in dev buildsv4.0.1Compare Source
Patch Changes
#12876
b00f231Thanks @phryneas! - Fix CJS build output forinvariantErrorCodes#12866
0d1614aThanks @jerelmiller! - ExportisNetworkStatusInFlightfrom@apollo/client/utilities. AddisNetworkStatusSettledto@apollo/client/utilitiesand re-export it from@apollo/clientwith a deprecation.v4.0.0Compare Source
apollographql/apollo-server (@apollo/server)
v5.2.0Compare Source
Minor Changes
#8161
51acbebThanks @jerelmiller! - Fix an issue where some bundlers would fail to build because of the dynamic import for the optional peer dependency on@yaacovcr/transformintroduced in@apollo/server5.1.0. To provide support for the legacy incremental format, you must now provide thelegacyExperimentalExecuteIncrementallyoption to theApolloServerconstructor.If the
legacyExperimentalExecuteIncrementallyoption is not provided and the client sends anAcceptheader with a value ofmultipart/mixed; deferSpec=20220824, an error is returned by the server.v5.1.0Compare Source
Minor Changes
#8148
80a1a1aThanks @jerelmiller! - Apollo Server now supports the incremental delivery protocol (@deferand@stream) that ships with[email protected]. To use the current protocol, clients must send theAcceptheader with a value ofmultipart/mixed; incrementalSpec=v0.2.Upgrading to 5.1 will depend on what version of
graphqlyou have installed and whether you already support the incremental delivery protocol.v5.0.0Compare Source
BREAKING CHANGES
Apollo Server v5 has very few breaking API changes. It is a small upgrade focused largely on adjusting which versions of Node.js and Express are supported.
Read our migration guide for more details on how to update your app.
graphqllibrary older thanv16.11.0. (Apollo Server 4 supportsgraphqlv16.6.0or later.) Upgradegraphqlbefore upgrading Apollo Server.@apollo/server/express4, or you could import it from the separate package@as-integrations/express4. In Apollo Server 5, you must import it from the separate package. You can migrate your server to the new package before upgrading to Apollo Server 5. (You can also use@as-integrations/express5for a middleware that works with Express 5.)fetchimplementation for HTTP requests by default, instead of thenode-fetchnpm package. If your server uses an HTTP proxy to make HTTP requests, you need to configure it in a slightly different way. See the migration guide for details.startStandaloneServerno longer uses Express. This is mostly invisible, but it does set slightly fewer headers. If you rely on the fact that this server is based on Express, you should explicitly use the Express middleware.@deferand@stream(which requires using a pre-release version ofgraphqlv17) now explicitly only works with version17.0.0-alpha.2ofgraphql. Note that this supports the same incremental delivery protocol implemented by Apollo Server 4, which is not the same protocol in the latest alpha version ofgraphql. As this support is experimental, we may switch over from "onlyalpha.2is supported" to "only a newer alpha or final release is supported, with a different protocol" during the lifetime of Apollo Server 5.variablesmap for a variable declared in the operation as aString) with a 400 status code, indicating a client error. This is also the behavior of Apollo Server 3. Apollo Server 4 mistakenly responds to these requests with a 200 status code by default; we recommended the use of thestatus400ForVariableCoercionErrors: trueoption to restore the intended behavior. That option now defaults to true.precomputedNonceoption to landing page plugins (which was only non-deprecated for 8 days) has been removed.Patch Changes
There are a few other small changes in v5:
#8076
5b26558Thanks @valters! - Fix some error logs to properly calllogger.errororlogger.warnwiththisset. This fixes errors or crashes from logger implementations that expectthisto be set properly in their methods.#7515
100233aThanks @trevor-scheer! - ApolloServerPluginSubscriptionCallback now takes afetcherargument, like the usage and schema reporting plugins. The default value is Node's built-in fetch.Updated dependencies [
100233a]:apollographql/router (apollo-router)
v2.9.0Compare Source
🚀 Features
Add CORS Private Network Access support (PR #8279)
CORS configuration now supports private network access (PNA). Enable PNA for a CORS policy by specifying the
private_network_accessfield, which supports two optional subfields:access_idandaccess_name.Example configuration:
By @TylerBloom in #8279
Configure maximum HTTP/2 header list size (PR #8636)
The router now supports configuring the maximum size for HTTP/2 header lists via the
limits.http2_max_headers_list_bytessetting. This protects against excessive resource usage from clients sending large sets of HTTP/2 headers.The default remains 16KiB. When a client sends a request with HTTP/2 headers whose total size exceeds the configured limit, the router rejects the request with a 431 error code.
Example configuration:
By @aaronArinder in #8636
Customize response cache key per subgraph via context (PR #8543)
The response cache key can now be customized per subgraph using the
apollo::response_cache::keycontext entry. The newsubgraphsfield enables defining separate cache keys for individual subgraphs.Subgraph-specific data takes precedence over data in the
allfield—the router doesn't merge them. To set common data when providing subgraph-specific data, add it to the subgraph-specific section.Example payload:
{ "all": 1, "subgraph_operation1": "key1", "subgraph_operation2": { "data": "key2" }, "subgraphs": { "my_subgraph": { "locale": "be" } } }By @bnjjj in #8543
Add telemetry selector for Cache-Control metrics (PR #8524)
The new
response_cache_controlselector enables telemetry metrics based on the computedCache-Controlheader from subgraph responses.Example configuration:
By @bnjjj in #8524
🐛 Fixes
Remove
_redactedsuffix from event attributes inapollo.router.state.change.totalmetric (Issue #8464)Event names in the
apollo.router.state.change.totalmetric no longer include the_redactedsuffix. The metric now uses theDisplaytrait instead ofDebugfor event names, changing values likeupdateconfiguration_redactedtoupdateconfigurationin APM platforms.The custom behavior for
UpdateLicenseevents is retained—the license state name is still appended.By @rohan-b99 in #8464
Preserve Content-Length header for responses with known size (Issue #7941)
The router now uses the
Content-Lengthheader for GraphQL responses with known content lengths instead oftransfer-encoding: chunked. Previously, thefleet_detectorplugin destroyed HTTP body size hints when collecting metrics.This extends the fix from #6538, which preserved size hints for
router → subgraphrequests, to also coverclient → routerrequests and responses. Size hints now flow correctly through the entire pipeline for optimal HTTP header selection.By @morriswchris in #7977
Correct
apollo.router.operations.subscriptions.eventsmetric counting (PR #8483)The
apollo.router.operations.subscriptions.eventsmetric now increments correctly for each subscription event (excluding ping/pong/close messages). The counter call has been moved into the stream to trigger on each event.This change also removes custom pong response handling before connection acknowledgment, which previously caused duplicate pongs because the WebSocket implementation already handles pings by default.
By @rohan-b99 in #8483
Unify timeout codes in response caching metrics (PR #8515)
Tokio- and Redis-based timeouts now use the same
timeoutcode inapollo.router.operations.response_cache.*.errormetrics. Previously, they were inadvertently given different code values.By @carodewig in #8515
📃 Configuration
Remove unused TTL parameter from response cache Redis configuration (PR #8513)
The
ttlparameter underredisconfiguration had no effect and is removed. Configure TTL at thesubgraphlevel to control cache entry expiration:By @carodewig in #8513
📚 Documentation
Document active subgraph requests selector (PR #8530)
The telemetry selectors documentation now correctly reflects the
active_subgraph_requestsattribute.By @faisalwaseem in #8530
Add Redis cache suggestions to response cache documentation (PR #8624)
The FAQ now includes information about supported Redis versions and Redis key eviction setup.
By @carodewig in #8624
v2.8.2Compare Source
🐛 Fixes
Support arrays in complex
@keyfields for entity caching (PR #8367)Entity caching now supports arrays (including arrays of objects and scalars) in complex
@keyfields when resolving entities by key. This improves entity matching when using complex@keyfields as primary cache keys.By @aaronArinder, @bnjjj, and @duckki in #8367
Parse scientific notation correctly in Rhai scripts (PR #8528)
The router now correctly parses scientific notation (like
1.5e10) in Rhai scripts and JSON operations. Previously, the Rhai scripting engine failed to parse these numeric formats, causing runtime errors when your scripts processed data containing exponential notation.This fix upgrades Rhai from 1.21.0 to 1.23.6, resolving the parsing issue and ensuring your scripts handle scientific notation seamlessly.
By @BrynCooke in #8528
Support enum types in
@cacheTagdirective format (PR #8496)Composition validation no longer raises an error when using enum types in the
@cacheTagdirective'sformatargument. Previously, only scalar types were accepted.Example:
By @bnjjj in #8496
Improve debugging data with caching flag and enhanced warnings (PR #8459)
Debugging data now includes a flag that indicates to Apollo Sandbox whether the data should be cached, preventing unnecessary local computation. This update also includes improved warnings.
By @bnjjj in #8459
Display cache tags from subgraph responses in debugger (PR #8531)
The debugger now displays cache tags generated from subgraph responses (in
extensions). For performance reasons, these generated cache tags are only displayed when the data has been cached in debug mode.By @bnjjj in #8531
📚 Documentation
Clarify guidance for OpenTelemetry "Recommended" attributes in telemetry documentation
The router telemetry documentation now clarifies that OpenTelemetry's "Recommended" attributes from their development-status GraphQL semantic conventions are experimental and still evolving. Apollo recommends using
requiredattributes instead ofrecommendedattributes because of high cardinality, security, and performance risks with attributes likegraphql.document.Learn more in Router Telemetry.
By @abernix
🧪 Experimental
Prevent panic when record/replay plugin encounters non-UTF-8 header values (PR #8485)
The record/replay plugin no longer panics when externalizing headers with invalid UTF-8 values. Instead, the plugin writes the header keys and errors to a
header_errorsobject for both requests and responses.By @rohan-b99 in #8485
v2.8.1Compare Source
🔒 Security
Fix authorization plugin handling of polymorphic types
Updates the auth plugin to correctly handle access control requirements when processing polymorphic types.
When querying interface types/fields, the auth plugin was verifying only whether all implementations shared the same access control requirements. In cases where interface types/fields did not specify the same access control requirements as the implementations, this could result in unauthorized access to protected data.
The auth plugin was updated to correctly verify that all polymorphic access control requirements are satisfied by the current context.
See GHSA-x33c-7c2v-mrj9 for additional details and the associated CVE number.
By @dariuszkuc
Fixed authorization plugin handling of directive renames
The router auth plugin did not properly handle access control requirements when subgraphs renamed their access control directives through imports. When such renames occurred, the plugin’s
@link-processing code ignored the imported directives entirely, causing access control constraints defined by the renamed directives to be ignored.The plugin code was updated to call the appropriate functionality in the
apollo-federationcrate, which correctly handles both because spec and imports directive renames.See GHSA-g8jh-vg5j-4h3f for additional details and the associated CVE number.
By @sachindshinde
v2.8.0Compare Source
🚀 Features
Response caching
Available on all GraphOS plans including Free, Developer, Standard and Enterprise.
Response caching enables the router to cache GraphQL subgraph origin responses using Redis, delivering performance improvements by reducing subgraph load and query latency. Unlike traditional HTTP caching or client-side caching, response caching works at the GraphQL entity level—caching reusable portions of query responses that can be shared across different operations and users.
Response caching caches two types of data:
Benefits include:
Cache-Controlheaders from subgraph originsResponse caching solves traditional GraphQL caching challenges including mixed TTL requirements across a single response, personalized versus public data mixing, and high data duplication.
Configure response caching using the
preview_response_cacheconfiguration option with Redis as the cache backend. For complete setup instructions and advanced configuration, see the Response Caching documentation.Migration from entity caching: For existing entity caching users, migration is as simple as renaming configuration options. For migration details see the Response Caching FAQ.
Support per-stage coprocessor URLs (PR #8384)
You can now configure different coprocessor URLs for each stage of request/response processing (router, supergraph, execution, subgraph). Each stage can specify its own
urlfield that overrides the global default URL.Changes:
urlfield to all stage configuration structsas_servicemethods to accept and resolve URLsThis change maintains full backward compatibility—existing configurations with a single global URL continue to work unchanged.
By @cgati in #8384
Add automatic unit conversion for duration instruments with non-second units
The router now automatically converts duration measurements to match the configured unit for telemetry instruments.
Previously, duration instruments always recorded values in seconds regardless of the configured
unitfield.When you specify units like
"ms"(milliseconds),"us"(microseconds), or"ns"(nanoseconds),the router automatically converts the measured duration to the appropriate scale.
Supported units:
"s"- seconds (default)"ms"- milliseconds"us"- microseconds"ns"- nanosecondsExample:
By Jon Christiansen in #8415
Add response reformatting and result coercion errors (PR #8441)
All subgraph responses are checked and corrected to ensure alignment with the schema and query. When a misaligned value is returned, it's nullified. When enabled, errors for this nullification are now included in the errors array in the response.
Enable this feature in your router configuration:
When enabled, the router generates validation errors with the code
RESPONSE_VALIDATION_FAILEDfor any values that don't match the expected GraphQL type. These errors include the specific path and reason for the validation failure, helping you identify data inconsistencies between your subgraphs and schema.While this feature improves GraphQL correctness, clients may encounter errors in responses where they previously did not, which may require consideration based on your specific usage patterns.
By @TylerBloom in #8441
Add router overhead metric (PR #8455)
The
apollo.router.overheadhistogram provides a direct measurement of router processing overhead. This metric tracks the time the router spends on tasks other than waiting for downstream HTTP requests—including GraphQL parsing, validation, query planning, response composition, and plugin execution.The overhead calculation excludes time spent waiting for downstream HTTP services (subgraphs and connectors), giving you visibility into the router's actual processing time versus downstream latency. This metric helps identify when the router itself is a bottleneck versus when delays are caused by downstream services.
Note: Coprocessor request time is currently included in the overhead calculation. In a future release, coprocessor time may be excluded similar to subgraphs and connectors.
By @BrynCooke in #8455
Include invalid Trace ID values in error logs (PR #8149)
Error messages for malformed Trace IDs now include the invalid value to help with debugging. Previously, when the router received an unparseable Trace ID in incoming requests, error logs only indicated that the Trace ID was invalid without showing the actual value.
Trace IDs can be unparseable due to invalid hexadecimal characters, incorrect length, or non-standard formats. Including the invalid value in error logs makes it easier to diagnose and resolve tracing configuration issues.
By @juancarlosjr97 in #8149
Add ability to rename metrics (PR #8424)
The router can now rename instruments via OpenTelemetry views. Details on how to use this feature can be found in the docs.
Benefits:
By @theJC in #8412
🐛 Fixes
Reload telemetry only when configuration changes (PR #8328)
Previously, schema or config reloads would always reload telemetry, dropping existing exporters and creating new ones.
Telemetry exporters are now only recreated when relevant configuration has changed.
By @BrynCooke in #8328
Replace Redis connections metric with clients metric (PR #8161)
The
apollo.router.cache.redis.connectionsmetric has been removed and replaced with theapollo.router.cache.redis.clientsmetric.The
connectionsmetric was implemented with an up-down counter that would sometimes not be collected properly (it could go negative). The nameconnectionswas also inaccurate since Redis clients each make multiple connections, one to each node in the Redis pool (if in clustered mode).The new
clientsmetric counts the number of clients across the router via anAtomicU64and surfaces that value in a gauge.By @carodewig in #8161
Prevent entity caching of expired data based on Age header (PR #8456)
When the
Ageheader is higher than themax-agedirective inCache-Control, the router no longer caches the data because it's already expired.For example, with these headers:
The data won't be cached since
Age(90) exceedsmax-age(5).By @bnjjj in #8456
Reduce config and schema reload log noise (PR #8336)
File watch events during an existing hot reload no longer spam the logs. Hot reload continues as usual after the existing reload finishes.
By @goto-bus-stop in #8336
Prevent query planning errors for
@shareablemutation fields (PR #8352)Query planning a mutation operation that executes a
@shareablemutation field at the top level may unexpectedly error when attempting to generate a plan where that mutation field is called more than once across multiple subgraphs. Query planning now avoids generating such plans.By @sachindshinde in #8352
Prevent UpDownCounter drift using RAII guards (PR #8379)
UpDownCounters now use RAII guards instead of manual incrementing and decrementing, ensuring they're always decremented when dropped.
This fix resolves drift in
apollo.router.opened.subscriptionsthat occurred due to manual incrementing and decrementing.By @BrynCooke in #8379
Reduce Rhai short circuit response log noise (PR #8364)
Rhai scripts that short-circuit the pipeline by throwing now only log an error if a response body isn't present.
For example the following will NOT log:
For example the following WILL log:
By @BrynCooke in #8364
Prevent query planning error where
@requiressubgraph jump fetches@keyfrom wrong subgraph (PR #8016)During query planning, a subgraph jump added due to a
@requiresfield may sometimes try to collect the necessary@keyfields from an upstream subgraph fetch as an optimization, but it wasn't properly checking whether that subgraph had those fields. This is now fixed and resolves query planning errors with messages like "Cannot add selection of fieldT.idto selection set of parent typeT".By @sachindshinde in #8016
Reduce log level for interrupted WebSocket streams (PR #8344)
The router now logs interrupted WebSocket streams at
tracelevel instead oferrorlevel.Previously, WebSocket stream interruptions logged at
errorlevel, creating excessive noise in logs when clients disconnected normally or networks experienced transient issues. Client disconnections and network interruptions are expected operational events that don't require immediate attention.Your logs will now be cleaner and more actionable, making genuine errors easier to spot. You can enable
tracelevel logging when debugging WebSocket connection issues.By @bnjjj in #8344
Respect Redis cluster slots when inserting multiple items (PR #8185)
The existing
insertcode would silently fail when trying to insert multiple values that correspond to different Redis cluster hash slots. This change corrects that behavior, raises errors when inserts fail, and adds new metrics to track Redis client health.New metrics:
apollo.router.cache.redis.unresponsive: counter for 'unresponsive' events raised by the Redis librarykind: Redis cache purpose (APQ,query planner,entity)server: Redis server that became unresponsiveapollo.router.cache.redis.reconnection: counter for 'reconnect' events raised by the Redis librarykind: Redis cache purpose (APQ,query planner,entity)server: Redis server that required client reconnectionBy @carodewig in #8185
Prevent unnecessary precomputation during query planner construction (PR #8373)
A regression introduced in v2.5.0 caused query planner construction to unnecessarily precompute metadata, leading to increased CPU and memory utilization during supergraph loading. Query planner construction now correctly avoids this unnecessary precomputation.
By @sachindshinde in #8373
Update cache key version for entity caching (PR #8458)
The entity cache key version has been bumped to avoid keeping invalid cached data for too long (fixed in #8456).
By @bnjjj in #8458
📃 Configuration
Add telemetry instrumentation config for
http_clientheaders (PR #8349)A new telemetry instrumentation configuration for
http_clientspans allows request headers added by Rhai scripts to be attached to thehttp_clientspan. Thesome_rhai_response_headervalue remains available on the subgraph span as before.By @bonnici in #8349
Promote Subgraph Insights metrics flag to general availability (PR #8392)
The
subgraph_metricsconfig flag that powers the Studio Subgraph Insights feature is now promoted frompreviewto general availability.The flag name has been updated from
preview_subgraph_metricstoBy @david_castaneda in #8392
🛠 Maintenance
Add export destination details to trace and metrics error messages (PR #8363)
Error messages raised during tracing and metric exports now indicate whether the error occurred when exporting to Apollo Studio or to your configured OTLP or Zipkin endpoint. For example, errors that occur when exporting Apollo Studio traces look like:
OpenTelemetry trace error occurred: [apollo traces] <etc>while errors that occur when exporting traces to your configured OTLP endpoint look like:
OpenTelemetry trace error occurred: [otlp traces] <etc>By @bonnici in #8363
📚 Documentation
Change MCP default port from 5000 to 8000 (PR #8375)
MCP's default port has changed from 5000 to 8000.
Add Render and Railway deployment guides (PR #8242)
Two new deployment guides are now available for popular hosting platforms: Render and Railway.
By @the-gigi-apollo in #8242
Add comprehensive context key reference (PR #8420)
The documentation now includes a comprehensive reference for all context keys the router supports.
By @faisalwaseem in #8420
Reorganize observability documentation structure (PR #8183)
Restructured the router observability and telemetry documentation to improve content discoverability and user experience. GraphOS insights documentation and router OpenTelemetry telemetry documentation are now in separate sections, with APM-specific documentation organized in dedicated folders for each APM provider (Datadog, Dynatrace, Jaeger, Prometheus, New Relic, Zipkin). This reorganization makes it easier for users to find relevant monitoring and observability configuration for their specific APM tools.
By @Robert113289 in #8183
Add comprehensive Datadog integration documentation (PR #8319)
The Datadog APM guide has been expanded to include the OpenTelemetry Collector, recommended router telemetry configuration, and out-of-the-box dashboard templates:
By @Robert113289 in #8319
Clarify timeout hierarchy for traffic shaping (PR #8203)
The docu
Configuration
📅 Schedule: Branch creation - At 12:00 AM through 04:59 AM and 10:00 PM through 11:59 PM, Monday through Friday ( * 0-4,22-23 * * 1-5 ), Only on Sunday and Saturday ( * * * * 0,6 ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.