-
Prevent webpack from misresolving the
graphqlpackage as the local@apollo/client/utilities/globals/graphql.jsmodule whenmodule.exports.resolve.preferRelativeis enabled inwebpack.config.js.Note: if you encounter strange module resolution errors like
export 'isType' (imported as 'isType') was not found in 'graphql' (possible exports: removeTemporaryGlobals)please try removingpreferRelative: truefrom yourwebpack.config.jsfile, or find a way to disable that resolution behavior for packages withinnode_modules. -
Avoid importing
isTypefrom thegraphqlpackage internally, to prevent bundlers from including as much as 3.4kB of unnecessary code.
@benjamn in #8891 -
Make
client.resetStoreandclient.clearStorepass appropriatediscardWatchesoption tocache.reset.
@benjamn in #8873
- Require calling
cache.reset({ discardWatches: true })to makecache.resetdiscardcache.watches, restoring behavior broken in v3.4.14 by #8826.
@benjamn in #8852
-
Disable
InMemoryCacheresult object canonization by default, to prevent unexpected memory growth and/or reuse of object references, with multiple ways to reenable it (per-cache, per-query, or a mixture of both).
@benjamn in #8822 -
Clear
InMemoryCachewatchesset whencache.reset()called.
@benjamn in #8826 -
Stop excluding observerless queries from
refetchQueries: [...]selection.
@benjamn in #8825 -
Prevent optimistic cache evictions from evicting non-optimistic data.
@benjamn in #8829 -
Ensure
cache.broadcastWatchpasses all relevantWatchOptionstocache.diffasDiffOptions.
@benjamn in #8832
-
Fix
componentDidUpatetypo inwithSubscriptionhigher-order component.
@YarBez in #7506 -
Fix internal
canUseSymbolimport within@apollo/client/utilitiesto avoid breaking bundlers/builds.
@benjamn in #8817 -
Tolerate unfreezable objects like
Uint8ArrayandBufferinmaybeDeepFreeze.
@geekuillaume and @benjamn in #8813
-
Improve handling of falsy
existingand/orincomingparameters inrelayStylePaginationfield policy helper function.
@bubba and @benjamn in #8733 -
Associate Apollo context with
React.createContext(instead of using a localWeakMap) again, so multiple copies of@apollo/client(uncommon) can share the same context.
@benjamn in #8798
- Fix Vite tree-shaking by calling the
checkDEV()function (at least once) in the module that exports it,@apollo/client/utilities/globals/index.ts.
@benjamn in #8767
- Upgrade docs theme for new Algolia-powered search experience.
@trevorblades in #8768
- Warn when calling
refetch({ variables })instead ofrefetch(variables), except for queries that declare a variable named$variables(uncommon).
@benjamn in #8702
-
Fix
ObservableQuery.getCurrentResult()returning cacheddatawith certain fetch policies.
@brainkim in #8718 -
Prevent
ssrMode/ssrForceFetchDelayfrom causing queries to hang.
@brainkim in #8709 -
Import
@apollo/client/utilities/globalsinternally wherever__DEV__is used, not just in@apollo/client/**/index.jsentry points.
@benjamn in #8720
-
Fix unhandled
Promiserejection warnings/errors whose message isObservable cancelled prematurely.
@benjamn in #8676 -
Enforce that
__DEV__is polyfilled by every@apollo/client/*entry point that uses it. This build step considers not only explicit__DEV__usage but also__DEV__references injected nearinvariant(...)andnew InvariantError(...)expressions.
@benjamn in #8689
-
Fix error thrown by nested
keyFields: ["a", ["b", "c"], "d"]type policies when writing results into the cache where any of the key fields (.a,.a.b,.a.c, or.d) have been renamed by query field alias syntax.
@benjamn in #8643 -
Fix regression from PR #8422 (first released in
@apollo/client@3.4.0-rc.15) that causedresult.datato be set to undefined in some cases afterObservableQuery#getCurrentResultreads an incomplete result from the cache.
@benjamn in #8642
- Fix accidental reuse of recycled
MergeTreeobjects inStoreWriterclass used byInMemoryCache.
@benjamn in #8618
-
Reevaluate
window.fetcheach timeHttpLinkuses it, if not configured usingoptions.fetch. This change enables a variety of strategies for instrumentingwindow.fetch, without requiring those strategies to run before@apollo/client/link/httpis first imported.
@benjamn in #8603 -
Clarify mutation
fetchPolicyoptions ("network-only"or"no-cache") usingMutationFetchPolicyunion type.
@benjamn in #8602
-
Restore full
@apollo/client/apollo-client.cjs.jsCommonJS bundle for older bundlers.Note that Node.js and CommonJS bundlers typically use the bundles specified by
"main"fields in our generatedpackage.jsonfiles, which are all independent and non-overlapping CommonJS modules. However,apollo-client.cjs.jsis just one big bundle, so mixing imports ofapollo-client.cjs.jswith the other CommonJS bundles is discouraged, as it could trigger the dual package hazard. In other words, please don't start usingapollo-client.cjs.jsif you're not already. -
Log
MissingFieldErrors inObservableQuery#getCurrentResultusinginvariant.debug, rather than reporting them viaresult.error.
@benjamn in #8604
-
Fix double registration bug for mutation
refetchQueriesspecified using legacy one-timerefetchQueries: [{ query, variables }]style. Though the bug is fixed, we recommend usingrefetchQueries: [query]instead (when possible) to refetch an existing query using itsDocumentNode, rather than creating, executing, and then deleting a new query, as the legacy{ query, variables }style unfortunately does.
@benjamn in #8586 -
Fix
useQuery/useLazyQuerystalling when clients or queries change.
@brainkim in #8589
- Revert accidental addition of
engines.npmsection to published version of@apollo/client/package.json.
@benjamn in #8578
- Use more default type parameters for mutation-related types in
react/types/types.ts, to provide smoother backwards compatibility for code using those types explicitly.
@benjamn in #8573
- Initialize
stringifyCanonlazily, whencanonicalStringifyis first called, fixingUncaught ReferenceError: __DEV__ is not definederrors due to usage of__DEV__before declaration.
@benjamn in #8557
- Refetching queries with
client.refetchQueries.
@StephenBarlow and @benjamn in #8265
-
InMemoryCachenow guarantees that any two result objects returned by the cache (fromreadQuery,readFragment, etc.) will be referentially equal (===) if they are deeply equal. Previously,===equality was often achievable for results for the same query, on a best-effort basis. Now, equivalent result objects will be automatically shared among the result trees of completely different queries. This guarantee is important for taking full advantage of optimistic updates that correctly guess the final data, and for "pure" UI components that can skip re-rendering when their input data are unchanged.
@benjamn in #7439 -
Mutations now accept an optional callback function called
onQueryUpdated, which will be passed theObservableQueryandCache.DiffResultobjects for any queries invalidated by cache writes performed by the mutation's finalupdatefunction. UsingonQueryUpdated, you can override the defaultFetchPolicyof the query, by (for example) callingObservableQuerymethods likerefetchto force a network request. This automatic detection of invalidated queries provides an alternative to manually enumerating queries using therefetchQueriesmutation option. Also, if you return aPromisefromonQueryUpdated, the mutation will automatically await thatPromise, rendering theawaitRefetchQueriesoption unnecessary.
@benjamn in #7827 -
Support
client.refetchQueriesas an imperative way to refetch queries, without having to passoptions.refetchQueriestoclient.mutate.
@dannycochran in #7431 -
Improve standalone
client.refetchQueriesmethod to support automatic detection of queries needing to be refetched.
@benjamn in #8000 -
Fix remaining barriers to loading
@apollo/client/coreas native ECMAScript modules from a CDN like esm.run. Importing@apollo/clientfrom a CDN will become possible once we move all React-related dependencies into@apollo/client/reactin Apollo Client 4.
@benjamn in #8266 -
InMemoryCachesupports a new method calledbatch, which is similar toperformTransactionbut takes named options rather than positional parameters. One of these named options is anonDirty(watch, diff)callback, which can be used to determine which watched queries were invalidated by thebatchoperation.
@benjamn in #7819 -
Allow
merge: truefield policy to mergeReferenceobjects with non-normalized objects, and vice-versa.
@benjamn in #7778 -
Allow identical subscriptions to be deduplicated by default, like queries.
@jkossis in #6910 -
Always use
POSTrequest when falling back to sending full query with@apollo/client/link/persisted-queries.
@rieset in #7456 -
The
FetchMoreQueryOptionstype now takes two instead of three type parameters (<TVariables, TData>), thanks to usingPartial<TVariables>instead ofK extends typeof TVariablesandPick<TVariables, K>.
@ArnaudBarre in #7476 -
Pass
variablesandcontextto a mutation'supdatefunction. Note: The type of theupdatefunction is now namedMutationUpdaterFunctionrather thanMutationUpdaterFn, since the older type was broken beyond repair. If you are usingMutationUpdaterFnin your own code, please useMutationUpdaterFunctioninstead.
@jcreighton in #7902 -
A
resultCacheMaxSizeoption may be passed to theInMemoryCacheconstructor to limit the number of result objects that will be retained in memory (to speed up repeated reads), and callingcache.reset()now releases all such memory.
@SofianHn in #8107 -
Fully remove result cache entries from LRU dependency system when the corresponding entities are removed from
InMemoryCacheby eviction, or by any other means.
@sofianhn and @benjamn in #8147 -
Add expected/received
variablestoNo more mocked responses...error messages generated byMockLink.
@markneub in #8340 -
The
InMemoryCacheversion of thecache.gcmethod now supports additional options for removing non-essential (recomputable) result caching data.
@benjamn in #8421 -
Suppress noisy
Missing cache result fields...warnings by default unlesssetLogVerbosity("debug")called.
@benjamn in #8489 -
Improve interaction between React hooks and React Fast Refresh in development.
@andreialecu in #7952
-
To avoid retaining sensitive information from mutation root field arguments, Apollo Client v3.4 automatically clears any
ROOT_MUTATIONfields from the cache after each mutation finishes. If you need this information to remain in the cache, you can prevent the removal by passing thekeepRootFields: trueoption toclient.mutate.ROOT_MUTATIONresult data are also passed to the mutationupdatefunction, so we recommend obtaining the results that way, rather than usingkeepRootFields: true, if possible.
@benjamn in #8280 -
Internally, Apollo Client now controls the execution of development-only code using the
__DEV__global variable, rather thanprocess.env.NODE_ENV. While this change should not cause any visible differences in behavior, it will increase your minified+gzip bundle size by more than 3.5kB, unless you configure your minifier to replace__DEV__with atrueorfalseconstant, the same way you already replaceprocess.env.NODE_ENVwith a string literal like"development"or"production". For an example of configuring a Create React App project without ejecting, see this pull request for our React Apollo reproduction template.
@benjamn in #8347 -
Internally, Apollo Client now uses namespace syntax (e.g.
import * as React from "react") for imports whose types are re-exported (and thus may appear in.d.tsfiles). This change should remove any need to configureesModuleInteroporallowSyntheticDefaultImportsintsconfig.json, but might require updating bundler configurations that specify named exports of thereactandprop-typespackages, to include exports likecreateContextandcreateElement(example).
@devrelm in #7742 -
Respect
no-cachefetch policy (by not reading anydatafrom the cache) forloading: trueresults triggered bynotifyOnNetworkStatusChange: true.
@jcreighton in #7761 -
The TypeScript return types of the
getLastResultandgetLastErrormethods ofObservableQuerynow correctly include the possibility of returningundefined. If you happen to be calling either of these methods directly, you may need to adjust how the calling code handles the methods' possibly-undefinedresults.
@benjamn in #8394 -
Log non-fatal
invariant.errormessage when fields are missing from result objects written intoInMemoryCache, rather than throwing an exception. While this change relaxes an exception to be merely an error message, which is usually a backwards-compatible change, the error messages are logged in more cases now than the exception was previously thrown, and those new error messages may be worth investigating to discover potential problems in your application. The errors are not displayed for@client-only fields, so adding@clientis one way to handle/hide the errors for local-only fields. Another general strategy is to use a more precise query to write specific subsets of data into the cache, rather than reusing a larger query that contains fields not present in the writtendata.
@benjamn in #8416 -
The
nextFetchPolicyoption forclient.watchQueryanduseQuerywill no longer be removed from theoptionsobject after it has been applied, and instead will continue to be applied any timeoptions.fetchPolicyis reset to another value, until/unless theoptions.nextFetchPolicyproperty is removed fromoptions.
@benjamn in #8465 -
The
fetchMore,subscribeToMore, andupdateQueryfunctions returned from theuseQueryhook may now return undefined in edge cases where the functions are called when the component is unmounted
@noghartt in #7980.
-
In Apollo Client 2.x, a
refetchoperation would always replace existing data in the cache. With the introduction of field policymergefunctions in Apollo Client 3, existing field values could be inappropriately combined with incoming field values by a custommergefunction that does not realize arefetchhas happened.To give you more control over this behavior, we have introduced an
overwrite?: boolean = falseoption forcache.writeQueryandcache.writeFragment, and an option calledrefetchWritePolicy?: "merge" | "overwrite"forclient.watchQuery,useQuery, and other functions that acceptWatchQueryOptions. You can use these options to make sure anymergefunctions involved in cache writes forrefetchoperations get invoked withundefinedas their first argument, which simulates the absence of any existing data, while still giving themergefunction a chance to determine the internal representation of the incoming data.The default behaviors are
overwrite: trueandrefetchWritePolicy: "overwrite", which restores the Apollo Client 2.x behavior, but (if this change causes any problems for your application) you can easily recover the previous merging behavior by setting a default value forrefetchWritePolicyindefaultOptions.watchQuery:new ApolloClient({ defaultOptions: { watchQuery: { refetchWritePolicy: "merge", }, }, })
-
Make sure the
MockedResponseResultFunctiontype is re-exported.
@hwillson in #8315 -
InMemoryCachenow coalescesEntityStoreupdates to guarantee only onestore.merge(id, fields)call peridper cache write.
@benjamn in #8372 -
Fix polling when used with
<React.StrictMode>.
@brainkim in #8414 -
Fix the React integration logging
Warning: Can't perform a React state update on an unmounted component.
@wuarmin in #7745 -
Make
ObservableQuery#getCurrentResultalways callqueryInfo.getDiff().
@benjamn in #8422 -
Make
readFielddefault to reading from current object only when thefromoption/argument is actually omitted, not whenfromis passed toreadFieldwith an undefined value. A warning will be printed when this situation occurs.
@benjamn in #8508 -
The
fetchMore,subscribeToMore, andupdateQueryfunctions no longer throwundefinederrors
@noghartt in #7980.
-
Fix race condition in
@apollo/client/link/contextthat could leak subscriptions if the subscription is cancelled beforeoperation.setContextis called.
@sofianhn in #8399 -
Prefer
existing.pageInfo.startCursorandendCursor(if defined) inreadfunction ofrelayStylePaginationpolicies.
@benjamn in #8438
- Fix policy merging bug when calling
cache.policies.addTypePoliciesmultiple times for the same type policy.
@Banou26 in #8361
- Use
export ... fromsyntax to re-exportgraphql-tagnamed exports, making tree-shaking easier for some bundlers.
@benjamn in #8221
- Replace Spectrum references with community.apollographql.com.
@hwillson in #8238
- Add
"sideEffects": falseto all generated/publishedpackage.jsonfiles, to improve dead code elimination for nested entry points like@apollo/client/cache.
@benjamn in #8213
- Make
useReactiveVar(rv)recheck the latestrv()value in itsuseEffectcallback, and immediately update state if the value has already changed, rather than callingrv.onNextChange(setValue)to listen for future changes.
@benjamn in #8135
-
Prevent
undefinedmutation result inuseMutation.
@jcreighton in #8018 -
Fix
useReactiveVarnot rerendering for successive synchronous calls.
@brainkim in #8022 -
Support
batchDebounceoption forBatchLinkandBatchHttpLink.
@dannycochran in #8024
-
Increment
queryInfo.lastRequestIdonly when making a network request through theApolloLinkchain, rather than every timefetchQueryByPolicyis called.
@dannycochran in #7956 -
During server-side rendering, allow initial
useQuerycalls to return final{ loading: false, data }results when the cache already contains the necessary data.
@benjamn in #7983
- Adjust TypeScript types to allow
keyFieldsandkeyArgsfunctions to returnfalse.
@CarsonF and @benjamn in #7900
-
Prevent
RenderPromisesmemory leak by callingrenderPromises.clear()aftergetMarkupFromTreefinishes.
@benjamn in #7943 -
Cancel pending notify timeout when stopping a
QueryInfoobject.
@hollandThomas in #7935 -
Fix infinite rendering bug related to
useSubscription.
@brainkim in #7917
-
Add missing
contextoption touseSubscription.
@jcreighton in #7860 -
Remove unnecessary TypeScript global
Observable<T>["@@observable"]method declaration.
@benjamn in #7888 -
Prevent skipped/observerless
ObservableQuerys from being refetched byrefetchQueries.
@dannycochran in #7877
-
Maintain serial ordering of
asyncMapmapping function calls, and prevent potential unhandledPromiserejection errors.
@benjamn in #7818 -
Relax incompatible
children?: React.ReactElementfield type inMockedProviderPropsinterface.
@kevinperaza in #7833
- Fix
useLazyQueryforceUpdateloop regression introduced by #7655 in version 3.3.10.
@benjamn in #7715
-
Revert PR #7276, but test that garbage collection reclaims torn-down
ObservableQueryobjects.
@benjamn in #7695 -
Reset
QueryInfo.diffandQueryInfo.dirtyafter canceling notify timeout inQueryInfo.markResultandQueryInfo.markError.
@jcreighton in #7696
-
Avoid calling
forceUpdatewhen component is unmounted.
@DylanVann in #7655 -
The
codemods/top-level directory has been moved into thescripts/directory.
@benjamn in #7675
- Prevent reactive variables from retaining otherwise unreachable
InMemoryCacheobjects.
@benjamn in #7661
- The
graphql-tagdependency has been updated to version 2.12.0, after converting its repository to use TypeScript and ECMAScript module syntax. There should be no visible changes in behavior, though the internal changes seemed significant enough to mention here.
@abdonrd in graphql-tag#273 and @PowerKiKi in graphql-tag#325
-
Catch updates in
useReactiveVarwith an additional check.
@jcreighton in #7652 -
Reactivate forgotten reactive variables whenever
InMemoryCacheacquires its first watcher.
@benjamn in #7657 -
Backport
Symbol.speciesfix forConcastandObservableQueryfromrelease-3.4, fixing subscriptions in React Native Android when the Hermes JavaScript engine is enabled (among other benefits).
@benjamn in #7403 and #7660
-
Fix a regression due to #7310 that caused
loadingalways to betrueforskip: trueresults during server-side rendering.
@rgrove in #7567 -
Avoid duplicate
useReactiveVarlisteners when rendering inReact.StrictMode.
@jcreighton in #7581
- Set
displayNameonApolloContextobjects for easier debugging.
@dulmandakh in #7550
-
Immediately apply
queryType: true,mutationType: true, andsubscriptionType: truetype policies, rather than waiting for the first time the policy is used, fixing a regression introduced by #7065.
@benjamn in #7463 -
Check that
windowis defined even whenconnectToDevToolsistrue.
@yasupeke in #7434
-
Replace stray
console.debug(undefined in React Native) withinvariant.log.
@benjamn in #7454 -
Suggest Firefox Apollo DevTools as well as the Chrome extension.
@benjamn in #7461
- Restore
client.versionproperty, reflecting the current@apollo/clientversion frompackage.json.
@benjamn in #7448
- Update
ts-invariantto avoid potential Content Security Policy-violatingFunctionfallback, thanks to a clever newglobalThispolyfill technique.
@benjamn in #7414
- Make the
observerparameter ofApolloLink#onErroroptional, fixing an unnecessary breaking change for any code that calledonErrordirectly.
@benjamn in #7407
⚠️ Note: This version of@apollo/clientcontains no behavioral changes since version 3.3.1
-
The Pagination article has been completely rewritten (and split into multiple pages) to cover Apollo Client 3 field policies.
@benjamn and @StephenBarlow in #7175 -
Revamp local state tutorial chapter for Apollo Client 3, including reactive variables.
@StephenBarlow inapollographql@apollo#1050 -
Add examples of using
ApolloLinkto modify response data asynchronously.
@alichry in #7332 -
Consolidate separate v2.4, v2.5, and v2.6 documentation versions into one v2 version.
@jgarrow in #7378
- Revert back to
default-importingReactinternally, rather than using a namespace import.
@benjamn in 113475b1
-
Update
@wry/equalityto consider undefined properties equivalent to missing properties.
@benjamn in #7108 -
Prevent memory leaks involving unused
onBroadcastfunction closure created inApolloClientconstructor.
@kamilkisiela in #7161 -
Provide default empty cache object for root IDs like
ROOT_QUERY, to avoid differences in behavior before/afterROOT_QUERYdata has been written intoInMemoryCache.
@benjamn in #7100 -
Cancel
queryInfo.notifyTimeoutinQueryInfo#markResultto prevent unnecessary network requests when using aFetchPolicyofcache-and-networkornetwork-onlyin a React component with multipleuseQuerycalls.
@benjamn in #7347
-
Ensure
cache.readQueryandcache.readFragmentalways returnTData | null, instead of throwingMissingFieldErrorexceptions when missing fields are encountered.
@benjamn in #7098Since this change converts prior exceptions to
nullreturns, and sincenullwas already a possible return value according to theTData | nullreturn type, we are confident this change will be backwards compatible (as long asnullwas properly handled before). -
HttpLinkwill now automatically strip any unusedvariablesbefore sending queries to the GraphQL server, since those queries are very likely to fail validation, according to the All Variables Used rule in the GraphQL specification. If you depend on the preservation of unused variables, you can restore the previous behavior by passingincludeUnusedVariables: trueto theHttpLinkconstructor (which is typically passed asoptions.linkto theApolloClientconstructor).
@benjamn in #7127 -
Ensure
MockLink(used byMockedProvider) returns mock configuration errors (e.g.No more mocked responses for the query ...) through the Link'sObservable, instead of throwing them. These errors are now available through theerrorproperty of a result.
@hwillson in #7110Returning mock configuration errors through the Link's
Observablewas the default behavior in Apollo Client 2.x. We changed it for 3, but the change has been problematic for those looking to migrate from 2.x to 3. We've decided to change this back with the understanding that not many people want or are relying onMockLink's throwing exception approach. If you want to change this functionality, you can define custom error handling throughMockLink.setOnError. -
Unsubscribing the last observer from an
ObservableQuerywill once again unsubscribe from the underlying networkObservablein all cases, as in Apollo Client 2.x, allowing network requests to be cancelled by unsubscribing.
@javier-garcia-meteologica in #7165 and #7170. -
The independent
QueryBaseOptionsandModifiableWatchQueryOptionsinterface supertypes have been eliminated, and their fields are now defined byQueryOptions.
@DCtheTall in #7136 -
Internally, Apollo Client now avoids nested imports from the
graphqlpackage, importing everything from the top-level package instead. For example,import { visit } from "graphql/language/visitor"
is now just
import { visit } from "graphql"
Since the
graphqlpackage uses.mjsmodules, your bundler may need to be configured to recognize.mjsfiles as ECMAScript modules rather than CommonJS modules.
@benjamn in #7185
-
Support inheritance of type and field policies, according to
possibleTypes.
@benjamn in #7065 -
Allow configuring custom
mergefunctions, including themerge: trueandmerge: falseshorthands, in type policies as well as field policies.
@benjamn in #7070 -
The verbosity of Apollo Client console messages can be globally adjusted using the
setLogVerbosityfunction:import { setLogVerbosity } from "@apollo/client"; setLogVerbosity("log"); // display all messages setLogVerbosity("warn"); // display only warnings and errors (default) setLogVerbosity("error"); // display only errors setLogVerbosity("silent"); // hide all console messages
Remember that all logs, warnings, and errors are hidden in production.
@benjamn in #7226 -
Modifying
InMemoryCachefields that havekeyArgsconfigured will now invalidate only the field value with matching key arguments, rather than invalidating all field values that share the same field name. IfkeyArgshas not been configured, the cache must err on the side of invalidating by field name, as before.
@benjamn in #7351 -
Shallow-merge
options.variableswhen combining existing or default options with newly-provided options, so new variables do not completely overwrite existing variables.
@amannn in #6927 -
Avoid displaying
Cache data may be lost...warnings for scalar field values that happen to be objects, such as JSON data.
@benjamn in #7075 -
In addition to the
result.dataproperty,useQueryanduseLazyQuerywill now provide aresult.previousDataproperty, which can be useful when a network request is pending andresult.datais undefined, sinceresult.previousDatacan be rendered instead of rendering an empty/loading state.
@hwillson in #7082 -
Passing
validate: trueto theSchemaLinkconstructor will enable validation of incoming queries against the local schema before execution, returning validation errors inresult.errors, just like a non-local GraphQL endpoint typically would.
@amannn in #7094 -
Allow optional arguments in
keyArgs: [...]arrays forInMemoryCachefield policies.
@benjamn in #7109 -
Avoid registering
QueryPromisewhenskipistrueduring server-side rendering.
@izumin5210 in #7310 -
ApolloCacheobjects (includingInMemoryCache) may now be associated with or disassociated from individual reactive variables by callingreactiveVar.attachCache(cache)and/orreactiveVar.forgetCache(cache).
@benjamn in #7350
- Revert back to
default-importingReactinternally, rather than using a namespace import.
@benjamn in 113475b1
-
Ensure
sourcesContentarray is properly defined in.js.mapfiles generated bytsc.
@benjamn in #7371 -
Avoid relying on global
Symbolproperties inApolloContext.ts.
@benjamn in #7371
- Revert updating
symbol-observablefrom version 2.x to version 3, which caused TypeScript errors with some@types/nodeversions, especially in Angular applications.
@benjamn in #7340
-
Always consider singleton IDs like
ROOT_QUERYandROOT_MUTATIONto be root IDs duringcache.gcgarbage collection, regardless of whether they have been retained or released.
@benjamn in #7333 -
Use optional chaining syntax (
this.currentObservable?.refetch) in Reactrefetchwrapper function to avoid crashing when an unmounted component is accidentally refetched.
@tm1000 in #6314 and @linmic in #7186
-
Handle older
react-apollopackage incodemods/ac2-to-ac3/imports.jsmigration script.
@tm1000 in #7216 -
Ensure
relayStylePaginationpreservespageInfo.{start,end}Cursorifedgesis missing or empty.
@beaucollins in #7224
-
Move
terserdependency fromdependenciestodevDependencies.
@SimenB in #7188 -
Avoid all sub-package imports from the
graphqlnpm package.
@stoically in #7185
-
Update the
optimismnpm dependency to version 0.13.0 in order to use the newoptimistic.forgetmethod to fix a potentialcache.watchmemory leak.
@benjamn in #7157 -
Consider
cache.reseta destructive method, likecache.evictandcache.modify.
@joshjg in #7150 -
Avoid refetching observerless queries with
reFetchObservableQueries.
@joshjg in #7146
- Undo
TEdgeWrapperapproach forrelayStylePagination, introduced by f41e9efc in #7023, since it was an unintended breaking change for existing code that usedcache.modifyto interact with field data managed byrelayStylePagination.
@benjamn in #7103
-
Fix
relayStylePaginationto handle the possibility that edges might be normalizedReferenceobjects (uncommon).
@anark and @benjamn in #7023 -
Disable "Missing cache result fields" warnings when
returnPartialDataistrue.
@hwillson in #7055
- Mark
subscriptions-transport-wspeerDependencyas optional.
@MasterOdin in #7047
-
Use
options.nextFetchPolicyinternally to restore originalFetchPolicyafter polling withfetchPolicy: "network-only", so that polling does not interfere with normal query watching.
@benjamn in #6893 -
Initialize
ObservableQueryinupdateObservableQueryeven ifskipistrue.
@mu29 in #6999 -
Prevent full reobservation of queries affected by optimistic mutation updates, while still delivering results from the cache.
@benjamn in #6854
-
In TypeScript, all APIs that take
DocumentNodeparameters now may alternatively takeTypeDocumentNode<Data, Variables>. This type has the same JavaScript representation but allows the APIs to infer the data and variable types instead of requiring you to specify types explicitly at the call site.
@dotansimha in #6720 -
Bring back an improved form of heuristic fragment matching, by allowing
possibleTypesto specify subtype regular expression strings, which count as matches if the written result object has all the fields expected for the fragment.
@benjamn in #6901 -
Allow
options.nextFetchPolicyto be a function that takes the currentFetchPolicyand returns a new (or the same)FetchPolicy, makingnextFetchPolicymore suitable for global use indefaultOptions.watchQuery.
@benjamn in #6893 -
Implement
useReactiveVarhook for consuming reactive variables in React components.
@benjamn in #6867 -
Move
apollo-link-persisted-queriesimplementation to@apollo/client/link/persisted-queries. Try running our automated imports transform to handle this conversion, if you're usingapollo-link-persisted-queries.
@hwillson in #6837 -
Disable feud-stopping logic after any
cache.evictorcache.modifyoperation.
@benjamn in #6817 and #6898 -
Throw if
writeFragmentcannot identifyoptions.datawhen nooptions.idprovided.
@jcreighton in #6859 -
Provide
options.storageobject tocache.modifyfunctions, as provided toreadandmergefunctions.
@benjamn in #6991 -
Allow
cache.modifyfunctions to returndetails.INVALIDATE(similar todetails.DELETE) to invalidate the current field, causing affected queries to rerun, even if the field's value is unchanged.
@benjamn in #6991 -
Support non-default
ErrorPolicyvalues (that is,"ignore"and"all", in addition to the default value"none") for mutations and subscriptions, like we do for queries.
@benjamn in #7003 -
Remove invariant forbidding a
FetchPolicyofcache-onlyinObservableQuery#refetch.
@benjamn in ccb0a79a, fixing #6702
-
Restrict root object identification to
ROOT_QUERY(the ID corresponding to the rootQueryobject), allowingMutationandSubscriptionas user-defined types.
@benjamn in #6914 -
Prevent crash when
pageInfoand emptyedgesare received byrelayStylePagination.
@fracmak in #6918
- Consider only
result.data(rather than all properties ofresult) when settling cache feuds.
@danReynolds in #6777
- Provide jscodeshift transform for automatically converting Apollo Client 2.x
importdeclarations to use Apollo Client 3.x packages. Instructions.
@dminkovsky and @jcreighton in #6486
- Re-export cache types from
@apollo/client/core(and thus also@apollo/client), again.
@benjamn in #6725
-
Rework interdependencies between
@apollo/client/*entry points, so that CommonJS and ESM modules are supported equally well, without any duplication of shared code.
@benjamn in #6656 and #6657 -
Tolerate
!==callback functions (likeonCompletedandonError) inuseQueryoptions, since those functions are almost always freshly evaluated each timeuseQueryis called.
@hwillson and @benjamn in #6588 -
Respect
context.queryDeduplicationif provided, and otherwise fall back toclient.deduplication(as before).
@igaloly in #6261 and @Kujawadl in #6526 -
Refactor
ObservableQuery#getCurrentResultto reenable immediate delivery of warm cache results. As part of this refactoring, theApolloCurrentQueryResulttype was eliminated in favor ofApolloQueryResult.
@benjamn in #6710 -
Avoid clobbering
defaultOptionswithundefinedvalues.
@benjamn in #6715
-
Apollo Client will no longer modify
options.fetchPolicyunless you passoptions.nextFetchPolicyto request an explicit change inFetchPolicyafter the current request. Although this is technically a breaking change,options.nextFieldPolicymakes it easy to restore the old behavior (by passingcache-first).
@benjamn in #6712, reverting #6353 -
Errors of the form
Invariant Violation: 42thrown in production can now be looked up much more easily, by consulting the auto-generated@apollo/client/invariantErrorCodes.jsfile specific to your@apollo/clientversion.
@benjamn in #6665 -
Make the
clientfield of theMutationResulttype non-optional, since it is always provided.
@glasser in #6617 -
Allow passing an asynchronous
options.renderFunctiontogetMarkupFromTree.
@richardscarrott in #6576 -
Ergonomic improvements for
mergeandkeyArgsfunctions in cache field policies.
@benjamn in #6714
- Avoid duplicating
graphql/execution/executedependency in CommonJS bundle for@apollo/client/link/schema, fixinginstanceoferrors reported in #6621 and #6614.
@benjamn in #6624
-
Make sure
useQueryonCompletedis not fired whenskipistrue.
@hwillson in #6589 -
Revert changes to
peerDependenciesinpackage.json(#6594), which would have allowed using incompatible future versions ofgraphqland/orreactdue to overly-permissive>=version constraints.
@hwillson in #6605
⚠️ Note: As of 3.0.0, Apollo Client uses a new package name:@apollo/client
-
[BREAKING]
ApolloClientis now only available as a named export. The defaultApolloClientexport has been removed.
@hwillson in #5425 -
[BREAKING] The
queryManagerproperty ofApolloClientinstances is now marked asprivate, paving the way for a more aggressive redesign of its API. -
[BREAKING] Apollo Client will no longer deliver "stale" results to
ObservableQueryconsumers, but will instead log more helpful errors about which cache fields were missing.
@benjamn in #6058 -
[BREAKING]
ApolloError's thrown by Apollo Client no longer prefix error messages withGraphQL error:orNetwork error:. To differentiate between GraphQL/network errors, refer toApolloError's publicgraphQLErrorsandnetworkErrorproperties.
@lorensr in #3892 -
[BREAKING] Support for the
@livedirective has been removed, but might be restored in the future if a more thorough implementation is proposed.
@benjamn in #6221 -
[BREAKING] Apollo Client 2.x allowed
@clientfields to be passed into thelinkchain ifresolverswere not set in the constructor. This allowed@clientfields to be passed into Links likeapollo-link-state. Apollo Client 3 enforces that@clientfields are local only, meaning they are no longer passed into thelinkchain, under any circumstances.
@hwillson in #5982 -
[BREAKING?] Refactor
QueryManagerto make better use of observables and enforcefetchPolicymore reliably.
@benjamn in #6221 -
The
updateQueryfunction previously required byfetchMorehas been deprecated with a warning, and will be removed in the next major version of Apollo Client. Please consider using amergefunction to handle incoming data instead of relying onupdateQuery.
@benjamn in #6464- Helper functions for generating common pagination-related field policies may be imported from
@apollo/client/utilities. The most basic helper isconcatPagination, which emulates the concatenation behavior of typicalupdateQueryfunctions. A more sophisticated helper isoffsetLimitPagination, which implements offset/limit-based pagination. If you are consuming paginated data from a Relay-friendly API, userelayStylePagination. Feel free to use these helper functions as inspiration for your own field policies, and/or modify them to suit your needs.
@benjamn in #6465
- Helper functions for generating common pagination-related field policies may be imported from
-
Updated to work with
graphql@15.
@durchanek in #6194 and #6279
@hagmic in #6328 -
Apollo Link core and HTTP related functionality has been merged into
@apollo/client. Functionality that was previously available through theapollo-link,apollo-link-http-commonandapollo-link-httppackages is now directly available from@apollo/client(e.g.import { HttpLink } from '@apollo/client'). TheApolloClientconstructor has also been updated to accept newuri,headersandcredentialsoptions. Ifuriis specified, Apollo Client will take care of creating the necessaryHttpLinkbehind the scenes.
@hwillson in #5412 -
The
gqltemplate tag should now be imported from the@apollo/clientpackage, rather than thegraphql-tagpackage. Although thegraphql-tagpackage still works for now, future versions of@apollo/clientmay change the implementation details ofgqlwithout a major version bump.
@hwillson in #5451 -
@apollo/client/corecan be used to import the Apollo Client core, which includes everything the main@apollo/clientpackage does, except for all React related functionality.
@kamilkisiela in #5541 -
Several deprecated methods have been fully removed:
ApolloClient#initQueryManagerQueryManager#startQueryObservableQuery#currentResult
-
Apollo Client now supports setting a new
ApolloLink(or link chain) afternew ApolloClient()has been called, using theApolloClient#setLinkmethod.
@hwillson in #6193 -
The final time a mutation
updatefunction is called, it can no longer accidentally read optimistic data from other concurrent mutations, which ensures the use of optimistic updates has no lasting impact on the state of the cache after mutations have finished.
@benjamn in #6551 -
Apollo links that were previously maintained in https://github.com/apollographql/apollo-link have been merged into the Apollo Client project. They should be accessed using the new entry points listed in the migration guide.
@hwillson in #
⚠️ Note:InMemoryCachehas been significantly redesigned and rewritten in Apollo Client 3.0. Please consult the migration guide and read the new documentation to understand everything that has been improved.
-
The
InMemoryCacheconstructor should now be imported directly from@apollo/client, rather than from a separate package. Theapollo-cache-inmemorypackage is no longer supported.The
@apollo/client/cacheentry point can be used to importInMemoryCachewithout importing other parts of the Apollo Client codebase.
@hwillson in #5577 -
[BREAKING]
FragmentMatcher,HeuristicFragmentMatcher, andIntrospectionFragmentMatcherhave all been removed. We now recommend usingInMemoryCache’spossibleTypesoption instead. For more information see the DefiningpossibleTypesmanually section of the docs.
@benjamn in #5073 -
[BREAKING] As promised in the Apollo Client 2.6 blog post, all cache results are now frozen/immutable.
@benjamn in #5153 -
[BREAKING] Eliminate "generated" cache IDs to avoid normalizing objects with no meaningful ID, significantly reducing cache memory usage. This might be a backwards-incompatible change if your code depends on the precise internal representation of normalized data in the cache.
@benjamn in #5146 -
[BREAKING]
InMemoryCachewill no longer merge the fields of written objects unless the objects are known to have the same identity, and the values of fields with the same name will not be recursively merged unless a custommergefunction is defined by a field policy for that field, within a type policy associated with the__typenameof the parent object.
@benjamn in #5603 -
[BREAKING]
InMemoryCachenow throws when data with missing or undefined query fields is written into the cache, rather than just warning in development.
@benjamn in #6055 -
[BREAKING]
client|cache.writeDatahave been fully removed.writeDatausage is one of the easiest ways to turn faulty assumptions about how the cache represents data internally, into cache inconsistency and corruption.client|cache.writeQuery,client|cache.writeFragment, and/orcache.modifycan be used to update the cache.
@benjamn in #5923 -
InMemoryCachenow supports tracing garbage collection and eviction. Note that the signature of theevictmethod has been simplified in a potentially backwards-incompatible way.
@benjamn in #5310-
[beta-BREAKING] Please note that the
cache.evictmethod now requiresCache.EvictOptions, though it previously supported positional arguments as well.
@danReynolds in #6141 @benjamn in #6364 -
Removing an entity object using the
cache.evictmethod does not automatically remove dangling references to that entity elsewhere in the cache, but dangling references will be automatically filtered from lists whenever those lists are read from the cache. You can define a custom fieldreadfunction to customize this behavior. See #6412, #6425, and #6454 for further explanation.
-
-
Cache methods that would normally trigger a broadcast, like
cache.evict,cache.writeQuery, andcache.writeFragment, can now be called with a named options object, which supports abroadcast: booleanproperty that can be used to silence the broadcast, for situations where you want to update the cache multiple times without triggering a broadcast each time.
@benjamn in #6288 -
InMemoryCachenowconsole.warns in development whenever non-normalized data is dangerously overwritten, with helpful links to documentation about normalization and custommergefunctions.
@benjamn in #6372 -
The result caching system (introduced in #3394) now tracks dependencies at the field level, rather than at the level of whole entity objects, allowing the cache to return identical (
===) results much more often than before.
@benjamn in #5617 -
InMemoryCachenow has a method calledmodifywhich can be used to update the value of a specific field within a specific entity object:cache.modify({ id: cache.identify(post), fields: { comments(comments: Reference[], { readField }) { return comments.filter(comment => idToRemove !== readField("id", comment)); }, }, });
This API gracefully handles cases where multiple field values are associated with a single field name, and also removes the need for updating the cache by reading a query or fragment, modifying the result, and writing the modified result back into the cache. Behind the scenes, the
cache.evictmethod is now implemented in terms ofcache.modify.
@benjamn in #5909 and #6178 -
InMemoryCacheprovides a new API for storing client state that can be updated from anywhere:import { makeVar } from "@apollo/client" const v = makeVar(123) console.log(v()) // 123 console.log(v(v() + 1)) // 124 console.log(v()) // 124 v("asdf") // TS type error
These variables are reactive in the sense that updating their values invalidates any previously cached query results that depended on the old values.
@benjamn in #5799, #5976, and #6512 -
Various cache read and write performance optimizations, cutting read and write times by more than 50% in larger benchmarks.
@benjamn in #5948 -
The
cache.readQueryandcache.writeQuerymethods now accept anoptions.idstring, which eliminates most use cases forcache.readFragmentandcache.writeFragment, and skips the implicit conversion of fragment documents to query documents performed bycache.{read,write}Fragment.
@benjamn in #5930 -
Support
cache.identify(entity)for easily computing entity ID strings.
@benjamn in #5642 -
Support eviction of specific entity fields using
cache.evict(id, fieldName).
@benjamn in #5643 -
Make
InMemoryCache#evictremove data from allEntityStorelayers.
@benjamn in #5773 -
Stop paying attention to
previousResultinInMemoryCache.
@benjamn in #5644 -
Improve optimistic update performance by limiting cache key diversity.
@benjamn in #5648 -
Custom field
readfunctions can read from neighboring fields using thereadField(fieldName)helper, and may also read fields from other entities by callingreadField(fieldName, objectOrReference).
@benjamn in #5651 -
Expose cache
modifyandidentifyto the mutateupdatefunction.
@hwillson in #5956 -
Add a default
gcimplementation toApolloCache.
@justinwaite in #5974
-
[BREAKING] The
QueryOptions,MutationOptions, andSubscriptionOptionsReact Apollo interfaces have been renamed toQueryDataOptions,MutationDataOptions, andSubscriptionDataOptions(to avoid conflicting with similarly named and exported Apollo Client interfaces). -
[BREAKING] Results with
loading: truewill no longer redeliver previous data, though they may provide partial data from the cache, when available.
@benjamn in #6566 -
[BREAKING?] Remove
fixPolyfills.ts, except when bundling for React Native. If you have trouble withMaporSetoperations due to frozen key objects in React Native, either update React Native to version 0.59.0 (or 0.61.x, if possible) or investigate whyfixPolyfills.native.jsis not included in your bundle.
@benjamn in #5962 -
The contents of the
@apollo/react-hookspackage have been merged into@apollo/client, enabling the following all-in-oneimport:import { ApolloClient, ApolloProvider, useQuery } from '@apollo/client';
-
React SSR features (previously accessed via
@apollo/react-ssr) can now be accessed from the separate Apollo Client entry point of@apollo/client/react/ssr. These features are not included in the default@apollo/clientbundle.
@hwillson in #6499
-
[BREAKING] Removed
graphql-anywheresince it's no longer used by Apollo Client.
@hwillson in #5159 -
[BREAKING] Removed
apollo-boostsince Apollo Client 3.0 provides a boost like getting started experience out of the box.
@hwillson in #5217 -
[BREAKING] We are no longer exporting certain (intended to be) internal utilities. If you are depending on some of the lesser known exports from
apollo-cache,apollo-cache-inmemory, orapollo-utilities, they may no longer be available from@apollo/client.
@hwillson in #5437 and #5514Utilities that were previously externally available through the
apollo-utilitiespackage are now only available by importing from@apollo/client/utilities.
@hwillson in #5683 -
Make sure all
graphql-tagpublic exports are re-exported.
@hwillson in #5861 -
Fully removed
prettier. The Apollo Client team has decided to no longer automatically enforce code formatting across the codebase. In most cases existing code styles should be followed as much as possible, but this is not a hard and fast rule.
@hwillson in #5227 -
Make sure
ApolloContextplays nicely with IE11 when storing the shared context.
@ms in #5840 -
Migrated React Apollo HOC and Components functionality into Apollo Client, making it accessible from
@apollo/client/react/componentsand@apollo/client/react/hocentry points.
@hwillson in #6558 -
Support passing a
contextobject through the link execution chain when using subscriptions.
@sgtpepper43 in #4925 -
MockSubscriptionLinknow supports multiple subscriptions.
@dfrankland in #6081
-
useMutationadjustments to help avoid an infinite loop / too many renders issue, caused by unintentionally modifying theuseStatebased mutation result directly.
@hwillson in #5770 -
Missing
__typenamefields no longer cause theInMemoryCache#diffresult to be markedcomplete: false, if those fields were added byInMemoryCache#transformDocument(which callsaddTypenameToDocument).
@benjamn in #5787 -
Fixed an issue that allowed
@client @exportbased queries to lead to extra unnecessary network requests being fired.
@hwillson in #5946 -
Refined
useLazyQuerytypes to help prevent runtime errors.
@benmosher in #5935 -
Make sure
@client @exportvariables used in watched queries are updated each time the query receives new data that changes the value of the@exportvariable.
@hwillson in #5986 -
Ensure
useMutationpasses a definederrorPolicyoption into its underlyingApolloClient.mutate()call.
@jamesreggio in #5863 -
useQuery: Prevent new data re-render attempts during an existing render. This helps avoid React 16.13.0's "Cannot update a component from inside the function body of a different component" warning (facebook/react#17099).
@hwillson in #6107 -
Expand
ApolloErrortypings to includeServerErrorandServerParseError.
@dmarkow in #6319 -
Fast responses received over the link chain will no longer conflict with
skipsettings.
@hwillson in #6587
-
Update the
fetchMoretype signature to acceptcontext.
@koenpunt in #5147 -
Fix type for
Resolverand use it in the definition ofResolvers.
@peoplenarthax in #4943 -
Local state resolver functions now receive a
fragmentMap: FragmentMapobject, in addition to thefield: FieldNodeobject, via theinfoparameter.
@mjlyons in #5388 -
Documentation updates.
@tomquirk in #5645
@Sequoia in #5641
@phryneas in #5628
@AryanJ-NYC in #5560
- Fix
filteredge case involvingnull.
@lifeiscontent in #5110
-
Replace
GlobalFetchreference withWindowOrWorkerGlobalScope.
@abdonrd in #5373 -
Add
assumeImmutableResultstyping to apollo boostPresetConfiginterface.
@bencoullie in #5571
-
Modify
ObservableQueryto allow queries withnotifyOnNetworkStatusChangeto be notified when loading after an error occurs.
@jasonpaulos in #4992 -
Add
graphqlas apeerDependencyofapollo-cacheandgraphql-anywhere.
@ssalbdivad in #5081
- A new
ObservableQuery.resetQueryStoreErrors()method is now available that can be used to clear outObservableQueryquery store errors.
@hwillson in #4941 - Documentation updates.
@michael-watson in #4940
@hwillson in #4969
- In all Apollo Client packages, the compilation of
lib/bundle.esm.jstolib/bundle.cjs.jsandlib/bundle.umd.jsnow uses Babel instead of Rollup, since Babel correctly compiles some edge cases that neither Rollup nor TypeScript compile correctly.
@benjamn in #4911
- The
isEqualfunction has been reimplemented using thelodash.isequalnpm package, to better support circular references. Since thelodash.isequalpackage is already used byreact-apollo, this change is likely to decrease total bundle size.
@capaj in #4915
- In production,
invariant(condition, message)failures will now include a unique error code that can be used to trace the error back to the point of failure.
@benjamn in #4521
-
If you can be sure your application code does not modify cache result objects (see
freezeResultsnote below), you can unlock substantial performance improvements by communicating this assumption vianew ApolloClient({ assumeImmutableResults: true })
which allows the client to avoid taking defensive snapshots of past results using
cloneDeep, as explained by @benjamn in #4543. -
Identical overlapping queries are now deduplicated internally by
apollo-client, rather than using theapollo-link-deduppackage.
@benjamn in commit 7cd8479f -
The
FetchPolicytype has been split into two types, so that passingcache-and-networktoApolloClient#queryis now forbidden at the type level, whereas previously it was forbidden by a runtimeinvariantassertion:export type FetchPolicy = | 'cache-first' | 'network-only' | 'cache-only' | 'no-cache' | 'standby'; export type WatchQueryFetchPolicy = | FetchPolicy | 'cache-and-network';
The exception thrown if you ignore the type error has also been improved to explain the motivation behind this restriction.
Issue #3130 (comment) and commit cf069bc7 -
Avoid updating (and later invalidating) cache watches when
fetchPolicyis'no-cache'.
@bradleyayers in PR #4573, part of issue #3452 -
Remove temporary
queryIdafterfetchMorecompletes.
@doomsower in #4440 -
Call
clearStorecallbacks after clearing store.
@ds8k in #4695 -
Perform all
DocumentNodetransforms once, and cache the results.
@benjamn in #4601 -
Accommodate
@client @exportvariable changes inObservableQuery.
@hwillson in #4604 -
Support the
returnPartialDataoption for watched queries again.
@benjamn in #4743 -
Preserve
networkStatusfor incompletecache-and-networkqueries.
@benjamn in #4765 -
Preserve
cache-and-networkfetchPolicywhen refetching.
@benjamn in #4840 -
Update the React Native docs to remove the request for external example apps that we can link to. We're no longer going to manage a list of external example apps.
@hwillson in #4531 -
Polling queries are no longer batched together, so their scheduling should be more predictable.
@benjamn in #4800
-
Support
new InMemoryCache({ freezeResults: true })to help enforce immutability.
@benjamn in #4514 -
Allow
IntrospectionFragmentMatcherto match fragments against the rootQuery, asHeuristicFragmentMatcherdoes.
@rynobax in #4620 -
Rerential identity (
===) of arrays in cache results will now be preserved for unchanged data.
@benjamn in commit f3091d6a -
Avoid adding
__typenamefield to@clientselection sets that have been@exported as input variables.
@benjamn in #4784
- The
graphqlfunction can now be configured to ignore@includeand@skipdirectives (useful when walking a fragment to generate prop types or filter result data).
@GreenGremlin in #4373
- Introduces new local state management features (client-side schema
and local resolver /
@clientsupport) and many overall code improvements, to help reduce the Apollo Client bundle size.
#4361 - Revamped CJS and ESM bundling approach with Rollup.
@rosskevin in #4261 - Fixes an issue where the
QueryManagerwas accidentally returning cached data fornetwork-onlyqueries.
@danilobuerger in #4352 - Fixed an issue in the repo
.gitattributesthat was causing binary files to have their line endings adjusted, and cleaned up corrupted documentation images (ref: apollographql#4232).
@rajington in #4438 - Improve (and shorten) query polling implementation.
PR #4337
-
Resolve "invalidate" -> "invalidated" typo in
QueryManager.
@quazzie in #4041 -
Properly type
setQueryand fix now typed callers.
@danilobuerger in #4369 -
Align with the React Apollo decision that result
datashould beTData | undefinedinstead ofTData | {}.
@danilobuerger in #4356 -
Documentation updates.
@danilobuerger in #4340
@justyn-clark in #4383
@jtassin in #4287
@Gongreg in #4386
@davecardwell in #4399
@michaelknoch in #4384
- Support
ApolloClient#stopmethod for safe client disposal.
PR #4336
- Added explicit dependencies on the
tslibpackage to all client packages to fix Issue #4332.
- Reverted some breaking changes accidentally released in a patch version (2.4.10). PR #4334
-
The
apollo-clientpackage no longer exports aprintASTfunction fromgraphql/language/printer. If you need this functionality, import it directly:import { print } from "graphql/language/printer" -
Query polling now uses a simpler scheduling strategy based on a single
setTimeoutinterval rather than multiplesetIntervaltimers. The new timer fires at the rate of the fastest polling interval, and queries with longer polling intervals fire whenever the time elapsed since they last fired exceeds their desired interval.
PR #4243
-
The
optimismnpm package has been updated to a version (0.6.9) that provides its own TypeScript declarations, which should fix problems like Issue #4327.
PR #4331 -
Error messages involving GraphQL queries now print the queries using
JSON.stringifyinstead of theprintfunction exported by thegraphqlpackage, to avoid pulling unnecessary printing logic into your JavaScript bundle.
PR #4234 -
The
QueryKeyMakerabstraction has been removed, meaning that cache results for non-identical queries (or sub-queries) with equivalent structure will no longer be cached together. This feature was a nice optimization in certain specific use cases, but it was not worth the additional complexity or bundle size.
PR #4245
- The
flattenSelectionshelper function is no longer exported fromapollo-utilities, sincegetDirectiveNameshas been reimplemented without usingflattenSelections, andflattenSelectionshas no clear purpose now. If you need the old functionality, use a visitor:import { visit } from "graphql/language/visitor"; function flattenSelections(selection: SelectionNode) { const selections: SelectionNode[] = []; visit(selection, { SelectionSet(ss) { selections.push(...ss.selections); } }); return selections; }
-
Apollo Client has been updated to use
graphql14.x as a dev dependency.
@hwillson in #4233 -
The
onClearStorefunction can now be used to register callbacks that should be triggered when callingclearStore.
@joe-re in #4082 -
Make
isApolloErroravailable for external use.
@FredyC in #4223 -
The
QueryManagernow callscompleteon the observables used by Apollo Client's Subscription handling. This gives finite subscriptions a chance to handle cleanup.
@sujeetsr in #4290 -
Documentation updates.
@lifedup in #3931
@Dem0n3D in #4008
@anand-sundaram-zocdoc in #4009
@mattphoto in #4026
@birge in #4029
@mxstbr in #4127
@Caerbannog in #4140
@jedwards1211 in #4179
@nutboltu in #4182
@CarloPalinckx in #4189
@joebernard in #4206
@evans in #4213
@danilobuerger in #4214
@stubailo in #4220
@haysclark in #4255
@shelmire in #4266
@peggyrayzis in #4280
@caydie-tran in #4300
- Transformation utilities have been refactored to work with
graphql14.x. GraphQL AST's are no longer being directly modified.
@hwillson in #4233
-
The speed and memory usage of optimistic reads and writes has been improved dramatically using a new layering technique that does not require copying the non-optimistic contents of the cache.
PR #4319 -
The
RecordingCacheabstraction has been removed, and thus is no longer exported fromapollo-cache-inmemory.
PR #4319 -
Export the optimism
wrapfunction using ES2015 export syntax, instead of CommonJS.
@ardatan in #4158
-
Documentation and config updates.
@justinanastos in #4187
@PowerKiKi in #3693
@nandito in #3865 -
Schema/AST tranformation utilities have been updated to work properly with
@clientdirectives.
@justinmakaila in #3482
-
Avoid using
DepTrackingCachefor optimistic reads. PR #4521 -
When creating an
InMemoryCacheobject, it's now possible to disable the result caching behavior introduced in #3394, either for diagnostic purposes or because the benefit of caching repeated reads is not worth the extra memory usage in your application:new InMemoryCache({ resultCaching: false })
Part of PR #4521.
- The
ApolloClientconstructor has been updated to acceptnameandversionparams, that can be used to support Apollo Server Client Awareness functionality. These client awareness properties are passed into the defined Apollo Link chain, and are then ultimately sent out as custom headers with outgoing requests.
@hwillson in #4154
- No changes.
- No changes.
- No changes.
- No changes.
- No changes.
-
Added some
returns to prevent errors withnoImplicitReturnsTypeScript rule. PR #4137 -
Exclude the
src/directory when publishingapollo-cache-inmemory. Issue #4083
-
Optimistic tests cleanup. PR #3834 by @joshribakoff
-
Documentation updates. PR #3840 by @chentsulin and PR #3844 by @lorensr
-
Implement
ObservableQuery#isDifferentFromLastResultto fix Issue #4054 and Issue #4031. PR #4069
- Add
readQuerytest to make sure options aren't mutated. @CarloPalinckx in #3838
- Avoid modifying source objects when merging cache results. Issue #4081 PR #4089
-
Discard property accessor functions in
cloneDeephelper, to fix issue #4034. -
Unconditionally remove
cloneDeepproperty accessors. PR #4039 -
Avoid copying non-enumerable and/or
Symbolkeys incloneDeep. PR #4052
-
Throw when querying non-scalar objects without a selection set. Issue #4025 PR #4038
-
Work around spec non-compliance of
Map#setandSet#addin IE11. Issue #4024 PR #4012
-
Add additional checks to make sure we don't try to set the network status of queries in the store, when the store doesn't exist.
@i6mi6 in #3914 -
Documentation updates.
@shanonvl in #3925
@ojh102 in #3920
@Bkucera in #3919
@j4chou in #3915
@billfienberg in #3886
@TLadd in #3884 -
The
ObservableQueryclass now makes a deep clone oflastResultwhen first received, so that theisDifferentResultlogic will not be confused if the result object is modified later. Issue #3992 PR #4032
-
Optimize repeated
apollo-cache-inmemoryreads by caching partial query results, for substantial performance improvements. As a consequence, watched queries will not be rebroadcast unless the data have changed. PR #3394 -
Include root ID and fragment matcher function in cache keys computed by
StoreReader#executeStoreQueryandexecuteSelectionSet, and work around bugs in the React NativeMapandSetpolyfills. PR #3964 React Native PR #21492 (pending) -
The
apollo-cache-inmemorypackage now allowsgraphql@^14.0.0as a peer dependency. Issue #3978 -
The
apollo-cache-inmemorypackage now correctly broadcasts changes even when the new data is===to the old data, since the contents of the data object may have changed. Issue #3992 PR #4032
- Make
graphql-anywherefilterfunction generic (typescript).
@minznerjosh in #3929
- The
fclonepackage has been replaced with a customcloneDeepimplementation that is tolerant of cycles, symbol properties, and non-enumerable properties. PR #4032
- Remove duplicate InMemoryCache export for Babel 6 compatibility. Issue #3910 PR #3932
- No changes.
- Apollo Client no longer deep freezes query results. @hwillson in #3883
- A new
clearStoremethod has been added, that will remove all data from the store. UnlikeresetStore, it will not refetch active queries after removing store data. @hwillson in #3885
- Replace the custom
cloneDeepimplementation withfclone, to avoid crashing when encountering circular references.
@hwillson in #3881
- No changes.
- No changes.
- No changes.
- No changes.
-
mutate'srefetchQueriesoption now allows queries to include a customcontextoption. Thiscontextwill be used when refetching the query. For example:context = { headers: { token: 'some auth token', }, }; client.mutate({ mutation: UPDATE_CUSTOMER_MUTATION, variables: { userId: user.id, firstName, ... }, refetchQueries: [{ query: CUSTOMER_MESSAGES_QUERY, variables: { userId: user.id }, context, }], context, });
The
CUSTOMER_MESSAGES_QUERYabove will be refetched usingcontext. Normally queries are refetched using the original context they were first started with, but this provides a way to override the context, if needed.
@hwillson in #3852
- Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817
- Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817
- Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817
- Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817
- Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817
- Add proper error handling for subscriptions. If you have defined an
errorhandler on your subscription observer, it will now be called when an error comes back in a result, and thenexthandler will be skipped (similar to how we're handling errors with mutations). Previously, the error was just passed in the result to thenexthandler. If you don't have anerrorhandler defined, the previous functionality is maintained, meaning the error is passed in the result, giving the next handler a chance to deal with it. This should help address backwards compatibility (and is the reason for the minor version bumo in this release).
@clayne11 in #3800 - Allow an
optimisticparam to be passed intoApolloClient.readQueryandApolloClient.readFragment, that when set totrue, will allow optimistic results to be returned. Isfalseby default.
@jay1337 in #2429 - Optimistic tests cleanup.
@joshribakoff in #3713 - Make sure each package has its own
.npmignore, so they're taken into consideration when publishing via lerna.
@hwillson in #3828 - Documentation updates.
@toolness in #3804
@pungggi in #3798
@lorensr in #3748
@joshribakoff in #3730
@yalamber in #3819
@pschreibs85 in #3812
@msreekm in #3808
@kamaltmo in #3806
@lorensr in #3739
@brainkim in #3680
- No changes.
- No changes.
- No changes.
- No changes.
- Adjusted the
graphqlpeer dependency to cover explicit minor ranges. Since the ^ operator only covers any minor version if the major version is not 0 (since a major version of 0 is technically considered development by semver 2), the current ^0.11.0 || ^14.0.0 graphql range doesn't cover 0.12.* or 0.13.*. This fixes theapollo-client@X has incorrect peer dependency "graphql@^0.11.0 || ^14.0.0"errors that people might have seen usinggraphql0.12.x or 0.13.x.
@hwillson in #3746 - Document
setVariablesinternal API status.
@PowerKiKi in #3692 - Corrected
ApolloClient.queryManagertyping as it may beundefined.
@danilobuerger in #3661 - Make sure using a
no-cachefetch policy with subscriptions prevents data from being cached.
@hwillson in #3773 - Fixed an issue that sometimes caused empty query results, when using the
no-cachefetch policy.
@hwillson in #3777 - Documentation updates.
@hwillson in #3750
@hwillson in #3754
@TheMightyPenguin in #3725
@bennypowers in #3668
@hwillson in #3762
@chentsulin in #3688
@chentsulin in #3687
@ardouglass in #3645
@hwillson in #3764
@hwillson in #3767
@hwillson in #3774
@hwillson in #3779
- No changes.
- No changes.
- No changes.
- No changes.
- No changes.
- Release 2.3.6 broke Typescript compilation.
QueryManager'sgetQueryWithPreviousResultmethod included an invalidvariablesreturn type in the auto-generatedcore/QueryManager.d.tsdeclaration file. The type definition had a locally referenced path, that appears to have been caused by the typescript compiler getting confused at compile/publish time.getQueryWithPreviousResultreturn types are now excplicity identified, which helps Typescript avoid the local type reference. For more details, see apollographql#3729.
@hwillson in #3731
- No changes.
- Documentation updates.
@ananth99 in #3599
@hwillson in #3635
@JakeDawkins in #3642
@hwillson in #3644
@gbau in #3644
@chentsulin in #3608
@MikaelCarpenter in #3609
@Gamezpedia in #3612
@jinxac in #3647
@abernix in #3705
@dandv in #3703
@hwillson in #3580 - Updated
graphqlpeerDependenciesto handle 14.x versions.
@ivank in #3598 - Add optional generic type params for variables on low level methods.
@mvestergaard in #3588 - Add a new
awaitRefetchQueriesconfig option to the Apollo Clientmutatefunction, that when set totruewill wait for allrefetchQueriesto be fully refetched, before resolving the mutation call.awaitRefetchQueriesisfalseby default.
@jzimmek in #3169
- Allow
fetchto be given as a configuration option toApolloBoost.
@mbaranovski in #3590 - The
apollo-boostApolloClientconstructor now warns about unsupported options.
@quentin- in #3551
- No changes.
- Add
__typenameandidproperties todataIdFromObjectparameter (typescript)
@jfurler in #3641 - Fixed an issue caused by
dataIdFromObjectconsidering returned 0 values to be falsy, instead of being a valid ID, which lead to the store not being updated properly in some cases.
@hwillson in #3711
- No changes.
- Add support for arrays to
graphql-anywhere's filter utility.
@jsweet314 in #3591 - Fix
Cannot convert object to primitive valueerror that was showing up when attempting to report a missing property on an object.
@benjie in #3618
- Internal code formatting updates.
- @chentsulin in #3574
- Documentation updates.
- @andtos90 in #3596
- @serranoarevalo in #3554
- @cooperka in #3594
- @pravdomil in #3587
- @excitement-engineer in #3309
- No changes.
- No changes.
- No changes.
- Removed unnecessary whitespace from error message.
- No changes.
- Export the
QueryOptionsinterface, to make sure it can be used by other projects (likeapollo-angular). - Fixed an issue caused by typescript changes to the constructor
defaultOptionsparam, that preventedquerydefaults from passing type checks. (@hwillson in #3585)
- No changes
- No changes
- No changes
- No changes
- No changes
- Typescript improvements. Made observable query parameterized on data and
variables:
ObservableQuery<TData, TVariables>(@excitement-engineer in #3140) - Added optional generics to cache manipulation methods (typescript). (@mvestergaard in #3541)
- Typescript improvements. Created a new
QueryOptionsinterface that is now used byApolloClient.queryoptions, instead of the previousWatchQueryOptionsinterface. This helps reduce confusion (especially in the docs) that made it look likeApolloClient.queryacceptedApolloClient.watchQueryonly options, likepollingInterval. (@hwillson in #3569)
- Allow
cacheto be given as a configuration option toApolloBoost. (@dandean in #3561) - Allow
headersandcredentialsto be passed in as configuration parameters to theapollo-boostApolloClientconstructor. (@rzane in #3098)
- Added optional generics to cache manipulation methods (typescript). (@mvestergaard in #3541)
- Added optional generics to cache manipulation methods (typescript). (@mvestergaard in #3541)
- Restore non-enumerability of
resultFields[ID_KEY]. (@benjamn in #3544) - Cache query documents transformed by InMemoryCache. (@benjamn in #3553)
- Store key names generated by
getStoreKeyNamenow leverage a more deterministic approach to handling JSON based strings. This prevents store key names from differing when usingargslike{ prop1: 'value1', prop2: 'value2' }and{ prop2: 'value2', prop1: 'value1' }. (@gdi2290 in #2869) - Avoid needless
hasOwnPropertycheck indeepFreeze. (@benjamn in #3545)
- No new changes.
- Fix SSR and
cache-and-networkfetch policy (@dastoori in #3372) - Fixed an issue where the
updateQuerymethod passed toObservableQuery.fetchMorewas receiving the original query variables, instead of the new variables that it used to fetch more data. (@abhiaiyer91 in #3500) - Fixed an issue involving
Object.setPrototypeOf()not working on JSC (Android), by instead setting theprototypeofthismanually. (@seklyza in #3306) - Added safeguards to make sure
QueryStore.initQueryandQueryStore.markQueryResultdon't try to set the network status of afetchMoreForQueryIdquery, if it does not exist in the store. This was happening when a query component was unmounted while afetchMorewas still in flight. (@conrad-vanl in #3367, @doomsower in #3469)
- Various internal code cleanup, tooling and dependency changes.
- Various internal code cleanup, tooling and dependency changes.
- Fixed an issue that caused fragment only queries to sometimes fail. (@abhiaiyer91 in #3507)
- Fixed cache invalidation for inlined mixed types in union fields within arrays. (@dferber90 in #3422)
- Make
maybeDeepFreezea little more defensive, by always usingObject.prototype.hasOwnProperty(to avoid cases where the object being frozen doesn't have its ownhasOwnProperty). (@jorisroling in #3418) - Remove certain small internal caches to prevent memory leaks when using SSR. (@brunorzn in #3444)