@apollo/client 3.6.1 → 3.6.4

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 (89) hide show
  1. package/LICENSE +1 -1
  2. package/apollo-client.cjs +133 -78
  3. package/apollo-client.cjs.map +1 -1
  4. package/apollo-client.min.cjs +1 -1
  5. package/cache/cache.cjs.native.js +2289 -0
  6. package/core/ApolloClient.d.ts.map +1 -1
  7. package/core/ApolloClient.js.map +1 -1
  8. package/core/ObservableQuery.d.ts.map +1 -1
  9. package/core/ObservableQuery.js +3 -1
  10. package/core/ObservableQuery.js.map +1 -1
  11. package/core/core.cjs +4 -2
  12. package/core/core.cjs.map +1 -1
  13. package/core/core.cjs.native.js +2141 -0
  14. package/errors/errors.cjs.native.js +48 -0
  15. package/invariantErrorCodes.js +1 -1
  16. package/link/batch/batch.cjs.native.js +161 -0
  17. package/link/batch-http/batch-http.cjs.native.js +127 -0
  18. package/link/context/context.cjs.native.js +38 -0
  19. package/link/core/core.cjs.native.js +121 -0
  20. package/link/error/error.cjs.native.js +90 -0
  21. package/link/http/http.cjs.native.js +320 -0
  22. package/link/http/selectHttpOptionsAndBody.d.ts.map +1 -1
  23. package/link/http/selectHttpOptionsAndBody.js.map +1 -1
  24. package/link/persisted-queries/index.d.ts +2 -1
  25. package/link/persisted-queries/index.d.ts.map +1 -1
  26. package/link/persisted-queries/index.js +26 -13
  27. package/link/persisted-queries/index.js.map +1 -1
  28. package/link/persisted-queries/persisted-queries.cjs +25 -12
  29. package/link/persisted-queries/persisted-queries.cjs.map +1 -1
  30. package/link/persisted-queries/persisted-queries.cjs.native.js +174 -0
  31. package/link/retry/retry.cjs.native.js +170 -0
  32. package/link/schema/schema.cjs.native.js +56 -0
  33. package/link/subscriptions/subscriptions.cjs.native.js +45 -0
  34. package/link/utils/utils.cjs.native.js +115 -0
  35. package/link/ws/ws.cjs.native.js +28 -0
  36. package/main.cjs.native.js +16 -0
  37. package/package.json +17 -18
  38. package/react/components/components.cjs.native.js +79 -0
  39. package/react/context/ApolloConsumer.js +2 -2
  40. package/react/context/ApolloProvider.js +2 -2
  41. package/react/context/context.cjs +4 -4
  42. package/react/context/context.cjs.map +1 -1
  43. package/react/context/context.cjs.native.js +67 -0
  44. package/react/hoc/hoc.cjs.native.js +325 -0
  45. package/react/hooks/hooks.cjs +151 -90
  46. package/react/hooks/hooks.cjs.map +1 -1
  47. package/react/hooks/hooks.cjs.native.js +604 -0
  48. package/react/hooks/useLazyQuery.d.ts.map +1 -1
  49. package/react/hooks/useLazyQuery.js +7 -22
  50. package/react/hooks/useLazyQuery.js.map +1 -1
  51. package/react/hooks/useQuery.d.ts +5 -1
  52. package/react/hooks/useQuery.d.ts.map +1 -1
  53. package/react/hooks/useQuery.js +46 -39
  54. package/react/hooks/useQuery.js.map +1 -1
  55. package/react/hooks/useSubscription.d.ts.map +1 -1
  56. package/react/hooks/useSubscription.js +17 -7
  57. package/react/hooks/useSubscription.js.map +1 -1
  58. package/react/hooks/useSyncExternalStore.d.ts +4 -0
  59. package/react/hooks/useSyncExternalStore.d.ts.map +1 -0
  60. package/react/hooks/useSyncExternalStore.js +48 -0
  61. package/react/hooks/useSyncExternalStore.js.map +1 -0
  62. package/react/parser/parser.cjs.native.js +103 -0
  63. package/react/react.cjs.native.js +22 -0
  64. package/react/ssr/ssr.cjs.native.js +150 -0
  65. package/testing/core/core.cjs.native.js +288 -0
  66. package/testing/core/mocking/mockQueryManager.js +1 -1
  67. package/testing/core/mocking/mockWatchQuery.js +1 -1
  68. package/testing/core/wrap.js +1 -1
  69. package/testing/testing.cjs.native.js +58 -0
  70. package/utilities/common/canUse.d.ts +2 -0
  71. package/utilities/common/canUse.d.ts.map +1 -1
  72. package/utilities/common/canUse.js +6 -2
  73. package/utilities/common/canUse.js.map +1 -1
  74. package/utilities/common/mergeOptions.d.ts +1 -1
  75. package/utilities/common/mergeOptions.d.ts.map +1 -1
  76. package/utilities/common/mergeOptions.js +1 -1
  77. package/utilities/common/mergeOptions.js.map +1 -1
  78. package/utilities/globals/global.js +1 -2
  79. package/utilities/globals/globals.cjs.native.js +56 -0
  80. package/utilities/observables/Concast.d.ts.map +1 -1
  81. package/utilities/observables/Concast.js +5 -2
  82. package/utilities/observables/Concast.js.map +1 -1
  83. package/utilities/policies/pagination.d.ts.map +1 -1
  84. package/utilities/policies/pagination.js +9 -7
  85. package/utilities/policies/pagination.js.map +1 -1
  86. package/utilities/utilities.cjs +22 -12
  87. package/utilities/utilities.cjs.map +1 -1
  88. package/utilities/utilities.cjs.native.js +1284 -0
  89. package/version.js +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useLazyQuery.js","sourceRoot":"","sources":["../../../src/react/hooks/useLazyQuery.ts"],"names":[],"mappings":"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","sourcesContent":["import { DocumentNode } from 'graphql';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { OperationVariables } from '../../core';\nimport { ApolloError } from '../../errors';\nimport {\n LazyQueryHookOptions,\n LazyQueryResultTuple,\n QueryResult,\n} from '../types/types';\nimport { useInternalState } from './useQuery';\nimport { useApolloClient } from './useApolloClient';\nimport { isNonEmptyArray } from '../../utilities';\n\n// The following methods, when called will execute the query, regardless of\n// whether the useLazyQuery execute function was called before.\nconst EAGER_METHODS = [\n 'refetch',\n 'reobserve',\n 'fetchMore',\n 'updateQuery',\n 'startPolling',\n 'subscribeToMore',\n] as const;\n\nexport function useLazyQuery<TData = any, TVariables = OperationVariables>(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options?: LazyQueryHookOptions<TData, TVariables>\n): LazyQueryResultTuple<TData, TVariables> {\n const internalState = useInternalState(\n useApolloClient(options && options.client),\n query,\n );\n\n const execOptionsRef = useRef<Partial<LazyQueryHookOptions<TData, TVariables>>>();\n const defaultOptions = internalState.client.defaultOptions.watchQuery;\n const initialFetchPolicy =\n (options && options.fetchPolicy) ||\n (execOptionsRef.current && execOptionsRef.current.fetchPolicy) ||\n (defaultOptions && defaultOptions.fetchPolicy) ||\n \"cache-first\";\n\n const useQueryResult = internalState.useQuery({\n ...options,\n ...execOptionsRef.current,\n skip: !execOptionsRef.current,\n });\n\n const result: QueryResult<TData, TVariables> =\n Object.assign(useQueryResult, {\n called: !!execOptionsRef.current,\n });\n\n // We use useMemo here to make sure the eager methods have a stable identity.\n const eagerMethods = useMemo(() => {\n const eagerMethods: Record<string, any> = {};\n for (const key of EAGER_METHODS) {\n const method = result[key];\n eagerMethods[key] = function () {\n if (!execOptionsRef.current) {\n execOptionsRef.current = Object.create(null);\n // Only the first time populating execOptionsRef.current matters here.\n internalState.forceUpdate();\n }\n return method.apply(this, arguments);\n };\n }\n\n return eagerMethods;\n }, []);\n\n Object.assign(result, eagerMethods);\n\n const execute = useCallback<\n LazyQueryResultTuple<TData, TVariables>[0]\n >(executeOptions => {\n const promise = result.reobserve(\n execOptionsRef.current = executeOptions ? {\n ...executeOptions,\n fetchPolicy: executeOptions.fetchPolicy || initialFetchPolicy,\n } : {\n fetchPolicy: initialFetchPolicy,\n },\n ).then(apolloQueryResult => {\n // If this.observable.options.fetchPolicy is \"standby\", the\n // apolloQueryResult we receive here can be undefined, so we call\n // getCurrentResult to obtain a stub result.\n // TODO Investigate whether standby queries could return this stub result\n // in the first place.\n apolloQueryResult = apolloQueryResult || internalState[\"getCurrentResult\"]();\n\n if (\n apolloQueryResult.error ||\n isNonEmptyArray(apolloQueryResult.errors)\n ) {\n const {\n errorPolicy = \"none\",\n } = result.observable.options;\n\n if (errorPolicy === \"none\") {\n throw apolloQueryResult.error || new ApolloError({\n graphQLErrors: apolloQueryResult.errors,\n });\n }\n }\n\n return internalState.toQueryResult(apolloQueryResult);\n\n }).then(queryResult => Object.assign(queryResult, eagerMethods));\n\n // Deliver the loading state for this reobservation immediately.\n internalState.forceUpdate();\n\n // Because the return value of `useLazyQuery` is usually floated, we need\n // to catch the promise to prevent unhandled rejections.\n promise.catch(() => {});\n\n return promise;\n }, []);\n\n return [execute, result];\n}\n"]}
1
+ {"version":3,"file":"useLazyQuery.js","sourceRoot":"","sources":["../../../src/react/hooks/useLazyQuery.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAQrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,IAAM,aAAa,GAAG;IACpB,SAAS;IACT,WAAW;IACX,WAAW;IACX,aAAa;IACb,cAAc;IACd,iBAAiB;CACT,CAAC;AAEX,MAAM,UAAU,YAAY,CAC1B,KAA0D,EAC1D,OAAiD;IAEjD,IAAM,aAAa,GAAG,gBAAgB,CACpC,eAAe,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAC1C,KAAK,CACN,CAAC;IAEF,IAAM,cAAc,GAAG,MAAM,EAAoD,CAAC;IAElF,IAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,gCACxC,OAAO,GACP,cAAc,CAAC,OAAO,KACzB,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,IAC7B,CAAC;IAEH,IAAM,kBAAkB,GACtB,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,kBAAkB;QACpD,aAAa,CAAC,qBAAqB,EAAE,CAAC;IAExC,IAAM,MAAM,GACV,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE;QAC5B,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO;KACjC,CAAC,CAAC;IAGL,IAAM,YAAY,GAAG,OAAO,CAAC;QAC3B,IAAM,YAAY,GAAwB,EAAE,CAAC;gCAClC,GAAG;YACZ,IAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,GAAG;gBAClB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBAC3B,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAE7C,aAAa,CAAC,WAAW,EAAE,CAAC;iBAC7B;gBACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC;;QATJ,KAAkB,UAAa,EAAb,+BAAa,EAAb,2BAAa,EAAb,IAAa;YAA1B,IAAM,GAAG,sBAAA;oBAAH,GAAG;SAUb;QAED,OAAO,YAAY,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEpC,IAAM,OAAO,GAAG,WAAW,CAEzB,UAAA,cAAc;QACd,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC,uBACpC,cAAc,KACjB,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,kBAAkB,IAC7D,CAAC,CAAC;YACF,WAAW,EAAE,kBAAkB;SAChC,CAAC;QAEF,IAAM,OAAO,GAAG,aAAa;aAC1B,WAAW,EAAE;aACb,IAAI,CAAC,UAAA,WAAW,IAAI,OAAA,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,EAAxC,CAAwC,CAAC,CAAC;QAIjE,OAAO,CAAC,KAAK,CAAC,cAAO,CAAC,CAAC,CAAC;QAExB,OAAO,OAAO,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC","sourcesContent":["import { DocumentNode } from 'graphql';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { OperationVariables } from '../../core';\nimport {\n LazyQueryHookOptions,\n LazyQueryResultTuple,\n QueryResult,\n} from '../types/types';\nimport { useInternalState } from './useQuery';\nimport { useApolloClient } from './useApolloClient';\n\n// The following methods, when called will execute the query, regardless of\n// whether the useLazyQuery execute function was called before.\nconst EAGER_METHODS = [\n 'refetch',\n 'reobserve',\n 'fetchMore',\n 'updateQuery',\n 'startPolling',\n 'subscribeToMore',\n] as const;\n\nexport function useLazyQuery<TData = any, TVariables = OperationVariables>(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options?: LazyQueryHookOptions<TData, TVariables>\n): LazyQueryResultTuple<TData, TVariables> {\n const internalState = useInternalState(\n useApolloClient(options && options.client),\n query,\n );\n\n const execOptionsRef = useRef<Partial<LazyQueryHookOptions<TData, TVariables>>>();\n\n const useQueryResult = internalState.useQuery({\n ...options,\n ...execOptionsRef.current,\n skip: !execOptionsRef.current,\n });\n\n const initialFetchPolicy =\n useQueryResult.observable.options.initialFetchPolicy ||\n internalState.getDefaultFetchPolicy();\n\n const result: QueryResult<TData, TVariables> =\n Object.assign(useQueryResult, {\n called: !!execOptionsRef.current,\n });\n\n // We use useMemo here to make sure the eager methods have a stable identity.\n const eagerMethods = useMemo(() => {\n const eagerMethods: Record<string, any> = {};\n for (const key of EAGER_METHODS) {\n const method = result[key];\n eagerMethods[key] = function () {\n if (!execOptionsRef.current) {\n execOptionsRef.current = Object.create(null);\n // Only the first time populating execOptionsRef.current matters here.\n internalState.forceUpdate();\n }\n return method.apply(this, arguments);\n };\n }\n\n return eagerMethods;\n }, []);\n\n Object.assign(result, eagerMethods);\n\n const execute = useCallback<\n LazyQueryResultTuple<TData, TVariables>[0]\n >(executeOptions => {\n execOptionsRef.current = executeOptions ? {\n ...executeOptions,\n fetchPolicy: executeOptions.fetchPolicy || initialFetchPolicy,\n } : {\n fetchPolicy: initialFetchPolicy,\n };\n\n const promise = internalState\n .asyncUpdate() // Like internalState.forceUpdate, but returns a Promise.\n .then(queryResult => Object.assign(queryResult, eagerMethods));\n\n // Because the return value of `useLazyQuery` is usually floated, we need\n // to catch the promise to prevent unhandled rejections.\n promise.catch(() => {});\n\n return promise;\n }, []);\n\n return [execute, result];\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { OperationVariables } from '../../core';
1
+ import { OperationVariables, WatchQueryFetchPolicy } from '../../core';
2
2
  import { ApolloClient, ApolloQueryResult, DocumentNode, TypedDocumentNode } from '../../core';
3
3
  import { QueryHookOptions, QueryResult } from '../types/types';
4
4
  import { useApolloClient } from './useApolloClient';
@@ -9,6 +9,9 @@ declare class InternalState<TData, TVariables> {
9
9
  readonly query: DocumentNode | TypedDocumentNode<TData, TVariables>;
10
10
  constructor(client: ReturnType<typeof useApolloClient>, query: DocumentNode | TypedDocumentNode<TData, TVariables>);
11
11
  forceUpdate(): void;
12
+ asyncUpdate(): Promise<QueryResult<TData, TVariables>>;
13
+ private asyncResolveFns;
14
+ private optionsToIgnoreOnce;
12
15
  useQuery(options: QueryHookOptions<TData, TVariables>): QueryResult<TData, TVariables>;
13
16
  private renderPromises;
14
17
  private queryHookOptions;
@@ -17,6 +20,7 @@ declare class InternalState<TData, TVariables> {
17
20
  private ssrDisabledResult;
18
21
  private skipStandbyResult;
19
22
  private createWatchQueryOptions;
23
+ getDefaultFetchPolicy(): WatchQueryFetchPolicy;
20
24
  private onCompleted;
21
25
  private onError;
22
26
  private observable;
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EACL,YAAY,EACZ,iBAAiB,EAGjB,YAAY,EACZ,iBAAiB,EAElB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASpD,wBAAgB,QAAQ,CACtB,KAAK,GAAG,GAAG,EACX,UAAU,GAAG,kBAAkB,EAE/B,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1D,OAAO,GAAE,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAuB,GACjE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAKhC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAChD,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,GACzD,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAuBlC;AAED,cAAM,aAAa,CAAC,KAAK,EAAE,UAAU;aAEjB,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC;aAC1C,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;gBAD1D,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EAC1C,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;IAK5E,WAAW;IAOX,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC;IAwGrD,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,iBAAiB,CAAuC;IAEhE,OAAO,CAAC,UAAU;IAmElB,OAAO,CAAC,iBAAiB,CAKtB;IAEH,OAAO,CAAC,iBAAiB,CAKtB;IAGH,OAAO,CAAC,uBAAuB;IAqH/B,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,kBAAkB;IAyC1B,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB,CAGtB;IAEJ,aAAa,CACX,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAC/B,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;IA2BjC,OAAO,CAAC,0BAA0B;CAoBnC"}
1
+ {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGrF,OAAO,EACL,YAAY,EACZ,iBAAiB,EAGjB,YAAY,EACZ,iBAAiB,EAElB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASpD,wBAAgB,QAAQ,CACtB,KAAK,GAAG,GAAG,EACX,UAAU,GAAG,kBAAkB,EAE/B,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1D,OAAO,GAAE,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAuB,GACjE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAKhC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAChD,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,GACzD,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAuBlC;AAED,cAAM,aAAa,CAAC,KAAK,EAAE,UAAU;aAEjB,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC;aAC1C,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;gBAD1D,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EAC1C,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;IAK5E,WAAW;IAKX,WAAW;IAQX,OAAO,CAAC,eAAe,CAEnB;IAEJ,OAAO,CAAC,mBAAmB,CAEvB;IAKJ,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC;IAgHrD,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,iBAAiB,CAAuC;IAEhE,OAAO,CAAC,UAAU;IA0FlB,OAAO,CAAC,iBAAiB,CAKtB;IAEH,OAAO,CAAC,iBAAiB,CAKtB;IAGH,OAAO,CAAC,uBAAuB;IAuD/B,qBAAqB,IAAI,qBAAqB;IAW9C,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,kBAAkB;IA6C1B,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB,CAGtB;IAEJ,aAAa,CACX,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAC/B,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;IA2BjC,OAAO,CAAC,0BAA0B;CAoBnC"}
@@ -1,6 +1,7 @@
1
1
  import { __assign, __rest } from "tslib";
2
+ import { invariant } from "../../utilities/globals/index.js";
2
3
  import { useCallback, useContext, useMemo, useRef, useState, } from 'react';
3
- import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
4
+ import { useSyncExternalStore } from "./useSyncExternalStore.js";
4
5
  import { equal } from '@wry/equality';
5
6
  import { mergeOptions } from "../../core/index.js";
6
7
  import { getApolloContext } from "../context/index.js";
@@ -8,7 +9,7 @@ import { ApolloError } from "../../errors/index.js";
8
9
  import { NetworkStatus, } from "../../core/index.js";
9
10
  import { DocumentType, verifyDocumentType } from "../parser/index.js";
10
11
  import { useApolloClient } from "./useApolloClient.js";
11
- import { canUseWeakMap, isNonEmptyArray, maybeDeepFreeze } from "../../utilities/index.js";
12
+ import { canUseWeakMap, canUseWeakSet, isNonEmptyArray, maybeDeepFreeze } from "../../utilities/index.js";
12
13
  var hasOwnProperty = Object.prototype.hasOwnProperty;
13
14
  export function useQuery(query, options) {
14
15
  if (options === void 0) { options = Object.create(null); }
@@ -32,6 +33,8 @@ var InternalState = (function () {
32
33
  function InternalState(client, query) {
33
34
  this.client = client;
34
35
  this.query = query;
36
+ this.asyncResolveFns = new Set();
37
+ this.optionsToIgnoreOnce = new (canUseWeakSet ? WeakSet : Set)();
35
38
  this.ssrDisabledResult = maybeDeepFreeze({
36
39
  loading: true,
37
40
  data: void 0,
@@ -48,6 +51,15 @@ var InternalState = (function () {
48
51
  verifyDocumentType(query, DocumentType.Query);
49
52
  }
50
53
  InternalState.prototype.forceUpdate = function () {
54
+ __DEV__ && invariant.warn("Calling default no-op implementation of InternalState#forceUpdate");
55
+ };
56
+ InternalState.prototype.asyncUpdate = function () {
57
+ var _this = this;
58
+ return new Promise(function (resolve) {
59
+ _this.asyncResolveFns.add(resolve);
60
+ _this.optionsToIgnoreOnce.add(_this.watchQueryOptions);
61
+ _this.forceUpdate();
62
+ });
51
63
  };
52
64
  InternalState.prototype.useQuery = function (options) {
53
65
  var _this = this;
@@ -100,17 +112,24 @@ var InternalState = (function () {
100
112
  obsQuery,
101
113
  this.renderPromises,
102
114
  this.client.disableNetworkFetches,
103
- ]), function () { return _this.getCurrentResult(); });
115
+ ]), function () { return _this.getCurrentResult(); }, function () { return _this.getCurrentResult(); });
104
116
  this.unsafeHandlePartialRefetch(result);
105
- return this.toQueryResult(result);
117
+ var queryResult = this.toQueryResult(result);
118
+ if (!queryResult.loading && this.asyncResolveFns.size) {
119
+ this.asyncResolveFns.forEach(function (resolve) { return resolve(queryResult); });
120
+ this.asyncResolveFns.clear();
121
+ }
122
+ return queryResult;
106
123
  };
107
124
  InternalState.prototype.useOptions = function (options) {
108
125
  var _a;
109
126
  var watchQueryOptions = this.createWatchQueryOptions(this.queryHookOptions = options);
110
127
  var currentWatchQueryOptions = this.watchQueryOptions;
111
- if (!equal(watchQueryOptions, currentWatchQueryOptions)) {
128
+ if (this.optionsToIgnoreOnce.has(currentWatchQueryOptions) ||
129
+ !equal(watchQueryOptions, currentWatchQueryOptions)) {
112
130
  this.watchQueryOptions = watchQueryOptions;
113
131
  if (currentWatchQueryOptions && this.observable) {
132
+ this.optionsToIgnoreOnce.delete(currentWatchQueryOptions);
114
133
  this.observable.reobserve(watchQueryOptions);
115
134
  this.previousData = ((_a = this.result) === null || _a === void 0 ? void 0 : _a.data) || this.previousData;
116
135
  this.result = void 0;
@@ -119,7 +138,8 @@ var InternalState = (function () {
119
138
  this.onCompleted = options.onCompleted || InternalState.prototype.onCompleted;
120
139
  this.onError = options.onError || InternalState.prototype.onError;
121
140
  if ((this.renderPromises || this.client.disableNetworkFetches) &&
122
- this.queryHookOptions.ssr === false) {
141
+ this.queryHookOptions.ssr === false &&
142
+ !this.queryHookOptions.skip) {
123
143
  this.result = this.ssrDisabledResult;
124
144
  }
125
145
  else if (this.queryHookOptions.skip ||
@@ -132,51 +152,38 @@ var InternalState = (function () {
132
152
  }
133
153
  };
134
154
  InternalState.prototype.createWatchQueryOptions = function (_a) {
155
+ var _b;
135
156
  if (_a === void 0) { _a = {}; }
136
157
  var skip = _a.skip, ssr = _a.ssr, onCompleted = _a.onCompleted, onError = _a.onError, displayName = _a.displayName, defaultOptions = _a.defaultOptions, otherOptions = __rest(_a, ["skip", "ssr", "onCompleted", "onError", "displayName", "defaultOptions"]);
137
- var toMerge = [];
138
- var globalDefaults = this.client.defaultOptions.watchQuery;
139
- if (globalDefaults)
140
- toMerge.push(globalDefaults);
141
- if (defaultOptions)
142
- toMerge.push(defaultOptions);
143
- var latestOptions = this.observable && this.observable.options;
144
- if (latestOptions && toMerge.length) {
145
- var defaults_1 = toMerge.reduce(mergeOptions, Object.create(null));
146
- toMerge.length = 1;
147
- toMerge[0] = defaults_1;
148
- Object.keys(defaults_1).forEach(function (defaultOptionName) {
149
- var currentOptionValue = latestOptions[defaultOptionName];
150
- if (hasOwnProperty.call(latestOptions, defaultOptionName) &&
151
- !equal(defaults_1[defaultOptionName], currentOptionValue)) {
152
- defaults_1[defaultOptionName] = defaultOptionName === "variables"
153
- ? __assign(__assign({}, defaults_1.variables), currentOptionValue) : currentOptionValue;
154
- }
155
- });
156
- }
157
- toMerge.push(otherOptions);
158
- var merged = toMerge.reduce(mergeOptions, Object.create(null));
159
- var watchQueryOptions = Object.assign(merged, { query: this.query });
158
+ var watchQueryOptions = Object.assign(otherOptions, { query: this.query });
160
159
  if (this.renderPromises &&
161
160
  (watchQueryOptions.fetchPolicy === 'network-only' ||
162
161
  watchQueryOptions.fetchPolicy === 'cache-and-network')) {
163
162
  watchQueryOptions.fetchPolicy = 'cache-first';
164
163
  }
165
- else if (!watchQueryOptions.fetchPolicy) {
166
- watchQueryOptions.fetchPolicy = 'cache-first';
164
+ if (!watchQueryOptions.variables) {
165
+ watchQueryOptions.variables = {};
167
166
  }
168
167
  if (skip) {
169
- var _b = watchQueryOptions.initialFetchPolicy, initialFetchPolicy = _b === void 0 ? watchQueryOptions.fetchPolicy : _b;
168
+ var _c = watchQueryOptions.fetchPolicy, fetchPolicy = _c === void 0 ? this.getDefaultFetchPolicy() : _c, _d = watchQueryOptions.initialFetchPolicy, initialFetchPolicy = _d === void 0 ? fetchPolicy : _d;
170
169
  Object.assign(watchQueryOptions, {
171
170
  initialFetchPolicy: initialFetchPolicy,
172
171
  fetchPolicy: 'standby',
173
172
  });
174
173
  }
175
- if (!watchQueryOptions.variables) {
176
- watchQueryOptions.variables = {};
174
+ else if (!watchQueryOptions.fetchPolicy) {
175
+ watchQueryOptions.fetchPolicy =
176
+ ((_b = this.observable) === null || _b === void 0 ? void 0 : _b.options.initialFetchPolicy) ||
177
+ this.getDefaultFetchPolicy();
177
178
  }
178
179
  return watchQueryOptions;
179
180
  };
181
+ InternalState.prototype.getDefaultFetchPolicy = function () {
182
+ var _a, _b;
183
+ return (((_a = this.queryHookOptions.defaultOptions) === null || _a === void 0 ? void 0 : _a.fetchPolicy) ||
184
+ ((_b = this.client.defaultOptions.watchQuery) === null || _b === void 0 ? void 0 : _b.fetchPolicy) ||
185
+ "cache-first");
186
+ };
180
187
  InternalState.prototype.onCompleted = function (data) { };
181
188
  InternalState.prototype.onError = function (error) { };
182
189
  InternalState.prototype.useObservableQuery = function () {
@@ -184,7 +191,7 @@ var InternalState = (function () {
184
191
  this.renderPromises
185
192
  && this.renderPromises.getSSRObservable(this.watchQueryOptions)
186
193
  || this.observable
187
- || this.client.watchQuery(__assign({}, this.watchQueryOptions));
194
+ || this.client.watchQuery(mergeOptions(this.queryHookOptions.defaultOptions, this.watchQueryOptions));
188
195
  this.obsQueryFields = useMemo(function () { return ({
189
196
  refetch: obsQuery.refetch.bind(obsQuery),
190
197
  reobserve: obsQuery.reobserve.bind(obsQuery),
@@ -194,11 +201,11 @@ var InternalState = (function () {
194
201
  stopPolling: obsQuery.stopPolling.bind(obsQuery),
195
202
  subscribeToMore: obsQuery.subscribeToMore.bind(obsQuery),
196
203
  }); }, [obsQuery]);
197
- if (this.renderPromises) {
204
+ var ssrAllowed = !(this.queryHookOptions.ssr === false ||
205
+ this.queryHookOptions.skip);
206
+ if (this.renderPromises && ssrAllowed) {
198
207
  this.renderPromises.registerSSRObservable(obsQuery);
199
- var ssrAllowed = !(this.queryHookOptions.ssr === false ||
200
- this.queryHookOptions.skip);
201
- if (ssrAllowed && obsQuery.getCurrentResult().loading) {
208
+ if (obsQuery.getCurrentResult().loading) {
202
209
  this.renderPromises.addObservableQueryPromise(obsQuery);
203
210
  }
204
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';\nimport { equal } from '@wry/equality';\n\nimport { mergeOptions, OperationVariables } from '../../core';\nimport { ApolloContextValue, getApolloContext } from '../context';\nimport { ApolloError } from '../../errors';\nimport {\n ApolloClient,\n ApolloQueryResult,\n NetworkStatus,\n ObservableQuery,\n DocumentNode,\n TypedDocumentNode,\n WatchQueryOptions,\n} from '../../core';\nimport {\n QueryHookOptions,\n QueryResult,\n ObservableQueryFields,\n} from '../types/types';\n\nimport { DocumentType, verifyDocumentType } from '../parser';\nimport { useApolloClient } from './useApolloClient';\nimport { canUseWeakMap, isNonEmptyArray, maybeDeepFreeze } from '../../utilities';\n\nconst {\n prototype: {\n hasOwnProperty,\n },\n} = Object;\n\nexport function useQuery<\n TData = any,\n TVariables = OperationVariables,\n>(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options: QueryHookOptions<TData, TVariables> = Object.create(null),\n): QueryResult<TData, TVariables> {\n return useInternalState(\n useApolloClient(options.client),\n query,\n ).useQuery(options);\n}\n\nexport function useInternalState<TData, TVariables>(\n client: ApolloClient<any>,\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n): InternalState<TData, TVariables> {\n const stateRef = useRef<InternalState<TData, TVariables>>();\n if (\n !stateRef.current ||\n client !== stateRef.current.client ||\n query !== stateRef.current.query\n ) {\n stateRef.current = new InternalState(client, query);\n }\n const state = stateRef.current;\n\n // By default, InternalState.prototype.forceUpdate is an empty function, but\n // we replace it here (before anyone has had a chance to see this state yet)\n // with a function that unconditionally forces an update, using the latest\n // setTick function. Updating this state by calling state.forceUpdate is the\n // only way we trigger React component updates (no other useState calls within\n // the InternalState class).\n const [_tick, setTick] = useState(0);\n state.forceUpdate = () => {\n setTick(tick => tick + 1);\n };\n\n return state;\n}\n\nclass InternalState<TData, TVariables> {\n constructor(\n public readonly client: ReturnType<typeof useApolloClient>,\n public readonly query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n ) {\n verifyDocumentType(query, DocumentType.Query);\n }\n\n forceUpdate() {\n // Replaced (in useInternalState) with a method that triggers an update.\n }\n\n // Methods beginning with use- should be called according to the standard\n // rules of React hooks: only at the top level of the calling function, and\n // without any dynamic conditional logic.\n useQuery(options: QueryHookOptions<TData, TVariables>) {\n // The renderPromises field gets initialized here in the useQuery method, at\n // the beginning of everything (for a given component rendering, at least),\n // so we can safely use this.renderPromises in other/later InternalState\n // methods without worrying it might be uninitialized. Even after\n // initialization, this.renderPromises is usually undefined (unless SSR is\n // happening), but that's fine as long as it has been initialized that way,\n // rather than left uninitialized.\n this.renderPromises = useContext(getApolloContext()).renderPromises;\n\n this.useOptions(options);\n\n const obsQuery = this.useObservableQuery();\n\n const result = useSyncExternalStore(\n useCallback(() => {\n if (this.renderPromises) {\n return () => {};\n }\n\n const onNext = () => {\n const previousResult = this.result;\n // We use `getCurrentResult()` instead of the onNext argument because\n // the values differ slightly. Specifically, loading results will have\n // an empty object for data instead of `undefined` for some reason.\n const result = obsQuery.getCurrentResult();\n // Make sure we're not attempting to re-render similar results\n if (\n previousResult &&\n previousResult.loading === result.loading &&\n previousResult.networkStatus === result.networkStatus &&\n equal(previousResult.data, result.data)\n ) {\n return;\n }\n\n this.setResult(result);\n };\n\n const onError = (error: Error) => {\n const last = obsQuery[\"last\"];\n subscription.unsubscribe();\n // Unfortunately, if `lastError` is set in the current\n // `observableQuery` when the subscription is re-created,\n // the subscription will immediately receive the error, which will\n // cause it to terminate again. To avoid this, we first clear\n // the last error/result from the `observableQuery` before re-starting\n // the subscription, and restore it afterwards (so the subscription\n // has a chance to stay open).\n try {\n obsQuery.resetLastResults();\n subscription = obsQuery.subscribe(onNext, onError);\n } finally {\n obsQuery[\"last\"] = last;\n }\n\n if (!hasOwnProperty.call(error, 'graphQLErrors')) {\n // The error is not a GraphQL error\n throw error;\n }\n\n const previousResult = this.result;\n if (\n !previousResult ||\n (previousResult && previousResult.loading) ||\n !equal(error, previousResult.error)\n ) {\n this.setResult({\n data: (previousResult && previousResult.data) as TData,\n error: error as ApolloError,\n loading: false,\n networkStatus: NetworkStatus.error,\n });\n }\n };\n\n let subscription = obsQuery.subscribe(onNext, onError);\n\n return () => subscription.unsubscribe();\n }, [\n // We memoize the subscribe function using useCallback and the following\n // dependency keys, because the subscribe function reference is all that\n // useSyncExternalStore uses internally as a dependency key for the\n // useEffect ultimately responsible for the subscription, so we are\n // effectively passing this dependency array to that useEffect buried\n // inside useSyncExternalStore, as desired.\n obsQuery,\n this.renderPromises,\n this.client.disableNetworkFetches,\n ]),\n\n () => this.getCurrentResult(),\n );\n\n // TODO Remove this method when we remove support for options.partialRefetch.\n this.unsafeHandlePartialRefetch(result);\n\n return this.toQueryResult(result);\n }\n\n // These members (except for renderPromises) are all populated by the\n // useOptions method, which is called unconditionally at the beginning of the\n // useQuery method, so we can safely use these members in other/later methods\n // without worrying they might be uninitialized.\n private renderPromises: ApolloContextValue[\"renderPromises\"];\n private queryHookOptions: QueryHookOptions<TData, TVariables>;\n private watchQueryOptions: WatchQueryOptions<TVariables, TData>;\n\n private useOptions(\n options: QueryHookOptions<TData, TVariables>,\n ) {\n const watchQueryOptions = this.createWatchQueryOptions(\n this.queryHookOptions = options,\n );\n\n // Update this.watchQueryOptions, but only when they have changed, which\n // allows us to depend on the referential stability of\n // this.watchQueryOptions elsewhere.\n const currentWatchQueryOptions = this.watchQueryOptions;\n if (!equal(watchQueryOptions, currentWatchQueryOptions)) {\n this.watchQueryOptions = watchQueryOptions;\n if (currentWatchQueryOptions && this.observable) {\n // Though it might be tempting to postpone this reobserve call to the\n // useEffect block, we need getCurrentResult to return an appropriate\n // loading:true result synchronously (later within the same call to\n // useQuery). Since we already have this.observable here (not true for\n // the very first call to useQuery), we are not initiating any new\n // subscriptions, though it does feel less than ideal that reobserve\n // (potentially) kicks off a network request (for example, when the\n // variables have changed), which is technically a side-effect.\n this.observable.reobserve(watchQueryOptions);\n this.previousData = this.result?.data || this.previousData;\n this.result = void 0;\n }\n }\n\n // Make sure state.onCompleted and state.onError always reflect the latest\n // options.onCompleted and options.onError callbacks provided to useQuery,\n // since those functions are often recreated every time useQuery is called.\n // Like the forceUpdate method, the versions of these methods inherited from\n // InternalState.prototype are empty no-ops, but we can override them on the\n // base state object (without modifying the prototype).\n this.onCompleted = options.onCompleted || InternalState.prototype.onCompleted;\n this.onError = options.onError || InternalState.prototype.onError;\n\n if (\n (this.renderPromises || this.client.disableNetworkFetches) &&\n this.queryHookOptions.ssr === false\n ) {\n // If SSR has been explicitly disabled, and this function has been called\n // on the server side, return the default loading state.\n this.result = this.ssrDisabledResult;\n } else if (\n this.queryHookOptions.skip ||\n this.watchQueryOptions.fetchPolicy === 'standby'\n ) {\n // When skipping a query (ie. we're not querying for data but still want to\n // render children), make sure the `data` is cleared out and `loading` is\n // set to `false` (since we aren't loading anything).\n //\n // NOTE: We no longer think this is the correct behavior. Skipping should\n // not automatically set `data` to `undefined`, but instead leave the\n // previous data in place. In other words, skipping should not mandate that\n // previously received data is all of a sudden removed. Unfortunately,\n // changing this is breaking, so we'll have to wait until Apollo Client 4.0\n // to address this.\n this.result = this.skipStandbyResult;\n } else if (\n this.result === this.ssrDisabledResult ||\n this.result === this.skipStandbyResult\n ) {\n this.result = void 0;\n }\n }\n\n private ssrDisabledResult = maybeDeepFreeze({\n loading: true,\n data: void 0 as unknown as TData,\n error: void 0,\n networkStatus: NetworkStatus.loading,\n });\n\n private skipStandbyResult = maybeDeepFreeze({\n loading: false,\n data: void 0 as unknown as TData,\n error: void 0,\n networkStatus: NetworkStatus.ready,\n });\n\n // A function to massage options before passing them to ObservableQuery.\n private createWatchQueryOptions({\n skip,\n ssr,\n onCompleted,\n onError,\n displayName,\n defaultOptions,\n // The above options are useQuery-specific, so this ...otherOptions spread\n // makes otherOptions almost a WatchQueryOptions object, except for the\n // query property that we add below.\n ...otherOptions\n }: QueryHookOptions<TData, TVariables> = {}): WatchQueryOptions<TVariables, TData> {\n // We use the mergeOptions helper function (which uses compact(...) and\n // shallow-merges variables) to combine globalDefaults with any local\n // defaultOptions provided to useQuery.\n const toMerge: Partial<WatchQueryOptions<TVariables, TData>>[] = [];\n\n // Merge global client.watchQuery default options with the lowest priority.\n const globalDefaults = this.client.defaultOptions.watchQuery;\n if (globalDefaults) toMerge.push(globalDefaults);\n\n // Next, merge any defaultOptions passed directly to useQuery.\n if (defaultOptions) toMerge.push(defaultOptions);\n\n const latestOptions = this.observable && this.observable.options;\n if (latestOptions && toMerge.length) {\n // If we already have this.watchQueryOptions, those options should take\n // precedence over default options of the same name. It might be simpler\n // to do toMerge.push(this.watchQueryOptions), but that potentially\n // (re)injects unrelated/unwanted options. Passing Object.create(null) as\n // the second argument to toMerge.reduce ensures the result is a newly\n // created object, so we can safely modify it in the forEach loop below.\n const defaults = toMerge.reduce(mergeOptions, Object.create(null));\n\n // Compact the toMerge array to hold only the merged defaults. This is\n // equivalent to toMerge.splice(0, toMerge.length, defaults).\n toMerge.length = 1;\n toMerge[0] = defaults;\n\n Object.keys(defaults).forEach(\n (defaultOptionName: keyof WatchQueryOptions<TVariables, TData>) => {\n const currentOptionValue = latestOptions[defaultOptionName];\n if (\n hasOwnProperty.call(latestOptions, defaultOptionName) &&\n !equal(defaults[defaultOptionName], currentOptionValue)\n ) {\n // If you keep passing useQuery({ defaultOptions: { variables }}),\n // those default variables continue to provide their default values\n // every time, though in most cases this.watchQueryOptions.variables\n // will have a current value for every default variable name, so the\n // defaults don't matter. However, if a variable has been removed\n // from this.watchQueryOptions.variables, future useQuery calls can\n // restore its default value from defaultOptions.variables.\n defaults[defaultOptionName] = defaultOptionName === \"variables\"\n ? { ...defaults.variables, ...currentOptionValue }\n : currentOptionValue;\n }\n },\n );\n }\n\n // Give highest precedence to any non-default WatchQueryOptions passed\n // directly to useQuery.\n toMerge.push(otherOptions);\n\n const merged = toMerge.reduce(mergeOptions, Object.create(null));\n\n // This Object.assign is safe because merged is the fresh object created by\n // the Object.create(null) argument to toMerge.reduce.\n const watchQueryOptions: WatchQueryOptions<TVariables, TData> =\n Object.assign(merged, { query: this.query });\n\n if (\n this.renderPromises &&\n (\n watchQueryOptions.fetchPolicy === 'network-only' ||\n watchQueryOptions.fetchPolicy === 'cache-and-network'\n )\n ) {\n // this behavior was added to react-apollo without explanation in this PR\n // https://github.com/apollographql/react-apollo/pull/1579\n watchQueryOptions.fetchPolicy = 'cache-first';\n } else if (!watchQueryOptions.fetchPolicy) {\n // We applied all available fetchPolicy default values above (from\n // globalDefaults and defaultOptions), so, if fetchPolicy is still\n // undefined, fall back to the default default (no typo), cache-first.\n watchQueryOptions.fetchPolicy = 'cache-first';\n }\n\n if (skip) {\n const {\n // The watchQueryOptions.initialFetchPolicy field usually defaults to\n // watchQueryOptions.fetchPolicy, which has now been properly\n // defaulted/initialized. However, watchQueryOptions.initialFetchPolicy\n // can be provided explicitly instead, if more control is desired.\n initialFetchPolicy = watchQueryOptions.fetchPolicy,\n } = watchQueryOptions;\n\n // When skipping, we set watchQueryOptions.fetchPolicy initially to\n // \"standby\", but we also need/want to preserve the initial non-standby\n // fetchPolicy that would have been used if not skipping.\n Object.assign(watchQueryOptions, {\n initialFetchPolicy,\n fetchPolicy: 'standby',\n });\n }\n\n if (!watchQueryOptions.variables) {\n watchQueryOptions.variables = {} as TVariables;\n }\n\n return watchQueryOptions;\n }\n\n // Defining these methods as no-ops on the prototype allows us to call\n // state.onCompleted and/or state.onError without worrying about whether a\n // callback was provided.\n private onCompleted(data: TData) {}\n private onError(error: ApolloError) {}\n\n private observable: ObservableQuery<TData, TVariables>;\n private obsQueryFields: Omit<\n ObservableQueryFields<TData, TVariables>,\n \"variables\"\n >;\n\n private useObservableQuery() {\n // See if there is an existing observable that was used to fetch the same\n // data and if so, use it instead since it will contain the proper queryId\n // to fetch the result set. This is used during SSR.\n const obsQuery = this.observable =\n this.renderPromises\n && this.renderPromises.getSSRObservable(this.watchQueryOptions)\n || this.observable // Reuse this.observable if possible (and not SSR)\n || this.client.watchQuery({\n ...this.watchQueryOptions,\n });\n\n this.obsQueryFields = useMemo(() => ({\n refetch: obsQuery.refetch.bind(obsQuery),\n reobserve: obsQuery.reobserve.bind(obsQuery),\n fetchMore: obsQuery.fetchMore.bind(obsQuery),\n updateQuery: obsQuery.updateQuery.bind(obsQuery),\n startPolling: obsQuery.startPolling.bind(obsQuery),\n stopPolling: obsQuery.stopPolling.bind(obsQuery),\n subscribeToMore: obsQuery.subscribeToMore.bind(obsQuery),\n }), [obsQuery]);\n\n if (this.renderPromises) {\n this.renderPromises.registerSSRObservable(obsQuery);\n\n const ssrAllowed = !(\n this.queryHookOptions.ssr === false ||\n this.queryHookOptions.skip\n );\n\n if (ssrAllowed && obsQuery.getCurrentResult().loading) {\n // TODO: This is a legacy API which could probably be cleaned up\n this.renderPromises.addObservableQueryPromise(obsQuery);\n }\n }\n\n return obsQuery;\n }\n\n // These members are populated by getCurrentResult and setResult, and it's\n // okay/normal for them to be initially undefined.\n private result: undefined | ApolloQueryResult<TData>;\n private previousData: undefined | TData;\n\n private setResult(nextResult: ApolloQueryResult<TData>) {\n const previousResult = this.result;\n if (previousResult && previousResult.data) {\n this.previousData = previousResult.data;\n }\n this.result = nextResult;\n // Calling state.setResult always triggers an update, though some call sites\n // perform additional equality checks before committing to an update.\n this.forceUpdate();\n this.handleErrorOrCompleted(nextResult);\n }\n\n private handleErrorOrCompleted(result: ApolloQueryResult<TData>) {\n if (!result.loading) {\n if (result.error) {\n this.onError(result.error);\n } else if (result.data) {\n this.onCompleted(result.data);\n }\n }\n }\n\n private getCurrentResult(): ApolloQueryResult<TData> {\n // Using this.result as a cache ensures getCurrentResult continues returning\n // the same (===) result object, unless state.setResult has been called, or\n // we're doing server rendering and therefore override the result below.\n if (!this.result) {\n this.handleErrorOrCompleted(\n this.result = this.observable.getCurrentResult()\n );\n }\n return this.result;\n }\n\n // This cache allows the referential stability of this.result (as returned by\n // getCurrentResult) to translate into referential stability of the resulting\n // QueryResult object returned by toQueryResult.\n private toQueryResultCache = new (canUseWeakMap ? WeakMap : Map)<\n ApolloQueryResult<TData>,\n QueryResult<TData, TVariables>\n >();\n\n toQueryResult(\n result: ApolloQueryResult<TData>,\n ): QueryResult<TData, TVariables> {\n let queryResult = this.toQueryResultCache.get(result);\n if (queryResult) return queryResult;\n\n const { data, partial, ...resultWithoutPartial } = result;\n this.toQueryResultCache.set(result, queryResult = {\n data, // Ensure always defined, even if result.data is missing.\n ...resultWithoutPartial,\n ...this.obsQueryFields,\n client: this.client,\n observable: this.observable,\n variables: this.observable.variables,\n called: true,\n previousData: this.previousData,\n });\n\n if (!queryResult.error && isNonEmptyArray(result.errors)) {\n // Until a set naming convention for networkError and graphQLErrors is\n // decided upon, we map errors (graphQLErrors) to the error options.\n // TODO: Is it possible for both result.error and result.errors to be\n // defined here?\n queryResult.error = new ApolloError({ graphQLErrors: result.errors });\n }\n\n return queryResult;\n }\n\n private unsafeHandlePartialRefetch(result: ApolloQueryResult<TData>) {\n // WARNING: SIDE-EFFECTS IN THE RENDER FUNCTION\n //\n // TODO: This code should be removed when the partialRefetch option is\n // removed. I was unable to get this hook to behave reasonably in certain\n // edge cases when this block was put in an effect.\n if (\n result.partial &&\n this.queryHookOptions.partialRefetch &&\n !result.loading &&\n (!result.data || Object.keys(result.data).length === 0) &&\n this.observable.options.fetchPolicy !== 'cache-only'\n ) {\n Object.assign(result, {\n loading: true,\n networkStatus: NetworkStatus.refetch,\n });\n this.observable.refetch();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from '../../utilities/globals';\n\nimport {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useSyncExternalStore } from './useSyncExternalStore';\nimport { equal } from '@wry/equality';\n\nimport { mergeOptions, OperationVariables, WatchQueryFetchPolicy } from '../../core';\nimport { ApolloContextValue, getApolloContext } from '../context';\nimport { ApolloError } from '../../errors';\nimport {\n ApolloClient,\n ApolloQueryResult,\n NetworkStatus,\n ObservableQuery,\n DocumentNode,\n TypedDocumentNode,\n WatchQueryOptions,\n} from '../../core';\nimport {\n QueryHookOptions,\n QueryResult,\n ObservableQueryFields,\n} from '../types/types';\n\nimport { DocumentType, verifyDocumentType } from '../parser';\nimport { useApolloClient } from './useApolloClient';\nimport { canUseWeakMap, canUseWeakSet, isNonEmptyArray, maybeDeepFreeze } from '../../utilities';\n\nconst {\n prototype: {\n hasOwnProperty,\n },\n} = Object;\n\nexport function useQuery<\n TData = any,\n TVariables = OperationVariables,\n>(\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options: QueryHookOptions<TData, TVariables> = Object.create(null),\n): QueryResult<TData, TVariables> {\n return useInternalState(\n useApolloClient(options.client),\n query,\n ).useQuery(options);\n}\n\nexport function useInternalState<TData, TVariables>(\n client: ApolloClient<any>,\n query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n): InternalState<TData, TVariables> {\n const stateRef = useRef<InternalState<TData, TVariables>>();\n if (\n !stateRef.current ||\n client !== stateRef.current.client ||\n query !== stateRef.current.query\n ) {\n stateRef.current = new InternalState(client, query);\n }\n const state = stateRef.current;\n\n // By default, InternalState.prototype.forceUpdate is an empty function, but\n // we replace it here (before anyone has had a chance to see this state yet)\n // with a function that unconditionally forces an update, using the latest\n // setTick function. Updating this state by calling state.forceUpdate is the\n // only way we trigger React component updates (no other useState calls within\n // the InternalState class).\n const [_tick, setTick] = useState(0);\n state.forceUpdate = () => {\n setTick(tick => tick + 1);\n };\n\n return state;\n}\n\nclass InternalState<TData, TVariables> {\n constructor(\n public readonly client: ReturnType<typeof useApolloClient>,\n public readonly query: DocumentNode | TypedDocumentNode<TData, TVariables>,\n ) {\n verifyDocumentType(query, DocumentType.Query);\n }\n\n forceUpdate() {\n // Replaced (in useInternalState) with a method that triggers an update.\n invariant.warn(\"Calling default no-op implementation of InternalState#forceUpdate\");\n }\n\n asyncUpdate() {\n return new Promise<QueryResult<TData, TVariables>>(resolve => {\n this.asyncResolveFns.add(resolve);\n this.optionsToIgnoreOnce.add(this.watchQueryOptions);\n this.forceUpdate();\n });\n }\n\n private asyncResolveFns = new Set<\n (result: QueryResult<TData, TVariables>) => void\n >();\n\n private optionsToIgnoreOnce = new (canUseWeakSet ? WeakSet : Set)<\n WatchQueryOptions<TVariables, TData>\n >();\n\n // Methods beginning with use- should be called according to the standard\n // rules of React hooks: only at the top level of the calling function, and\n // without any dynamic conditional logic.\n useQuery(options: QueryHookOptions<TData, TVariables>) {\n // The renderPromises field gets initialized here in the useQuery method, at\n // the beginning of everything (for a given component rendering, at least),\n // so we can safely use this.renderPromises in other/later InternalState\n // methods without worrying it might be uninitialized. Even after\n // initialization, this.renderPromises is usually undefined (unless SSR is\n // happening), but that's fine as long as it has been initialized that way,\n // rather than left uninitialized.\n this.renderPromises = useContext(getApolloContext()).renderPromises;\n\n this.useOptions(options);\n\n const obsQuery = this.useObservableQuery();\n\n const result = useSyncExternalStore(\n useCallback(() => {\n if (this.renderPromises) {\n return () => {};\n }\n\n const onNext = () => {\n const previousResult = this.result;\n // We use `getCurrentResult()` instead of the onNext argument because\n // the values differ slightly. Specifically, loading results will have\n // an empty object for data instead of `undefined` for some reason.\n const result = obsQuery.getCurrentResult();\n // Make sure we're not attempting to re-render similar results\n if (\n previousResult &&\n previousResult.loading === result.loading &&\n previousResult.networkStatus === result.networkStatus &&\n equal(previousResult.data, result.data)\n ) {\n return;\n }\n\n this.setResult(result);\n };\n\n const onError = (error: Error) => {\n const last = obsQuery[\"last\"];\n subscription.unsubscribe();\n // Unfortunately, if `lastError` is set in the current\n // `observableQuery` when the subscription is re-created,\n // the subscription will immediately receive the error, which will\n // cause it to terminate again. To avoid this, we first clear\n // the last error/result from the `observableQuery` before re-starting\n // the subscription, and restore it afterwards (so the subscription\n // has a chance to stay open).\n try {\n obsQuery.resetLastResults();\n subscription = obsQuery.subscribe(onNext, onError);\n } finally {\n obsQuery[\"last\"] = last;\n }\n\n if (!hasOwnProperty.call(error, 'graphQLErrors')) {\n // The error is not a GraphQL error\n throw error;\n }\n\n const previousResult = this.result;\n if (\n !previousResult ||\n (previousResult && previousResult.loading) ||\n !equal(error, previousResult.error)\n ) {\n this.setResult({\n data: (previousResult && previousResult.data) as TData,\n error: error as ApolloError,\n loading: false,\n networkStatus: NetworkStatus.error,\n });\n }\n };\n\n let subscription = obsQuery.subscribe(onNext, onError);\n\n return () => subscription.unsubscribe();\n }, [\n // We memoize the subscribe function using useCallback and the following\n // dependency keys, because the subscribe function reference is all that\n // useSyncExternalStore uses internally as a dependency key for the\n // useEffect ultimately responsible for the subscription, so we are\n // effectively passing this dependency array to that useEffect buried\n // inside useSyncExternalStore, as desired.\n obsQuery,\n this.renderPromises,\n this.client.disableNetworkFetches,\n ]),\n\n () => this.getCurrentResult(),\n () => this.getCurrentResult(),\n );\n\n // TODO Remove this method when we remove support for options.partialRefetch.\n this.unsafeHandlePartialRefetch(result);\n\n const queryResult = this.toQueryResult(result);\n\n if (!queryResult.loading && this.asyncResolveFns.size) {\n this.asyncResolveFns.forEach(resolve => resolve(queryResult));\n this.asyncResolveFns.clear();\n }\n\n return queryResult;\n }\n\n // These members (except for renderPromises) are all populated by the\n // useOptions method, which is called unconditionally at the beginning of the\n // useQuery method, so we can safely use these members in other/later methods\n // without worrying they might be uninitialized.\n private renderPromises: ApolloContextValue[\"renderPromises\"];\n private queryHookOptions: QueryHookOptions<TData, TVariables>;\n private watchQueryOptions: WatchQueryOptions<TVariables, TData>;\n\n private useOptions(\n options: QueryHookOptions<TData, TVariables>,\n ) {\n const watchQueryOptions = this.createWatchQueryOptions(\n this.queryHookOptions = options,\n );\n\n // Update this.watchQueryOptions, but only when they have changed, which\n // allows us to depend on the referential stability of\n // this.watchQueryOptions elsewhere.\n const currentWatchQueryOptions = this.watchQueryOptions;\n\n // To force this equality test to \"fail,\" thereby reliably triggering\n // observable.reobserve, add any current WatchQueryOptions object(s) you\n // want to be ignored to this.optionsToIgnoreOnce. A similar effect could be\n // achieved by nullifying this.watchQueryOptions so the equality test\n // immediately fails because currentWatchQueryOptions is null, but this way\n // we can promise a truthy this.watchQueryOptions at all times.\n if (\n this.optionsToIgnoreOnce.has(currentWatchQueryOptions) ||\n !equal(watchQueryOptions, currentWatchQueryOptions)\n ) {\n this.watchQueryOptions = watchQueryOptions;\n\n if (currentWatchQueryOptions && this.observable) {\n // As advertised in the -Once of this.optionsToIgnoreOnce, this trick is\n // only good for one forced execution of observable.reobserve per\n // ignored WatchQueryOptions object, though it is unlikely we will ever\n // see this exact currentWatchQueryOptions object again here, since we\n // just replaced this.watchQueryOptions with watchQueryOptions.\n this.optionsToIgnoreOnce.delete(currentWatchQueryOptions);\n\n // Though it might be tempting to postpone this reobserve call to the\n // useEffect block, we need getCurrentResult to return an appropriate\n // loading:true result synchronously (later within the same call to\n // useQuery). Since we already have this.observable here (not true for\n // the very first call to useQuery), we are not initiating any new\n // subscriptions, though it does feel less than ideal that reobserve\n // (potentially) kicks off a network request (for example, when the\n // variables have changed), which is technically a side-effect.\n this.observable.reobserve(watchQueryOptions);\n\n // Make sure getCurrentResult returns a fresh ApolloQueryResult<TData>,\n // but save the current data as this.previousData, just like setResult\n // usually does.\n this.previousData = this.result?.data || this.previousData;\n this.result = void 0;\n }\n }\n\n // Make sure state.onCompleted and state.onError always reflect the latest\n // options.onCompleted and options.onError callbacks provided to useQuery,\n // since those functions are often recreated every time useQuery is called.\n // Like the forceUpdate method, the versions of these methods inherited from\n // InternalState.prototype are empty no-ops, but we can override them on the\n // base state object (without modifying the prototype).\n this.onCompleted = options.onCompleted || InternalState.prototype.onCompleted;\n this.onError = options.onError || InternalState.prototype.onError;\n\n if (\n (this.renderPromises || this.client.disableNetworkFetches) &&\n this.queryHookOptions.ssr === false &&\n !this.queryHookOptions.skip\n ) {\n // If SSR has been explicitly disabled, and this function has been called\n // on the server side, return the default loading state.\n this.result = this.ssrDisabledResult;\n } else if (\n this.queryHookOptions.skip ||\n this.watchQueryOptions.fetchPolicy === 'standby'\n ) {\n // When skipping a query (ie. we're not querying for data but still want to\n // render children), make sure the `data` is cleared out and `loading` is\n // set to `false` (since we aren't loading anything).\n //\n // NOTE: We no longer think this is the correct behavior. Skipping should\n // not automatically set `data` to `undefined`, but instead leave the\n // previous data in place. In other words, skipping should not mandate that\n // previously received data is all of a sudden removed. Unfortunately,\n // changing this is breaking, so we'll have to wait until Apollo Client 4.0\n // to address this.\n this.result = this.skipStandbyResult;\n } else if (\n this.result === this.ssrDisabledResult ||\n this.result === this.skipStandbyResult\n ) {\n this.result = void 0;\n }\n }\n\n private ssrDisabledResult = maybeDeepFreeze({\n loading: true,\n data: void 0 as unknown as TData,\n error: void 0,\n networkStatus: NetworkStatus.loading,\n });\n\n private skipStandbyResult = maybeDeepFreeze({\n loading: false,\n data: void 0 as unknown as TData,\n error: void 0,\n networkStatus: NetworkStatus.ready,\n });\n\n // A function to massage options before passing them to ObservableQuery.\n private createWatchQueryOptions({\n skip,\n ssr,\n onCompleted,\n onError,\n displayName,\n defaultOptions,\n // The above options are useQuery-specific, so this ...otherOptions spread\n // makes otherOptions almost a WatchQueryOptions object, except for the\n // query property that we add below.\n ...otherOptions\n }: QueryHookOptions<TData, TVariables> = {}): WatchQueryOptions<TVariables, TData> {\n // This Object.assign is safe because otherOptions is a fresh ...rest object\n // that did not exist until just now, so modifications are still allowed.\n const watchQueryOptions: WatchQueryOptions<TVariables, TData> =\n Object.assign(otherOptions, { query: this.query });\n\n if (\n this.renderPromises &&\n (\n watchQueryOptions.fetchPolicy === 'network-only' ||\n watchQueryOptions.fetchPolicy === 'cache-and-network'\n )\n ) {\n // this behavior was added to react-apollo without explanation in this PR\n // https://github.com/apollographql/react-apollo/pull/1579\n watchQueryOptions.fetchPolicy = 'cache-first';\n }\n\n if (!watchQueryOptions.variables) {\n watchQueryOptions.variables = {} as TVariables;\n }\n\n if (skip) {\n const {\n fetchPolicy = this.getDefaultFetchPolicy(),\n initialFetchPolicy = fetchPolicy,\n } = watchQueryOptions;\n\n // When skipping, we set watchQueryOptions.fetchPolicy initially to\n // \"standby\", but we also need/want to preserve the initial non-standby\n // fetchPolicy that would have been used if not skipping.\n Object.assign(watchQueryOptions, {\n initialFetchPolicy,\n fetchPolicy: 'standby',\n });\n } else if (!watchQueryOptions.fetchPolicy) {\n watchQueryOptions.fetchPolicy =\n this.observable?.options.initialFetchPolicy ||\n this.getDefaultFetchPolicy();\n }\n\n return watchQueryOptions;\n }\n\n getDefaultFetchPolicy(): WatchQueryFetchPolicy {\n return (\n this.queryHookOptions.defaultOptions?.fetchPolicy ||\n this.client.defaultOptions.watchQuery?.fetchPolicy ||\n \"cache-first\"\n );\n }\n\n // Defining these methods as no-ops on the prototype allows us to call\n // state.onCompleted and/or state.onError without worrying about whether a\n // callback was provided.\n private onCompleted(data: TData) {}\n private onError(error: ApolloError) {}\n\n private observable: ObservableQuery<TData, TVariables>;\n private obsQueryFields: Omit<\n ObservableQueryFields<TData, TVariables>,\n \"variables\"\n >;\n\n private useObservableQuery() {\n // See if there is an existing observable that was used to fetch the same\n // data and if so, use it instead since it will contain the proper queryId\n // to fetch the result set. This is used during SSR.\n const obsQuery = this.observable =\n this.renderPromises\n && this.renderPromises.getSSRObservable(this.watchQueryOptions)\n || this.observable // Reuse this.observable if possible (and not SSR)\n || this.client.watchQuery(mergeOptions(\n // Any options.defaultOptions passed to useQuery serve as default\n // options because we use them only here, when first creating the\n // ObservableQuery by calling client.watchQuery.\n this.queryHookOptions.defaultOptions,\n this.watchQueryOptions,\n ));\n\n this.obsQueryFields = useMemo(() => ({\n refetch: obsQuery.refetch.bind(obsQuery),\n reobserve: obsQuery.reobserve.bind(obsQuery),\n fetchMore: obsQuery.fetchMore.bind(obsQuery),\n updateQuery: obsQuery.updateQuery.bind(obsQuery),\n startPolling: obsQuery.startPolling.bind(obsQuery),\n stopPolling: obsQuery.stopPolling.bind(obsQuery),\n subscribeToMore: obsQuery.subscribeToMore.bind(obsQuery),\n }), [obsQuery]);\n\n const ssrAllowed = !(\n this.queryHookOptions.ssr === false ||\n this.queryHookOptions.skip\n );\n\n if (this.renderPromises && ssrAllowed) {\n this.renderPromises.registerSSRObservable(obsQuery);\n\n if (obsQuery.getCurrentResult().loading) {\n // TODO: This is a legacy API which could probably be cleaned up\n this.renderPromises.addObservableQueryPromise(obsQuery);\n }\n }\n\n return obsQuery;\n }\n\n // These members are populated by getCurrentResult and setResult, and it's\n // okay/normal for them to be initially undefined.\n private result: undefined | ApolloQueryResult<TData>;\n private previousData: undefined | TData;\n\n private setResult(nextResult: ApolloQueryResult<TData>) {\n const previousResult = this.result;\n if (previousResult && previousResult.data) {\n this.previousData = previousResult.data;\n }\n this.result = nextResult;\n // Calling state.setResult always triggers an update, though some call sites\n // perform additional equality checks before committing to an update.\n this.forceUpdate();\n this.handleErrorOrCompleted(nextResult);\n }\n\n private handleErrorOrCompleted(result: ApolloQueryResult<TData>) {\n if (!result.loading) {\n if (result.error) {\n this.onError(result.error);\n } else if (result.data) {\n this.onCompleted(result.data);\n }\n }\n }\n\n private getCurrentResult(): ApolloQueryResult<TData> {\n // Using this.result as a cache ensures getCurrentResult continues returning\n // the same (===) result object, unless state.setResult has been called, or\n // we're doing server rendering and therefore override the result below.\n if (!this.result) {\n this.handleErrorOrCompleted(\n this.result = this.observable.getCurrentResult()\n );\n }\n return this.result;\n }\n\n // This cache allows the referential stability of this.result (as returned by\n // getCurrentResult) to translate into referential stability of the resulting\n // QueryResult object returned by toQueryResult.\n private toQueryResultCache = new (canUseWeakMap ? WeakMap : Map)<\n ApolloQueryResult<TData>,\n QueryResult<TData, TVariables>\n >();\n\n toQueryResult(\n result: ApolloQueryResult<TData>,\n ): QueryResult<TData, TVariables> {\n let queryResult = this.toQueryResultCache.get(result);\n if (queryResult) return queryResult;\n\n const { data, partial, ...resultWithoutPartial } = result;\n this.toQueryResultCache.set(result, queryResult = {\n data, // Ensure always defined, even if result.data is missing.\n ...resultWithoutPartial,\n ...this.obsQueryFields,\n client: this.client,\n observable: this.observable,\n variables: this.observable.variables,\n called: true,\n previousData: this.previousData,\n });\n\n if (!queryResult.error && isNonEmptyArray(result.errors)) {\n // Until a set naming convention for networkError and graphQLErrors is\n // decided upon, we map errors (graphQLErrors) to the error options.\n // TODO: Is it possible for both result.error and result.errors to be\n // defined here?\n queryResult.error = new ApolloError({ graphQLErrors: result.errors });\n }\n\n return queryResult;\n }\n\n private unsafeHandlePartialRefetch(result: ApolloQueryResult<TData>) {\n // WARNING: SIDE-EFFECTS IN THE RENDER FUNCTION\n //\n // TODO: This code should be removed when the partialRefetch option is\n // removed. I was unable to get this hook to behave reasonably in certain\n // edge cases when this block was put in an effect.\n if (\n result.partial &&\n this.queryHookOptions.partialRefetch &&\n !result.loading &&\n (!result.data || Object.keys(result.data).length === 0) &&\n this.observable.options.fetchPolicy !== 'cache-only'\n ) {\n Object.assign(result, {\n loading: true,\n networkStatus: NetworkStatus.refetch,\n });\n this.observable.refetch();\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useSubscription.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,kBAAkB,EAC1E,YAAY,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EACjE,OAAO,CAAC,EAAE,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,kCA4GrD"}
1
+ {"version":3,"file":"useSubscription.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,kBAAkB,EAC1E,YAAY,EAAE,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EACjE,OAAO,CAAC,EAAE,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,kCAqHrD"}
@@ -23,6 +23,12 @@ export function useSubscription(subscription, options) {
23
23
  context: options === null || options === void 0 ? void 0 : options.context,
24
24
  });
25
25
  }), observable = _b[0], setObservable = _b[1];
26
+ var canResetObservableRef = useRef(false);
27
+ useEffect(function () {
28
+ return function () {
29
+ canResetObservableRef.current = true;
30
+ };
31
+ }, []);
26
32
  var ref = useRef({ client: client, subscription: subscription, options: options });
27
33
  useEffect(function () {
28
34
  var _a, _b, _c, _d;
@@ -31,7 +37,7 @@ export function useSubscription(subscription, options) {
31
37
  shouldResubscribe = !!shouldResubscribe(options);
32
38
  }
33
39
  if (options === null || options === void 0 ? void 0 : options.skip) {
34
- if (!(options === null || options === void 0 ? void 0 : options.skip) !== !((_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.skip)) {
40
+ if (!(options === null || options === void 0 ? void 0 : options.skip) !== !((_a = ref.current.options) === null || _a === void 0 ? void 0 : _a.skip) || canResetObservableRef.current) {
35
41
  setResult({
36
42
  loading: false,
37
43
  data: void 0,
@@ -39,13 +45,16 @@ export function useSubscription(subscription, options) {
39
45
  variables: options === null || options === void 0 ? void 0 : options.variables,
40
46
  });
41
47
  setObservable(null);
48
+ canResetObservableRef.current = false;
42
49
  }
43
50
  }
44
- else if (shouldResubscribe !== false && (client !== ref.current.client ||
45
- subscription !== ref.current.subscription ||
46
- (options === null || options === void 0 ? void 0 : options.fetchPolicy) !== ((_b = ref.current.options) === null || _b === void 0 ? void 0 : _b.fetchPolicy) ||
47
- !(options === null || options === void 0 ? void 0 : options.skip) !== !((_c = ref.current.options) === null || _c === void 0 ? void 0 : _c.skip) ||
48
- !equal(options === null || options === void 0 ? void 0 : options.variables, (_d = ref.current.options) === null || _d === void 0 ? void 0 : _d.variables))) {
51
+ else if ((shouldResubscribe !== false &&
52
+ (client !== ref.current.client ||
53
+ subscription !== ref.current.subscription ||
54
+ (options === null || options === void 0 ? void 0 : options.fetchPolicy) !== ((_b = ref.current.options) === null || _b === void 0 ? void 0 : _b.fetchPolicy) ||
55
+ !(options === null || options === void 0 ? void 0 : options.skip) !== !((_c = ref.current.options) === null || _c === void 0 ? void 0 : _c.skip) ||
56
+ !equal(options === null || options === void 0 ? void 0 : options.variables, (_d = ref.current.options) === null || _d === void 0 ? void 0 : _d.variables))) ||
57
+ canResetObservableRef.current) {
49
58
  setResult({
50
59
  loading: true,
51
60
  data: void 0,
@@ -58,9 +67,10 @@ export function useSubscription(subscription, options) {
58
67
  fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
59
68
  context: options === null || options === void 0 ? void 0 : options.context,
60
69
  }));
70
+ canResetObservableRef.current = false;
61
71
  }
62
72
  Object.assign(ref.current, { client: client, subscription: subscription, options: options });
63
- }, [client, subscription, options]);
73
+ }, [client, subscription, options, canResetObservableRef.current]);
64
74
  useEffect(function () {
65
75
  if (!observable) {
66
76
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useSubscription.js","sourceRoot":"","sources":["../../../src/react/hooks/useSubscription.ts"],"names":[],"mappings":"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","sourcesContent":["import '../../utilities/globals';\nimport { useState, useRef, useEffect } from 'react';\nimport { DocumentNode } from 'graphql';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { equal } from '@wry/equality';\n\nimport { DocumentType, verifyDocumentType } from '../parser';\nimport {\n SubscriptionHookOptions,\n SubscriptionResult\n} from '../types/types';\nimport { OperationVariables } from '../../core';\nimport { useApolloClient } from './useApolloClient';\n\nexport function useSubscription<TData = any, TVariables = OperationVariables>(\n subscription: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options?: SubscriptionHookOptions<TData, TVariables>,\n) {\n const client = useApolloClient(options?.client);\n verifyDocumentType(subscription, DocumentType.Subscription);\n const [result, setResult] = useState<SubscriptionResult<TData>>({\n loading: !options?.skip,\n error: void 0,\n data: void 0,\n variables: options?.variables,\n });\n\n const [observable, setObservable] = useState(() => {\n if (options?.skip) {\n return null;\n }\n\n return client.subscribe({\n query: subscription,\n variables: options?.variables,\n fetchPolicy: options?.fetchPolicy,\n context: options?.context,\n });\n });\n\n const ref = useRef({ client, subscription, options });\n useEffect(() => {\n let shouldResubscribe = options?.shouldResubscribe;\n if (typeof shouldResubscribe === 'function') {\n shouldResubscribe = !!shouldResubscribe(options!);\n }\n\n if (options?.skip) {\n if (!options?.skip !== !ref.current.options?.skip) {\n setResult({\n loading: false,\n data: void 0,\n error: void 0,\n variables: options?.variables,\n });\n setObservable(null);\n }\n } else if (\n shouldResubscribe !== false && (\n client !== ref.current.client ||\n subscription !== ref.current.subscription ||\n options?.fetchPolicy !== ref.current.options?.fetchPolicy ||\n !options?.skip !== !ref.current.options?.skip ||\n !equal(options?.variables, ref.current.options?.variables)\n )\n ) {\n setResult({\n loading: true,\n data: void 0,\n error: void 0,\n variables: options?.variables,\n });\n setObservable(client.subscribe({\n query: subscription,\n variables: options?.variables,\n fetchPolicy: options?.fetchPolicy,\n context: options?.context,\n }));\n }\n\n Object.assign(ref.current, { client, subscription, options });\n }, [client, subscription, options]);\n\n useEffect(() => {\n if (!observable) {\n return;\n }\n\n const subscription = observable.subscribe({\n next(fetchResult) {\n const result = {\n loading: false,\n // TODO: fetchResult.data can be null but SubscriptionResult.data\n // expects TData | undefined only\n data: fetchResult.data!,\n error: void 0,\n variables: options?.variables,\n };\n setResult(result);\n\n ref.current.options?.onSubscriptionData?.({\n client,\n subscriptionData: result\n });\n },\n error(error) {\n setResult({\n loading: false,\n data: void 0,\n error,\n variables: options?.variables,\n });\n },\n complete() {\n ref.current.options?.onSubscriptionComplete?.();\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [observable]);\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"useSubscription.js","sourceRoot":"","sources":["../../../src/react/hooks/useSubscription.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAM7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAC7B,YAAiE,EACjE,OAAoD;IAEpD,IAAM,MAAM,GAAG,eAAe,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAC;IAChD,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IACtD,IAAA,KAAsB,QAAQ,CAA4B;QAC9D,OAAO,EAAE,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA;QACvB,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,KAAK,CAAC;QACZ,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;KAC9B,CAAC,EALK,MAAM,QAAA,EAAE,SAAS,QAKtB,CAAC;IAEG,IAAA,KAA8B,QAAQ,CAAC;QAC3C,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE;YACjB,OAAO,IAAI,CAAC;SACb;QAED,OAAO,MAAM,CAAC,SAAS,CAAC;YACtB,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;YAC7B,WAAW,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW;YACjC,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,EAXK,UAAU,QAAA,EAAE,aAAa,QAW9B,CAAC;IAEH,IAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,SAAS,CAAC;QACR,OAAO;YACL,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAM,GAAG,GAAG,MAAM,CAAC,EAAE,MAAM,QAAA,EAAE,YAAY,cAAA,EAAE,OAAO,SAAA,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC;;QACR,IAAI,iBAAiB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,CAAC;QACnD,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;YAC3C,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAQ,CAAC,CAAC;SACnD;QAED,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAE;YACjB,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA,KAAK,CAAC,CAAA,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,IAAI,CAAA,IAAI,qBAAqB,CAAC,OAAO,EAAE;gBAClF,SAAS,CAAC;oBACR,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK,CAAC;oBACZ,KAAK,EAAE,KAAK,CAAC;oBACb,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;iBAC9B,CAAC,CAAC;gBACH,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpB,qBAAqB,CAAC,OAAO,GAAG,KAAK,CAAC;aACvC;SACF;aAAM,IACL,CAAC,iBAAiB,KAAK,KAAK;YAC1B,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC5B,YAAY,KAAK,GAAG,CAAC,OAAO,CAAC,YAAY;gBACzC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,OAAK,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,WAAW,CAAA;gBACzD,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA,KAAK,CAAC,CAAA,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,IAAI,CAAA;gBAC7C,CAAC,KAAK,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,SAAS,CAAC,CAAC,CAAC;YAChE,qBAAqB,CAAC,OAAO,EAC7B;YACA,SAAS,CAAC;gBACR,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,KAAK,CAAC;gBACZ,KAAK,EAAE,KAAK,CAAC;gBACb,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;aAC9B,CAAC,CAAC;YACH,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC7B,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;gBAC7B,WAAW,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW;gBACjC,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;aAC1B,CAAC,CAAC,CAAC;YACJ,qBAAqB,CAAC,OAAO,GAAG,KAAK,CAAC;SACvC;QAED,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,QAAA,EAAE,YAAY,cAAA,EAAE,OAAO,SAAA,EAAE,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAEnE,SAAS,CAAC;QACR,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;SACR;QAED,IAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC;YACxC,IAAI,EAAJ,UAAK,WAAW;;gBACd,IAAM,MAAM,GAAG;oBACb,OAAO,EAAE,KAAK;oBAGd,IAAI,EAAE,WAAW,CAAC,IAAK;oBACvB,KAAK,EAAE,KAAK,CAAC;oBACb,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;iBAC9B,CAAC;gBACF,SAAS,CAAC,MAAM,CAAC,CAAC;gBAElB,MAAA,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,kBAAkB,mDAAG;oBACxC,MAAM,QAAA;oBACN,gBAAgB,EAAE,MAAM;iBACzB,CAAC,CAAC;YACL,CAAC;YACD,KAAK,YAAC,KAAK;gBACT,SAAS,CAAC;oBACR,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK,CAAC;oBACZ,KAAK,OAAA;oBACL,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,QAAQ;;gBACN,MAAA,MAAA,GAAG,CAAC,OAAO,CAAC,OAAO,0CAAE,sBAAsB,kDAAI,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import '../../utilities/globals';\nimport { useState, useRef, useEffect } from 'react';\nimport { DocumentNode } from 'graphql';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { equal } from '@wry/equality';\n\nimport { DocumentType, verifyDocumentType } from '../parser';\nimport {\n SubscriptionHookOptions,\n SubscriptionResult\n} from '../types/types';\nimport { OperationVariables } from '../../core';\nimport { useApolloClient } from './useApolloClient';\n\nexport function useSubscription<TData = any, TVariables = OperationVariables>(\n subscription: DocumentNode | TypedDocumentNode<TData, TVariables>,\n options?: SubscriptionHookOptions<TData, TVariables>,\n) {\n const client = useApolloClient(options?.client);\n verifyDocumentType(subscription, DocumentType.Subscription);\n const [result, setResult] = useState<SubscriptionResult<TData>>({\n loading: !options?.skip,\n error: void 0,\n data: void 0,\n variables: options?.variables,\n });\n\n const [observable, setObservable] = useState(() => {\n if (options?.skip) {\n return null;\n }\n\n return client.subscribe({\n query: subscription,\n variables: options?.variables,\n fetchPolicy: options?.fetchPolicy,\n context: options?.context,\n });\n });\n\n const canResetObservableRef = useRef(false);\n useEffect(() => {\n return () => {\n canResetObservableRef.current = true;\n };\n }, []);\n\n const ref = useRef({ client, subscription, options });\n useEffect(() => {\n let shouldResubscribe = options?.shouldResubscribe;\n if (typeof shouldResubscribe === 'function') {\n shouldResubscribe = !!shouldResubscribe(options!);\n }\n\n if (options?.skip) {\n if (!options?.skip !== !ref.current.options?.skip || canResetObservableRef.current) {\n setResult({\n loading: false,\n data: void 0,\n error: void 0,\n variables: options?.variables,\n });\n setObservable(null);\n canResetObservableRef.current = false;\n }\n } else if (\n (shouldResubscribe !== false &&\n (client !== ref.current.client ||\n subscription !== ref.current.subscription ||\n options?.fetchPolicy !== ref.current.options?.fetchPolicy ||\n !options?.skip !== !ref.current.options?.skip ||\n !equal(options?.variables, ref.current.options?.variables))) ||\n canResetObservableRef.current\n ) {\n setResult({\n loading: true,\n data: void 0,\n error: void 0,\n variables: options?.variables,\n });\n setObservable(client.subscribe({\n query: subscription,\n variables: options?.variables,\n fetchPolicy: options?.fetchPolicy,\n context: options?.context,\n }));\n canResetObservableRef.current = false;\n }\n\n Object.assign(ref.current, { client, subscription, options });\n }, [client, subscription, options, canResetObservableRef.current]);\n\n useEffect(() => {\n if (!observable) {\n return;\n }\n\n const subscription = observable.subscribe({\n next(fetchResult) {\n const result = {\n loading: false,\n // TODO: fetchResult.data can be null but SubscriptionResult.data\n // expects TData | undefined only\n data: fetchResult.data!,\n error: void 0,\n variables: options?.variables,\n };\n setResult(result);\n\n ref.current.options?.onSubscriptionData?.({\n client,\n subscriptionData: result\n });\n },\n error(error) {\n setResult({\n loading: false,\n data: void 0,\n error,\n variables: options?.variables,\n });\n },\n complete() {\n ref.current.options?.onSubscriptionComplete?.();\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [observable]);\n\n return result;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ declare type RealUseSESHookType = typeof import("use-sync-external-store").useSyncExternalStore;
2
+ export declare const useSyncExternalStore: RealUseSESHookType;
3
+ export {};
4
+ //# sourceMappingURL=useSyncExternalStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncExternalStore.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSyncExternalStore.ts"],"names":[],"mappings":"AAOA,aAAK,kBAAkB,GAKrB,cAAc,yBAAyB,EAAE,oBAAoB,CAAC;AAYhE,eAAO,MAAM,oBAAoB,EAAE,kBAyFjC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { invariant } from "../../utilities/globals/index.js";
2
+ import * as React from 'react';
3
+ import { canUseLayoutEffect } from "../../utilities/index.js";
4
+ var didWarnUncachedGetSnapshot = false;
5
+ var uSESKey = "useSyncExternalStore";
6
+ var realHook = React[uSESKey];
7
+ export var useSyncExternalStore = realHook || (function (subscribe, getSnapshot, getServerSnapshot) {
8
+ var value = getSnapshot();
9
+ if (__DEV__ &&
10
+ !didWarnUncachedGetSnapshot &&
11
+ value !== getSnapshot()) {
12
+ didWarnUncachedGetSnapshot = true;
13
+ __DEV__ && invariant.error('The result of getSnapshot should be cached to avoid an infinite loop');
14
+ }
15
+ var _a = React.useState({ inst: { value: value, getSnapshot: getSnapshot } }), inst = _a[0].inst, forceUpdate = _a[1];
16
+ if (canUseLayoutEffect) {
17
+ React.useLayoutEffect(function () {
18
+ Object.assign(inst, { value: value, getSnapshot: getSnapshot });
19
+ if (checkIfSnapshotChanged(inst)) {
20
+ forceUpdate({ inst: inst });
21
+ }
22
+ }, [subscribe, value, getSnapshot]);
23
+ }
24
+ else {
25
+ Object.assign(inst, { value: value, getSnapshot: getSnapshot });
26
+ }
27
+ React.useEffect(function () {
28
+ if (checkIfSnapshotChanged(inst)) {
29
+ forceUpdate({ inst: inst });
30
+ }
31
+ return subscribe(function handleStoreChange() {
32
+ if (checkIfSnapshotChanged(inst)) {
33
+ forceUpdate({ inst: inst });
34
+ }
35
+ });
36
+ }, [subscribe]);
37
+ return value;
38
+ });
39
+ function checkIfSnapshotChanged(_a) {
40
+ var value = _a.value, getSnapshot = _a.getSnapshot;
41
+ try {
42
+ return value !== getSnapshot();
43
+ }
44
+ catch (_b) {
45
+ return true;
46
+ }
47
+ }
48
+ //# sourceMappingURL=useSyncExternalStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncExternalStore.js","sourceRoot":"","sources":["../../../src/react/hooks/useSyncExternalStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,IAAI,0BAA0B,GAAG,KAAK,CAAC;AAYvC,IAAM,OAAO,GAAG,sBAA4C,CAAC;AAC7D,IAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAmC,CAAC;AAMlE,MAAM,CAAC,IAAM,oBAAoB,GAAuB,QAAQ,IAAI,CAAC,UACnE,SAAS,EACT,WAAW,EACX,iBAAiB;IAMjB,IAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,IAEE,OAAO;QACP,CAAC,0BAA0B;QAG3B,KAAK,KAAK,WAAW,EAAE,EACvB;QACA,0BAA0B,GAAG,IAAI,CAAC;QAElC,SAAS,CAAC,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAgBK,IAAA,KAAwB,KAAK,CAAC,QAAQ,CAAC,EAAC,IAAI,EAAE,EAAC,KAAK,OAAA,EAAE,WAAW,aAAA,EAAC,EAAC,CAAC,EAAlE,IAAI,aAAA,EAAG,WAAW,QAAgD,CAAC;IAK3E,IAAI,kBAAkB,EAAE;QAKtB,KAAK,CAAC,eAAe,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,OAAA,EAAE,WAAW,aAAA,EAAE,CAAC,CAAC;YAK5C,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;gBAEhC,WAAW,CAAC,EAAC,IAAI,MAAA,EAAC,CAAC,CAAC;aACrB;QACH,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;KACrC;SAAM;QACL,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,OAAA,EAAE,WAAW,aAAA,EAAE,CAAC,CAAC;KAC7C;IAED,KAAK,CAAC,SAAS,CAAC;QAGd,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;YAEhC,WAAW,CAAC,EAAC,IAAI,MAAA,EAAC,CAAC,CAAC;SACrB;QAGD,OAAO,SAAS,CAAC,SAAS,iBAAiB;YAQzC,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;gBAEhC,WAAW,CAAC,EAAC,IAAI,MAAA,EAAC,CAAC,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,SAAS,sBAAsB,CAAW,EAMzC;QALC,KAAK,WAAA,EACL,WAAW,iBAAA;IAKX,IAAI;QACF,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;KAChC;IAAC,WAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC","sourcesContent":["import { invariant } from '../../utilities/globals';\nimport * as React from 'react';\n\nimport { canUseLayoutEffect } from '../../utilities';\n\nlet didWarnUncachedGetSnapshot = false;\n\ntype RealUseSESHookType =\n // This import depends only on the @types/use-sync-external-store package, not\n // the actual use-sync-external-store package, which is not installed. It\n // might be nice to get this type from React 18, but it still needs to work\n // when only React 17 or earlier is installed.\n typeof import(\"use-sync-external-store\").useSyncExternalStore;\n\n// Prevent webpack from complaining about our feature detection of the\n// useSyncExternalStore property of the React namespace, which is expected not\n// to exist when using React 17 and earlier, and that's fine.\nconst uSESKey = \"useSyncExternalStore\" as keyof typeof React;\nconst realHook = React[uSESKey] as RealUseSESHookType | undefined;\n\n// Adapted from https://www.npmjs.com/package/use-sync-external-store, with\n// Apollo Client deviations called out by \"// DEVIATION ...\" comments.\n\n// When/if React.useSyncExternalStore is defined, delegate fully to it.\nexport const useSyncExternalStore: RealUseSESHookType = realHook || ((\n subscribe,\n getSnapshot,\n getServerSnapshot,\n) => {\n // Read the current snapshot from the store on every render. Again, this\n // breaks the rules of React, and only works here because of specific\n // implementation details, most importantly that updates are\n // always synchronous.\n const value = getSnapshot();\n if (\n // DEVIATION: Using our own __DEV__ polyfill (from ../../utilities/globals).\n __DEV__ &&\n !didWarnUncachedGetSnapshot &&\n // DEVIATION: Not using Object.is because we know our snapshots will never\n // be exotic primitive values like NaN, which is !== itself.\n value !== getSnapshot()\n ) {\n didWarnUncachedGetSnapshot = true;\n // DEVIATION: Using invariant.error instead of console.error directly.\n invariant.error(\n 'The result of getSnapshot should be cached to avoid an infinite loop',\n );\n }\n\n // Because updates are synchronous, we don't queue them. Instead we force a\n // re-render whenever the subscribed state changes by updating an some\n // arbitrary useState hook. Then, during render, we call getSnapshot to read\n // the current value.\n //\n // Because we don't actually use the state returned by the useState hook, we\n // can save a bit of memory by storing other stuff in that slot.\n //\n // To implement the early bailout, we need to track some things on a mutable\n // object. Usually, we would put that in a useRef hook, but we can stash it in\n // our useState hook instead.\n //\n // To force a re-render, we call forceUpdate({inst}). That works because the\n // new object always fails an equality check.\n const [{inst}, forceUpdate] = React.useState({inst: {value, getSnapshot}});\n\n // Track the latest getSnapshot function with a ref. This needs to be updated\n // in the layout phase so we can access it during the tearing check that\n // happens on subscribe.\n if (canUseLayoutEffect) {\n // DEVIATION: We avoid calling useLayoutEffect when !canUseLayoutEffect,\n // which may seem like a conditional hook, but this code ends up behaving\n // unconditionally (one way or the other) because canUseLayoutEffect is\n // constant.\n React.useLayoutEffect(() => {\n Object.assign(inst, { value, getSnapshot });\n // Whenever getSnapshot or subscribe changes, we need to check in the\n // commit phase if there was an interleaved mutation. In concurrent mode\n // this can happen all the time, but even in synchronous mode, an earlier\n // effect may have mutated the store.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({inst});\n }\n }, [subscribe, value, getSnapshot]);\n } else {\n Object.assign(inst, { value, getSnapshot });\n }\n\n React.useEffect(() => {\n // Check for changes right before subscribing. Subsequent changes will be\n // detected in the subscription handler.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({inst});\n }\n\n // Subscribe to the store and return a clean-up function.\n return subscribe(function handleStoreChange() {\n // TODO: Because there is no cross-renderer API for batching updates, it's\n // up to the consumer of this library to wrap their subscription event\n // with unstable_batchedUpdates. Should we try to detect when this isn't\n // the case and print a warning in development?\n\n // The store changed. Check if the snapshot changed since the last time we\n // read from the store.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({inst});\n }\n });\n }, [subscribe]);\n\n return value;\n});\n\nfunction checkIfSnapshotChanged<Snapshot>({\n value,\n getSnapshot,\n}: {\n value: Snapshot;\n getSnapshot: () => Snapshot;\n}): boolean {\n try {\n return value !== getSnapshot();\n } catch {\n return true;\n }\n}\n"]}