Odoo GraphQL Subscription using Node, Express JS for Sample
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

254 KiB

@apollo/client

3.9.5

Patch Changes

  • #11595 8c20955 Thanks @phryneas! - Bumps the dependency rehackt to 0.0.5

  • #11592 1133469 Thanks @Stephen2! - Strengthen MockedResponse.newData type

  • #11579 1ba2fd9 Thanks @jerelmiller! - Fix issue where partial data is reported to useQuery when using notifyOnNetworkStatusChange after it errors while another overlapping query succeeds.

  • #11579 1ba2fd9 Thanks @jerelmiller! - Fix an issue where a partial cache write for an errored query would result in automatically refetching that query.

  • #11562 65ab695 Thanks @mspiess! - Mocks with an infinite delay no longer require result or error

3.9.4

Patch Changes

  • #11403 b0c4f3a Thanks @jerelmiller! - Fix issue in useLazyQuery that results in a double network call when calling the execute function with no arguments after having called it previously with another set of arguments.

  • #11576 e855d00 Thanks @alessbell! - Revert PR #11202 to fix caching bug reported in #11560

3.9.3

Patch Changes

3.9.2

Patch Changes

3.9.1

Patch Changes

3.9.0

Minor Changes

Memory optimizations

  • #11424 62f3b6d Thanks @phryneas! - Simplify RetryLink, fix potential memory leak

    Historically, RetryLink would keep a values array of all previous values, in case the operation would get an additional subscriber at a later point in time.

    In practice, this could lead to a memory leak (#11393) and did not serve any further purpose, as the resulting observable would only be subscribed to by Apollo Client itself, and only once - it would be wrapped in a Concast before being exposed to the user, and that Concast would handle subscribers on its own.

  • #11435 5cce53e Thanks @phryneas! - Deprecates canonizeResults.

    Using canonizeResults can result in memory leaks so we generally do not recommend using this option anymore. A future version of Apollo Client will contain a similar feature without the risk of memory leaks.

  • #11254 d08970d Thanks @benjamn! - Decouple canonicalStringify from ObjectCanon for better time and memory performance.

  • #11356 cc4ac7e Thanks @phryneas! - Fix a potential memory leak in FragmentRegistry.transform and FragmentRegistry.findFragmentSpreads that would hold on to passed-in DocumentNodes for too long.

  • #11370 25e2cb4 Thanks @phryneas! - parse function: improve memory management

    • use LRU WeakCache instead of Map to keep a limited number of parsed results
    • cache is initiated lazily, only when needed
    • expose parse.resetCache() method
  • #11389 139acd1 Thanks @phryneas! - documentTransform: use optimism and WeakCache instead of directly storing data on the Trie

  • #11358 7d939f8 Thanks @phryneas! - Fixes a potential memory leak in Concast that might have been triggered when Concast was used outside of Apollo Client.

  • #11344 bd26676 Thanks @phryneas! - Add a resetCache method to DocumentTransform and hook InMemoryCache.addTypenameTransform up to InMemoryCache.gc

  • #11367 30d17bf Thanks @phryneas! - print: use WeakCache instead of WeakMap

  • #11387 4dce867 Thanks @phryneas! - QueryManager.transformCache: use WeakCache instead of WeakMap

  • #11369 2a47164 Thanks @phryneas! - Persisted Query Link: improve memory management

    • use LRU WeakCache instead of WeakMap to keep a limited number of hash results
    • hash cache is initiated lazily, only when needed
    • expose persistedLink.resetHashCache() method
    • reset hash cache if the upstream server reports it doesn't accept persisted queries
  • #10804 221dd99 Thanks @phryneas! - use WeakMap in React Native with Hermes

  • #11355 7d8e184 Thanks @phryneas! - InMemoryCache.gc now also triggers FragmentRegistry.resetCaches (if there is a FragmentRegistry)

  • #11409 2e7203b Thanks @phryneas! - Adds an experimental ApolloClient.getMemoryInternals helper

  • #11343 776631d Thanks @phryneas! - Add reset method to print, hook up to InMemoryCache.gc

Suspense-enabled data fetching on user interaction with useLoadableQuery

  • #11300 a815873 Thanks @jerelmiller! - Introduces a new useLoadableQuery hook. This hook works similarly to useBackgroundQuery in that it returns a queryRef that can be used to suspend a component via the useReadQuery hook. It provides a more ergonomic way to load the query during a user interaction (for example when wanting to preload some data) that would otherwise be clunky with useBackgroundQuery.

    function App() {
      const [loadQuery, queryRef, { refetch, fetchMore, reset }] =
        useLoadableQuery(query, options);
    
      return (
        <>
          <button onClick={() => loadQuery(variables)}>Load query</button>
          <Suspense fallback={<SuspenseFallback />}>
            {queryRef && <Child queryRef={queryRef} />}
          </Suspense>
        </>
      );
    }
    
    function Child({ queryRef }) {
      const { data } = useReadQuery(queryRef);
    
      // ...
    }
    

Begin preloading outside of React with createQueryPreloader

  • #11412 58db5c3 Thanks @jerelmiller! - Add the ability to start preloading a query outside React to begin fetching as early as possible. Call createQueryPreloader to create a preloadQuery function which can be called to start fetching a query. This returns a queryRef which is passed to useReadQuery and suspended until the query is done fetching.

Testing utility improvements

  • #11178 4d64a6f Thanks @sebakerckhof! - Support re-using of mocks in the MockedProvider

  • #6701 8d2b4e1 Thanks @prowe! - Ability to dynamically match mocks

    Adds support for a new property MockedResponse.variableMatcher: a predicate function that accepts a variables param. If true, the variables will be passed into the ResultFunction to help dynamically build a response.

New useQueryRefHandlers hook

  • #11412 58db5c3 Thanks @jerelmiller! - Create a new useQueryRefHandlers hook that returns refetch and fetchMore functions for a given queryRef. This is useful to get access to handlers for a queryRef that was created by createQueryPreloader or when the handlers for a queryRef produced by a different component are inaccessible.

    const MyComponent({ queryRef }) {
      const { refetch, fetchMore } = useQueryRefHandlers(queryRef);
    
      // ...
    }
    

Bail out of optimisticResponse updates with the IGNORE sentinel object

  • #11410 07fcf6a Thanks @sf-twingate! - Allow returning IGNORE sentinel object from optimisticResponse functions to bail-out from the optimistic update.

    Consider this example:

    const UPDATE_COMMENT = gql`
      mutation UpdateComment($commentId: ID!, $commentContent: String!) {
        updateComment(commentId: $commentId, content: $commentContent) {
          id
          __typename
          content
        }
      }
    `;
    
    function CommentPageWithData() {
      const [mutate] = useMutation(UPDATE_COMMENT);
      return (
        <Comment
          updateComment={({ commentId, commentContent }) =>
            mutate({
              variables: { commentId, commentContent },
              optimisticResponse: (vars, { IGNORE }) => {
                if (commentContent === "foo") {
                  // conditionally bail out of optimistic updates
                  return IGNORE;
                }
                return {
                  updateComment: {
                    id: commentId,
                    __typename: "Comment",
                    content: commentContent,
                  },
                };
              },
            })
          }
        />
      );
    }
    

    The IGNORE sentinel can be destructured from the second parameter in the callback function signature passed to optimisticResponse.

    const preloadQuery = createQueryPreloader(client);
    const queryRef = preloadQuery(QUERY, { variables, ...otherOptions });
    
    function App() {
      return {
        <Suspense fallback={<div>Loading</div>}>
          <MyQuery />
        </Suspense>
      }
    }
    
    function MyQuery() {
      const { data } = useReadQuery(queryRef);
    
      // do something with data
    }
    

Network adapters for multipart subscriptions usage with Relay and urql

  • #11301 46ab032 Thanks @alessbell! - Add multipart subscription network adapters for Relay and urql

    Relay
    import { createFetchMultipartSubscription } from "@apollo/client/utilities/subscriptions/relay";
    import { Environment, Network, RecordSource, Store } from "relay-runtime";
    
    const fetchMultipartSubs = createFetchMultipartSubscription(
      "http://localhost:4000",
    );
    
    const network = Network.create(fetchQuery, fetchMultipartSubs);
    
    export const RelayEnvironment = new Environment({
      network,
      store: new Store(new RecordSource()),
    });
    
    Urql
    import { createFetchMultipartSubscription } from "@apollo/client/utilities/subscriptions/urql";
    import { Client, fetchExchange, subscriptionExchange } from "@urql/core";
    
    const url = "http://localhost:4000";
    
    const multipartSubscriptionForwarder = createFetchMultipartSubscription(url);
    
    const client = new Client({
      url,
      exchanges: [
        fetchExchange,
        subscriptionExchange({
          forwardSubscription: multipartSubscriptionForwarder,
        }),
      ],
    });
    

skipPollAttempt callback function

  • #11397 3f7eecb Thanks @aditya-kumawat! - Adds a new skipPollAttempt callback function that's called whenever a refetch attempt occurs while polling. If the function returns true, the refetch is skipped and not reattempted until the next poll interval. This will solve the frequent use-case of disabling polling when the window is inactive.

    useQuery(QUERY, {
      pollInterval: 1000,
      skipPollAttempt: () => document.hidden, // or !document.hasFocus()
    });
    // or define it globally
    new ApolloClient({
      defaultOptions: {
        watchQuery: {
          skipPollAttempt: () => document.hidden, // or !document.hasFocus()
        },
      },
    });
    

QueryManager.inFlightLinkObservables now uses a strong Trie as an internal data structure

  • #11345 1759066 Thanks @phryneas!

    Warning: requires @apollo/experimental-nextjs-app-support update

    If you are using @apollo/experimental-nextjs-app-support, you will need to update that to at least 0.5.2, as it accesses this internal data structure.

More Minor Changes

  • #11202 7c2bc08 Thanks @benjamn! - Prevent QueryInfo#markResult mutation of result.data and return cache data consistently whether complete or incomplete.

  • #11442 4b6f2bc Thanks @jerelmiller! - Remove the need to call retain from useLoadableQuery since useReadQuery will now retain the query. This means that a queryRef that is not consumed by useReadQuery within the given autoDisposeTimeoutMs will now be auto diposed for you.

    Thanks to #11412, disposed query refs will be automatically resubscribed to the query when consumed by useReadQuery after it has been disposed.

  • #11438 6d46ab9 Thanks @jerelmiller! - Remove the need to call retain from useBackgroundQuery since useReadQuery will now retain the query. This means that a queryRef that is not consumed by useReadQuery within the given autoDisposeTimeoutMs will now be auto diposed for you.

    Thanks to #11412, disposed query refs will be automatically resubscribed to the query when consumed by useReadQuery after it has been disposed.

  • #11175 d6d1491 Thanks @phryneas! - To work around issues in React Server Components, especially with bundling for the Next.js "edge" runtime we now use an external package to wrap react imports instead of importing React directly.

  • #11495 1190aa5 Thanks @jerelmiller! - Increase the default memory limits for executeSelectionSet and executeSelectionSetArray.

Patch Changes

  • #11275 3862f9b Thanks @phryneas! - Add a defaultContext option and property on ApolloClient, e.g. for keeping track of changing auth tokens or dependency injection.

    This can be used e.g. in authentication scenarios, where a new token might be generated outside of the link chain and should passed into the link chain.

    import { ApolloClient, createHttpLink, InMemoryCache } from "@apollo/client";
    import { setContext } from "@apollo/client/link/context";
    
    const httpLink = createHttpLink({
      uri: "/graphql",
    });
    
    const authLink = setContext((_, { headers, token }) => {
      return {
        headers: {
          ...headers,
          authorization: token ? `Bearer ${token}` : "",
        },
      };
    });
    
    const client = new ApolloClient({
      link: authLink.concat(httpLink),
      cache: new InMemoryCache(),
    });
    
    // somewhere else in your application
    function onNewToken(newToken) {
      // token can now be changed for future requests without need for a global
      // variable, scoped ref or recreating the client
      client.defaultContext.token = newToken;
    }
    
  • #11443 ff5a332 Thanks @phryneas! - Adds a deprecation warning to the HOC and render prop APIs.

    The HOC and render prop APIs have already been deprecated since 2020, but we previously didn't have a @deprecated tag in the DocBlocks.

  • #11385 d9ca4f0 Thanks @phryneas! - ensure defaultContext is also used for mutations and subscriptions

  • #11503 67f62e3 Thanks @jerelmiller! - Release changes from v3.8.10

  • #11078 14edebe Thanks @phryneas! - ObservableQuery: prevent reporting results of previous queries if the variables changed since

  • #11439 33454f0 Thanks @jerelmiller! - Address bundling issue introduced in #11412 where the react/cache internals ended up duplicated in the bundle. This was due to the fact that we had a react/hooks entrypoint that imported these files along with the newly introduced createQueryPreloader function, which lived outside of the react/hooks folder.

  • #11371 ebd8fe2 Thanks @phryneas! - Clarify types of EntityStore.makeCacheKey.

3.8.10

Patch Changes

  • #11489 abfd02a Thanks @gronxb! - Fix networkStatus with useSuspenseQuery not properly updating to ready state when using a cache-and-network fetch policy that returns data equal to what is already in the cache.

  • #11483 6394dda Thanks @pipopotamasu! - Fix cache override warning output

3.8.9

Patch Changes

  • #11472 afc844d Thanks @alessbell! - Fix delay: Infinity when set on a MockResponse passed to Mocked Provider so it indefinitely enters loading state.

  • #11464 aac12b2 Thanks @jerelmiller! - Prevent useFragment from excessively unsubscribing and resubscribing the fragment with the cache on every render.

  • #11449 f40cda4 Thanks @phryneas! - Removes refences to the typescript "dom" lib.

  • #11470 e293bc9 Thanks @phryneas! - Remove an unnecessary check from parseAndCheckHttpResponse.

3.8.8

Patch Changes

3.8.7

Patch Changes

  • #11297 c8c76a522 Thanks @jerelmiller! - Add an explicit return type for the useReadQuery hook called UseReadQueryResult. Previously the return type of this hook was inferred from the return value.

  • #11337 bb1da8349 Thanks @phryneas! - #11206 used the TypeScript syntax infer X extends Y that was introduced in TS 4.8. This caused some problems for some users, so we are rolling back to a more backwars-compatible (albeit slightly less performant) type.

3.8.6

Patch Changes

  • #11291 2be7eafe3 Thanks @ArioA! - Fix a bug that allows to only call loadErrorMessages without also calling loadDevErrorMessages.

  • #11274 b29f000f3 Thanks @jerelmiller! - Start the query ref auto dispose timeout after the initial promise has settled. This prevents requests that run longer than the timeout duration from keeping the component suspended indefinitely.

  • #11289 b5894dbf0 Thanks @phryneas! - MockedProvider: default connectToDevTools to false in created ApolloClient instance.

    This will prevent the mocked ApolloClient instance from trying to connect to the DevTools, which would start a setTimeout that might keep running after a test has finished.

  • #11206 dd2ce7687 Thanks @phryneas! - cache.modify: Less strict types & new dev runtime warnings.

3.8.5

Patch Changes

  • #11266 5192cf6e1 Thanks @phryneas! - Fixes argument handling for invariant log messages.

  • #11235 6cddaaf65 Thanks @phryneas! - Fix nextFetchPolicy behaviour with transformed documents by keeping options reference stable when passing it through QueryManager.

  • #11252 327a2abbd Thanks @phryneas! - Fixes a race condition in asyncMap that caused issues in React Native when errors were returned in the response payload along with a data property that was null.

  • #11229 c372bad4e Thanks @phryneas! - Remove (already throwing) SuspenseCache export that should have been removed in 3.8.

  • #11267 bc055e068 Thanks @phryneas! - Remove some dead code.

3.8.4

Patch Changes

  • #11195 9e59b251d Thanks @phryneas! - For invariant.log etc., error arguments are now serialized correctly in the link to the error page.

3.8.3

Patch Changes

3.8.2

Patch Changes

  • #10072 51045c336 Thanks @Huulivoide! - Fixes race conditions in useReactiveVar that may prevent updates to the reactive variable from propagating through the hook.

  • #11162 d9685f53c Thanks @jerelmiller! - Ensures GraphQL errors returned in subscription payloads adhere to the errorPolicy set in client.subscribe(...) calls.

  • #11134 96492e142 Thanks @alessbell! - Use separate type imports in useSuspenseQuery and useBackgroundQuery to workaround SWC compiler issue.

  • #11117 6b8198109 Thanks @phryneas! - Adds a new devtools registration mechanism and tweaks the mechanism behind the "devtools not found" mechanic.

  • #11186 f1d429f32 Thanks @jerelmiller! - Fix an issue where race conditions when rapidly switching between variables would sometimes result in the wrong data returned from the query. Specifically this occurs when a query is triggered with an initial set of variables (VariablesA), then triggers the same query with another set of variables (VariablesB) but switches back to the VariablesA before the response for VariablesB is returned. Previously this would result in the data for VariablesB to be displayed while VariablesA was active. The data is for VariablesA is now properly returned.

  • #11163 a8a9e11e9 Thanks @bignimbus! - Fix typo in error message: "occured" -> "occurred"

  • #11180 7d9c481e5 Thanks @jerelmiller! - Fixes an issue where refetching from useBackgroundQuery via refetch with an error after an error was already fetched would get stuck in a loading state.

3.8.1

Patch Changes

  • #11141 c469b1616 Thanks @jerelmiller! - Remove newly exported response iterator helpers that caused problems on some installs where @types/node was not available.

    IMPORTANT

    The following exports were added in version 3.8.0 that are removed with this patch.

    • isAsyncIterableIterator
    • isBlob
    • isNodeReadableStream
    • isNodeResponse
    • isReadableStream
    • isStreamableBlob

3.8.0

Minor Changes

Fetching with Suspense 🎉

  • #10323 64cb88a4b Thanks @jerelmiller! - Add support for React suspense with a new useSuspenseQuery hook.

    useSuspenseQuery initiates a network request and causes the component calling it to suspend while the request is in flight. It can be thought of as a drop-in replacement for useQuery that allows you to take advantage of React's concurrent features while fetching during render.

    Consider a Dog component that fetches and renders some information about a dog named Mozzarella:

    View code 🐶
    import { Suspense } from "react";
    import { gql, TypedDocumentNode, useSuspenseQuery } from "@apollo/client";
    
    interface Data {
      dog: {
        id: string;
        name: string;
      };
    }
    
    interface Variables {
      name: string;
    }
    
    const GET_DOG_QUERY: TypedDocumentNode<Data, Variables> = gql`
      query GetDog($name: String) {
        dog(name: $name) {
          id
          name
        }
      }
    `;
    
    function App() {
      return (
        <Suspense fallback={<div>Loading...</div>}>
          <Dog name="Mozzarella" />
        </Suspense>
      );
    }
    
    function Dog({ name }: { name: string }) {
      const { data } = useSuspenseQuery(GET_DOG_QUERY, {
        variables: { name },
      });
    
      return <>Name: {data.dog.name}</>;
    }
    

    For a detailed explanation of useSuspenseQuery, see our fetching with Suspense reference.

  • #10755 e3c676deb Thanks @alessbell! - Feature: adds useBackgroundQuery and useReadQuery hooks

    useBackgroundQuery initiates a request for data in a parent component and returns a QueryReference which is used to read the data in a child component via useReadQuery. If the child component attempts to render before the data can be found in the cache, the child component will suspend until the data is available. On cache updates to watched data, the child component calling useReadQuery will re-render with new data but the parent component will not re-render (as it would, for example, if it were using useQuery to issue the request).

    Consider an App component that fetches a list of breeds in the background while also fetching and rendering some information about an individual dog, Mozzarella:

    View code 🐶
    function App() {
      const [queryRef] = useBackgroundQuery(GET_BREEDS_QUERY);
      return (
        <Suspense fallback={<div>Loading...</div>}>
          <Dog name="Mozzarella" queryRef={queryRef} />
        </Suspense>
      );
    }
    
    function Dog({
      name,
      queryRef,
    }: {
      name: string;
      queryRef: QueryReference<BreedData>;
    }) {
      const { data } = useSuspenseQuery(GET_DOG_QUERY, {
        variables: { name },
      });
      return (
        <>
          Name: {data.dog.name}
          <Suspense fallback={<div>Loading breeds...</div>}>
            <Breeds queryRef={queryRef} />
          </Suspense>
        </>
      );
    }
    
    function Breeds({ queryRef }: { queryRef: QueryReference<BreedData> }) {
      const { data } = useReadQuery(queryRef);
      return data.breeds.map(({ characteristics }) =>
        characteristics.map((characteristic) => (
          <div key={characteristic}>{characteristic}</div>
        )),
      );
    }
    

    For a detailed explanation of useBackgroundQuery and useReadQuery, see our fetching with Suspense reference.

Document transforms 📑

  • #10509 79df2c7ba Thanks @jerelmiller! - Add the ability to specify custom GraphQL document transforms. These transforms are run before reading data from the cache, before local state is resolved, and before the query document is sent through the link chain.

    To register a custom document transform, create a transform using the DocumentTransform class and pass it to the documentTransform option on ApolloClient.

    import { DocumentTransform } from "@apollo/client";
    
    const documentTransform = new DocumentTransform((document) => {
      // do something with `document`
      return transformedDocument;
    });
    
    const client = new ApolloClient({ documentTransform: documentTransform });
    

    For more information on the behavior and API of DocumentTransform, see its reference page in our documentation.

  • #10853 300957960 Thanks @jerelmiller! - Introduce the new removeTypenameFromVariables link. This link will automatically remove __typename fields from variables for all operations. This link can be configured to exclude JSON-scalars for scalars that utilize __typename.

    This change undoes some work from #10724 where __typename was automatically stripped for all operations with no configuration. This was determined to be a breaking change and therefore moved into this link.

    For a detailed explanation of removeTypenameFromVariables, see its API reference.

New skipToken sentinel

  • #11112 b4aefcfe9 Thanks @jerelmiller! - Adds support for a skipToken sentinel that can be used as options in useSuspenseQuery and useBackgroundQuery to skip execution of a query. This works identically to the skip option but is more type-safe and as such, becomes the recommended way to skip query execution. As such, the skip option has been deprecated in favor of skipToken.

    We are considering the removal of the skip option from useSuspenseQuery and useBackgroundQuery in the next major. We are releasing with it now to make migration from useQuery easier and make skipToken more discoverable.

    useSuspenseQuery

    import { skipToken, useSuspenseQuery } from "@apollo/client";
    
    const id: number | undefined;
    
    const { data } = useSuspenseQuery(
      query,
      id ? { variables: { id } } : skipToken,
    );
    

    useBackgroundQuery

    import { skipToken, useBackgroundQuery } from "@apollo/client";
    
    function Parent() {
      const [queryRef] = useBackgroundQuery(
        query,
        id ? { variables: { id } } : skipToken
      );
    
      return queryRef ? <Child queryRef={queryRef} /> : null;
    }
    
    function Child({ queryRef }: { queryRef: QueryReference<TData> }) {
      const { data } = useReadQuery(queryRef);
    }
    

    For a detailed explanation of skipToken, see its API reference.

New error extraction mechanism, smaller bundles 📉

  • #10887 f8c0b965d Thanks @phryneas! - Add a new mechanism for Error Extraction to reduce bundle size by including error message texts on an opt-in basis.

    By default, errors will link to an error page with the entire error message. This replaces "development" and "production" errors and works without additional bundler configuration.

    Bundling the text of error messages and development warnings can be enabled as follows:

    import { loadErrorMessages, loadDevMessages } from "@apollo/client/dev";
    if (process.env.NODE_ENV !== "production") {
      loadErrorMessages();
      loadDevMessages();
    }
    

    For a detailed explanation, see our reference on reducing bundle size.

New @nonreactive directive 🎬

  • #10722 c7e60f83d Thanks @benjamn! - Implement a @nonreactive directive for selectively skipping reactive comparisons of query result subtrees.

    The @nonreactive directive can be used to mark query fields or fragment spreads and is used to indicate that changes to the data contained within the subtrees marked @nonreactive should not trigger re-rendering. This allows parent components to fetch data to be rendered by their children without re-rendering themselves when the data corresponding with fields marked as @nonreactive change.

    Consider an App component that fetches and renders a list of ski trails:

    View code 🎿
    const TrailFragment = gql`
      fragment TrailFragment on Trail {
        name
        status
      }
    `;
    
    const ALL_TRAILS = gql`
      query allTrails {
        allTrails {
          id
          ...TrailFragment @nonreactive
        }
      }
      ${TrailFragment}
    `;
    
    function App() {
      const { data, loading } = useQuery(ALL_TRAILS);
      return (
        <main>
          <h2>Ski Trails</h2>
          <ul>
            {data?.trails.map((trail) => (
              <Trail key={trail.id} id={trail.id} />
            ))}
          </ul>
        </main>
      );
    }
    

    The Trail component renders a trail's name and status and allows the user to execute a mutation to toggle the status of the trail between "OPEN" and "CLOSED":

    View code 🎿
    const Trail = ({ id }) => {
      const [updateTrail] = useMutation(UPDATE_TRAIL);
      const { data } = useFragment({
        fragment: TrailFragment,
        from: {
          __typename: "Trail",
          id,
        },
      });
      return (
        <li key={id}>
          {data.name} - {data.status}
          <input
            checked={data.status === "OPEN" ? true : false}
            type="checkbox"
            onChange={(e) => {
              updateTrail({
                variables: {
                  trailId: id,
                  status: e.target.checked ? "OPEN" : "CLOSED",
                },
              });
            }}
          />
        </li>
      );
    };
    

    Notice that the Trail component isn't receiving the entire trail object via props, only the id which is used along with the fragment document to create a live binding for each trail item in the cache. This allows each Trail component to react to the cache updates for a single trail independently. Updates to a trail's status will not cause the parent App component to rerender since the @nonreactive directive is applied to the TrailFragment spread, a fragment that includes the status field.

    For a detailed explanation, see our @nonreactive reference and @alessbell's post on the Apollo blog about using @nonreactive with useFragment.

Abort the AbortController signal more granularly 🛑

  • #11040 125ef5b2a Thanks @phryneas! - HttpLink/BatchHttpLink: Abort the AbortController signal more granularly.

    Before this change, when HttpLink/BatchHttpLink created an AbortController internally, the signal would always be .aborted after the request was completed. This could cause issues with Sentry Session Replay and Next.js App Router Cache invalidations, which just replayed the fetch with the same options - including the cancelled AbortSignal.

    With this change, the AbortController will only be .abort()ed by outside events, not as a consequence of the request completing.

useFragment drops its experimental label 🎓

  • #10916 ea75e18de Thanks @alessbell! - Remove experimental labels.

    useFragment, introduced in 3.7.0 as useFragment_experimental, is no longer an experimental API 🎉 We've removed the _experimental suffix from its named export and have made a number of improvements.

    For a detailed explanation, see our useFragment reference and @alessbell's post on the Apollo blog about using useFragment with @nonreactive for improved performance when rendering lists.

    useFragment improvements
    • #10765 35f36c5aa Thanks @phryneas! - More robust types for the data property on UseFragmentResult. When a partial result is given, the type is now correctly set to Partial<TData>.

    • #11083 f766e8305 Thanks @phryneas! - Adjust the rerender timing of useQuery to more closely align with useFragment. This means that cache updates delivered to both hooks should trigger renders at relatively the same time. Previously, the useFragment might rerender much faster leading to some confusion.

    • #10836 6794893c2 Thanks @phryneas! - Remove the deprecated returnPartialData option from useFragment hook.

More Minor Changes

  • #10895 e187866fd Thanks @Gelio! - Add generic type parameter for the entity modified in cache.modify. Improves TypeScript type inference for that type's fields and values of those fields.

    Example:

    cache.modify<Book>({
      id: cache.identify(someBook),
      fields: {
        title: (title) => {
          // title has type `string`.
          // It used to be `any`.
        },
     => {
          // author has type `Reference | Book["author"]`.
          // It used to be `any`.
        },
      },
    });
    
  • #10895 e187866fd Thanks @Gelio! - Use unique opaque types for the DELETE and INVALIDATE Apollo cache modifiers.

    This increases type safety, since these 2 modifiers no longer have the any type. Moreover, it no longer triggers the @typescript-eslint/no-unsafe-return rule.

  • #10340 4f73c5ca1 Thanks @alessbell! - Avoid calling useQuery onCompleted for cache writes

  • #10527 0cc7e2e19 Thanks @phryneas! - Remove the query/mutation/subscription option from hooks that already take that value as their first argument.

  • #10506 2dc2e1d4f Thanks @phryneas! - prevent accidental widening of inferred TData and TVariables generics for query hook option arguments

  • #10521 fbf729414 Thanks @benjamn! - Simplify __DEV__ polyfill to use imports instead of global scope

  • #10994 2ebbd3abb Thanks @phryneas! - Add .js file extensions to imports in src and dist/*/.d.ts

  • #11045 9c1d4a104 Thanks @jerelmiller! - When changing variables back to a previously used set of variables, do not automatically cache the result as part of the query reference. Instead, dispose of the query reference so that the InMemoryCache can determine the cached behavior. This means that fetch policies that would guarantee a network request are now honored when switching back to previously used variables.

  • #11058 89bf33c42 Thanks @phryneas! - (Batch)HttpLink: Propagate AbortErrors to the user when a user-provided signal is passed to the link. Previously, these links would swallow all AbortErrors, potentially causing queries and mutations to never resolve. As a result of this change, users are now expected to handle AbortErrors when passing in a user-provided signal.

  • #10346 3bcfc42d3 Thanks @jerelmiller! - Add the ability to allow @client fields to be sent to the link chain.

  • #10567 c2ce6496c Thanks @benjamn! - Allow ApolloCache implementations to specify default value for assumeImmutableResults client option, improving performance for applications currently using InMemoryCache without configuring new ApolloClient({ assumeImmutableResults: true })

  • #10915 3a62d8228 Thanks @phryneas! - Changes how development-only code is bundled in the library to more reliably enable consuming bundlers to reduce production bundle sizes while keeping compatibility with non-node environments.

Patch Changes

  • #11086 0264fee06 Thanks @jerelmiller! - Fix an issue where a call to refetch, fetchMore, or changing skip to false that returned a result deeply equal to data in the cache would get stuck in a pending state and never resolve.

  • #11053 c0ca70720 Thanks @phryneas! - Add SuspenseCache as a lazy hidden property on ApolloClient. This means that SuspenseCache is now an implementation details of Apollo Client and you no longer need to manually instantiate it and no longer need to pass it into ApolloProvider. Trying to instantiate a SuspenseCache instance in your code will now throw an error.

  • #11115 78739e3ef Thanks @phryneas! - Enforce export type for all type-level exports.

  • #11027 e47cfd04e Thanks @phryneas! - Prevents the DevTool installation warning to be turned into a documentation link.

  • #10594 f221b5e8f Thanks @phryneas! - Add a suspenseCache option to useSuspenseQuery

  • #10700 12e37f46f Thanks @jerelmiller! - Add a queryKey option to useSuspenseQuery that allows the hook to create a unique subscription instance.

  • #10724 e285dfd00 Thanks @jerelmiller! - Automatically strips __typename fields from variables sent to the server when using HttpLink, BatchHttpLink, or GraphQLWsLink. This allows GraphQL data returned from a query to be used as an argument to a subsequent GraphQL operation without the need to strip the __typename in user-space.

  • #10957 445164d21 Thanks @phryneas! - Use React.version as key for shared Contexts.

  • #10635 7df51ee19 Thanks @jerelmiller! - Fix an issue where cache updates would not propagate to useSuspenseQuery while in strict mode.

  • #11013 5ed2cfdaf Thanks @alessbell! - Make private fields inFlightLinkObservables and fetchCancelFns protected in QueryManager in order to make types available in @apollo/experimental-nextjs-app-support package when extending the ApolloClient class.

  • #10869 ba1d06166 Thanks @phryneas! - Ensure Context value stability when rerendering ApolloProvider with the same client and/or suspenseCache prop

  • #11103 e3d611daf Thanks @caylahamann! - Fixes a bug in useMutation so that onError is called when an error is returned from the request with errorPolicy set to 'all' .

  • #10657 db305a800 Thanks @jerelmiller! - Return networkStatus in the useSuspenseQuery result.

  • #10937 eea44eb87 Thanks @jerelmiller! - Moves DocumentTransform to the utilities sub-package to avoid a circular dependency between the core and cache sub-packages.

  • #10951 2e833b2ca Thanks @alessbell! - Improve useBackgroundQuery type interface

  • #10651 8355d0e1e Thanks @jerelmiller! - Fixes an issue where useSuspenseQuery would not respond to cache updates when using a cache-first fetchPolicy after the hook was mounted with data already in the cache.

  • #11026 b8d405eee Thanks @phryneas! - Store React.Context instance mapped by React.createContext instance, not React.version. Using React.version can cause problems with preact, as multiple versions of preact will all identify themselves as React 17.0.2.

  • #11000 1d43ab616 Thanks @phryneas! - Use import * as React everywhere. This prevents an error when importing @apollo/client in a React Server component. (see #10974)

  • #10852 27fbdb3f9 Thanks @phryneas! - Chore: Add ESLint rule for consistent type imports, apply autofix

  • #10999 c1904a78a Thanks @phryneas! - Fix a bug in QueryReference where this.resolve or this.reject might be executed even if undefined.

  • #10940 1d38f128f Thanks @jerelmiller! - Add support for the skip option in useBackgroundQuery and useSuspenseQuery. Setting this option to true will avoid a network request.

  • #10672 932252b0c Thanks @jerelmiller! - Fix the compatibility between useSuspenseQuery and React's useDeferredValue and startTransition APIs to allow React to show stale UI while the changes to the variable cause the component to suspend.

    Breaking change

    nextFetchPolicy support has been removed from useSuspenseQuery. If you are using this option, remove it, otherwise it will be ignored.

  • #10964 f33171506 Thanks @alessbell! - Fixes a bug in BatchHttpLink that removed variables from all requests by default.

  • #10633 90a06eeeb Thanks @benjamn! - Fix type policy inheritance involving fuzzy possibleTypes

  • #10754 64b304862 Thanks @sincraianul! - Fix includeUnusedVariables option not working with BatchHttpLink

  • #11018 5618953f3 Thanks @jerelmiller! - useBackgroundQuery now uses its own options type called BackgroundQueryHookOptions rather than reusing SuspenseQueryHookOptions.

  • #11035 a3ab7456d Thanks @jerelmiller! - Incrementally re-render deferred queries after calling refetch or setting skip to false to match the behavior of the initial fetch. Previously, the hook would not re-render until the entire result had finished loading in these cases.

  • #10399 652a1ae08 Thanks @alessbell! - Silence useLayoutEffect warning when useSuspenseQuery runs on server

  • #10919 f796ce1ac Thanks @jerelmiller! - Fix an issue when using a link that relied on operation.getContext and operation.setContext would error out when it was declared after the removeTypenameFromVariables link.

  • #10968 b102390b2 Thanks @phryneas! - Use printed query for query deduplication. Cache print calls for GraphQL documents to speed up repeated operations.

  • #11071 4473e925a Thanks @jerelmiller! - #10509 introduced some helpers for determining the type of operation for a GraphQL query. This imported the OperationTypeNode from graphql-js which is not available in GraphQL 14. To maintain compatibility with graphql-js v14, this has been reverted to use plain strings.

  • #10766 ffb179e55 Thanks @jerelmiller! - More robust typings for the data property returned from useSuspenseQuery when using returnPartialData: true or an errorPolicy of all or ignore. TData now defaults to unknown instead of any.

  • #10401 3e5b41a75 Thanks @jerelmiller! - Always throw network errors in useSuspenseQuery regardless of the set errorPolicy.

  • #10877 f40248598 Thanks @phryneas! - Change an import in useQuery and useMutation that added an unnecessary runtime dependency on @apollo/client/core. This drastically reduces the bundle size of each the hooks.

  • #10656 54c4d2f3c Thanks @jerelmiller! - Ensure refetch, fetchMore, and subscribeToMore functions returned by useSuspenseQuery are referentially stable between renders, even as data is updated.

  • #10324 95eb228be Thanks @jerelmiller! - Add @defer support to useSuspenseQuery.

  • #10888 1562a2f5a Thanks @alessbell! - Updates dependency versions in package.json by bumping:

    • @wry/context to ^0.7.3
    • @wry/equality to ^0.5.6
    • @wry/trie to ^0.4.3
    • optimism to ^0.17.4

    to 1. fix sourcemap warnings and 2. a Codesandbox sandpack (in-browser) bundler transpilation bug with an upstream optimism workaround.

  • #11010 1051a9c88 Thanks @alessbell! - Hide queryRef in a Symbol in useBackgroundQuerys return value.

  • #10758 9def7421f Thanks @phryneas! - use React.use where available

  • #11032 6a4da900a Thanks @jerelmiller! - Throw errors in useSuspenseQuery for errors returned in incremental chunks when errorPolicy is none. This provides a more consistent behavior of the errorPolicy in the hook.

    Potentially breaking change

    Previously, if you issued a query with @defer and relied on errorPolicy: 'none' to set the error property returned from useSuspenseQuery when the error was returned in an incremental chunk, this error is now thrown. Switch the errorPolicy to all to avoid throwing the error and instead return it in the error property.

  • #10960 ee407ef97 Thanks @alessbell! - Adds support for returnPartialData and refetchWritePolicy options in useBackgroundQuery hook.

  • #10809 49d28f764 Thanks @jerelmiller! - Fixed the ability to use refetch and fetchMore with React's startTransition. The hook will now behave correctly by allowing React to avoid showing the Suspense fallback when these functions are wrapped by startTransition. This change deprecates the suspensePolicy option in favor of startTransition.

  • #11082 0f1cde3a2 Thanks @phryneas! - Restore Apollo Client 3.7 getApolloContext behaviour

  • #10969 525a9317a Thanks @phryneas! - Slightly decrease bundle size and memory footprint of SuspenseCache by changing how cache entries are stored internally.

  • #11025 6092b6edf Thanks @jerelmiller! - useSuspenseQuery and useBackgroundQuery will now properly apply changes to its options between renders.

  • #10872 96b4f8837 Thanks @phryneas! - The "per-React-Version-Singleton" ApolloContext is now stored on globalThis, not React.createContext, and throws an error message when accessed from React Server Components.

  • #10450 f8bc33387 Thanks @jerelmiller! - Add support for the subscribeToMore and client fields returned in the useSuspenseQuery result.

3.7.17

Patch Changes

  • #10631 b93388d75 Thanks @phryneas! - ObservableQuery.getCurrentResult: skip the cache if the running query should not access the cache

3.7.16

Patch Changes

  • #10806 cb1540504 Thanks @phryneas! - Fix a bug in PersistedQueryLink that would cause it to permanently skip persisted queries after a 400 or 500 status code.

  • #10807 b32369592 Thanks @phryneas! - PersistedQueryLink will now also check for error codes in extensions.

  • #10982 b9be7a814 Thanks @sdeleur-sc! - Update relayStylePagination to avoid populating startCursor when only a single cursor is present under the edges field. Use that cursor only as the endCursor.

  • #10962 772cfa3cb Thanks @jerelmiller! - Remove useGETForQueries option in BatchHttpLink.Options type since it is not supported.

3.7.15

Patch Changes

  • #10891 ab42a5c08 Thanks @laverdet! - Fixes a bug in how multipart responses are read when using @defer. When reading a multipart body, HttpLink no longer attempts to parse the boundary (e.g. "---" or other boundary string) within the response data itself, only when reading the beginning of each mulitpart chunked message.

  • #10789 23a4e1578 Thanks @phryneas! - Fix a bug where other fields could be aliased to __typename or id, in which case an incoming result would be merged into the wrong cache entry.

3.7.14

Patch Changes

  • #10764 1b0a61fe5 Thanks @phryneas! - Deprecate useFragment returnPartialData option

  • #10810 a6252774f Thanks @dleavitt! - Fix type signature of ServerError.

    In <3.7 HttpLink and BatchHttpLink would return a ServerError.message of e.g. "Unexpected token 'E', \"Error! Foo bar\" is not valid JSON" and a ServerError.result of undefined in the case where a server returned a >= 300 response code with a response body containing a string that could not be parsed as JSON.

    In >=3.7, message became e.g. Response not successful: Received status code 302 and result became the string from the response body, however the type in ServerError.result was not updated to include the string type, which is now properly reflected.

3.7.13

Patch Changes

  • #10805 a5503666c Thanks @phryneas! - Fix a potential memory leak in SSR scenarios when many persistedQuery instances were created over time.

  • #10718 577c68bdd Thanks @Hsifnus! - Delay Concast subscription teardown slightly in useSubscription to prevent unexpected Concast teardown when one useSubscription hook tears down its in-flight Concast subscription immediately followed by another useSubscription hook reusing and subscribing to that same Concast

3.7.12

Patch Changes

  • #10735 895bcdcff Thanks @alessbell! - If a multipart chunk contains only hasNext: false, immediately complete the observable.

3.7.11

Patch Changes

  • #10586 4175af594 Thanks @alessbell! - Improve WebSocket error handling for generic Event received on error. For more information see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/error_event.

  • #10411 152baac34 Thanks @lovasoa! - Simplify error message generation and make 'undefined' an impossible message string.

  • #10592 cdb98ae08 Thanks @alessbell! - Adds support for multipart subscriptions in HttpLink.

  • #10698 38508a251 Thanks @jerelmiller! - Changes the behavior of useLazyQuery introduced in #10427 where unmounting a component before a query was resolved would reject the promise with an abort error. Instead, the promise will now resolve naturally with the result from the request.

    Other notable fixes:

    • Kicking off multiple requests in parallel with the execution function will now ensure each returned promise is resolved with the data from its request. Previously, each promise was resolved with data from the last execution.
    • Re-rendering useLazyQuery with a different query document will now ensure the execution function uses the updated query document. Previously, only the query document rendered the first time would be used for the request.
  • #10660 364bee98f Thanks @alessbell! - Upgrades TypeScript to v5. This change is fully backward-compatible and transparent to users.

  • #10597 8fb9d190d Thanks @phryneas! - Fix a bug where an incoming cache update could prevent future updates from the active link.

  • #10629 02605bb3c Thanks @phryneas! - useQuery: delay unsubscribe to fix race conditions

3.7.10

Patch Changes

  • #9438 52a9c8ea1 Thanks @dciesielkiewicz! - Ensure the client option passed to useMutation's execute function is used when provided. Previously this option was ignored.

  • #9124 975b923c0 Thanks @andrebrantom! - Make ApolloClient.writeQuery and ApolloClient.writeFragment behave more like cache.writeQuery and cache.writeFragment by returning the reference returned by the cache.

3.7.9

Patch Changes

  • #10560 a561ecf43 Thanks @benjamn! - Keep __typename fragment when it does not contain @client directive and strip out inline fragments which use a @client directive. Thanks @Gazler and @mtsmfm!

  • #10560 251a12806 Thanks @benjamn! - Refactor removeDirectivesFromDocument to fix AST ordering sensitivities and avoid 1/3 AST traversals, potentially improving performance for large queries

3.7.8

Patch Changes

  • #7555 45562d6fa Thanks @TheCeloReis! - Adds TVariables generic to GraphQLRequest and MockedResponse interfaces.

  • #10526 1d13de4f1 Thanks @benjamn! - Tolerate undefined concast.sources if complete called earlier than concast.start

  • #10497 8a883d8a1 Thanks @nevir! - Update SingleExecutionResult and IncrementalPayload's data types such that they no longer include undefined, which was not a valid runtime value, to fix errors when TypeScript's exactOptionalPropertyTypes is enabled.

3.7.7

Patch Changes

  • #10502 315faf9ca Thanks @jerelmiller! - Log a warning to the console when a mock passed to MockedProvider or MockLink cannot be matched to a query during a test. This makes it easier to debug user errors in the mock setup, such as typos, especially if the query under test is using an errorPolicy set to ignore, which makes it difficult to know that a match did not occur.

  • #10499 9e54f5dfa Thanks @phryneas! - Allow the execution function returned by useLazyQuery to change the query.

  • #10362 14a56b105 Thanks @mccraveiro! - Fix error when server returns an error and we are also querying for a local field

3.7.6

Patch Changes

  • #10470 47435e879 Thanks @alessbell! - Bumps TypeScript to 4.9.4 (previously 4.7.4) and updates types to account for changes in TypeScript 4.8 by propagating contstraints on generic types. Technically this makes some types stricter as attempting to pass null|undefined into certain functions is now disallowed by TypeScript, but these were never expected runtime values in the first place. This should only affect you if you are wrapping functions provided by Apollo Client with your own abstractions that pass in their generics as type arguments, in which case you might get an error like error TS2344: Type 'YourGenericType' does not satisfy the constraint 'OperationVariables'. In that case, make sure that YourGenericType is restricted to a type that only accepts objects via extends, like Record<string, any> or @apollo/client's OperationVariables:

    import {
      QueryHookOptions,
      QueryResult,
      useQuery,
    + OperationVariables,
    } from '@apollo/client';
    - export function useWrappedQuery<T, TVariables>(
    + export function useWrappedQuery<T, TVariables extends OperationVariables>(
        query: DocumentNode,
        queryOptions: QueryHookOptions<T, TVariables>
      ): QueryResult<T, TVariables> {
        const [execute, result] = useQuery<T, TVariables>(query);
      }
    
  • #10408 55ffafc58 Thanks @zlrlo! - fix: modify BatchHttpLink to have a separate timer for each different batch key

  • #9573 4a4f48dda Thanks @vladar! - Improve performance of local resolvers by only executing selection sets that contain an @client directive. Previously, local resolvers were executed even when the field did not contain @client. While the result was properly discarded, the unncessary work could negatively affect query performance, sometimes signficantly.

3.7.5

Patch Changes

  • #10458 b5ccef229 Thanks @lennyburdette! - Passes getServerSnapshot to useSyncExternalStore so that it doesn't trigger a Missing getServerSnapshot error when using useFragment_experimental on the server.

  • #10471 895ddcb54 Thanks @alessbell! - More robust type definition for headers property passed to createHttpLink

  • #10321 bbaa3ef2d Thanks @alessbell! - Refetch should not return partial data with errorPolicy: none and notifyOnNetworkStatusChange: true.

  • #10402 0b07aa955 Thanks @Hugodby! - Improve context types

  • #10469 328c58f90 Thanks @jerelmiller! - Add generic type defaults when using useFragment to allow passing TData directly to the function without needing to specify TVars.

3.7.4

Patch Changes

  • #10427 28d909cff Thanks @jerelmiller! - Ensure in-flight promises executed by useLazyQuery are rejected when useLazyQuery unmounts.

  • #10383 5c5ca9b01 Thanks @jerelmiller! - Ensure the onError callback is called when the errorPolicy is set to "all" and partial data is returned.

  • #10425 86e35a6d2 Thanks @jerelmiller! - Prefer the onError and onCompleted callback functions passed to the execute function returned from useMutation instead of calling both callback handlers.

3.7.3

Patch Changes

  • #10334 7d923939d Thanks @jerelmiller! - Better handle deferred queries that have cached or partial cached data for them

  • #10368 46b58e976 Thanks @alessbell! - Fix: unblocks support for defer in mutations

    If the @defer directive is present in the document passed to mutate, the Promise will resolve with the final merged data after the last multipart chunk has arrived in the response.

3.7.2

Patch Changes

  • Only show dev tools suggestion in the console when connectToDevTools is true.
    @chris110408 in #10258

  • Pass TCache generic to MutationHookOptions for better type support in useMutation.
    @igrlk in #10223

  • Add name property to ApolloError to ensure better type safety and help error reporting tools better identify the error.
    @aaronadamsCA in #9323

  • Export a ModifierDetails type for the details parameter of a Modifier function.
    @KeithGillette in #7133

  • Revert use of cloneDeep to clone options when fetching queries.
    @MrDoomBringer in #10215

3.7.1

Patch Changes

  • Fix issue where loading remains true after observer.refetch is called repeatedly with different variables when the same data are returned.
    @alessbell in #10143

  • Fix race condition where useFragment_experimental could receive cache updates before initially calling cache.watch in useEffect.
    @benjamn in #10212

3.7.0

Minor Changes

  • Implement preview support for the @defer directive.
    @alessbell and @benjamn in #10018

  • Implement useFragment_experimental hook, which represents a lightweight live binding into the ApolloCache, and never triggers network requests of its own.
    @benjamn in #8782

  • Allow registering named fragments with InMemoryCache to support using ...NamedFragment in queries without redeclaring NamedFragment repeatedly in every query that uses it.
    @benjamn in #9764

  • Support onError callback for useSubscription hook.
    @jeroenvisser101 in #9495

  • Implement preserveHeaderCase option for http context object, enabling preserved header capitalization for non-http-spec-compliant servers.
    @mrdoombringer in #9891

Patch Changes

  • Delay calling onCompleted and onError callbacks passed to useQuery using Promise.resolve().then(() => ...) to fix issue #9794.
    @dylanwulf in #9823

  • Replace concast.cleanup method with simpler concast.beforeNext API, which promises to call the given callback function just before the next result/error is delivered. In addition, concast.removeObserver no longer takes a quietly?: boolean parameter, since that parameter was partly responsible for cleanup callbacks sometimes not getting called.
    @benjamn in #9718

  • Allow preserving header name capitalization when creating an HttpLink with createHttpLink({ uri, preserveHeaderCase: true }). Otherwise, header names are converted to lowercase to prevent case-sensitivity bugs.
    @MrDoomBringer in #9891

  • Make queries with a pollInterval respect the no-cache fetch policy, instead of writing polled results into the cache.
    @MrDoomBringer in #10020

  • Deprecate the onSubscriptionData callback in favor of a new onData callback for the useSubscription hook. Deprecate the onSubscriptionComplete callback in favor of a new onComplete callback for the useSubscription hook.
    @jerelmiller in #10134

Potentially disruptive

  • The optional subscribeAndCount testing utility exported from @apollo/client/testing/core now takes a single generic TResult type parameter, instead of TData. This type will typically be inferred from the observable argument type, but if you have any explicit calls to subscribeAndCount<TData>(...) in your own codebase, you may need to adjust those calls accordingly.
    @benjamn in #9718

Apollo Client 3.6.10 (2022-09-29)

Improvements

  • The client options (variables, context, etc.) used for mutation calls are now available as the second argument to the onCompleted and onError callback functions.
    @MrDoomBringer in #10052

Apollo Client 3.6.9 (2022-06-21)

Bug Fixes

  • Leave fetchPolicy unchanged when skip: true (or in standby) and nextFetchPolicy is available, even if variables change.
    @benjamn in #9823

Apollo Client 3.6.8 (2022-06-10)

Bug Fixes

  • Fix incorrect variables passed in FieldFunctionOptions for nested readField calls in read and merge functions.
    @stardustxx in #9808

  • Improve repository build scripts to work better on Windows.
    @dylanwulf in #9805

  • Ensure useQuery(query, { skip: true }).called === false rather than always returning called as true.
    @KucharskiPiotr in #9798

  • Allow abandoned reobserve requests to unsubscribe from their underlying Observable.
    @javier-garcia-meteologica in #9791

Apollo Client 3.6.7 (2022-06-10)

Bug Fixes

  • Fix regression (introduced in v3.6.0) that caused BatchHttpLink to discard pending batched queries on early completion of the underlying Observable.
    @benjamn in #9793

Apollo Client 3.6.6 (2022-05-26)

Bug Fixes

  • Allow useLazyQuery(query, { defaultOptions }) to benefit from defaultOptions.variables and client.defaultOptions.watchQuery.variables merging.
    @benjamn in #9762

Apollo Client 3.6.5 (2022-05-23)

Bug Fixes

  • Restore pre-v3.6 variables replacement behavior of ObservableQuery#reobserve method, fixing a regression that prevented removal of variables.
    @benjamn in #9741

  • Preserve previousData even when different query or client provided to useQuery, instead of resetting previousData to undefined in those cases, matching behavior prior to v3.6.0.
    @benjamn in #9734

  • Fix bug where onCompleted() and onError() are stale for useMutation().
    @charle692 in #9740

  • Limit scope of DeepMerger object reuse, and avoid using Object.isFrozen, which can introduce differences between development and production if objects that were frozen using Object.freeze in development are left unfrozen in production.
    @benjamn in #9742

  • Properly merge variables from original useLazyQuery(query, { variables }) with variables passed to execution function.
    @benjamn in #9758

Apollo Client 3.6.4 (2022-05-16)

Bug Fixes

  • Guarantee Concast cleanup without Observable cancelled prematurely rejection, potentially solving long-standing issues involving that error.
    @benjamn in #9701

  • Ensure useSubscription subscriptions are properly restarted after unmounting/remounting by React 18 in <StrictMode>.
    @kazekyo in #9707

Improvements

  • Internalize useSyncExternalStore shim, for more control than use-sync-external-store provides, fixing some React Native issues.
    @benjamn in #9675 and #9709

  • Provide @apollo/client/**/*.cjs.native.js versions of every @apollo/client/**/*.cjs bundle (including dependencies ts-invariant and zen-observable-ts) to help React Native's Metro bundler automatically resolve CommonJS entry point modules. These changes should render unnecessary the advice we gave in the v3.5.4 section below about metro.config.js.
    @benjamn in #9716

  • Handle falsy incoming data more gracefully in offetLimitPagination().merge function.
    @shobhitsharma in #9705

Apollo Client 3.6.3 (2022-05-05, only tagged next on npm)

Bug Fixes

  • Simplify useQuery(query, { defaultOptions }) default options processing in order to fix bug where skip: true queries failed to execute upon switching to skip: false.
    @benjamn in #9665

  • Add tests of skipping/unskipping and useLazyQuery with defaultOptions, and fix a bug causing duplicate requests.
    @benjamn in #9666

  • Update ts-invariant to version 0.10.2 to fix source map warnings.
    @benjamn in #9672

  • Test that useQuery queries with skip: true do not stall server-side rendering.
    @nathanmarks and @benjamn in #9677

  • Prevent useLazyQuery from making duplicate requests when its execution function is first called, and stop rejecting the Promise it returns when result.error is defined.
    @benjamn in #9684

  • Fix issue with useQuery returning loading: true state during server-side rendering with skip: true.
    @nathanmarks in #9679

Apollo Client 3.6.2 (2022-05-02)

Bug Fixes

  • Pass getServerSnapshot function to useSyncExternalStore in addition to getSnapshot, though the two functions behave identically. This change should fix/unbreak React 18 server rendering.
    @hungphongbk in #9652

Improvements

  • Consider networkError.result.errors in addition to result.errors in PersistedQueryLink.
    @redaid113 and @benjamn in #9410

Apollo Client 3.6.1 (2022-04-28)

Bug Fixes

  • Remove recently-added, internal fetchBlockingPromise option from the WatchQueryOptions interface, due to regressions.
    @benjamn in #9504

Apollo Client 3.6.0 (2022-04-26)

Potentially disruptive changes

  • Calling fetchMore for queries using the cache-and-network or network-only fetch policies will no longer trigger additional network requests when cache results are complete. Instead, those complete cache results will be delivered as if using the cache-first fetch policy.
    @benjamn in #9504

  • Reimplement useQuery and useLazyQuery to use the proposed useSyncExternalStore API from React 18.
    @brainkim and @benjamn in #8785 and #9596

  • Fixed bug where the useLazyQuery execution function would always use the refetch method of ObservableQuery, instead of properly reapplying the current fetchPolicy using the reobserve method.
    @benjamn in #9564

    Since this reobserve method is useful and used internally, we have now exposed it as use[Lazy]Query(...).reobserve (which optionally takes a Partial<WatchQueryOptions> of new options), to supplement the existing refetch method. Note that reobserve permanently updates the variables and other options of the ObservableQuery, unlike refetch({ ...variables }), which does not save those variables.

  • The internal use of options.fetchBlockingPromise by useQuery and useLazyQuery may slightly delay the delivery of network results, compared to previous versions of Apollo Client. Since network results are already delivered asynchronously, these timing differences should not be disruptive in most cases. Nevertheless, please open an issue if the timing differences are a problem for you (and you have no easy workaround).
    @benjamn in #9599

React 18

In both its peerDependencies and its internal implementation, Apollo Client v3.6 should no longer prevent you from updating to React 18 in your applications.

Internally, we have refactored useQuery and useLazyQuery to be implemented in terms of React's new (shimmable) useSyncExternalStore hook, demonstrating Apollo Client can serve as an external store with a referentially stable, synchronous API, as needed by React.

As part of this refactoring, we also improved the behavior of useQuery and useLazyQuery when used in <React.StrictMode>, which double-renders components in development. While this double-rendering always results in calling useQuery twice, forcing Apollo Client to create and then discard an unnecessary ObservableQuery object, we now have multiple defenses in place against executing any network queries for the unused ObservableQuery objects.

In upcoming v3.6.x and v3.7 (beta) releases, we will be completely overhauling our server-side rendering utilities (getDataFromTree et al.), and introducing suspenseful versions of our hooks, to take full advantage of the new patterns React 18+ enables for data management libraries like Apollo Client.

Improvements

  • Allow BatchLink to cancel queued and in-flight operations.
    @PowerKiKi and @benjamn in #9248

  • Add GraphQLWsLink in @apollo/client/link/subscriptions. This link is similar to the existing WebSocketLink in @apollo/client/link/ws, but uses the newer graphql-ws package and protocol instead of the older subscriptions-transport-ws implementation. This functionality was technically first released in @apollo/client@3.5.10, but semantically belongs in the 3.6.0 minor version. @glasser in #9369

  • Allow passing defaultOptions to useQuery to avoid clobbering/resetting existing options when useQuery is called repeatedly.
    @benjamn in #9563, superseding #9223

  • Provide additional context to nextFetchPolicy functions to assist with fetchPolicy transitions. More details can be found in the nextFetchPolicy documentation.
    @benjamn in #9222

  • Remove nagging deprecation warning about passing an options.updateQuery function to fetchMore.
    @benjamn in #9504

  • Let addTypenameToDocument take any ASTNode (including DocumentNode, as before).
    @benjamn in #9595

  • Set useMutation internal isMounted variable to true again when component remounted.
    @devpeerapong in #9561

Apollo Client 3.5.10 (2022-02-24)

Improvements

  • Add GraphQLWsLink in @apollo/client/link/subscriptions. This link is similar to the existing WebSocketLink in @apollo/client/link/ws, but uses the newer graphql-ws package and protocol instead of the older subscriptions-transport-ws implementation.
    @glasser in #9369

    Note from @benjamn: since GraphQLWsLink is new functionality, we would normally wait for the next minor version (v3.6), but we were asked to expedite this release. These changes are strictly additive/opt-in/backwards-compatible, so shipping them in a patch release (3.5.10) seems safe, if unusual.

Apollo Client 3.5.9 (2022-02-15)

Improvements

  • Interpret keyFields: [...] and keyArgs: [...] configurations in InMemoryCache type/field policies as ReadonlyArrays, since they are never mutated internally.
    @julienfouilhe in #9339

  • Avoid declaring a global type for the __DEV__ constant, to avoid conflict with other such global declarations.
    @benjamn in #9386

Bug Fixes

  • Fix useSubscription executing skipped subscription when input changes.
    @levrik in #9299

  • Fix partial data appearing in useQuery().data when notifyOnNetworkStatusChange: true.
    @brainkim in #9367

  • Prevent Promises returned by useLazyQuery execute functions from causing unhandled Promise rejection errors if uncaught.
    @brainkim in #9380

Apollo Client 3.5.8 (2022-01-24)

Bug Fixes

  • Fix the type of the called property returned by useQuery() and useLazyQuery().
    @sztadii in #9304

Bug Fixes (by @brainkim in #9328)

  • Fix refetch() not being called when skip is true.
  • Fix the promise returned from the useLazyQuery() execution function having stale variables.
  • Fix the promise returned from the useLazyQuery() execution function not rejecting when a query errors.

Apollo Client 3.5.7 (2022-01-10)

Bug Fixes

  • Fix regression that prevented calling onError or onCompleted in some cases when using useQuery.
    @mmahalwy in #9226

  • Make useQuery respect defaultOptions.watchQuery.fetchPolicy.
    @yasharzolmajdi in #9210

Apollo Client 3.5.6 (2021-12-07)

Bug Fixes (by @brainkim in #9144)

  • Restores old behavior where the callback passed to useMutation() is constant.
  • Fix useMutation() callbacks having stale closures.
  • Fix useQuery() variables being out of date.

Apollo Client 3.5.5 (2021-11-23)

Bug Fixes

  • Remove printer: Printer positional parameter from publicly-exported selectHttpOptionsAndBody function, whose addition in #8699 was a breaking change (starting in Apollo Client 3.5.0) for direct consumers of selectHttpOptionsAndBody.
    @benjamn in #9103

Apollo Client 3.5.4 (2021-11-19)

Notices

The following advice about metro.config.js should no longer be necessary, as of Apollo Client v3.6.4.

  • [Relevant if you use Apollo Client with React Native] Since Apollo Client v3.5.0, CommonJS bundles provided by @apollo/client use a .cjs file extension rather than .cjs.js, so Node.js won't interpret them as ECMAScript modules. While this change should be an implementation detail, it may cause problems for the Metro bundler used by React Native, whose resolver.sourceExts configuration does not include the cjs extension by default.

    As a workaround until this issue is resolved, you can configure Metro to understand the .cjs file extension by creating a metro.config.js file in the root of your React Native project:

    // NOTE: No longer necessary in @apollo/client@3.6.4!
    const { getDefaultConfig } = require("metro-config");
    const { resolver: defaultResolver } = getDefaultConfig.getDefaultValues();
    exports.resolver = {
      ...defaultResolver,
      sourceExts: [...defaultResolver.sourceExts, "cjs"],
    };
    

Improvements

  • Restore the ability to pass onError() and onCompleted() to the mutation execution function.
    @brainkim in #9076

  • Work around webpack 5 errors of the form

    The request 'ts-invariant/process' failed to resolve only because it was resolved as fully specified
    

    by ensuring import ... from 'ts-invariant/process' is internally written to import ... from 'ts-invariant/process/index.js'.
    @benjamn in #9083

Apollo Client 3.5.3 (2021-11-17)

  • Avoid rewriting non-relative imported module specifiers in config/rewriteModuleIds.ts script, thereby allowing bundlers to resolve those imports as they see fit.
    @benjamn in #9073

  • Ensure only current file is matched when running VSCode debugger.
    @eps1lon in #9050

Apollo Client 3.5.2 (2021-11-10)

  • Fix useMutation execute function returning non-identical execution functions when passing similar options.
    @brainkim in #9037

Apollo Client 3.5.1 (2021-11-09)

  • Remove npm from dependencies, and avoid referencing graphql-js enum value.
    @brainkim in #9030

Apollo Client 3.5.0 (2021-11-08)

Improvements

  • Add updateQuery and updateFragment methods to ApolloCache, simplifying common readQuery/writeQuery cache update patterns.
    @wassim-k in #8382

  • Field directives and their arguments can now be included along with field argument names when using field policy keyArgs: [...] notation. For example, if you have a Query.feed field that takes an argument called type and uses a @connection(key:...) directive to keep feed data from different queries separate within the cache, you might configure both using the following InMemoryCache field policy:

    new InMemoryCache({
      typePolicies: {
        Query: {
          fields: {
            feed: {
              keyArgs: ["type", "@connection", ["key"]],
            },
          },
        },
      },
    });
    

    @benjamn in #8678

  • Report single MissingFieldError instead of a potentially very large MissingFieldError[] array for incomplete cache reads, improving performance and memory usage.
    @benjamn in #8734

  • When writing results into InMemoryCache, each written object is now identified using policies.identify after traversing the fields of the object (rather than before), simplifying identification and reducing duplicate work. If you have custom keyFields functions, they still receive the raw result object as their first parameter, but the KeyFieldsContext parameter now provides context.storeObject (the StoreObject just processed by processSelectionSet) and context.readField (a helper function for reading fields from context.storeObject and any References it might contain, similar to readField for read, merge, and cache.modify functions).
    @benjamn in #8996

  • Ensure cache.identify never throws when primary key fields are missing, and include the source object in the error message when keyFields processing fails.
    @benjamn in #8679

  • The HttpLink constructor now accepts an optional print function that can be used to customize how GraphQL DocumentNode objects are transformed back into strings before they are sent over the network.
    @sarahgp in #8699

  • Make @apollo/client/testing a fully-fledged, independent entry point, instead of re-exporting @apollo/client/utilities/testing (which was never an entry point and no longer exists).
    @benjamn in #8769

  • A new nested entry point called @apollo/client/testing/core has been created. Importing from this entry point instead of @apollo/client/testing excludes any React-related dependencies.
    @wassim-k in #8687

  • Make cache.batch return the result of calling the options.update function.
    @benjamn in #8696

  • The NetworkError and ErrorResponse types have been changed to align more closely.
    @korywka in #8424

  • Include graphql@16 in peer deps.
    @brainkim in #8997

  • Update zen-observable-ts to eliminate transitive dependency on @types/zen-observable.
    @benjamn in #8695

React Refactoring

Improvements (due to @brainkim in #8875):

  • The useLazyQuery function now returns a promise with the result.
  • The useMutation result now exposes a method which can be reset.

Bug Fixes (due to @brainkim in #8596):

  • The useQuery and useLazyQuery hooks will now have ObservableQuery methods defined consistently.
  • Calling useLazyQuery methods like startPolling will start the query.
  • Calling the useLazyQuery execution function will now behave more like refetch. previousData will be preserved.
  • standby fetchPolicies will now act like skip: true more consistently.
  • Calling refetch on a skipped query will have no effect (issue #8270).
  • Prevent onError and onCompleted functions from firing continuously, and improving their polling behavior.

Apollo Client 3.4.17 (2021-11-08)

Improvements

  • Allow TOptions extends FieldFunctionOptions to be passed as final (optional) type parameter of FieldPolicy type.
    @VictorGaiva in #9000

Apollo Client 3.4.16

Improvements

  • Prevent webpack from misresolving the graphql package as the local @apollo/client/utilities/globals/graphql.js module when module.exports.resolve.preferRelative is enabled in webpack.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 removing preferRelative: true from your webpack.config.js file, or find a way to disable that resolution behavior for packages within node_modules.

    @benjamn in #8862

  • Avoid importing isType from the graphql package internally, to prevent bundlers from including as much as 3.4kB of unnecessary code.
    @benjamn in #8891

  • Make client.resetStore and client.clearStore pass appropriate discardWatches option to cache.reset.
    @benjamn in #8873

Apollo Client 3.4.15

Bug Fixes

  • Require calling cache.reset({ discardWatches: true }) to make cache.reset discard cache.watches, restoring behavior broken in v3.4.14 by #8826.
    @benjamn in #8852

Apollo Client 3.4.14

Bug Fixes

  • Disable InMemoryCache result 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 InMemoryCache watches set when cache.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.broadcastWatch passes all relevant WatchOptions to cache.diff as DiffOptions.
    @benjamn in #8832

Apollo Client 3.4.13

Bug Fixes

  • Fix componentDidUpate typo in withSubscription higher-order component.
    @YarBez in #7506

  • Fix internal canUseSymbol import within @apollo/client/utilities to avoid breaking bundlers/builds.
    @benjamn in #8817

  • Tolerate unfreezable objects like Uint8Array and Buffer in maybeDeepFreeze.
    @geekuillaume and @benjamn in #8813

Apollo Client 3.4.12

Bug Fixes

  • Improve handling of falsy existing and/or incoming parameters in relayStylePagination field policy helper function.
    @bubba and @benjamn in #8733

  • Associate Apollo context with React.createContext (instead of using a local WeakMap) again, so multiple copies of @apollo/client (uncommon) can share the same context.
    @benjamn in #8798

Apollo Client 3.4.11

Bug Fixes

  • 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

Improvements

  • Export PersistedQueryLink namespace from @apollo/client/link/persisted-queries.
    @vedrani in #8761

Documentation

Apollo Client 3.4.10

Improvements

  • Warn when calling refetch({ variables }) instead of refetch(variables), except for queries that declare a variable named $variables (uncommon).
    @benjamn in #8702

Bug Fixes

  • Fix ObservableQuery.getCurrentResult() returning cached data with certain fetch policies.
    @brainkim in #8718

  • Prevent ssrMode/ssrForceFetchDelay from causing queries to hang.
    @brainkim in #8709

  • Import @apollo/client/utilities/globals internally wherever __DEV__ is used, not just in @apollo/client/**/index.js entry points.
    @benjamn in #8720

Apollo Client 3.4.9

Bug Fixes

  • Fix unhandled Promise rejection warnings/errors whose message is Observable 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 near invariant(...) and new InvariantError(...) expressions.
    @benjamn in #8689

Apollo Client 3.4.8

Bug Fixes

  • 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 caused result.data to be set to undefined in some cases after ObservableQuery#getCurrentResult reads an incomplete result from the cache.
    @benjamn in #8642

Apollo Client 3.4.7

Bug Fixes

  • Fix accidental reuse of recycled MergeTree objects in StoreWriter class used by InMemoryCache.
    @benjamn in #8618

Apollo Client 3.4.6

Improvements

  • Reevaluate window.fetch each time HttpLink uses it, if not configured using options.fetch. This change enables a variety of strategies for instrumenting window.fetch, without requiring those strategies to run before @apollo/client/link/http is first imported.
    @benjamn in #8603

  • Clarify mutation fetchPolicy options ("network-only" or "no-cache") using MutationFetchPolicy union type.
    @benjamn in #8602

Bug Fixes

  • Restore full @apollo/client/apollo-client.cjs.js CommonJS bundle for older bundlers.

    Note that Node.js and CommonJS bundlers typically use the bundles specified by "main" fields in our generated package.json files, which are all independent and non-overlapping CommonJS modules. However, apollo-client.cjs.js is just one big bundle, so mixing imports of apollo-client.cjs.js with the other CommonJS bundles is discouraged, as it could trigger the dual package hazard. In other words, please don't start using apollo-client.cjs.js if you're not already.

    @benjamn in #8592

  • Log MissingFieldErrors in ObservableQuery#getCurrentResult using invariant.debug, rather than reporting them via result.error.
    @benjamn in #8604

Apollo Client 3.4.5

Bug Fixes

  • Fix double registration bug for mutation refetchQueries specified using legacy one-time refetchQueries: [{ query, variables }] style. Though the bug is fixed, we recommend using refetchQueries: [query] instead (when possible) to refetch an existing query using its DocumentNode, rather than creating, executing, and then deleting a new query, as the legacy { query, variables } style unfortunately does.
    @benjamn in #8586

  • Fix useQuery/useLazyQuery stalling when clients or queries change.
    @brainkim in #8589

Apollo Client 3.4.4

Bug Fixes

  • Revert accidental addition of engines.npm section to published version of @apollo/client/package.json.
    @benjamn in #8578

Apollo Client 3.4.3

Bug Fixes

  • Fix { ssr: false } causing queries to hang on the client.
    @brainkim in #8574

Apollo Client 3.4.2

Bug Fixes

  • 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

Apollo Client 3.4.1

Bug Fixes

  • Initialize stringifyCanon lazily, when canonicalStringify is first called, fixing Uncaught ReferenceError: __DEV__ is not defined errors due to usage of __DEV__ before declaration.
    @benjamn in #8557

Apollo Client 3.4.0

New documentation

Improvements

  • InMemoryCache now guarantees that any two result objects returned by the cache (from readQuery, 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 the ObservableQuery and Cache.DiffResult objects for any queries invalidated by cache writes performed by the mutation's final update function. Using onQueryUpdated, you can override the default FetchPolicy of the query, by (for example) calling ObservableQuery methods like refetch to force a network request. This automatic detection of invalidated queries provides an alternative to manually enumerating queries using the refetchQueries mutation option. Also, if you return a Promise from onQueryUpdated, the mutation will automatically await that Promise, rendering the awaitRefetchQueries option unnecessary.
    @benjamn in #7827

  • Support client.refetchQueries as an imperative way to refetch queries, without having to pass options.refetchQueries to client.mutate.
    @dannycochran in #7431

  • Improve standalone client.refetchQueries method to support automatic detection of queries needing to be refetched.
    @benjamn in #8000

  • Fix remaining barriers to loading @apollo/client/core as native ECMAScript modules from a CDN like esm.run. Importing @apollo/client from a CDN will become possible once we move all React-related dependencies into @apollo/client/react in Apollo Client 4.
    @benjamn in #8266

  • InMemoryCache supports a new method called batch, which is similar to performTransaction but takes named options rather than positional parameters. One of these named options is an onDirty(watch, diff) callback, which can be used to determine which watched queries were invalidated by the batch operation.
    @benjamn in #7819

  • Allow merge: true field policy to merge Reference objects 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 POST request when falling back to sending full query with @apollo/client/link/persisted-queries.
    @rieset in #7456

  • The FetchMoreQueryOptions type now takes two instead of three type parameters (<TVariables, TData>), thanks to using Partial<TVariables> instead of K extends typeof TVariables and Pick<TVariables, K>.
    @ArnaudBarre in #7476

  • Pass variables and context to a mutation's update function. Note: The type of the update function is now named MutationUpdaterFunction rather than MutationUpdaterFn, since the older type was broken beyond repair. If you are using MutationUpdaterFn in your own code, please use MutationUpdaterFunction instead.
    @jcreighton in #7902

  • A resultCacheMaxSize option may be passed to the InMemoryCache constructor to limit the number of result objects that will be retained in memory (to speed up repeated reads), and calling cache.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 InMemoryCache by eviction, or by any other means.
    @sofianhn and @benjamn in #8147

  • Expose missing field errors in results.
    @brainkim in #8262

  • Add expected/received variables to No more mocked responses... error messages generated by MockLink.
    @markneub in #8340

  • The InMemoryCache version of the cache.gc method now supports additional options for removing non-essential (recomputable) result caching data.
    @benjamn in #8421

  • Suppress noisy Missing cache result fields... warnings by default unless setLogVerbosity("debug") called.
    @benjamn in #8489

  • Improve interaction between React hooks and React Fast Refresh in development.
    @andreialecu in #7952

Potentially disruptive changes

  • To avoid retaining sensitive information from mutation root field arguments, Apollo Client v3.4 automatically clears any ROOT_MUTATION fields from the cache after each mutation finishes. If you need this information to remain in the cache, you can prevent the removal by passing the keepRootFields: true option to client.mutate. ROOT_MUTATION result data are also passed to the mutation update function, so we recommend obtaining the results that way, rather than using keepRootFields: true, if possible.
    @benjamn in #8280

  • Internally, Apollo Client now controls the execution of development-only code using the __DEV__ global variable, rather than process.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 a true or false constant, the same way you already replace process.env.NODE_ENV with 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.ts files). This change should remove any need to configure esModuleInterop or allowSyntheticDefaultImports in tsconfig.json, but might require updating bundler configurations that specify named exports of the react and prop-types packages, to include exports like createContext and createElement (example).
    @devrelm in #7742

  • Respect no-cache fetch policy (by not reading any data from the cache) for loading: true results triggered by notifyOnNetworkStatusChange: true.
    @jcreighton in #7761

  • The TypeScript return types of the getLastResult and getLastError methods of ObservableQuery now correctly include the possibility of returning undefined. If you happen to be calling either of these methods directly, you may need to adjust how the calling code handles the methods' possibly-undefined results.
    @benjamn in #8394

  • Log non-fatal invariant.error message when fields are missing from result objects written into InMemoryCache, 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 @client is 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 written data.
    @benjamn in #8416

  • The nextFetchPolicy option for client.watchQuery and useQuery will no longer be removed from the options object after it has been applied, and instead will continue to be applied any time options.fetchPolicy is reset to another value, until/unless the options.nextFetchPolicy property is removed from options.
    @benjamn in #8465

  • The fetchMore, subscribeToMore, and updateQuery functions returned from the useQuery hook may now return undefined in edge cases where the functions are called when the component is unmounted
    @noghartt in #7980.

Bug fixes

  • In Apollo Client 2.x, a refetch operation would always replace existing data in the cache. With the introduction of field policy merge functions in Apollo Client 3, existing field values could be inappropriately combined with incoming field values by a custom merge function that does not realize a refetch has happened.

    To give you more control over this behavior, we have introduced an overwrite?: boolean = false option for cache.writeQuery and cache.writeFragment, and an option called refetchWritePolicy?: "merge" | "overwrite" for client.watchQuery, useQuery, and other functions that accept WatchQueryOptions. You can use these options to make sure any merge functions involved in cache writes for refetch operations get invoked with undefined as their first argument, which simulates the absence of any existing data, while still giving the merge function a chance to determine the internal representation of the incoming data.

    The default behaviors are overwrite: true and refetchWritePolicy: "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 for refetchWritePolicy in defaultOptions.watchQuery:

    new ApolloClient({
      defaultOptions: {
        watchQuery: {
          refetchWritePolicy: "merge",
        },
      },
    });
    

    @benjamn in #7810

  • Make sure the MockedResponse ResultFunction type is re-exported.
    @hwillson in #8315

  • Fix polling when used with skip.
    @brainkim in #8346

  • InMemoryCache now coalesces EntityStore updates to guarantee only one store.merge(id, fields) call per id per 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#getCurrentResult always call queryInfo.getDiff().
    @benjamn in #8422

  • Make readField default to reading from current object only when the from option/argument is actually omitted, not when from is passed to readField with an undefined value. A warning will be printed when this situation occurs.
    @benjamn in #8508

  • The fetchMore, subscribeToMore, and updateQuery functions no longer throw undefined errors
    @noghartt in #7980.

Apollo Client 3.3.21

Bug fixes

  • Fix race condition in @apollo/client/link/context that could leak subscriptions if the subscription is cancelled before operation.setContext is called.
    @sofianhn in #8399

  • Prefer existing.pageInfo.startCursor and endCursor (if defined) in read function of relayStylePagination policies.
    @benjamn in #8438

Improvements

  • Normalize user-provided HttpLink headers by lower-casing their names.
    @benjamn in #8449

Apollo Client 3.3.20

Bug fixes

  • Fix policy merging bug when calling cache.policies.addTypePolicies multiple times for the same type policy.
    @Banou26 in #8361

Apollo Client 3.3.19

Bug fixes

  • Use export ... from syntax to re-export graphql-tag named exports, making tree-shaking easier for some bundlers.
    @benjamn in #8221

Documentation

Apollo Client 3.3.18

Bug fixes

  • Add "sideEffects": false to all generated/published package.json files, to improve dead code elimination for nested entry points like @apollo/client/cache.
    @benjamn in #8213

Apollo Client 3.3.17

Bug fixes

  • Make useReactiveVar(rv) recheck the latest rv() value in its useEffect callback, and immediately update state if the value has already changed, rather than calling rv.onNextChange(setValue) to listen for future changes.
    @benjamn in #8135

Apollo Client 3.3.16

Bug fixes

  • Prevent undefined mutation result in useMutation.
    @jcreighton in #8018

  • Fix useReactiveVar not rerendering for successive synchronous calls.
    @brainkim in #8022

  • Support batchDebounce option for BatchLink and BatchHttpLink.
    @dannycochran in #8024

Apollo Client 3.3.15

  • Increment queryInfo.lastRequestId only when making a network request through the ApolloLink chain, rather than every time fetchQueryByPolicy is called.
    @dannycochran in #7956

  • During server-side rendering, allow initial useQuery calls to return final { loading: false, data } results when the cache already contains the necessary data.
    @benjamn in #7983

Apollo Client 3.3.14

Improvements

  • Adjust TypeScript types to allow keyFields and keyArgs functions to return false.
    @CarsonF and @benjamn in #7900

Bug fixes

  • Prevent RenderPromises memory leak by calling renderPromises.clear() after getMarkupFromTree finishes.
    @benjamn in #7943

  • Cancel pending notify timeout when stopping a QueryInfo object.
    @hollandThomas in #7935

  • Fix infinite rendering bug related to useSubscription.
    @brainkim in #7917

Apollo Client 3.3.13

Improvements

  • Add missing context option to useSubscription.
    @jcreighton in #7860

  • Remove unnecessary TypeScript global Observable<T>["@@observable"] method declaration.
    @benjamn in #7888

  • Prevent skipped/observerless ObservableQuerys from being refetched by refetchQueries.
    @dannycochran in #7877

Apollo Client 3.3.12

Bug fixes

  • Maintain serial ordering of asyncMap mapping function calls, and prevent potential unhandled Promise rejection errors.
    @benjamn in #7818

  • Relax incompatible children?: React.ReactElement field type in MockedProviderProps interface.
    @kevinperaza in #7833

Apollo Client 3.3.11

Bug fixes

  • Fix useLazyQuery forceUpdate loop regression introduced by #7655 in version 3.3.10.
    @benjamn in #7715

Apollo Client 3.3.10

Bug fixes

  • Revert PR #7276, but test that garbage collection reclaims torn-down ObservableQuery objects.
    @benjamn in #7695

  • Reset QueryInfo.diff and QueryInfo.dirty after canceling notify timeout in QueryInfo.markResult and QueryInfo.markError.
    @jcreighton in #7696

Improvements

  • Avoid calling forceUpdate when component is unmounted.
    @DylanVann in #7655

  • The codemods/ top-level directory has been moved into the scripts/ directory.
    @benjamn in #7675

Apollo Client 3.3.9

Bug Fixes

  • Prevent reactive variables from retaining otherwise unreachable InMemoryCache objects.
    @benjamn in #7661

Improvements

  • The graphql-tag dependency 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

Apollo Client 3.3.8

Bug Fixes

  • Catch updates in useReactiveVar with an additional check.
    @jcreighton in #7652

  • Reactivate forgotten reactive variables whenever InMemoryCache acquires its first watcher.
    @benjamn in #7657

  • Backport Symbol.species fix for Concast and ObservableQuery from release-3.4, fixing subscriptions in React Native Android when the Hermes JavaScript engine is enabled (among other benefits).
    @benjamn in #7403 and #7660

Apollo Client 3.3.7

Bug Fixes

  • Fix a regression due to #7310 that caused loading always to be true for skip: true results during server-side rendering.
    @rgrove in #7567

  • Avoid duplicate useReactiveVar listeners when rendering in React.StrictMode.
    @jcreighton in #7581

Improvements

  • Set displayName on ApolloContext objects for easier debugging.
    @dulmandakh in #7550

Apollo Client 3.3.6

Bug Fixes

  • Immediately apply queryType: true, mutationType: true, and subscriptionType: true type policies, rather than waiting for the first time the policy is used, fixing a regression introduced by #7065.
    @benjamn in #7463

  • Check that window is defined even when connectToDevTools is true.
    @yasupeke in #7434

Improvements

  • Replace stray console.debug (undefined in React Native) with invariant.log.
    @benjamn in #7454

  • Suggest Firefox Apollo DevTools as well as the Chrome extension.
    @benjamn in #7461

Apollo Client 3.3.5

Improvements

  • Restore client.version property, reflecting the current @apollo/client version from package.json.
    @benjamn in #7448

Apollo Client 3.3.4

Improvements

Apollo Client 3.3.3

Bug fixes

  • Make the observer parameter of ApolloLink#onError optional, fixing an unnecessary breaking change for any code that called onError directly.
    @benjamn in #7407

Apollo Client 3.3.2

Note: This version of @apollo/client contains no behavioral changes since version 3.3.1

Documentation

Apollo Client 3.3.1

Bug Fixes

  • Revert back to default-importing React internally, rather than using a namespace import.
    @benjamn in 113475b1

Apollo Client 3.3.0

Bug Fixes

  • Update @wry/equality to consider undefined properties equivalent to missing properties.
    @benjamn in #7108

  • Prevent memory leaks involving unused onBroadcast function closure created in ApolloClient constructor.
    @kamilkisiela in #7161

  • Provide default empty cache object for root IDs like ROOT_QUERY, to avoid differences in behavior before/after ROOT_QUERY data has been written into InMemoryCache.
    @benjamn in #7100

  • Cancel queryInfo.notifyTimeout in QueryInfo#markResult to prevent unnecessary network requests when using a FetchPolicy of cache-and-network or network-only in a React component with multiple useQuery calls.
    @benjamn in #7347

Potentially breaking changes

  • Ensure cache.readQuery and cache.readFragment always return TData | null, instead of throwing MissingFieldError exceptions when missing fields are encountered.
    @benjamn in #7098

    Since this change converts prior exceptions to null returns, and since null was already a possible return value according to the TData | null return type, we are confident this change will be backwards compatible (as long as null was properly handled before).

  • HttpLink will now automatically strip any unused variables before 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 passing includeUnusedVariables: true to the HttpLink constructor (which is typically passed as options.link to the ApolloClient constructor).
    @benjamn in #7127

  • Ensure MockLink (used by MockedProvider) returns mock configuration errors (e.g. No more mocked responses for the query ...) through the Link's Observable, instead of throwing them. These errors are now available through the error property of a result.
    @hwillson in #7110

    Returning mock configuration errors through the Link's Observable was 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 on MockLink's throwing exception approach. If you want to change this functionality, you can define custom error handling through MockLink.setOnError.

  • Unsubscribing the last observer from an ObservableQuery will once again unsubscribe from the underlying network Observable in 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 QueryBaseOptions and ModifiableWatchQueryOptions interface supertypes have been eliminated, and their fields are now defined by QueryOptions.
    @DCtheTall in #7136

  • Internally, Apollo Client now avoids nested imports from the graphql package, 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 graphql package uses .mjs modules, your bundler may need to be configured to recognize .mjs files as ECMAScript modules rather than CommonJS modules.
    @benjamn in #7185

Improvements

  • Support inheritance of type and field policies, according to possibleTypes.
    @benjamn in #7065

  • Allow configuring custom merge functions, including the merge: true and merge: false shorthands, in type policies as well as field policies.
    @benjamn in #7070

  • The verbosity of Apollo Client console messages can be globally adjusted using the setLogVerbosity function:

    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 InMemoryCache fields that have keyArgs configured will now invalidate only the field value with matching key arguments, rather than invalidating all field values that share the same field name. If keyArgs has not been configured, the cache must err on the side of invalidating by field name, as before.
    @benjamn in #7351

  • Shallow-merge options.variables when 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.data property, useQuery and useLazyQuery will now provide a result.previousData property, which can be useful when a network request is pending and result.data is undefined, since result.previousData can be rendered instead of rendering an empty/loading state.
    @hwillson in #7082

  • Passing validate: true to the SchemaLink constructor will enable validation of incoming queries against the local schema before execution, returning validation errors in result.errors, just like a non-local GraphQL endpoint typically would.
    @amannn in #7094

  • Allow optional arguments in keyArgs: [...] arrays for InMemoryCache field policies.
    @benjamn in #7109

  • Avoid registering QueryPromise when skip is true during server-side rendering.
    @izumin5210 in #7310

  • ApolloCache objects (including InMemoryCache) may now be associated with or disassociated from individual reactive variables by calling reactiveVar.attachCache(cache) and/or reactiveVar.forgetCache(cache).
    @benjamn in #7350

Apollo Client 3.2.9

Bug Fixes

  • Revert back to default-importing React internally, rather than using a namespace import.
    @benjamn in 113475b1

Apollo Client 3.2.8

Bug Fixes

  • Ensure sourcesContent array is properly defined in .js.map files generated by tsc.
    @benjamn in #7371

  • Avoid relying on global Symbol properties in ApolloContext.ts.
    @benjamn in #7371

Apollo Client 3.2.7

Bug Fixes

  • Revert updating symbol-observable from version 2.x to version 3, which caused TypeScript errors with some @types/node versions, especially in Angular applications.
    @benjamn in #7340

Apollo Client 3.2.6

Bug Fixes

  • Always consider singleton IDs like ROOT_QUERY and ROOT_MUTATION to be root IDs during cache.gc garbage collection, regardless of whether they have been retained or released.
    @benjamn in #7333

  • Use optional chaining syntax (this.currentObservable?.refetch) in React refetch wrapper function to avoid crashing when an unmounted component is accidentally refetched.
    @tm1000 in #6314 and @linmic in #7186

Improvements

  • Handle older react-apollo package in codemods/ac2-to-ac3/imports.js migration script.
    @tm1000 in #7216

  • Ensure relayStylePagination preserves pageInfo.{start,end}Cursor if edges is missing or empty.
    @beaucollins in #7224

Apollo Client 3.2.5

Improvements

  • Move terser dependency from dependencies to devDependencies.
    @SimenB in #7188

  • Avoid all sub-package imports from the graphql npm package.
    @stoically in #7185

Apollo Client 3.2.4

Improvements

  • Update the optimism npm dependency to version 0.13.0 in order to use the new optimistic.forget method to fix a potential cache.watch memory leak.
    @benjamn in #7157

  • Consider cache.reset a destructive method, like cache.evict and cache.modify.
    @joshjg in #7150

  • Avoid refetching observerless queries with reFetchObservableQueries.
    @joshjg in #7146

Apollo Client 3.2.3

Improvements

  • Default args.offset to zero in offsetLimitPagination.
    @benjamn in #7141

Apollo Client 3.2.2

Bug Fixes

  • Undo TEdgeWrapper approach for relayStylePagination, introduced by f41e9efc in #7023, since it was an unintended breaking change for existing code that used cache.modify to interact with field data managed by relayStylePagination.
    @benjamn in #7103

Apollo Client 3.2.1

Bug Fixes

  • Fix relayStylePagination to handle the possibility that edges might be normalized Reference objects (uncommon).
    @anark and @benjamn in #7023

  • Disable "Missing cache result fields" warnings when returnPartialData is true.
    @hwillson in #7055

Improvements

  • Mark subscriptions-transport-ws peerDependency as optional.
    @MasterOdin in #7047

Apollo Client 3.2.0

Bug Fixes

  • Use options.nextFetchPolicy internally to restore original FetchPolicy after polling with fetchPolicy: "network-only", so that polling does not interfere with normal query watching.
    @benjamn in #6893

  • Initialize ObservableQuery in updateObservableQuery even if skip is true.
    @mu29 in #6999

  • Prevent full reobservation of queries affected by optimistic mutation updates, while still delivering results from the cache.
    @benjamn in #6854

Improvements

  • In TypeScript, all APIs that take DocumentNode parameters now may alternatively take TypeDocumentNode<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 possibleTypes to 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.nextFetchPolicy to be a function that takes the current FetchPolicy and returns a new (or the same) FetchPolicy, making nextFetchPolicy more suitable for global use in defaultOptions.watchQuery.
    @benjamn in #6893

  • Implement useReactiveVar hook for consuming reactive variables in React components.
    @benjamn in #6867

  • Move apollo-link-persisted-queries implementation to @apollo/client/link/persisted-queries. Try running our automated imports transform to handle this conversion, if you're using apollo-link-persisted-queries.
    @hwillson in #6837

  • Disable feud-stopping logic after any cache.evict or cache.modify operation.
    @benjamn in #6817 and #6898

  • Throw if writeFragment cannot identify options.data when no options.id provided.
    @jcreighton in #6859

  • Provide options.storage object to cache.modify functions, as provided to read and merge functions.
    @benjamn in #6991

  • Allow cache.modify functions to return details.INVALIDATE (similar to details.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 ErrorPolicy values (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 FetchPolicy of cache-only in ObservableQuery#refetch.
    @benjamn in ccb0a79a, fixing #6702

Apollo Client 3.1.5

Bug Fixes

  • Make ApolloQueryResult.data field non-optional again.
    @benjamn in #6997

Improvements

  • Allow querying Connection metadata without args in relayStylePagination.
    @anark in #6935

Apollo Client 3.1.4

Bug Fixes

  • Restrict root object identification to ROOT_QUERY (the ID corresponding to the root Query object), allowing Mutation and Subscription as user-defined types.
    @benjamn in #6914

  • Prevent crash when pageInfo and empty edges are received by relayStylePagination.
    @fracmak in #6918

Apollo Client 3.1.3

Bug Fixes

  • Consider only result.data (rather than all properties of result) when settling cache feuds.
    @danReynolds in #6777

Improvements

Apollo Client 3.1.2

Bug Fixes

Improvements

  • Allow SchemaLink.Options.context function to be async (or return a Promise).
    @benjamn in #6735

Apollo Client 3.1.1

Bug Fixes

  • Re-export cache types from @apollo/client/core (and thus also @apollo/client), again.
    @benjamn in #6725

Apollo Client 3.1.0

Bug Fixes

  • 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 (like onCompleted and onError) in useQuery options, since those functions are almost always freshly evaluated each time useQuery is called.
    @hwillson and @benjamn in #6588

  • Respect context.queryDeduplication if provided, and otherwise fall back to client.deduplication (as before).
    @igaloly in #6261 and @Kujawadl in #6526

  • Refactor ObservableQuery#getCurrentResult to reenable immediate delivery of warm cache results. As part of this refactoring, the ApolloCurrentQueryResult type was eliminated in favor of ApolloQueryResult.
    @benjamn in #6710

  • Avoid clobbering defaultOptions with undefined values.
    @benjamn in #6715

Improvements

  • Apollo Client will no longer modify options.fetchPolicy unless you pass options.nextFetchPolicy to request an explicit change in FetchPolicy after the current request. Although this is technically a breaking change, options.nextFieldPolicy makes it easy to restore the old behavior (by passing cache-first).
    @benjamn in #6712, reverting #6353

  • Errors of the form Invariant Violation: 42 thrown in production can now be looked up much more easily, by consulting the auto-generated @apollo/client/invariantErrorCodes.js file specific to your @apollo/client version.
    @benjamn in #6665

  • Make the client field of the MutationResult type non-optional, since it is always provided.
    @glasser in #6617

  • Allow passing an asynchronous options.renderFunction to getMarkupFromTree.
    @richardscarrott in #6576

  • Ergonomic improvements for merge and keyArgs functions in cache field policies.
    @benjamn in #6714

Apollo Client 3.0.2

Bug Fixes

  • Avoid duplicating graphql/execution/execute dependency in CommonJS bundle for @apollo/client/link/schema, fixing instanceof errors reported in #6621 and #6614.
    @benjamn in #6624

Apollo Client 3.0.1

Bug Fixes

  • Make sure useQuery onCompleted is not fired when skip is true.
    @hwillson in #6589

  • Revert changes to peerDependencies in package.json (#6594), which would have allowed using incompatible future versions of graphql and/or react due to overly-permissive >= version constraints.
    @hwillson in #6605

Apollo Client 3.0.0

Improvements

Note: As of 3.0.0, Apollo Client uses a new package name: @apollo/client

ApolloClient

  • [BREAKING] ApolloClient is now only available as a named export. The default ApolloClient export has been removed.
    @hwillson in #5425

  • [BREAKING] The queryManager property of ApolloClient instances is now marked as private, paving the way for a more aggressive redesign of its API.

  • [BREAKING] Apollo Client will no longer deliver "stale" results to ObservableQuery consumers, 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 with GraphQL error: or Network error:. To differentiate between GraphQL/network errors, refer to ApolloError's public graphQLErrors and networkError properties.
    @lorensr in #3892

  • [BREAKING] Support for the @live directive 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 @client fields to be passed into the link chain if resolvers were not set in the constructor. This allowed @client fields to be passed into Links like apollo-link-state. Apollo Client 3 enforces that @client fields are local only, meaning they are no longer passed into the link chain, under any circumstances.
    @hwillson in #5982

  • [BREAKING?] Refactor QueryManager to make better use of observables and enforce fetchPolicy more reliably.
    @benjamn in #6221

  • The updateQuery function previously required by fetchMore has been deprecated with a warning, and will be removed in the next major version of Apollo Client. Please consider using a merge function to handle incoming data instead of relying on updateQuery.
    @benjamn in #6464

    • Helper functions for generating common pagination-related field policies may be imported from @apollo/client/utilities. The most basic helper is concatPagination, which emulates the concatenation behavior of typical updateQuery functions. A more sophisticated helper is offsetLimitPagination, which implements offset/limit-based pagination. If you are consuming paginated data from a Relay-friendly API, use relayStylePagination. 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
  • 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 the apollo-link, apollo-link-http-common and apollo-link-http packages is now directly available from @apollo/client (e.g. import { HttpLink } from '@apollo/client'). The ApolloClient constructor has also been updated to accept new uri, headers and credentials options. If uri is specified, Apollo Client will take care of creating the necessary HttpLink behind the scenes.
    @hwillson in #5412

  • The gql template tag should now be imported from the @apollo/client package, rather than the graphql-tag package. Although the graphql-tag package still works for now, future versions of @apollo/client may change the implementation details of gql without a major version bump.
    @hwillson in #5451

  • @apollo/client/core can be used to import the Apollo Client core, which includes everything the main @apollo/client package does, except for all React related functionality.
    @kamilkisiela in #5541

  • Several deprecated methods have been fully removed:

    • ApolloClient#initQueryManager
    • QueryManager#startQuery
    • ObservableQuery#currentResult
  • Apollo Client now supports setting a new ApolloLink (or link chain) after new ApolloClient() has been called, using the ApolloClient#setLink method.
    @hwillson in #6193

  • The final time a mutation update function 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 #

InMemoryCache

Note: InMemoryCache has 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 InMemoryCache constructor should now be imported directly from @apollo/client, rather than from a separate package. The apollo-cache-inmemory package is no longer supported.

    The @apollo/client/cache entry point can be used to import InMemoryCache without importing other parts of the Apollo Client codebase.
    > @hwillson in #5577

  • [BREAKING] FragmentMatcher, HeuristicFragmentMatcher, and IntrospectionFragmentMatcher have all been removed. We now recommend using InMemoryCache’s possibleTypes option instead. For more information see the Defining possibleTypes manually 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] InMemoryCache will 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 custom merge function is defined by a field policy for that field, within a type policy associated with the __typename of the parent object.
    @benjamn in #5603

  • [BREAKING] InMemoryCache now 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.writeData have been fully removed. writeData usage 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/or cache.modify can be used to update the cache.
    @benjamn in #5923

  • InMemoryCache now supports tracing garbage collection and eviction. Note that the signature of the evict method has been simplified in a potentially backwards-incompatible way.
    @benjamn in #5310

    • [beta-BREAKING] Please note that the cache.evict method now requires Cache.EvictOptions, though it previously supported positional arguments as well.
      @danReynolds in #6141 @benjamn in #6364

    • Removing an entity object using the cache.evict method 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 field read function 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, and cache.writeFragment, can now be called with a named options object, which supports a broadcast: boolean property 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

  • InMemoryCache now console.warns in development whenever non-normalized data is dangerously overwritten, with helpful links to documentation about normalization and custom merge functions.
    @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

  • InMemoryCache now has a method called modify which 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.evict method is now implemented in terms of cache.modify.
    @benjamn in #5909 and #6178

  • InMemoryCache provides 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.readQuery and cache.writeQuery methods now accept an options.id string, which eliminates most use cases for cache.readFragment and cache.writeFragment, and skips the implicit conversion of fragment documents to query documents performed by cache.{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#evict remove data from all EntityStore layers.
    @benjamn in #5773

  • Stop paying attention to previousResult in InMemoryCache.
    @benjamn in #5644

  • Improve optimistic update performance by limiting cache key diversity.
    @benjamn in #5648

  • Custom field read functions can read from neighboring fields using the readField(fieldName) helper, and may also read fields from other entities by calling readField(fieldName, objectOrReference).
    @benjamn in #5651

  • Expose cache modify and identify to the mutate update function.
    @hwillson in #5956

  • Add a default gc implementation to ApolloCache.
    @justinwaite in #5974

React

  • [BREAKING] The QueryOptions, MutationOptions, and SubscriptionOptions React Apollo interfaces have been renamed to QueryDataOptions, MutationDataOptions, and SubscriptionDataOptions (to avoid conflicting with similarly named and exported Apollo Client interfaces).

  • [BREAKING] Results with loading: true will 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 with Map or Set operations 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 why fixPolyfills.native.js is not included in your bundle.
    @benjamn in #5962

  • The contents of the @apollo/react-hooks package have been merged into @apollo/client, enabling the following all-in-one import:

    import { ApolloClient, ApolloProvider, useQuery } from "@apollo/client";
    

    @hwillson in #5357

  • 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/client bundle.
    @hwillson in #6499

General

  • [BREAKING] Removed graphql-anywhere since it's no longer used by Apollo Client.
    @hwillson in #5159

  • [BREAKING] Removed apollo-boost since 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, or apollo-utilities, they may no longer be available from @apollo/client.
    @hwillson in #5437 and #5514

    Utilities that were previously externally available through the apollo-utilities package are now only available by importing from @apollo/client/utilities.
    > @hwillson in #5683

  • Make sure all graphql-tag public 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 ApolloContext plays 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/components and @apollo/client/react/hoc entry points.
    @hwillson in #6558

  • Support passing a context object through the link execution chain when using subscriptions.
    @sgtpepper43 in #4925

  • MockSubscriptionLink now supports multiple subscriptions.
    @dfrankland in #6081

Bug Fixes

  • useMutation adjustments to help avoid an infinite loop / too many renders issue, caused by unintentionally modifying the useState based mutation result directly.
    @hwillson in #5770

  • Missing __typename fields no longer cause the InMemoryCache#diff result to be marked complete: false, if those fields were added by InMemoryCache#transformDocument (which calls addTypenameToDocument).
    @benjamn in #5787

  • Fixed an issue that allowed @client @export based queries to lead to extra unnecessary network requests being fired.
    @hwillson in #5946

  • Refined useLazyQuery types to help prevent runtime errors.
    @benmosher in #5935

  • Make sure @client @export variables used in watched queries are updated each time the query receives new data that changes the value of the @export variable.
    @hwillson in #5986

  • Ensure useMutation passes a defined errorPolicy option into its underlying ApolloClient.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 (https://github.com/facebook/react/pull/17099).
    @hwillson in #6107

  • Expand ApolloError typings to include ServerError and ServerParseError.
    @dmarkow in #6319

  • Fast responses received over the link chain will no longer conflict with skip settings.
    @hwillson in #6587

Apollo Client 2.6.8

Apollo Client (2.6.8)

GraphQL Anywhere (4.2.6)

Apollo Boost (0.4.7)

  • Replace GlobalFetch reference with WindowOrWorkerGlobalScope.
    @abdonrd in #5373

  • Add assumeImmutableResults typing to apollo boost PresetConfig interface.
    @bencoullie in #5571

Apollo Client (2.6.4)

Apollo Client (2.6.4)

Apollo Client (2.6.3)

Apollo Client (2.6.3)

Apollo Client (2.6.1)

Apollo Utilities 1.3.2

  • Reimplement isEqual without pulling in massive lodash.isequal.
    @benjamn in #4924

Apollo Client (2.6.1)

  • In all Apollo Client packages, the compilation of lib/bundle.esm.js to lib/bundle.cjs.js and lib/bundle.umd.js now uses Babel instead of Rollup, since Babel correctly compiles some edge cases that neither Rollup nor TypeScript compile correctly.
    @benjamn in #4911

Apollo Cache In-Memory 1.6.1

  • Pretend that __typename exists on the root Query when matching fragments.
    @benjamn in #4853

Apollo Utilities 1.3.1

  • The isEqual function has been reimplemented using the lodash.isequal npm package, to better support circular references. Since the lodash.isequal package is already used by react-apollo, this change is likely to decrease total bundle size.
    @capaj in #4915

Apollo Client (2.6.0)

  • 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

Apollo Client 2.6.0

  • If you can be sure your application code does not modify cache result objects (see freezeResults note below), you can unlock substantial performance improvements by communicating this assumption via

    new 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 the apollo-link-dedup package.
    @benjamn in commit 7cd8479f

  • The FetchPolicy type has been split into two types, so that passing cache-and-network to ApolloClient#query is now forbidden at the type level, whereas previously it was forbidden by a runtime invariant assertion:

    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 fetchPolicy is 'no-cache'.
    @bradleyayers in PR #4573, part of issue #3452

  • Remove temporary queryId after fetchMore completes.
    @doomsower in #4440

  • Call clearStore callbacks after clearing store.
    @ds8k in #4695

  • Perform all DocumentNode transforms once, and cache the results.
    @benjamn in #4601

  • Accommodate @client @export variable changes in ObservableQuery.
    @hwillson in #4604

  • Support the returnPartialData option for watched queries again.
    @benjamn in #4743

  • Preserve networkStatus for incomplete cache-and-network queries.
    @benjamn in #4765

  • Preserve cache-and-network fetchPolicy when 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

Apollo Cache In-Memory 1.6.0

  • Support new InMemoryCache({ freezeResults: true }) to help enforce immutability.
    @benjamn in #4514

  • Allow IntrospectionFragmentMatcher to match fragments against the root Query, as HeuristicFragmentMatcher does.
    @rynobax in #4620

  • Rerential identity (===) of arrays in cache results will now be preserved for unchanged data.
    @benjamn in commit f3091d6a

  • Avoid adding __typename field to @client selection sets that have been @exported as input variables.
    @benjamn in #4784

GraphQL Anywhere 4.2.2

  • The graphql function can now be configured to ignore @include and @skip directives (useful when walking a fragment to generate prop types or filter result data).
    @GreenGremlin in #4373

Apollo Client 2.5.1

apollo-client 2.5.1

  • Fixes A tuple type element list cannot be empty issue.
    @benjamn in #4502

graphql-anywhere 4.2.1

  • Adds back the missing graphql-anywhere/lib/async entry point.
    @benjamn in #4503

Apollo Client (2.5.0)

Apollo Client (2.5.0)

  • Introduces new local state management features (client-side schema and local resolver / @client support) 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 QueryManager was accidentally returning cached data for network-only queries.
    @danilobuerger in #4352
  • Fixed an issue in the repo .gitattributes that was causing binary files to have their line endings adjusted, and cleaned up corrupted documentation images (ref: https://github.com/apollographql/apollo-client/pull/4232).
    @rajington in #4438
  • Improve (and shorten) query polling implementation.
    PR #4337

Apollo Client (2.4.13)

Apollo Client (2.4.13)

Apollo Client (2.4.12)

Apollo Client (2.4.12)

  • Support ApolloClient#stop method for safe client disposal.
    PR #4336

Apollo Client (2.4.11)

  • Added explicit dependencies on the tslib package to all client packages to fix Issue #4332.

Apollo Client (2.4.11)

  • Reverted some breaking changes accidentally released in a patch version (2.4.10). PR #4334

Apollo Client (2.4.10)

Apollo Client (2.4.10)

  • The apollo-client package no longer exports a printAST function from graphql/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 setTimeout interval rather than multiple setInterval timers. 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

Apollo Cache In-Memory (1.4.1)

  • The optimism npm 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.stringify instead of the print function exported by the graphql package, to avoid pulling unnecessary printing logic into your JavaScript bundle.
    PR #4234

  • The QueryKeyMaker abstraction 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

Apollo Utilities (1.1.1)

  • The flattenSelections helper function is no longer exported from apollo-utilities, since getDirectiveNames has been reimplemented without using flattenSelections, and flattenSelections has 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 (2.4.9)

Apollo Client (2.4.9)

Apollo Utilities (1.1.0)

  • Transformation utilities have been refactored to work with graphql 14.x. GraphQL AST's are no longer being directly modified.
    @hwillson in #4233

Apollo Cache In-Memory (1.4.0)

  • 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 RecordingCache abstraction has been removed, and thus is no longer exported from apollo-cache-inmemory.
    PR #4319

  • Export the optimism wrap function using ES2015 export syntax, instead of CommonJS.
    @ardatan in #4158

Apollo Client (2.4.8)

Apollo Client (2.4.8)

Apollo Cache In-Memory (1.3.12)

  • Avoid using DepTrackingCache for optimistic reads. PR #4521

  • When creating an InMemoryCache object, 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.

Apollo Client (2.4.7)

Apollo Client (2.4.7)

  • The ApolloClient constructor has been updated to accept name and version params, 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

Apollo Boost (0.1.22)

  • No changes.

Apollo Cache (1.1.21)

  • No changes.

Apollo Cache In-Memory (1.3.11)

  • No changes.

Apollo Utilities (1.0.26)

  • No changes.

Graphql Anywhere (4.1.23)

  • No changes.

Apollo Client (2.4.6)

Apollo Cache In-Memory (1.3.10)

  • Added some returns to prevent errors with noImplicitReturns TypeScript rule. PR #4137

  • Exclude the src/ directory when publishing apollo-cache-inmemory. Issue #4083

Apollo Client (2.4.5)

Apollo Cache (1.1.20)

Apollo Cache In-Memory (1.3.9)

Apollo Utilities (1.0.25)

  • Fix apollo-utilities isEqual bug due to missing hasOwnProperty check. PR #4072 by @samkline

Apollo Client (2.4.4)

Apollo Utilities (1.0.24)

  • Discard property accessor functions in cloneDeep helper, to fix issue #4034.

  • Unconditionally remove cloneDeep property accessors. PR #4039

  • Avoid copying non-enumerable and/or Symbol keys in cloneDeep. PR #4052

Apollo Cache In-Memory (1.3.7)

Apollo Client (2.4.3)

Apollo Cache In-Memory (1.3.6)

  • Optimize repeated apollo-cache-inmemory reads 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#executeStoreQuery and executeSelectionSet, and work around bugs in the React Native Map and Set polyfills. PR #3964 React Native PR #21492 (pending)

  • The apollo-cache-inmemory package now allows graphql@^14.0.0 as a peer dependency. Issue #3978

  • The apollo-cache-inmemory package 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

Apollo GraphQL Anywhere (4.1.20)

Apollo Utilities (1.0.22)

  • The fclone package has been replaced with a custom cloneDeep implementation that is tolerant of cycles, symbol properties, and non-enumerable properties. PR #4032

Apollo Boost (0.1.17)

Apollo Cache (1.1.18)

  • No changes.

Apollo Client (2.4.2)

Apollo Client (2.4.2)

  • Apollo Client no longer deep freezes query results. @hwillson in #3883
  • A new clearStore method has been added, that will remove all data from the store. Unlike resetStore, it will not refetch active queries after removing store data. @hwillson in #3885

Apollo Utilities (1.0.21)

  • Replace the custom cloneDeep implementation with fclone, to avoid crashing when encountering circular references.
    @hwillson in #3881

Apollo Boost (0.1.16)

  • No changes.

Apollo Cache (1.1.17)

  • No changes.

Apollo Cache In-Memory (1.2.10)

  • No changes.

Apollo GraphQL Anywhere (4.1.19)

  • No changes.

2.4.1 (August 26, 2018)

Apollo Client (2.4.1)

  • mutate's refetchQueries option now allows queries to include a custom context option. This context will 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_QUERY above will be refetched using context. 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

  • Documentation updates.
    @hwillson in #3841

Apollo Boost (0.1.15)

  • Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817

Apollo Cache (1.1.16)

  • Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817

Apollo Cache In-Memory (1.2.9)

  • Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817

Apollo Utilities (1.0.20)

  • Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817

Apollo GraphQL Anywhere (4.1.18)

  • Various internal infrastructure changes related to building, bundling, testing, etc. @hwillson in #3817

2.4.0 (August 17, 2018)

Apollo Client (2.4.0)

  • Add proper error handling for subscriptions. If you have defined an error handler on your subscription observer, it will now be called when an error comes back in a result, and the next handler will be skipped (similar to how we're handling errors with mutations). Previously, the error was just passed in the result to the next handler. If you don't have an error handler 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 optimistic param to be passed into ApolloClient.readQuery and ApolloClient.readFragment, that when set to true, will allow optimistic results to be returned. Is false by 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

Apollo Cache In-Memory (1.2.8)

  • Fix typo in console.warn regarding fragment matching error message.
    @combizs in #3701

Apollo Boost (0.1.14)

  • No changes.

Apollo Cache (1.1.15)

  • No changes.

Apollo Utilities (1.0.19)

  • No changes.

Apollo GraphQL Anywhere (4.1.17)

  • No changes.

2.3.8 (August 9, 2018)

Apollo Client (2.3.8)

Apollo Boost (0.1.13)

  • No changes.

Apollo Cache In-Memory (1.2.7)

  • No changes.

Apollo Cache (1.1.14)

  • No changes.

Apollo Utilities (1.0.18)

  • No changes.

Apollo GraphQL Anywhere (4.1.16)

  • No changes.

2.3.7 (July 24, 2018)

Apollo Client (2.3.7)

  • Release 2.3.6 broke Typescript compilation. QueryManager's getQueryWithPreviousResult method included an invalid variables return type in the auto-generated core/QueryManager.d.ts declaration 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. getQueryWithPreviousResult return types are now excplicity identified, which helps Typescript avoid the local type reference. For more details, see https://github.com/apollographql/apollo-client/issues/3729.
    @hwillson in #3731

Apollo Boost (0.1.12)

  • No changes.

2.3.6 (July 24, 2018)

Apollo Client (2.3.6)

Apollo Boost (0.1.11)

  • Allow fetch to be given as a configuration option to ApolloBoost.
    @mbaranovski in #3590
  • The apollo-boost ApolloClient constructor now warns about unsupported options.
    @quentin- in #3551

Apollo Cache (1.1.13)

  • No changes.

Apollo Cache In-Memory (1.2.6)

  • Add __typename and id properties to dataIdFromObject parameter (typescript)
    @jfurler in #3641
  • Fixed an issue caused by dataIdFromObject considering 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

Apollo Utilities (1.0.17)

  • No changes.

Apollo GraphQL Anywhere (4.1.15)

  • Add support for arrays to graphql-anywhere's filter utility.
    @jsweet314 in #3591
  • Fix Cannot convert object to primitive value error that was showing up when attempting to report a missing property on an object.
    @benjie in #3618

2.3.5 (June 19, 2018)

Apollo Client (2.3.5)

Apollo Boost (0.1.10)

  • No changes.

Apollo Cache (1.1.12)

  • No changes.

Apollo Cache In-Memory (1.2.5)

  • No changes.

Apollo Utilities (1.0.16)

Apollo GraphQL Anywhere (4.1.14)

  • No changes.

2.3.4 (June 13, 2018)

Apollo Client (2.3.4)

  • Export the QueryOptions interface, to make sure it can be used by other projects (like apollo-angular).
  • Fixed an issue caused by typescript changes to the constructor defaultOptions param, that prevented query defaults from passing type checks. (@hwillson in #3585)

Apollo Boost (0.1.9)

  • No changes

Apollo Cache (1.1.11)

  • No changes

Apollo Cache In-Memory (1.2.4)

  • No changes

Apollo Utilities (1.0.15)

  • No changes

Apollo GraphQL Anywhere (4.1.13)

  • No changes

2.3.3 (June 13, 2018)

Apollo Client (2.3.3)

  • 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 QueryOptions interface that is now used by ApolloClient.query options, instead of the previous WatchQueryOptions interface. This helps reduce confusion (especially in the docs) that made it look like ApolloClient.query accepted ApolloClient.watchQuery only options, like pollingInterval. (@hwillson in #3569)

Apollo Boost (0.1.8)

  • Allow cache to be given as a configuration option to ApolloBoost. (@dandean in #3561)
  • Allow headers and credentials to be passed in as configuration parameters to the apollo-boost ApolloClient constructor. (@rzane in #3098)

Apollo Cache (1.1.10)

  • Added optional generics to cache manipulation methods (typescript). (@mvestergaard in #3541)

Apollo Cache In-Memory (1.2.3)

  • 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)

Apollo Utilities (1.0.14)

  • Store key names generated by getStoreKeyName now leverage a more deterministic approach to handling JSON based strings. This prevents store key names from differing when using args like { prop1: 'value1', prop2: 'value2' } and { prop2: 'value2', prop1: 'value1' }. (@gdi2290 in #2869)
  • Avoid needless hasOwnProperty check in deepFreeze. (@benjamn in #3545)

Apollo GraphQL Anywhere (4.1.12)

  • No new changes.

2.3.2 (May 29, 2018)

Apollo Client (2.3.2)

  • Fix SSR and cache-and-network fetch policy (@dastoori in #3372)
  • Fixed an issue where the updateQuery method passed to ObservableQuery.fetchMore was 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 the prototype of this manually. (@seklyza in #3306)
  • Added safeguards to make sure QueryStore.initQuery and QueryStore.markQueryResult don't try to set the network status of a fetchMoreForQueryId query, if it does not exist in the store. This was happening when a query component was unmounted while a fetchMore was still in flight. (@conrad-vanl in #3367, @doomsower in #3469)

Apollo Boost (0.1.7)

  • Various internal code cleanup, tooling and dependency changes.

Apollo Cache (1.1.9)

  • Various internal code cleanup, tooling and dependency changes.

Apollo Cache In-Memory (1.2.2)

  • 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)

Apollo Utilities (1.0.13)

  • Make maybeDeepFreeze a little more defensive, by always using Object.prototype.hasOwnProperty (to avoid cases where the object being frozen doesn't have its own hasOwnProperty). (@jorisroling in #3418)
  • Remove certain small internal caches to prevent memory leaks when using SSR. (@brunorzn in #3444)

Apollo GraphQL Anywhere (4.1.11)

  • Source files are now excluded when publishing to npm. (@hwillson in #3454)