@apollo/client 3.8.8 → 3.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +23 -3
  2. package/apollo-client.cjs +48 -43
  3. package/apollo-client.cjs.map +1 -1
  4. package/apollo-client.min.cjs +1 -1
  5. package/cache/inmemory/writeToStore.js.map +1 -1
  6. package/core/core.cjs +1 -1
  7. package/core/core.cjs.map +1 -1
  8. package/core/core.cjs.native.js +1 -1
  9. package/dev/dev.cjs +2 -2
  10. package/dev/dev.cjs.map +1 -1
  11. package/dev/dev.cjs.native.js +2 -2
  12. package/invariantErrorCodes.js +1 -1
  13. package/link/http/checkFetcher.d.ts +1 -1
  14. package/link/http/checkFetcher.js.map +1 -1
  15. package/link/http/http.cjs +0 -3
  16. package/link/http/http.cjs.map +1 -1
  17. package/link/http/http.cjs.native.js +0 -3
  18. package/link/http/parseAndCheckHttpResponse.js +0 -4
  19. package/link/http/parseAndCheckHttpResponse.js.map +1 -1
  20. package/link/http/selectHttpOptionsAndBody.d.ts +1 -1
  21. package/link/http/selectHttpOptionsAndBody.js.map +1 -1
  22. package/package.json +32 -32
  23. package/react/cache/QueryReference.js +2 -1
  24. package/react/cache/QueryReference.js.map +1 -1
  25. package/react/hooks/hooks.cjs +47 -39
  26. package/react/hooks/hooks.cjs.map +1 -1
  27. package/react/hooks/hooks.cjs.native.js +47 -39
  28. package/react/hooks/internal/index.d.ts +1 -0
  29. package/react/hooks/internal/index.js +1 -0
  30. package/react/hooks/internal/index.js.map +1 -1
  31. package/react/hooks/internal/useLazyRef.d.ts +3 -0
  32. package/react/hooks/internal/useLazyRef.js +10 -0
  33. package/react/hooks/internal/useLazyRef.js.map +1 -0
  34. package/react/hooks/useFragment.js +20 -17
  35. package/react/hooks/useFragment.js.map +1 -1
  36. package/testing/core/core.cjs +4 -2
  37. package/testing/core/core.cjs.map +1 -1
  38. package/testing/core/core.cjs.native.js +4 -2
  39. package/testing/core/mocking/mockLink.js +8 -2
  40. package/testing/core/mocking/mockLink.js.map +1 -1
  41. package/utilities/globals/globals.cjs +1 -1
  42. package/utilities/globals/globals.cjs.map +1 -1
  43. package/utilities/globals/globals.cjs.native.js +1 -1
  44. package/version.js +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"QueryReference.js","sourceRoot":"","sources":["../../../src/react/cache/QueryReference.ts"],"names":[],"mappings":"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","sourcesContent":["import { equal } from \"@wry/equality\";\nimport type {\n ApolloError,\n ApolloQueryResult,\n ObservableQuery,\n OperationVariables,\n WatchQueryOptions,\n} from \"../../core/index.js\";\nimport { isNetworkRequestSettled } from \"../../core/index.js\";\nimport type { ObservableSubscription } from \"../../utilities/index.js\";\nimport {\n createFulfilledPromise,\n createRejectedPromise,\n} from \"../../utilities/index.js\";\nimport type { CacheKey } from \"./types.js\";\nimport type { useBackgroundQuery, useReadQuery } from \"../hooks/index.js\";\n\ntype Listener<TData> = (promise: Promise<ApolloQueryResult<TData>>) => void;\n\ntype FetchMoreOptions<TData> = Parameters<\n ObservableQuery<TData>[\"fetchMore\"]\n>[0];\n\nconst QUERY_REFERENCE_SYMBOL: unique symbol = Symbol();\n/**\n * A `QueryReference` is an opaque object returned by {@link useBackgroundQuery}.\n * A child component reading the `QueryReference` via {@link useReadQuery} will\n * suspend until the promise resolves.\n */\nexport interface QueryReference<TData = unknown> {\n [QUERY_REFERENCE_SYMBOL]: InternalQueryReference<TData>;\n}\n\ninterface InternalQueryReferenceOptions {\n key: CacheKey;\n onDispose?: () => void;\n autoDisposeTimeoutMs?: number;\n}\n\nexport function wrapQueryRef<TData>(\n internalQueryRef: InternalQueryReference<TData>\n): QueryReference<TData> {\n return { [QUERY_REFERENCE_SYMBOL]: internalQueryRef };\n}\n\nexport function unwrapQueryRef<TData>(\n queryRef: QueryReference<TData>\n): InternalQueryReference<TData> {\n return queryRef[QUERY_REFERENCE_SYMBOL];\n}\n\nconst OBSERVED_CHANGED_OPTIONS = [\n \"canonizeResults\",\n \"context\",\n \"errorPolicy\",\n \"fetchPolicy\",\n \"refetchWritePolicy\",\n \"returnPartialData\",\n] as const;\n\ntype ObservedOptions = Pick<\n WatchQueryOptions,\n (typeof OBSERVED_CHANGED_OPTIONS)[number]\n>;\n\nexport class InternalQueryReference<TData = unknown> {\n public result: ApolloQueryResult<TData>;\n public readonly key: CacheKey;\n public readonly observable: ObservableQuery<TData>;\n\n public promiseCache?: Map<CacheKey, Promise<ApolloQueryResult<TData>>>;\n public promise: Promise<ApolloQueryResult<TData>>;\n\n private subscription: ObservableSubscription;\n private listeners = new Set<Listener<TData>>();\n private autoDisposeTimeoutId?: NodeJS.Timeout;\n private status: \"idle\" | \"loading\" = \"loading\";\n\n private resolve: ((result: ApolloQueryResult<TData>) => void) | undefined;\n private reject: ((error: unknown) => void) | undefined;\n\n private references = 0;\n\n constructor(\n observable: ObservableQuery<TData>,\n options: InternalQueryReferenceOptions\n ) {\n this.handleNext = this.handleNext.bind(this);\n this.handleError = this.handleError.bind(this);\n this.dispose = this.dispose.bind(this);\n this.observable = observable;\n // Don't save this result as last result to prevent delivery of last result\n // when first subscribing\n this.result = observable.getCurrentResult(false);\n this.key = options.key;\n\n if (options.onDispose) {\n this.onDispose = options.onDispose;\n }\n\n if (\n isNetworkRequestSettled(this.result.networkStatus) ||\n (this.result.data &&\n (!this.result.partial || this.watchQueryOptions.returnPartialData))\n ) {\n this.promise = createFulfilledPromise(this.result);\n this.status = \"idle\";\n } else {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n this.subscription = observable\n .filter(({ data }) => !equal(data, {}))\n .subscribe({\n next: this.handleNext,\n error: this.handleError,\n });\n\n // Start a timer that will automatically dispose of the query if the\n // suspended resource does not use this queryRef in the given time. This\n // helps prevent memory leaks when a component has unmounted before the\n // query has finished loading.\n const startDisposeTimer = () => {\n if (!this.references) {\n this.autoDisposeTimeoutId = setTimeout(\n this.dispose,\n options.autoDisposeTimeoutMs ?? 30_000\n );\n }\n };\n\n // We wait until the request has settled to ensure we don't dispose of the\n // query ref before the request finishes, otherwise we would leave the\n // promise in a pending state rendering the suspense boundary indefinitely.\n this.promise.then(startDisposeTimer, startDisposeTimer);\n }\n\n get watchQueryOptions() {\n return this.observable.options;\n }\n\n retain() {\n this.references++;\n clearTimeout(this.autoDisposeTimeoutId);\n let disposed = false;\n\n return () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n this.references--;\n\n // Wait before fully disposing in case the app is running in strict mode.\n setTimeout(() => {\n if (!this.references) {\n this.dispose();\n }\n });\n };\n }\n\n didChangeOptions(watchQueryOptions: ObservedOptions) {\n return OBSERVED_CHANGED_OPTIONS.some(\n (option) =>\n !equal(this.watchQueryOptions[option], watchQueryOptions[option])\n );\n }\n\n applyOptions(watchQueryOptions: ObservedOptions) {\n const {\n fetchPolicy: currentFetchPolicy,\n canonizeResults: currentCanonizeResults,\n } = this.watchQueryOptions;\n\n // \"standby\" is used when `skip` is set to `true`. Detect when we've\n // enabled the query (i.e. `skip` is `false`) to execute a network request.\n if (\n currentFetchPolicy === \"standby\" &&\n currentFetchPolicy !== watchQueryOptions.fetchPolicy\n ) {\n this.initiateFetch(this.observable.reobserve(watchQueryOptions));\n } else {\n this.observable.silentSetOptions(watchQueryOptions);\n\n if (currentCanonizeResults !== watchQueryOptions.canonizeResults) {\n this.result = { ...this.result, ...this.observable.getCurrentResult() };\n this.promise = createFulfilledPromise(this.result);\n }\n }\n\n return this.promise;\n }\n\n listen(listener: Listener<TData>) {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n refetch(variables: OperationVariables | undefined) {\n return this.initiateFetch(this.observable.refetch(variables));\n }\n\n fetchMore(options: FetchMoreOptions<TData>) {\n return this.initiateFetch(this.observable.fetchMore<TData>(options));\n }\n\n private dispose() {\n this.subscription.unsubscribe();\n this.onDispose();\n }\n\n private onDispose() {\n // noop. overridable by options\n }\n\n private handleNext(result: ApolloQueryResult<TData>) {\n switch (this.status) {\n case \"loading\": {\n // Maintain the last successful `data` value if the next result does not\n // have one.\n if (result.data === void 0) {\n result.data = this.result.data;\n }\n this.status = \"idle\";\n this.result = result;\n this.resolve?.(result);\n break;\n }\n case \"idle\": {\n // This occurs when switching to a result that is fully cached when this\n // class is instantiated. ObservableQuery will run reobserve when\n // subscribing, which delivers a result from the cache.\n if (result.data === this.result.data) {\n return;\n }\n\n // Maintain the last successful `data` value if the next result does not\n // have one.\n if (result.data === void 0) {\n result.data = this.result.data;\n }\n\n this.result = result;\n this.promise = createFulfilledPromise(result);\n this.deliver(this.promise);\n break;\n }\n }\n }\n\n private handleError(error: ApolloError) {\n this.subscription.unsubscribe();\n this.subscription = this.observable.resubscribeAfterError(\n this.handleNext,\n this.handleError\n );\n\n switch (this.status) {\n case \"loading\": {\n this.status = \"idle\";\n this.reject?.(error);\n break;\n }\n case \"idle\": {\n this.promise = createRejectedPromise(error);\n this.deliver(this.promise);\n }\n }\n }\n\n private deliver(promise: Promise<ApolloQueryResult<TData>>) {\n this.listeners.forEach((listener) => listener(promise));\n }\n\n private initiateFetch(returnedPromise: Promise<ApolloQueryResult<TData>>) {\n this.status = \"loading\";\n\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n this.promise.catch(() => {});\n\n // If the data returned from the fetch is deeply equal to the data already\n // in the cache, `handleNext` will not be triggered leaving the promise we\n // created in a pending state forever. To avoid this situtation, we attempt\n // to resolve the promise if `handleNext` hasn't been run to ensure the\n // promise is resolved correctly.\n returnedPromise\n .then((result) => {\n if (this.status === \"loading\") {\n this.status = \"idle\";\n this.result = result;\n this.resolve?.(result);\n }\n })\n .catch(() => {});\n\n return returnedPromise;\n }\n}\n"]}
1
+ {"version":3,"file":"QueryReference.js","sourceRoot":"","sources":["../../../src/react/cache/QueryReference.ts"],"names":[],"mappings":"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","sourcesContent":["import { equal } from \"@wry/equality\";\nimport type {\n ApolloError,\n ApolloQueryResult,\n ObservableQuery,\n OperationVariables,\n WatchQueryOptions,\n} from \"../../core/index.js\";\nimport { isNetworkRequestSettled } from \"../../core/index.js\";\nimport type { ObservableSubscription } from \"../../utilities/index.js\";\nimport {\n createFulfilledPromise,\n createRejectedPromise,\n} from \"../../utilities/index.js\";\nimport type { CacheKey } from \"./types.js\";\nimport type { useBackgroundQuery, useReadQuery } from \"../hooks/index.js\";\n\ntype Listener<TData> = (promise: Promise<ApolloQueryResult<TData>>) => void;\n\ntype FetchMoreOptions<TData> = Parameters<\n ObservableQuery<TData>[\"fetchMore\"]\n>[0];\n\nconst QUERY_REFERENCE_SYMBOL: unique symbol = Symbol();\n/**\n * A `QueryReference` is an opaque object returned by {@link useBackgroundQuery}.\n * A child component reading the `QueryReference` via {@link useReadQuery} will\n * suspend until the promise resolves.\n */\nexport interface QueryReference<TData = unknown> {\n [QUERY_REFERENCE_SYMBOL]: InternalQueryReference<TData>;\n}\n\ninterface InternalQueryReferenceOptions {\n key: CacheKey;\n onDispose?: () => void;\n autoDisposeTimeoutMs?: number;\n}\n\nexport function wrapQueryRef<TData>(\n internalQueryRef: InternalQueryReference<TData>\n): QueryReference<TData> {\n return { [QUERY_REFERENCE_SYMBOL]: internalQueryRef };\n}\n\nexport function unwrapQueryRef<TData>(\n queryRef: QueryReference<TData>\n): InternalQueryReference<TData> {\n return queryRef[QUERY_REFERENCE_SYMBOL];\n}\n\nconst OBSERVED_CHANGED_OPTIONS = [\n \"canonizeResults\",\n \"context\",\n \"errorPolicy\",\n \"fetchPolicy\",\n \"refetchWritePolicy\",\n \"returnPartialData\",\n] as const;\n\ntype ObservedOptions = Pick<\n WatchQueryOptions,\n (typeof OBSERVED_CHANGED_OPTIONS)[number]\n>;\n\nexport class InternalQueryReference<TData = unknown> {\n public result: ApolloQueryResult<TData>;\n public readonly key: CacheKey;\n public readonly observable: ObservableQuery<TData>;\n\n public promiseCache?: Map<CacheKey, Promise<ApolloQueryResult<TData>>>;\n public promise: Promise<ApolloQueryResult<TData>>;\n\n private subscription: ObservableSubscription;\n private listeners = new Set<Listener<TData>>();\n private autoDisposeTimeoutId?: NodeJS.Timeout;\n private status: \"idle\" | \"loading\" = \"loading\";\n\n private resolve: ((result: ApolloQueryResult<TData>) => void) | undefined;\n private reject: ((error: unknown) => void) | undefined;\n\n private references = 0;\n\n constructor(\n observable: ObservableQuery<TData>,\n options: InternalQueryReferenceOptions\n ) {\n this.handleNext = this.handleNext.bind(this);\n this.handleError = this.handleError.bind(this);\n this.dispose = this.dispose.bind(this);\n this.observable = observable;\n // Don't save this result as last result to prevent delivery of last result\n // when first subscribing\n this.result = observable.getCurrentResult(false);\n this.key = options.key;\n\n if (options.onDispose) {\n this.onDispose = options.onDispose;\n }\n\n if (\n isNetworkRequestSettled(this.result.networkStatus) ||\n (this.result.data &&\n (!this.result.partial || this.watchQueryOptions.returnPartialData))\n ) {\n this.promise = createFulfilledPromise(this.result);\n this.status = \"idle\";\n } else {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n this.subscription = observable\n .filter(({ data }) => !equal(data, {}))\n .subscribe({\n next: this.handleNext,\n error: this.handleError,\n });\n\n // Start a timer that will automatically dispose of the query if the\n // suspended resource does not use this queryRef in the given time. This\n // helps prevent memory leaks when a component has unmounted before the\n // query has finished loading.\n const startDisposeTimer = () => {\n if (!this.references) {\n this.autoDisposeTimeoutId = setTimeout(\n this.dispose,\n options.autoDisposeTimeoutMs ?? 30_000\n );\n }\n };\n\n // We wait until the request has settled to ensure we don't dispose of the\n // query ref before the request finishes, otherwise we would leave the\n // promise in a pending state rendering the suspense boundary indefinitely.\n this.promise.then(startDisposeTimer, startDisposeTimer);\n }\n\n get watchQueryOptions() {\n return this.observable.options;\n }\n\n retain() {\n this.references++;\n clearTimeout(this.autoDisposeTimeoutId);\n let disposed = false;\n\n return () => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n this.references--;\n\n // Wait before fully disposing in case the app is running in strict mode.\n setTimeout(() => {\n if (!this.references) {\n this.dispose();\n }\n });\n };\n }\n\n didChangeOptions(watchQueryOptions: ObservedOptions) {\n return OBSERVED_CHANGED_OPTIONS.some(\n (option) =>\n !equal(this.watchQueryOptions[option], watchQueryOptions[option])\n );\n }\n\n applyOptions(watchQueryOptions: ObservedOptions) {\n const {\n fetchPolicy: currentFetchPolicy,\n canonizeResults: currentCanonizeResults,\n } = this.watchQueryOptions;\n\n // \"standby\" is used when `skip` is set to `true`. Detect when we've\n // enabled the query (i.e. `skip` is `false`) to execute a network request.\n if (\n currentFetchPolicy === \"standby\" &&\n currentFetchPolicy !== watchQueryOptions.fetchPolicy\n ) {\n this.initiateFetch(this.observable.reobserve(watchQueryOptions));\n } else {\n this.observable.silentSetOptions(watchQueryOptions);\n\n if (currentCanonizeResults !== watchQueryOptions.canonizeResults) {\n this.result = { ...this.result, ...this.observable.getCurrentResult() };\n this.promise = createFulfilledPromise(this.result);\n }\n }\n\n return this.promise;\n }\n\n listen(listener: Listener<TData>) {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n refetch(variables: OperationVariables | undefined) {\n return this.initiateFetch(this.observable.refetch(variables));\n }\n\n fetchMore(options: FetchMoreOptions<TData>) {\n return this.initiateFetch(this.observable.fetchMore<TData>(options));\n }\n\n private dispose() {\n this.subscription.unsubscribe();\n this.onDispose();\n }\n\n private onDispose() {\n // noop. overridable by options\n }\n\n private handleNext(result: ApolloQueryResult<TData>) {\n switch (this.status) {\n case \"loading\": {\n // Maintain the last successful `data` value if the next result does not\n // have one.\n if (result.data === void 0) {\n result.data = this.result.data;\n }\n this.status = \"idle\";\n this.result = result;\n this.resolve?.(result);\n break;\n }\n case \"idle\": {\n // This occurs when switching to a result that is fully cached when this\n // class is instantiated. ObservableQuery will run reobserve when\n // subscribing, which delivers a result from the cache.\n if (\n result.data === this.result.data &&\n result.networkStatus === this.result.networkStatus\n ) {\n return;\n }\n\n // Maintain the last successful `data` value if the next result does not\n // have one.\n if (result.data === void 0) {\n result.data = this.result.data;\n }\n\n this.result = result;\n this.promise = createFulfilledPromise(result);\n this.deliver(this.promise);\n break;\n }\n }\n }\n\n private handleError(error: ApolloError) {\n this.subscription.unsubscribe();\n this.subscription = this.observable.resubscribeAfterError(\n this.handleNext,\n this.handleError\n );\n\n switch (this.status) {\n case \"loading\": {\n this.status = \"idle\";\n this.reject?.(error);\n break;\n }\n case \"idle\": {\n this.promise = createRejectedPromise(error);\n this.deliver(this.promise);\n }\n }\n }\n\n private deliver(promise: Promise<ApolloQueryResult<TData>>) {\n this.listeners.forEach((listener) => listener(promise));\n }\n\n private initiateFetch(returnedPromise: Promise<ApolloQueryResult<TData>>) {\n this.status = \"loading\";\n\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n this.promise.catch(() => {});\n\n // If the data returned from the fetch is deeply equal to the data already\n // in the cache, `handleNext` will not be triggered leaving the promise we\n // created in a pending state forever. To avoid this situtation, we attempt\n // to resolve the promise if `handleNext` hasn't been run to ensure the\n // promise is resolved correctly.\n returnedPromise\n .then((result) => {\n if (this.status === \"loading\") {\n this.status = \"idle\";\n this.result = result;\n this.resolve?.(result);\n }\n })\n .catch(() => {});\n\n return returnedPromise;\n }\n}\n"]}
@@ -691,44 +691,6 @@ function useReactiveVar(rv) {
691
691
  }, [rv]), rv, rv);
692
692
  }
693
693
 
694
- function useFragment(options) {
695
- var cache = useApolloClient().cache;
696
- var fragment = options.fragment, fragmentName = options.fragmentName, from = options.from, _a = options.optimistic, optimistic = _a === void 0 ? true : _a, rest = tslib.__rest(options, ["fragment", "fragmentName", "from", "optimistic"]);
697
- var diffOptions = tslib.__assign(tslib.__assign({}, rest), { returnPartialData: true, id: typeof from === "string" ? from : cache.identify(from), query: cache["getFragmentDoc"](fragment, fragmentName), optimistic: optimistic });
698
- var resultRef = React__namespace.useRef();
699
- var latestDiff = cache.diff(diffOptions);
700
- var getSnapshot = function () {
701
- var latestDiffToResult = diffToResult(latestDiff);
702
- return (resultRef.current &&
703
- equality.equal(resultRef.current.data, latestDiffToResult.data)) ?
704
- resultRef.current
705
- : (resultRef.current = latestDiffToResult);
706
- };
707
- return useSyncExternalStore(function (forceUpdate) {
708
- var lastTimeout = 0;
709
- var unsubcribe = cache.watch(tslib.__assign(tslib.__assign({}, diffOptions), { immediate: true, callback: function (diff) {
710
- if (!equality.equal(diff, latestDiff)) {
711
- resultRef.current = diffToResult((latestDiff = diff));
712
- lastTimeout = setTimeout(forceUpdate);
713
- }
714
- } }));
715
- return function () {
716
- unsubcribe();
717
- clearTimeout(lastTimeout);
718
- };
719
- }, getSnapshot, getSnapshot);
720
- }
721
- function diffToResult(diff) {
722
- var result = {
723
- data: diff.result,
724
- complete: !!diff.complete,
725
- };
726
- if (diff.missing) {
727
- result.missing = utilities.mergeDeepArray(diff.missing.map(function (error) { return error.missing; }));
728
- }
729
- return result;
730
- }
731
-
732
694
  function useDeepMemo(memoFn, deps) {
733
695
  var ref = React__namespace.useRef();
734
696
  if (!ref.current || !equality.equal(ref.current.deps, deps)) {
@@ -737,6 +699,15 @@ function useDeepMemo(memoFn, deps) {
737
699
  return ref.current.value;
738
700
  }
739
701
 
702
+ var INIT = {};
703
+ function useLazyRef(getInitialValue) {
704
+ var ref = React__namespace.useRef(INIT);
705
+ if (ref.current === INIT) {
706
+ ref.current = getInitialValue();
707
+ }
708
+ return ref;
709
+ }
710
+
740
711
  var useKey = "use";
741
712
  var realHook = React__namespace[useKey];
742
713
  var __use = realHook ||
@@ -752,6 +723,42 @@ var __use = realHook ||
752
723
  }
753
724
  };
754
725
 
726
+ function useFragment(options) {
727
+ var cache = useApolloClient().cache;
728
+ var diffOptions = useDeepMemo(function () {
729
+ var fragment = options.fragment, fragmentName = options.fragmentName, from = options.from, _a = options.optimistic, optimistic = _a === void 0 ? true : _a, rest = tslib.__rest(options, ["fragment", "fragmentName", "from", "optimistic"]);
730
+ return tslib.__assign(tslib.__assign({}, rest), { returnPartialData: true, id: typeof from === "string" ? from : cache.identify(from), query: cache["getFragmentDoc"](fragment, fragmentName), optimistic: optimistic });
731
+ }, [options]);
732
+ var resultRef = useLazyRef(function () {
733
+ return diffToResult(cache.diff(diffOptions));
734
+ });
735
+ var getSnapshot = React__namespace.useCallback(function () { return resultRef.current; }, []);
736
+ return useSyncExternalStore(React__namespace.useCallback(function (forceUpdate) {
737
+ var lastTimeout = 0;
738
+ var unsubscribe = cache.watch(tslib.__assign(tslib.__assign({}, diffOptions), { immediate: true, callback: function (diff) {
739
+ if (!equality.equal(diff.result, resultRef.current.data)) {
740
+ resultRef.current = diffToResult(diff);
741
+ clearTimeout(lastTimeout);
742
+ lastTimeout = setTimeout(forceUpdate);
743
+ }
744
+ } }));
745
+ return function () {
746
+ unsubscribe();
747
+ clearTimeout(lastTimeout);
748
+ };
749
+ }, [cache, diffOptions]), getSnapshot, getSnapshot);
750
+ }
751
+ function diffToResult(diff) {
752
+ var result = {
753
+ data: diff.result,
754
+ complete: !!diff.complete,
755
+ };
756
+ if (diff.missing) {
757
+ result.missing = utilities.mergeDeepArray(diff.missing.map(function (error) { return error.missing; }));
758
+ }
759
+ return result;
760
+ }
761
+
755
762
  var QUERY_REFERENCE_SYMBOL = Symbol();
756
763
  function wrapQueryRef(internalQueryRef) {
757
764
  var _a;
@@ -890,7 +897,8 @@ var InternalQueryReference = (function () {
890
897
  break;
891
898
  }
892
899
  case "idle": {
893
- if (result.data === this.result.data) {
900
+ if (result.data === this.result.data &&
901
+ result.networkStatus === this.result.networkStatus) {
894
902
  return;
895
903
  }
896
904
  if (result.data === void 0) {