Skip to content

Releases: apollographql/apollo-client

v3.9.8

20 Mar 19:08
a0d114e
Compare
Choose a tag to compare

Patch Changes

  • #11706 8619bc7 Thanks @jerelmiller! - Fix issue in all suspense hooks where returning an empty array after calling fetchMore would rerender the component with an empty list.

  • #11694 835d5f3 Thanks @phryneas! - Expose setErrorMessageHandler from @apollo/client/dev entrypoint.

  • #11689 cb8ffe5 Thanks @jerelmiller! - Fix issue where passing a new from option to useFragment would first render with the previous value before rerendering with the correct value.

  • #11713 642092c Thanks @jerelmiller! - Fix issue where setting a default watchQuery option in the ApolloClient constructor could break startTransition when used with suspense hooks.

v3.10.0-alpha.1

18 Mar 19:52
Compare
Choose a tag to compare
v3.10.0-alpha.1 Pre-release
Pre-release

Patch Changes

  • #11465 7623da7 Thanks @alessbell! - Add watchFragment method to the cache and expose it on ApolloClient, refactor useFragment using watchFragment.

v3.9.7

13 Mar 17:43
9c5a8ce
Compare
Choose a tag to compare

Patch Changes

v3.9.6

06 Mar 18:02
1d2c631
Compare
Choose a tag to compare

Patch Changes

  • #11617 f1d8bc4 Thanks @phryneas! - Allow Apollo Client instance to intercept hook functionality

  • #11638 bf93ada Thanks @jerelmiller! - Fix issue where calling fetchMore from a suspense-enabled hook inside startTransition caused an unnecessary rerender.

v3.9.5

15 Feb 17:36
17ccc42
Compare
Choose a tag to compare

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

v3.9.4

07 Feb 17:26
0933946
Compare
Choose a tag to compare

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

v3.9.3

06 Feb 19:29
bb908a3
Compare
Choose a tag to compare

Patch Changes

v3.9.2

01 Feb 14:38
064cf54
Compare
Choose a tag to compare

Patch Changes

v3.9.1

31 Jan 16:52
10f7b48
Compare
Choose a tag to compare

Patch Changes

v3.9.0

30 Jan 21:18
9f2ccdb
Compare
Choose a tag to compare

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
        }
      ...
Read more