@apollo/client 3.8.7 → 3.8.8

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 (609) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/CHANGELOG.md +3357 -0
  4. package/apollo-client.cjs +314 -316
  5. package/apollo-client.cjs.map +1 -1
  6. package/apollo-client.min.cjs +1 -1
  7. package/cache/cache.cjs +133 -152
  8. package/cache/cache.cjs.map +1 -1
  9. package/cache/cache.cjs.native.js +133 -152
  10. package/cache/core/cache.d.ts +10 -0
  11. package/cache/core/cache.js +17 -5
  12. package/cache/core/cache.js.map +1 -1
  13. package/cache/core/types/Cache.d.ts +1 -1
  14. package/cache/core/types/Cache.js.map +1 -1
  15. package/cache/core/types/DataProxy.d.ts +92 -0
  16. package/cache/core/types/common.js +4 -1
  17. package/cache/core/types/common.js.map +1 -1
  18. package/cache/inmemory/entityStore.d.ts +1 -1
  19. package/cache/inmemory/entityStore.js +190 -29
  20. package/cache/inmemory/entityStore.js.map +1 -1
  21. package/cache/inmemory/fixPolyfills.js +9 -0
  22. package/cache/inmemory/fixPolyfills.js.map +1 -1
  23. package/cache/inmemory/fixPolyfills.native.js +12 -0
  24. package/cache/inmemory/fixPolyfills.native.js.map +1 -1
  25. package/cache/inmemory/fragmentRegistry.js +23 -12
  26. package/cache/inmemory/fragmentRegistry.js.map +1 -1
  27. package/cache/inmemory/helpers.js +20 -11
  28. package/cache/inmemory/helpers.js.map +1 -1
  29. package/cache/inmemory/inMemoryCache.js +161 -8
  30. package/cache/inmemory/inMemoryCache.js.map +1 -1
  31. package/cache/inmemory/key-extractor.js +72 -4
  32. package/cache/inmemory/key-extractor.js.map +1 -1
  33. package/cache/inmemory/object-canon.js +91 -3
  34. package/cache/inmemory/object-canon.js.map +1 -1
  35. package/cache/inmemory/policies.js +193 -43
  36. package/cache/inmemory/policies.js.map +1 -1
  37. package/cache/inmemory/reactiveVars.js +20 -2
  38. package/cache/inmemory/reactiveVars.js.map +1 -1
  39. package/cache/inmemory/readFromStore.d.ts +4 -0
  40. package/cache/inmemory/readFromStore.js +54 -9
  41. package/cache/inmemory/readFromStore.js.map +1 -1
  42. package/cache/inmemory/types.d.ts +28 -0
  43. package/cache/inmemory/types.js.map +1 -1
  44. package/cache/inmemory/writeToStore.js +152 -25
  45. package/cache/inmemory/writeToStore.js.map +1 -1
  46. package/config/jest/setup.js +2 -0
  47. package/config/jest/setup.js.map +1 -1
  48. package/core/ApolloClient.d.ts +264 -3
  49. package/core/ApolloClient.js +235 -7
  50. package/core/ApolloClient.js.map +1 -1
  51. package/core/LocalState.d.ts +4 -6
  52. package/core/LocalState.js +56 -18
  53. package/core/LocalState.js.map +1 -1
  54. package/core/ObservableQuery.d.ts +25 -0
  55. package/core/ObservableQuery.js +239 -30
  56. package/core/ObservableQuery.js.map +1 -1
  57. package/core/QueryInfo.d.ts +3 -3
  58. package/core/QueryInfo.js +116 -13
  59. package/core/QueryInfo.js.map +1 -1
  60. package/core/QueryManager.d.ts +4 -0
  61. package/core/QueryManager.js +229 -33
  62. package/core/QueryManager.js.map +1 -1
  63. package/core/core.cjs +112 -103
  64. package/core/core.cjs.map +1 -1
  65. package/core/core.cjs.native.js +112 -103
  66. package/core/equalByQuery.js +20 -1
  67. package/core/equalByQuery.js.map +1 -1
  68. package/core/index.d.ts +1 -1
  69. package/core/index.js +19 -0
  70. package/core/index.js.map +1 -1
  71. package/core/networkStatus.d.ts +39 -0
  72. package/core/networkStatus.js +39 -0
  73. package/core/networkStatus.js.map +1 -1
  74. package/core/types.d.ts +9 -0
  75. package/core/types.js.map +1 -1
  76. package/core/watchQueryOptions.d.ts +225 -1
  77. package/core/watchQueryOptions.js.map +1 -1
  78. package/dev/dev.cjs +5 -111
  79. package/dev/dev.cjs.map +1 -1
  80. package/dev/dev.cjs.native.js +5 -111
  81. package/dev/loadErrorMessageHandler.js.map +1 -1
  82. package/errors/errors.cjs +1 -1
  83. package/errors/errors.cjs.map +1 -1
  84. package/errors/errors.cjs.native.js +1 -1
  85. package/errors/index.js +14 -1
  86. package/errors/index.js.map +1 -1
  87. package/invariantErrorCodes.js +1 -0
  88. package/link/batch/batch.cjs +2 -2
  89. package/link/batch/batch.cjs.map +1 -1
  90. package/link/batch/batch.cjs.native.js +2 -2
  91. package/link/batch/batchLink.d.ts +21 -0
  92. package/link/batch/batchLink.js +2 -1
  93. package/link/batch/batchLink.js.map +1 -1
  94. package/link/batch/batching.js +24 -1
  95. package/link/batch/batching.js.map +1 -1
  96. package/link/batch-http/batch-http.cjs +3 -2
  97. package/link/batch-http/batch-http.cjs.map +1 -1
  98. package/link/batch-http/batch-http.cjs.native.js +3 -2
  99. package/link/batch-http/batchHttpLink.d.ts +4 -0
  100. package/link/batch-http/batchHttpLink.js +53 -2
  101. package/link/batch-http/batchHttpLink.js.map +1 -1
  102. package/link/context/context.cjs.map +1 -1
  103. package/link/context/index.js +1 -0
  104. package/link/context/index.js.map +1 -1
  105. package/link/core/ApolloLink.js +12 -5
  106. package/link/core/ApolloLink.js.map +1 -1
  107. package/link/core/core.cjs +5 -5
  108. package/link/core/core.cjs.map +1 -1
  109. package/link/core/core.cjs.native.js +5 -5
  110. package/link/error/error.cjs +1 -1
  111. package/link/error/error.cjs.map +1 -1
  112. package/link/error/error.cjs.native.js +1 -1
  113. package/link/error/index.d.ts +3 -0
  114. package/link/error/index.js +4 -1
  115. package/link/error/index.js.map +1 -1
  116. package/link/http/HttpLink.d.ts +0 -2
  117. package/link/http/HttpLink.js +1 -1
  118. package/link/http/HttpLink.js.map +1 -1
  119. package/link/http/checkFetcher.js.map +1 -1
  120. package/link/http/createHttpLink.js +23 -1
  121. package/link/http/createHttpLink.js.map +1 -1
  122. package/link/http/createSignalIfSupported.d.ts +5 -0
  123. package/link/http/createSignalIfSupported.js +5 -0
  124. package/link/http/createSignalIfSupported.js.map +1 -1
  125. package/link/http/http.cjs +14 -12
  126. package/link/http/http.cjs.map +1 -1
  127. package/link/http/http.cjs.native.js +14 -12
  128. package/link/http/index.js +2 -1
  129. package/link/http/index.js.map +1 -1
  130. package/link/http/iterators/async.d.ts +4 -0
  131. package/link/http/iterators/async.js +4 -0
  132. package/link/http/iterators/async.js.map +1 -1
  133. package/link/http/iterators/nodeStream.d.ts +4 -0
  134. package/link/http/iterators/nodeStream.js +4 -0
  135. package/link/http/iterators/nodeStream.js.map +1 -1
  136. package/link/http/iterators/promise.d.ts +4 -0
  137. package/link/http/iterators/promise.js +4 -0
  138. package/link/http/iterators/promise.js.map +1 -1
  139. package/link/http/iterators/reader.d.ts +4 -0
  140. package/link/http/iterators/reader.js +4 -0
  141. package/link/http/iterators/reader.js.map +1 -1
  142. package/link/http/parseAndCheckHttpResponse.js +51 -10
  143. package/link/http/parseAndCheckHttpResponse.js.map +1 -1
  144. package/link/http/responseIterator.d.ts +4 -0
  145. package/link/http/responseIterator.js +6 -0
  146. package/link/http/responseIterator.js.map +1 -1
  147. package/link/http/rewriteURIForGET.d.ts +1 -1
  148. package/link/http/rewriteURIForGET.js +10 -0
  149. package/link/http/rewriteURIForGET.js.map +1 -1
  150. package/link/http/selectHttpOptionsAndBody.d.ts +45 -0
  151. package/link/http/selectHttpOptionsAndBody.js +23 -0
  152. package/link/http/selectHttpOptionsAndBody.js.map +1 -1
  153. package/link/http/selectURI.js.map +1 -1
  154. package/link/http/serializeFetchParameter.js.map +1 -1
  155. package/link/persisted-queries/index.js +34 -4
  156. package/link/persisted-queries/index.js.map +1 -1
  157. package/link/persisted-queries/persisted-queries.cjs +4 -4
  158. package/link/persisted-queries/persisted-queries.cjs.map +1 -1
  159. package/link/persisted-queries/persisted-queries.cjs.native.js +4 -4
  160. package/link/remove-typename/remove-typename.cjs +12 -9
  161. package/link/remove-typename/remove-typename.cjs.map +1 -1
  162. package/link/remove-typename/remove-typename.cjs.native.js +12 -9
  163. package/link/remove-typename/removeTypenameFromVariables.js +12 -9
  164. package/link/remove-typename/removeTypenameFromVariables.js.map +1 -1
  165. package/link/retry/delayFunction.d.ts +29 -0
  166. package/link/retry/delayFunction.js +6 -0
  167. package/link/retry/delayFunction.js.map +1 -1
  168. package/link/retry/retry.cjs +5 -5
  169. package/link/retry/retry.cjs.map +1 -1
  170. package/link/retry/retry.cjs.native.js +5 -5
  171. package/link/retry/retryFunction.d.ts +20 -0
  172. package/link/retry/retryLink.d.ts +6 -0
  173. package/link/retry/retryLink.js +31 -6
  174. package/link/retry/retryLink.js.map +1 -1
  175. package/link/schema/index.d.ts +13 -0
  176. package/link/schema/index.js +3 -3
  177. package/link/schema/index.js.map +1 -1
  178. package/link/schema/schema.cjs +3 -3
  179. package/link/schema/schema.cjs.map +1 -1
  180. package/link/schema/schema.cjs.native.js +3 -3
  181. package/link/subscriptions/index.js +35 -2
  182. package/link/subscriptions/index.js.map +1 -1
  183. package/link/subscriptions/subscriptions.cjs +3 -2
  184. package/link/subscriptions/subscriptions.cjs.map +1 -1
  185. package/link/subscriptions/subscriptions.cjs.native.js +3 -2
  186. package/link/utils/createOperation.js.map +1 -1
  187. package/link/utils/filterOperationVariables.js +4 -0
  188. package/link/utils/filterOperationVariables.js.map +1 -1
  189. package/link/utils/toPromise.js.map +1 -1
  190. package/link/utils/transformOperation.js +3 -2
  191. package/link/utils/transformOperation.js.map +1 -1
  192. package/link/utils/utils.cjs +2 -2
  193. package/link/utils/utils.cjs.map +1 -1
  194. package/link/utils/utils.cjs.native.js +2 -2
  195. package/link/utils/validateOperation.js.map +1 -1
  196. package/link/ws/index.d.ts +12 -0
  197. package/link/ws/index.js +1 -1
  198. package/link/ws/index.js.map +1 -1
  199. package/link/ws/ws.cjs +1 -1
  200. package/link/ws/ws.cjs.map +1 -1
  201. package/link/ws/ws.cjs.native.js +1 -1
  202. package/package.json +49 -38
  203. package/react/cache/QueryReference.d.ts +6 -1
  204. package/react/cache/QueryReference.js +26 -1
  205. package/react/cache/QueryReference.js.map +1 -1
  206. package/react/cache/SuspenseCache.d.ts +10 -0
  207. package/react/cache/SuspenseCache.js +1 -1
  208. package/react/cache/SuspenseCache.js.map +1 -1
  209. package/react/cache/getSuspenseCache.js.map +1 -1
  210. package/react/context/ApolloContext.d.ts +5 -0
  211. package/react/context/ApolloContext.js +10 -3
  212. package/react/context/ApolloContext.js.map +1 -1
  213. package/react/context/context.cjs +1 -3
  214. package/react/context/context.cjs.map +1 -1
  215. package/react/context/context.cjs.native.js +1 -3
  216. package/react/hoc/graphql.js.map +1 -1
  217. package/react/hoc/hoc-utils.js +3 -1
  218. package/react/hoc/hoc-utils.js.map +1 -1
  219. package/react/hoc/hoc.cjs +9 -17
  220. package/react/hoc/hoc.cjs.map +1 -1
  221. package/react/hoc/hoc.cjs.native.js +9 -17
  222. package/react/hoc/mutation-hoc.js +9 -4
  223. package/react/hoc/mutation-hoc.js.map +1 -1
  224. package/react/hoc/query-hoc.js +10 -4
  225. package/react/hoc/query-hoc.js.map +1 -1
  226. package/react/hoc/subscription-hoc.js +10 -4
  227. package/react/hoc/subscription-hoc.js.map +1 -1
  228. package/react/hoc/withApollo.js +3 -4
  229. package/react/hoc/withApollo.js.map +1 -1
  230. package/react/hooks/hooks.cjs +30 -22
  231. package/react/hooks/hooks.cjs.map +1 -1
  232. package/react/hooks/hooks.cjs.native.js +30 -22
  233. package/react/hooks/internal/__use.js +5 -0
  234. package/react/hooks/internal/__use.js.map +1 -1
  235. package/react/hooks/internal/index.js +1 -0
  236. package/react/hooks/internal/index.js.map +1 -1
  237. package/react/hooks/internal/useDeepMemo.js.map +1 -1
  238. package/react/hooks/internal/useIsomorphicLayoutEffect.js +6 -3
  239. package/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
  240. package/react/hooks/useBackgroundQuery.js +6 -0
  241. package/react/hooks/useBackgroundQuery.js.map +1 -1
  242. package/react/hooks/useFragment.js +4 -3
  243. package/react/hooks/useFragment.js.map +1 -1
  244. package/react/hooks/useLazyQuery.js +13 -4
  245. package/react/hooks/useLazyQuery.js.map +1 -1
  246. package/react/hooks/useMutation.js +8 -3
  247. package/react/hooks/useMutation.js.map +1 -1
  248. package/react/hooks/useQuery.d.ts +11 -0
  249. package/react/hooks/useQuery.js +137 -5
  250. package/react/hooks/useQuery.js.map +1 -1
  251. package/react/hooks/useReactiveVar.js +5 -0
  252. package/react/hooks/useReactiveVar.js.map +1 -1
  253. package/react/hooks/useReadQuery.d.ts +19 -0
  254. package/react/hooks/useReadQuery.js.map +1 -1
  255. package/react/hooks/useSubscription.js +5 -0
  256. package/react/hooks/useSubscription.js.map +1 -1
  257. package/react/hooks/useSuspenseQuery.js +11 -5
  258. package/react/hooks/useSuspenseQuery.js.map +1 -1
  259. package/react/hooks/useSyncExternalStore.js +53 -1
  260. package/react/hooks/useSyncExternalStore.js.map +1 -1
  261. package/react/parser/index.js +4 -5
  262. package/react/parser/index.js.map +1 -1
  263. package/react/parser/parser.cjs +2 -4
  264. package/react/parser/parser.cjs.map +1 -1
  265. package/react/parser/parser.cjs.native.js +2 -4
  266. package/react/ssr/RenderPromises.js +21 -1
  267. package/react/ssr/RenderPromises.js.map +1 -1
  268. package/react/ssr/getDataFromTree.js +18 -3
  269. package/react/ssr/getDataFromTree.js.map +1 -1
  270. package/react/ssr/ssr.cjs +6 -4
  271. package/react/ssr/ssr.cjs.map +1 -1
  272. package/react/ssr/ssr.cjs.native.js +6 -4
  273. package/react/types/types.d.ts +66 -0
  274. package/testing/core/core.cjs +14 -11
  275. package/testing/core/core.cjs.map +1 -1
  276. package/testing/core/core.cjs.native.js +14 -11
  277. package/testing/core/itAsync.d.ts +1 -1
  278. package/testing/core/itAsync.js.map +1 -1
  279. package/testing/core/mocking/mockFetch.d.ts +2 -2
  280. package/testing/core/mocking/mockFetch.js +8 -4
  281. package/testing/core/mocking/mockFetch.js.map +1 -1
  282. package/testing/core/mocking/mockLink.js +17 -7
  283. package/testing/core/mocking/mockLink.js.map +1 -1
  284. package/testing/core/mocking/mockQueryManager.js +2 -0
  285. package/testing/core/mocking/mockQueryManager.js.map +1 -1
  286. package/testing/core/mocking/mockSubscriptionLink.d.ts +1 -1
  287. package/testing/core/mocking/mockSubscriptionLink.js +1 -1
  288. package/testing/core/mocking/mockSubscriptionLink.js.map +1 -1
  289. package/testing/core/mocking/mockWatchQuery.js +1 -1
  290. package/testing/core/mocking/mockWatchQuery.js.map +1 -1
  291. package/testing/core/observableToPromise.d.ts +17 -3
  292. package/testing/core/observableToPromise.js +5 -0
  293. package/testing/core/observableToPromise.js.map +1 -1
  294. package/testing/core/subscribeAndCount.js +3 -0
  295. package/testing/core/subscribeAndCount.js.map +1 -1
  296. package/testing/core/wait.js +2 -2
  297. package/testing/core/wait.js.map +1 -1
  298. package/testing/core/withConsoleSpy.d.ts +3 -0
  299. package/testing/core/withConsoleSpy.js +7 -1
  300. package/testing/core/withConsoleSpy.js.map +1 -1
  301. package/testing/core/wrap.js +2 -0
  302. package/testing/core/wrap.js.map +1 -1
  303. package/testing/internal/ObservableStream.js +14 -14
  304. package/testing/internal/ObservableStream.js.map +1 -1
  305. package/testing/internal/disposables/spyOnConsole.d.ts +1 -0
  306. package/testing/internal/disposables/spyOnConsole.js +2 -0
  307. package/testing/internal/disposables/spyOnConsole.js.map +1 -1
  308. package/testing/internal/disposables/withCleanup.d.ts +1 -0
  309. package/testing/internal/disposables/withCleanup.js +3 -0
  310. package/testing/internal/disposables/withCleanup.js.map +1 -1
  311. package/testing/internal/profile/Render.d.ts +28 -0
  312. package/testing/internal/profile/Render.js +12 -1
  313. package/testing/internal/profile/Render.js.map +1 -1
  314. package/testing/internal/profile/profile.d.ts +44 -7
  315. package/testing/internal/profile/profile.js +63 -51
  316. package/testing/internal/profile/profile.js.map +1 -1
  317. package/testing/internal/profile/traces.d.ts +4 -0
  318. package/testing/internal/profile/traces.js +9 -5
  319. package/testing/internal/profile/traces.js.map +1 -1
  320. package/testing/matchers/ProfiledComponent.js +27 -22
  321. package/testing/matchers/ProfiledComponent.js.map +1 -1
  322. package/testing/matchers/toHaveSuspenseCacheEntryUsing.js.map +1 -1
  323. package/testing/matchers/toMatchDocument.js.map +1 -1
  324. package/testing/react/MockedProvider.d.ts +4 -0
  325. package/testing/react/MockedProvider.js +6 -2
  326. package/testing/react/MockedProvider.js.map +1 -1
  327. package/testing/testing.cjs +4 -2
  328. package/testing/testing.cjs.map +1 -1
  329. package/testing/testing.cjs.native.js +4 -2
  330. package/utilities/common/arrays.js +1 -0
  331. package/utilities/common/arrays.js.map +1 -1
  332. package/utilities/common/canUse.js +16 -1
  333. package/utilities/common/canUse.js.map +1 -1
  334. package/utilities/common/cloneDeep.d.ts +3 -0
  335. package/utilities/common/cloneDeep.js +5 -0
  336. package/utilities/common/cloneDeep.js.map +1 -1
  337. package/utilities/common/compact.d.ts +4 -0
  338. package/utilities/common/compact.js +4 -0
  339. package/utilities/common/compact.js.map +1 -1
  340. package/utilities/common/errorHandling.js +1 -3
  341. package/utilities/common/errorHandling.js.map +1 -1
  342. package/utilities/common/incrementalResult.js +3 -0
  343. package/utilities/common/incrementalResult.js.map +1 -1
  344. package/utilities/common/makeUniqueId.js +2 -0
  345. package/utilities/common/makeUniqueId.js.map +1 -1
  346. package/utilities/common/maybeDeepFreeze.js +3 -0
  347. package/utilities/common/maybeDeepFreeze.js.map +1 -1
  348. package/utilities/common/mergeDeep.js +12 -1
  349. package/utilities/common/mergeDeep.js.map +1 -1
  350. package/utilities/common/mergeOptions.d.ts +1 -1
  351. package/utilities/common/mergeOptions.js.map +1 -1
  352. package/utilities/common/omitDeep.js.map +1 -1
  353. package/utilities/globals/global.js +7 -1
  354. package/utilities/globals/global.js.map +1 -1
  355. package/utilities/globals/globals.cjs +4 -5
  356. package/utilities/globals/globals.cjs.map +1 -1
  357. package/utilities/globals/globals.cjs.native.js +4 -5
  358. package/utilities/globals/index.d.ts +4 -0
  359. package/utilities/globals/index.js +7 -0
  360. package/utilities/globals/index.js.map +1 -1
  361. package/utilities/globals/invariantWrappers.d.ts +40 -0
  362. package/utilities/globals/invariantWrappers.js +11 -3
  363. package/utilities/globals/invariantWrappers.js.map +1 -1
  364. package/utilities/globals/maybe.js.map +1 -1
  365. package/utilities/graphql/DocumentTransform.js +19 -6
  366. package/utilities/graphql/DocumentTransform.js.map +1 -1
  367. package/utilities/graphql/directives.js +3 -0
  368. package/utilities/graphql/directives.js.map +1 -1
  369. package/utilities/graphql/fragments.d.ts +25 -0
  370. package/utilities/graphql/fragments.js +36 -0
  371. package/utilities/graphql/fragments.js.map +1 -1
  372. package/utilities/graphql/getFromAST.d.ts +5 -0
  373. package/utilities/graphql/getFromAST.js +9 -0
  374. package/utilities/graphql/getFromAST.js.map +1 -1
  375. package/utilities/graphql/print.js.map +1 -1
  376. package/utilities/graphql/storeUtils.d.ts +14 -0
  377. package/utilities/graphql/storeUtils.js +7 -2
  378. package/utilities/graphql/storeUtils.js.map +1 -1
  379. package/utilities/graphql/transform.js +106 -7
  380. package/utilities/graphql/transform.js.map +1 -1
  381. package/utilities/observables/Concast.d.ts +1 -1
  382. package/utilities/observables/Concast.js +84 -1
  383. package/utilities/observables/Concast.js.map +1 -1
  384. package/utilities/observables/Observable.js +6 -0
  385. package/utilities/observables/Observable.js.map +1 -1
  386. package/utilities/observables/asyncMap.js +12 -3
  387. package/utilities/observables/asyncMap.js.map +1 -1
  388. package/utilities/observables/iteration.js +3 -0
  389. package/utilities/observables/iteration.js.map +1 -1
  390. package/utilities/observables/subclassing.js +14 -0
  391. package/utilities/observables/subclassing.js.map +1 -1
  392. package/utilities/policies/pagination.js +47 -3
  393. package/utilities/policies/pagination.js.map +1 -1
  394. package/utilities/promises/decoration.js +1 -0
  395. package/utilities/promises/decoration.js.map +1 -1
  396. package/utilities/types/DeepOmit.js.map +1 -1
  397. package/utilities/types/DeepPartial.d.ts +1 -1
  398. package/utilities/types/DeepPartial.js +4 -0
  399. package/utilities/types/DeepPartial.js.map +1 -1
  400. package/utilities/types/IsStrictlyAny.js.map +1 -1
  401. package/utilities/types/TODO.d.ts +3 -0
  402. package/utilities/types/TODO.js +2 -0
  403. package/utilities/types/TODO.js.map +1 -0
  404. package/utilities/utilities.cjs +31 -27
  405. package/utilities/utilities.cjs.map +1 -1
  406. package/utilities/utilities.cjs.native.js +31 -27
  407. package/version.js +1 -1
  408. package/cache/core/cache.d.ts.map +0 -1
  409. package/cache/core/types/Cache.d.ts.map +0 -1
  410. package/cache/core/types/DataProxy.d.ts.map +0 -1
  411. package/cache/core/types/common.d.ts.map +0 -1
  412. package/cache/index.d.ts.map +0 -1
  413. package/cache/inmemory/entityStore.d.ts.map +0 -1
  414. package/cache/inmemory/fixPolyfills.d.ts.map +0 -1
  415. package/cache/inmemory/fixPolyfills.native.d.ts.map +0 -1
  416. package/cache/inmemory/fragmentRegistry.d.ts.map +0 -1
  417. package/cache/inmemory/helpers.d.ts.map +0 -1
  418. package/cache/inmemory/inMemoryCache.d.ts.map +0 -1
  419. package/cache/inmemory/key-extractor.d.ts.map +0 -1
  420. package/cache/inmemory/object-canon.d.ts.map +0 -1
  421. package/cache/inmemory/policies.d.ts.map +0 -1
  422. package/cache/inmemory/reactiveVars.d.ts.map +0 -1
  423. package/cache/inmemory/readFromStore.d.ts.map +0 -1
  424. package/cache/inmemory/types.d.ts.map +0 -1
  425. package/cache/inmemory/writeToStore.d.ts.map +0 -1
  426. package/config/jest/setup.d.ts.map +0 -1
  427. package/core/ApolloClient.d.ts.map +0 -1
  428. package/core/LocalState.d.ts.map +0 -1
  429. package/core/ObservableQuery.d.ts.map +0 -1
  430. package/core/QueryInfo.d.ts.map +0 -1
  431. package/core/QueryManager.d.ts.map +0 -1
  432. package/core/equalByQuery.d.ts.map +0 -1
  433. package/core/index.d.ts.map +0 -1
  434. package/core/networkStatus.d.ts.map +0 -1
  435. package/core/types.d.ts.map +0 -1
  436. package/core/watchQueryOptions.d.ts.map +0 -1
  437. package/dev/index.d.ts.map +0 -1
  438. package/dev/loadDevMessages.d.ts.map +0 -1
  439. package/dev/loadErrorMessageHandler.d.ts.map +0 -1
  440. package/dev/loadErrorMessages.d.ts.map +0 -1
  441. package/errors/index.d.ts.map +0 -1
  442. package/index.d.ts.map +0 -1
  443. package/invariantErrorCodes.d.ts.map +0 -1
  444. package/link/batch/batchLink.d.ts.map +0 -1
  445. package/link/batch/batching.d.ts.map +0 -1
  446. package/link/batch/index.d.ts.map +0 -1
  447. package/link/batch-http/batchHttpLink.d.ts.map +0 -1
  448. package/link/batch-http/index.d.ts.map +0 -1
  449. package/link/context/index.d.ts.map +0 -1
  450. package/link/core/ApolloLink.d.ts.map +0 -1
  451. package/link/core/concat.d.ts.map +0 -1
  452. package/link/core/empty.d.ts.map +0 -1
  453. package/link/core/execute.d.ts.map +0 -1
  454. package/link/core/from.d.ts.map +0 -1
  455. package/link/core/index.d.ts.map +0 -1
  456. package/link/core/split.d.ts.map +0 -1
  457. package/link/core/types.d.ts.map +0 -1
  458. package/link/error/index.d.ts.map +0 -1
  459. package/link/http/HttpLink.d.ts.map +0 -1
  460. package/link/http/checkFetcher.d.ts.map +0 -1
  461. package/link/http/createHttpLink.d.ts.map +0 -1
  462. package/link/http/createSignalIfSupported.d.ts.map +0 -1
  463. package/link/http/index.d.ts.map +0 -1
  464. package/link/http/iterators/async.d.ts.map +0 -1
  465. package/link/http/iterators/nodeStream.d.ts.map +0 -1
  466. package/link/http/iterators/promise.d.ts.map +0 -1
  467. package/link/http/iterators/reader.d.ts.map +0 -1
  468. package/link/http/parseAndCheckHttpResponse.d.ts.map +0 -1
  469. package/link/http/responseIterator.d.ts.map +0 -1
  470. package/link/http/rewriteURIForGET.d.ts.map +0 -1
  471. package/link/http/selectHttpOptionsAndBody.d.ts.map +0 -1
  472. package/link/http/selectURI.d.ts.map +0 -1
  473. package/link/http/serializeFetchParameter.d.ts.map +0 -1
  474. package/link/persisted-queries/index.d.ts.map +0 -1
  475. package/link/remove-typename/index.d.ts.map +0 -1
  476. package/link/remove-typename/removeTypenameFromVariables.d.ts.map +0 -1
  477. package/link/retry/delayFunction.d.ts.map +0 -1
  478. package/link/retry/index.d.ts.map +0 -1
  479. package/link/retry/retryFunction.d.ts.map +0 -1
  480. package/link/retry/retryLink.d.ts.map +0 -1
  481. package/link/schema/index.d.ts.map +0 -1
  482. package/link/subscriptions/index.d.ts.map +0 -1
  483. package/link/utils/createOperation.d.ts.map +0 -1
  484. package/link/utils/filterOperationVariables.d.ts.map +0 -1
  485. package/link/utils/fromError.d.ts.map +0 -1
  486. package/link/utils/fromPromise.d.ts.map +0 -1
  487. package/link/utils/index.d.ts.map +0 -1
  488. package/link/utils/throwServerError.d.ts.map +0 -1
  489. package/link/utils/toPromise.d.ts.map +0 -1
  490. package/link/utils/transformOperation.d.ts.map +0 -1
  491. package/link/utils/validateOperation.d.ts.map +0 -1
  492. package/link/ws/index.d.ts.map +0 -1
  493. package/react/cache/QueryReference.d.ts.map +0 -1
  494. package/react/cache/SuspenseCache.d.ts.map +0 -1
  495. package/react/cache/getSuspenseCache.d.ts.map +0 -1
  496. package/react/cache/index.d.ts.map +0 -1
  497. package/react/cache/types.d.ts.map +0 -1
  498. package/react/components/Mutation.d.ts.map +0 -1
  499. package/react/components/Query.d.ts.map +0 -1
  500. package/react/components/Subscription.d.ts.map +0 -1
  501. package/react/components/index.d.ts.map +0 -1
  502. package/react/components/types.d.ts.map +0 -1
  503. package/react/context/ApolloConsumer.d.ts.map +0 -1
  504. package/react/context/ApolloContext.d.ts.map +0 -1
  505. package/react/context/ApolloProvider.d.ts.map +0 -1
  506. package/react/context/index.d.ts.map +0 -1
  507. package/react/hoc/graphql.d.ts.map +0 -1
  508. package/react/hoc/hoc-utils.d.ts.map +0 -1
  509. package/react/hoc/index.d.ts.map +0 -1
  510. package/react/hoc/mutation-hoc.d.ts.map +0 -1
  511. package/react/hoc/query-hoc.d.ts.map +0 -1
  512. package/react/hoc/subscription-hoc.d.ts.map +0 -1
  513. package/react/hoc/types.d.ts.map +0 -1
  514. package/react/hoc/withApollo.d.ts.map +0 -1
  515. package/react/hooks/constants.d.ts.map +0 -1
  516. package/react/hooks/index.d.ts.map +0 -1
  517. package/react/hooks/internal/__use.d.ts.map +0 -1
  518. package/react/hooks/internal/index.d.ts.map +0 -1
  519. package/react/hooks/internal/useDeepMemo.d.ts.map +0 -1
  520. package/react/hooks/internal/useIsomorphicLayoutEffect.d.ts.map +0 -1
  521. package/react/hooks/useApolloClient.d.ts.map +0 -1
  522. package/react/hooks/useBackgroundQuery.d.ts.map +0 -1
  523. package/react/hooks/useFragment.d.ts.map +0 -1
  524. package/react/hooks/useLazyQuery.d.ts.map +0 -1
  525. package/react/hooks/useMutation.d.ts.map +0 -1
  526. package/react/hooks/useQuery.d.ts.map +0 -1
  527. package/react/hooks/useReactiveVar.d.ts.map +0 -1
  528. package/react/hooks/useReadQuery.d.ts.map +0 -1
  529. package/react/hooks/useSubscription.d.ts.map +0 -1
  530. package/react/hooks/useSuspenseQuery.d.ts.map +0 -1
  531. package/react/hooks/useSyncExternalStore.d.ts.map +0 -1
  532. package/react/index.d.ts.map +0 -1
  533. package/react/parser/index.d.ts.map +0 -1
  534. package/react/ssr/RenderPromises.d.ts.map +0 -1
  535. package/react/ssr/getDataFromTree.d.ts.map +0 -1
  536. package/react/ssr/index.d.ts.map +0 -1
  537. package/react/ssr/renderToStringWithData.d.ts.map +0 -1
  538. package/react/types/types.d.ts.map +0 -1
  539. package/testing/core/index.d.ts.map +0 -1
  540. package/testing/core/itAsync.d.ts.map +0 -1
  541. package/testing/core/mocking/mockClient.d.ts.map +0 -1
  542. package/testing/core/mocking/mockFetch.d.ts.map +0 -1
  543. package/testing/core/mocking/mockLink.d.ts.map +0 -1
  544. package/testing/core/mocking/mockQueryManager.d.ts.map +0 -1
  545. package/testing/core/mocking/mockSubscriptionLink.d.ts.map +0 -1
  546. package/testing/core/mocking/mockWatchQuery.d.ts.map +0 -1
  547. package/testing/core/observableToPromise.d.ts.map +0 -1
  548. package/testing/core/subscribeAndCount.d.ts.map +0 -1
  549. package/testing/core/wait.d.ts.map +0 -1
  550. package/testing/core/withConsoleSpy.d.ts.map +0 -1
  551. package/testing/core/wrap.d.ts.map +0 -1
  552. package/testing/index.d.ts.map +0 -1
  553. package/testing/internal/ObservableStream.d.ts.map +0 -1
  554. package/testing/internal/disposables/index.d.ts.map +0 -1
  555. package/testing/internal/disposables/spyOnConsole.d.ts.map +0 -1
  556. package/testing/internal/disposables/withCleanup.d.ts.map +0 -1
  557. package/testing/internal/index.d.ts.map +0 -1
  558. package/testing/internal/profile/Render.d.ts.map +0 -1
  559. package/testing/internal/profile/index.d.ts.map +0 -1
  560. package/testing/internal/profile/profile.d.ts.map +0 -1
  561. package/testing/internal/profile/traces.d.ts.map +0 -1
  562. package/testing/matchers/ProfiledComponent.d.ts.map +0 -1
  563. package/testing/matchers/index.d.ts.map +0 -1
  564. package/testing/matchers/toHaveSuspenseCacheEntryUsing.d.ts.map +0 -1
  565. package/testing/matchers/toMatchDocument.d.ts.map +0 -1
  566. package/testing/react/MockedProvider.d.ts.map +0 -1
  567. package/utilities/common/arrays.d.ts.map +0 -1
  568. package/utilities/common/canUse.d.ts.map +0 -1
  569. package/utilities/common/cloneDeep.d.ts.map +0 -1
  570. package/utilities/common/compact.d.ts.map +0 -1
  571. package/utilities/common/errorHandling.d.ts.map +0 -1
  572. package/utilities/common/filterInPlace.d.ts +0 -2
  573. package/utilities/common/filterInPlace.d.ts.map +0 -1
  574. package/utilities/common/filterInPlace.js +0 -11
  575. package/utilities/common/filterInPlace.js.map +0 -1
  576. package/utilities/common/incrementalResult.d.ts.map +0 -1
  577. package/utilities/common/makeUniqueId.d.ts.map +0 -1
  578. package/utilities/common/maybeDeepFreeze.d.ts.map +0 -1
  579. package/utilities/common/mergeDeep.d.ts.map +0 -1
  580. package/utilities/common/mergeOptions.d.ts.map +0 -1
  581. package/utilities/common/objects.d.ts.map +0 -1
  582. package/utilities/common/omitDeep.d.ts.map +0 -1
  583. package/utilities/common/stringifyForDisplay.d.ts.map +0 -1
  584. package/utilities/common/stripTypename.d.ts.map +0 -1
  585. package/utilities/globals/global.d.ts.map +0 -1
  586. package/utilities/globals/index.d.ts.map +0 -1
  587. package/utilities/globals/invariantWrappers.d.ts.map +0 -1
  588. package/utilities/globals/maybe.d.ts.map +0 -1
  589. package/utilities/graphql/DocumentTransform.d.ts.map +0 -1
  590. package/utilities/graphql/directives.d.ts.map +0 -1
  591. package/utilities/graphql/fragments.d.ts.map +0 -1
  592. package/utilities/graphql/getFromAST.d.ts.map +0 -1
  593. package/utilities/graphql/operations.d.ts.map +0 -1
  594. package/utilities/graphql/print.d.ts.map +0 -1
  595. package/utilities/graphql/storeUtils.d.ts.map +0 -1
  596. package/utilities/graphql/transform.d.ts.map +0 -1
  597. package/utilities/index.d.ts.map +0 -1
  598. package/utilities/observables/Concast.d.ts.map +0 -1
  599. package/utilities/observables/Observable.d.ts.map +0 -1
  600. package/utilities/observables/asyncMap.d.ts.map +0 -1
  601. package/utilities/observables/iteration.d.ts.map +0 -1
  602. package/utilities/observables/subclassing.d.ts.map +0 -1
  603. package/utilities/policies/pagination.d.ts.map +0 -1
  604. package/utilities/promises/decoration.d.ts.map +0 -1
  605. package/utilities/types/DeepOmit.d.ts.map +0 -1
  606. package/utilities/types/DeepPartial.d.ts.map +0 -1
  607. package/utilities/types/IsStrictlyAny.d.ts.map +0 -1
  608. package/utilities/types/Primitive.d.ts.map +0 -1
  609. package/version.d.ts.map +0 -1
@@ -5,11 +5,13 @@ import { NetworkStatus, isNetworkRequestInFlight } from "./networkStatus.js";
5
5
  import { cloneDeep, compact, getOperationDefinition, Observable, iterateObserversSafely, fixObservableSubclass, getQueryDefinition, } from "../utilities/index.js";
6
6
  import { equalByQuery } from "./equalByQuery.js";
7
7
  var assign = Object.assign, hasOwnProperty = Object.hasOwnProperty;
8
- var ObservableQuery = (function (_super) {
8
+ var ObservableQuery = /** @class */ (function (_super) {
9
9
  __extends(ObservableQuery, _super);
10
10
  function ObservableQuery(_a) {
11
11
  var queryManager = _a.queryManager, queryInfo = _a.queryInfo, options = _a.options;
12
12
  var _this = _super.call(this, function (observer) {
13
+ // Zen Observable has its own error function, so in order to log correctly
14
+ // we need to provide a custom error callback.
13
15
  try {
14
16
  var subObserver = observer._subscription._observer;
15
17
  if (subObserver && !subObserver.error) {
@@ -19,6 +21,7 @@ var ObservableQuery = (function (_super) {
19
21
  catch (_a) { }
20
22
  var first = !_this.observers.size;
21
23
  _this.observers.add(observer);
24
+ // Deliver most recent error or result.
22
25
  var last = _this.last;
23
26
  if (last && last.error) {
24
27
  observer.error && observer.error(last.error);
@@ -26,7 +29,13 @@ var ObservableQuery = (function (_super) {
26
29
  else if (last && last.result) {
27
30
  observer.next && observer.next(last.result);
28
31
  }
32
+ // Initiate observation of this query if it hasn't been reported to
33
+ // the QueryManager yet.
29
34
  if (first) {
35
+ // Blindly catching here prevents unhandled promise rejections,
36
+ // and is safe because the ObservableQuery handles this error with
37
+ // this.observer.error, so we're not just swallowing the error by
38
+ // ignoring it here.
30
39
  _this.reobserve().catch(function () { });
31
40
  }
32
41
  return function () {
@@ -37,21 +46,36 @@ var ObservableQuery = (function (_super) {
37
46
  }) || this;
38
47
  _this.observers = new Set();
39
48
  _this.subscriptions = new Set();
49
+ // related classes
40
50
  _this.queryInfo = queryInfo;
41
51
  _this.queryManager = queryManager;
52
+ // active state
42
53
  _this.waitForOwnResult = skipCacheDataFor(options.fetchPolicy);
43
54
  _this.isTornDown = false;
44
55
  var _b = queryManager.defaultOptions.watchQuery, _c = _b === void 0 ? {} : _b, _d = _c.fetchPolicy, defaultFetchPolicy = _d === void 0 ? "cache-first" : _d;
45
- var _e = options.fetchPolicy, fetchPolicy = _e === void 0 ? defaultFetchPolicy : _e, _f = options.initialFetchPolicy, initialFetchPolicy = _f === void 0 ? fetchPolicy === "standby"
46
- ? defaultFetchPolicy
47
- : fetchPolicy : _f;
48
- _this.options = __assign(__assign({}, options), { initialFetchPolicy: initialFetchPolicy, fetchPolicy: fetchPolicy });
56
+ var _e = options.fetchPolicy, fetchPolicy = _e === void 0 ? defaultFetchPolicy : _e,
57
+ // Make sure we don't store "standby" as the initialFetchPolicy.
58
+ _f = options.initialFetchPolicy,
59
+ // Make sure we don't store "standby" as the initialFetchPolicy.
60
+ initialFetchPolicy = _f === void 0 ? fetchPolicy === "standby" ? defaultFetchPolicy : (fetchPolicy) : _f;
61
+ _this.options = __assign(__assign({}, options), {
62
+ // Remember the initial options.fetchPolicy so we can revert back to this
63
+ // policy when variables change. This information can also be specified
64
+ // (or overridden) by providing options.initialFetchPolicy explicitly.
65
+ initialFetchPolicy: initialFetchPolicy,
66
+ // This ensures this.options.fetchPolicy always has a string value, in
67
+ // case options.fetchPolicy was not provided.
68
+ fetchPolicy: fetchPolicy });
49
69
  _this.queryId = queryInfo.queryId || queryManager.generateQueryId();
50
70
  var opDef = getOperationDefinition(_this.query);
51
71
  _this.queryName = opDef && opDef.name && opDef.name.value;
52
72
  return _this;
53
73
  }
54
74
  Object.defineProperty(ObservableQuery.prototype, "query", {
75
+ // The `query` computed property will always reflect the document transformed
76
+ // by the last run query. `this.options.query` will always reflect the raw
77
+ // untransformed query to ensure document transforms with runtime conditionals
78
+ // are run on the original document.
55
79
  get: function () {
56
80
  return this.lastQuery || this.options.query;
57
81
  },
@@ -59,6 +83,8 @@ var ObservableQuery = (function (_super) {
59
83
  configurable: true
60
84
  });
61
85
  Object.defineProperty(ObservableQuery.prototype, "variables", {
86
+ // Computed shorthand for this.options.variables, preserved for
87
+ // backwards compatibility.
62
88
  get: function () {
63
89
  return this.options.variables;
64
90
  },
@@ -68,9 +94,22 @@ var ObservableQuery = (function (_super) {
68
94
  ObservableQuery.prototype.result = function () {
69
95
  var _this = this;
70
96
  return new Promise(function (resolve, reject) {
97
+ // TODO: this code doesn’t actually make sense insofar as the observer
98
+ // will never exist in this.observers due how zen-observable wraps observables.
99
+ // https://github.com/zenparsing/zen-observable/blob/master/src/Observable.js#L169
71
100
  var observer = {
72
101
  next: function (result) {
73
102
  resolve(result);
103
+ // Stop the query within the QueryManager if we can before
104
+ // this function returns.
105
+ //
106
+ // We do this in order to prevent observers piling up within
107
+ // the QueryManager. Notice that we only fully unsubscribe
108
+ // from the subscription in a setTimeout(..., 0) call. This call can
109
+ // actually be handled by the browser at a much later time. If queries
110
+ // are fired in the meantime, observers that should have been removed
111
+ // from the QueryManager will continue to fire, causing an unnecessary
112
+ // performance hit.
74
113
  _this.observers.delete(observer);
75
114
  if (!_this.observers.size) {
76
115
  _this.queryManager.removeQuery(_this.queryId);
@@ -86,16 +125,28 @@ var ObservableQuery = (function (_super) {
86
125
  };
87
126
  ObservableQuery.prototype.getCurrentResult = function (saveAsLastResult) {
88
127
  if (saveAsLastResult === void 0) { saveAsLastResult = true; }
128
+ // Use the last result as long as the variables match this.variables.
89
129
  var lastResult = this.getLastResult(true);
90
130
  var networkStatus = this.queryInfo.networkStatus ||
91
131
  (lastResult && lastResult.networkStatus) ||
92
132
  NetworkStatus.ready;
93
133
  var result = __assign(__assign({}, lastResult), { loading: isNetworkRequestInFlight(networkStatus), networkStatus: networkStatus });
94
134
  var _a = this.options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a;
95
- if (skipCacheDataFor(fetchPolicy) ||
135
+ if (
136
+ // These fetch policies should never deliver data from the cache, unless
137
+ // redelivering a previously delivered result.
138
+ skipCacheDataFor(fetchPolicy) ||
139
+ // If this.options.query has @client(always: true) fields, we cannot
140
+ // trust diff.result, since it was read from the cache without running
141
+ // local resolvers (and it's too late to run resolvers now, since we must
142
+ // return a result synchronously).
96
143
  this.queryManager.getDocumentInfo(this.query).hasForcedResolvers) {
144
+ // Fall through.
97
145
  }
98
146
  else if (this.waitForOwnResult) {
147
+ // This would usually be a part of `QueryInfo.getDiff()`.
148
+ // which we skip in the waitForOwnResult case since we are not
149
+ // interested in the diff.
99
150
  this.queryInfo["updateWatch"]();
100
151
  }
101
152
  else {
@@ -107,7 +158,12 @@ var ObservableQuery = (function (_super) {
107
158
  result.data = void 0;
108
159
  }
109
160
  if (diff.complete) {
161
+ // Similar to setting result.partial to false, but taking advantage of the
162
+ // falsiness of missing fields.
110
163
  delete result.partial;
164
+ // If the diff is complete, and we're using a FetchPolicy that
165
+ // terminates after a complete cache read, we can assume the next result
166
+ // we receive will have NetworkStatus.ready and !loading.
111
167
  if (diff.complete &&
112
168
  result.networkStatus === NetworkStatus.loading &&
113
169
  (fetchPolicy === "cache-first" || fetchPolicy === "cache-only")) {
@@ -132,13 +188,14 @@ var ObservableQuery = (function (_super) {
132
188
  }
133
189
  return result;
134
190
  };
191
+ // Compares newResult to the snapshot we took of this.lastResult when it was
192
+ // first received.
135
193
  ObservableQuery.prototype.isDifferentFromLastResult = function (newResult, variables) {
136
194
  if (!this.last) {
137
195
  return true;
138
196
  }
139
- var resultIsDifferent = this.queryManager.getDocumentInfo(this.query)
140
- .hasNonreactiveDirective
141
- ? !equalByQuery(this.query, this.last.result, newResult, this.variables)
197
+ var resultIsDifferent = this.queryManager.getDocumentInfo(this.query).hasNonreactiveDirective ?
198
+ !equalByQuery(this.query, this.last.result, newResult, this.variables)
142
199
  : !equal(this.last.result, newResult);
143
200
  return (resultIsDifferent || (variables && !equal(this.last.variables, variables)));
144
201
  };
@@ -163,11 +220,22 @@ var ObservableQuery = (function (_super) {
163
220
  ObservableQuery.prototype.resetQueryStoreErrors = function () {
164
221
  this.queryManager.resetErrors(this.queryId);
165
222
  };
223
+ /**
224
+ * Update the variables of this observable query, and fetch the new results.
225
+ * This method should be preferred over `setVariables` in most use cases.
226
+ *
227
+ * @param variables - The new set of variables. If there are missing variables,
228
+ * the previous values of those variables will be used.
229
+ */
166
230
  ObservableQuery.prototype.refetch = function (variables) {
167
231
  var _a;
168
232
  var reobserveOptions = {
233
+ // Always disable polling for refetches.
169
234
  pollInterval: 0,
170
235
  };
236
+ // Unless the provided fetchPolicy always consults the network
237
+ // (no-cache, network-only, or cache-and-network), override it with
238
+ // network-only to force the refetch for this fetchQuery call.
171
239
  var fetchPolicy = this.options.fetchPolicy;
172
240
  if (fetchPolicy === "cache-and-network") {
173
241
  reobserveOptions.fetchPolicy = fetchPolicy;
@@ -190,6 +258,7 @@ var ObservableQuery = (function (_super) {
190
258
  }
191
259
  }
192
260
  if (variables && !equal(this.options.variables, variables)) {
261
+ // Update the existing options with new variables
193
262
  reobserveOptions.variables = this.options.variables = __assign(__assign({}, this.options.variables), variables);
194
263
  }
195
264
  this.queryInfo.resetLastWrite();
@@ -197,14 +266,26 @@ var ObservableQuery = (function (_super) {
197
266
  };
198
267
  ObservableQuery.prototype.fetchMore = function (fetchMoreOptions) {
199
268
  var _this = this;
200
- var combinedOptions = __assign(__assign({}, (fetchMoreOptions.query
201
- ? fetchMoreOptions
202
- : __assign(__assign(__assign(__assign({}, this.options), { query: this.options.query }), fetchMoreOptions), { variables: __assign(__assign({}, this.options.variables), fetchMoreOptions.variables) }))), { fetchPolicy: "no-cache" });
269
+ var combinedOptions = __assign(__assign({}, (fetchMoreOptions.query ? fetchMoreOptions : (__assign(__assign(__assign(__assign({}, this.options), { query: this.options.query }), fetchMoreOptions), { variables: __assign(__assign({}, this.options.variables), fetchMoreOptions.variables) })))), {
270
+ // The fetchMore request goes immediately to the network and does
271
+ // not automatically write its result to the cache (hence no-cache
272
+ // instead of network-only), because we allow the caller of
273
+ // fetchMore to provide an updateQuery callback that determines how
274
+ // the data gets written to the cache.
275
+ fetchPolicy: "no-cache" });
203
276
  combinedOptions.query = this.transformDocument(combinedOptions.query);
204
277
  var qid = this.queryManager.generateQueryId();
205
- this.lastQuery = fetchMoreOptions.query
206
- ? this.transformDocument(this.options.query)
207
- : combinedOptions.query;
278
+ // If a temporary query is passed to `fetchMore`, we don't want to store
279
+ // it as the last query result since it may be an optimized query for
280
+ // pagination. We will however run the transforms on the original document
281
+ // as well as the document passed in `fetchMoreOptions` to ensure the cache
282
+ // uses the most up-to-date document which may rely on runtime conditionals.
283
+ this.lastQuery =
284
+ fetchMoreOptions.query ?
285
+ this.transformDocument(this.options.query)
286
+ : combinedOptions.query;
287
+ // Simulate a loading result for the original query with
288
+ // result.networkStatus === NetworkStatus.fetchMore.
208
289
  var queryInfo = this.queryInfo;
209
290
  var originalNetworkStatus = queryInfo.networkStatus;
210
291
  queryInfo.networkStatus = NetworkStatus.fetchMore;
@@ -219,6 +300,11 @@ var ObservableQuery = (function (_super) {
219
300
  if (queryInfo.networkStatus === NetworkStatus.fetchMore) {
220
301
  queryInfo.networkStatus = originalNetworkStatus;
221
302
  }
303
+ // Performing this cache update inside a cache.batch transaction ensures
304
+ // any affected cache.watch watchers are notified at most once about any
305
+ // updates. Most watchers will be using the QueryInfo class, which
306
+ // responds to notifications by calling reobserveCacheFirst to deliver
307
+ // fetchMore cache results back to this ObservableQuery.
222
308
  _this.queryManager.cache.batch({
223
309
  update: function (cache) {
224
310
  var updateQuery = fetchMoreOptions.updateQuery;
@@ -236,6 +322,11 @@ var ObservableQuery = (function (_super) {
236
322
  });
237
323
  }
238
324
  else {
325
+ // If we're using a field policy instead of updateQuery, the only
326
+ // thing we need to do is write the new data to the cache using
327
+ // combinedOptions.variables (instead of this.variables, which is
328
+ // what this.updateQuery uses, because it works by abusing the
329
+ // original field value, keyed by the original variables).
239
330
  cache.writeQuery({
240
331
  query: combinedOptions.query,
241
332
  variables: combinedOptions.variables,
@@ -244,17 +335,27 @@ var ObservableQuery = (function (_super) {
244
335
  }
245
336
  },
246
337
  onWatchUpdated: function (watch) {
338
+ // Record the DocumentNode associated with any watched query whose
339
+ // data were updated by the cache writes above.
247
340
  updatedQuerySet.add(watch.query);
248
341
  },
249
342
  });
250
343
  return fetchMoreResult;
251
344
  })
252
345
  .finally(function () {
346
+ // In case the cache writes above did not generate a broadcast
347
+ // notification (which would have been intercepted by onWatchUpdated),
348
+ // likely because the written data were the same as what was already in
349
+ // the cache, we still want fetchMore to deliver its final loading:false
350
+ // result with the unchanged data.
253
351
  if (!updatedQuerySet.has(_this.query)) {
254
352
  reobserveCacheFirst(_this);
255
353
  }
256
354
  });
257
355
  };
356
+ // XXX the subscription variables are separate from the query variables.
357
+ // if you want to update subscription variables, right now you have to do that separately,
358
+ // and you can only do it by stopping the subscription and then subscribing again with new variables.
258
359
  ObservableQuery.prototype.subscribeToMore = function (options) {
259
360
  var _this = this;
260
361
  var subscription = this.queryManager
@@ -298,15 +399,38 @@ var ObservableQuery = (function (_super) {
298
399
  var mergedOptions = compact(this.options, newOptions || {});
299
400
  assign(this.options, mergedOptions);
300
401
  };
402
+ /**
403
+ * Update the variables of this observable query, and fetch the new results
404
+ * if they've changed. Most users should prefer `refetch` instead of
405
+ * `setVariables` in order to to be properly notified of results even when
406
+ * they come from the cache.
407
+ *
408
+ * Note: the `next` callback will *not* fire if the variables have not changed
409
+ * or if the result is coming from cache.
410
+ *
411
+ * Note: the promise will return the old results immediately if the variables
412
+ * have not changed.
413
+ *
414
+ * Note: the promise will return null immediately if the query is not active
415
+ * (there are no subscribers).
416
+ *
417
+ * @param variables - The new set of variables. If there are missing variables,
418
+ * the previous values of those variables will be used.
419
+ */
301
420
  ObservableQuery.prototype.setVariables = function (variables) {
302
421
  if (equal(this.variables, variables)) {
422
+ // If we have no observers, then we don't actually want to make a network
423
+ // request. As soon as someone observes the query, the request will kick
424
+ // off. For now, we just store any changes. (See #1077)
303
425
  return this.observers.size ? this.result() : Promise.resolve();
304
426
  }
305
427
  this.options.variables = variables;
428
+ // See comment above
306
429
  if (!this.observers.size) {
307
430
  return Promise.resolve();
308
431
  }
309
432
  return this.reobserve({
433
+ // Reset options.fetchPolicy to its original value.
310
434
  fetchPolicy: this.options.initialFetchPolicy,
311
435
  variables: variables,
312
436
  }, NetworkStatus.setVariables);
@@ -339,12 +463,29 @@ var ObservableQuery = (function (_super) {
339
463
  this.options.pollInterval = 0;
340
464
  this.updatePolling();
341
465
  };
342
- ObservableQuery.prototype.applyNextFetchPolicy = function (reason, options) {
466
+ // Update options.fetchPolicy according to options.nextFetchPolicy.
467
+ ObservableQuery.prototype.applyNextFetchPolicy = function (reason,
468
+ // It's possible to use this method to apply options.nextFetchPolicy to
469
+ // options.fetchPolicy even if options !== this.options, though that happens
470
+ // most often when the options are temporary, used for only one request and
471
+ // then thrown away, so nextFetchPolicy may not end up mattering.
472
+ options) {
343
473
  if (options.nextFetchPolicy) {
344
474
  var _a = options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a, _b = options.initialFetchPolicy, initialFetchPolicy = _b === void 0 ? fetchPolicy : _b;
345
475
  if (fetchPolicy === "standby") {
476
+ // Do nothing, leaving options.fetchPolicy unchanged.
346
477
  }
347
478
  else if (typeof options.nextFetchPolicy === "function") {
479
+ // When someone chooses "cache-and-network" or "network-only" as their
480
+ // initial FetchPolicy, they often do not want future cache updates to
481
+ // trigger unconditional network requests, which is what repeatedly
482
+ // applying the "cache-and-network" or "network-only" policies would
483
+ // seem to imply. Instead, when the cache reports an update after the
484
+ // initial network request, it may be desirable for subsequent network
485
+ // requests to be triggered only if the cache result is incomplete. To
486
+ // that end, the options.nextFetchPolicy option provides an easy way to
487
+ // update options.fetchPolicy after the initial network request, without
488
+ // having to call observableQuery.setOptions.
348
489
  options.fetchPolicy = options.nextFetchPolicy(fetchPolicy, {
349
490
  reason: reason,
350
491
  options: options,
@@ -362,11 +503,15 @@ var ObservableQuery = (function (_super) {
362
503
  return options.fetchPolicy;
363
504
  };
364
505
  ObservableQuery.prototype.fetch = function (options, newNetworkStatus, query) {
506
+ // TODO Make sure we update the networkStatus (and infer fetchVariables)
507
+ // before actually committing to the fetch.
365
508
  this.queryManager.setObservableQuery(this);
366
509
  return this.queryManager["fetchConcastWithInfo"](this.queryId, options, newNetworkStatus, query);
367
510
  };
511
+ // Turns polling on or off based on this.options.pollInterval.
368
512
  ObservableQuery.prototype.updatePolling = function () {
369
513
  var _this = this;
514
+ // Avoid polling in SSR mode
370
515
  if (this.queryManager.ssrMode) {
371
516
  return;
372
517
  }
@@ -388,8 +533,12 @@ var ObservableQuery = (function (_super) {
388
533
  if (_this.pollingInfo) {
389
534
  if (!isNetworkRequestInFlight(_this.queryInfo.networkStatus)) {
390
535
  _this.reobserve({
391
- fetchPolicy: _this.options.initialFetchPolicy === "no-cache"
392
- ? "no-cache"
536
+ // Most fetchPolicy options don't make sense to use in a polling context, as
537
+ // users wouldn't want to be polling the cache directly. However, network-only and
538
+ // no-cache are both useful for when the user wants to control whether or not the
539
+ // polled results are written to the cache.
540
+ fetchPolicy: _this.options.initialFetchPolicy === "no-cache" ?
541
+ "no-cache"
393
542
  : "network-only",
394
543
  }, NetworkStatus.poll).then(poll, poll);
395
544
  }
@@ -410,34 +559,55 @@ var ObservableQuery = (function (_super) {
410
559
  ObservableQuery.prototype.updateLastResult = function (newResult, variables) {
411
560
  if (variables === void 0) { variables = this.variables; }
412
561
  var error = this.getLastError();
562
+ // Preserve this.last.error unless the variables have changed.
413
563
  if (error && this.last && !equal(variables, this.last.variables)) {
414
564
  error = void 0;
415
565
  }
416
- return (this.last = __assign({ result: this.queryManager.assumeImmutableResults
417
- ? newResult
566
+ return (this.last = __assign({ result: this.queryManager.assumeImmutableResults ?
567
+ newResult
418
568
  : cloneDeep(newResult), variables: variables }, (error ? { error: error } : null)));
419
569
  };
420
570
  ObservableQuery.prototype.reobserveAsConcast = function (newOptions, newNetworkStatus) {
421
571
  var _this = this;
422
572
  this.isTornDown = false;
423
- var useDisposableConcast = newNetworkStatus === NetworkStatus.refetch ||
573
+ var useDisposableConcast =
574
+ // Refetching uses a disposable Concast to allow refetches using different
575
+ // options/variables, without permanently altering the options of the
576
+ // original ObservableQuery.
577
+ newNetworkStatus === NetworkStatus.refetch ||
578
+ // The fetchMore method does not actually call the reobserve method, but,
579
+ // if it did, it would definitely use a disposable Concast.
424
580
  newNetworkStatus === NetworkStatus.fetchMore ||
581
+ // Polling uses a disposable Concast so the polling options (which force
582
+ // fetchPolicy to be "network-only" or "no-cache") won't override the original options.
425
583
  newNetworkStatus === NetworkStatus.poll;
584
+ // Save the old variables, since Object.assign may modify them below.
426
585
  var oldVariables = this.options.variables;
427
586
  var oldFetchPolicy = this.options.fetchPolicy;
428
587
  var mergedOptions = compact(this.options, newOptions || {});
429
- var options = useDisposableConcast
430
- ?
431
- mergedOptions
588
+ var options = useDisposableConcast ?
589
+ // Disposable Concast fetches receive a shallow copy of this.options
590
+ // (merged with newOptions), leaving this.options unmodified.
591
+ mergedOptions
432
592
  : assign(this.options, mergedOptions);
593
+ // Don't update options.query with the transformed query to avoid
594
+ // overwriting this.options.query when we aren't using a disposable concast.
595
+ // We want to ensure we can re-run the custom document transforms the next
596
+ // time a request is made against the original query.
433
597
  var query = this.transformDocument(options.query);
434
598
  this.lastQuery = query;
435
599
  if (!useDisposableConcast) {
600
+ // We can skip calling updatePolling if we're not changing this.options.
436
601
  this.updatePolling();
602
+ // Reset options.fetchPolicy to its original value when variables change,
603
+ // unless a new fetchPolicy was provided by newOptions.
437
604
  if (newOptions &&
438
605
  newOptions.variables &&
439
606
  !equal(newOptions.variables, oldVariables) &&
607
+ // Don't mess with the fetchPolicy if it's currently "standby".
440
608
  options.fetchPolicy !== "standby" &&
609
+ // If we're changing the fetchPolicy anyway, don't try to change it here
610
+ // using applyNextFetchPolicy. The explicit options.fetchPolicy wins.
441
611
  options.fetchPolicy === oldFetchPolicy) {
442
612
  this.applyNextFetchPolicy("variables-changed", options);
443
613
  if (newNetworkStatus === void 0) {
@@ -464,6 +634,8 @@ var ObservableQuery = (function (_super) {
464
634
  },
465
635
  };
466
636
  if (!useDisposableConcast && (fromLink || !this.concast)) {
637
+ // We use the {add,remove}Observer methods directly to avoid wrapping
638
+ // observer with an unnecessary SubscriptionObserver object.
467
639
  if (this.concast && this.observer) {
468
640
  this.concast.removeObserver(this.observer);
469
641
  }
@@ -474,25 +646,43 @@ var ObservableQuery = (function (_super) {
474
646
  return concast;
475
647
  };
476
648
  ObservableQuery.prototype.reobserve = function (newOptions, newNetworkStatus) {
477
- return this.reobserveAsConcast(newOptions, newNetworkStatus).promise;
649
+ return this.reobserveAsConcast(newOptions, newNetworkStatus)
650
+ .promise;
478
651
  };
479
652
  ObservableQuery.prototype.resubscribeAfterError = function () {
480
653
  var args = [];
481
654
  for (var _i = 0; _i < arguments.length; _i++) {
482
655
  args[_i] = arguments[_i];
483
656
  }
657
+ // If `lastError` is set in the current when the subscription is re-created,
658
+ // the subscription will immediately receive the error, which will
659
+ // cause it to terminate again. To avoid this, we first clear
660
+ // the last error/result from the `observableQuery` before re-starting
661
+ // the subscription, and restore the last value afterwards so that the
662
+ // subscription has a chance to stay open.
484
663
  var last = this.last;
485
664
  this.resetLastResults();
486
665
  var subscription = this.subscribe.apply(this, args);
487
666
  this.last = last;
488
667
  return subscription;
489
668
  };
669
+ // (Re)deliver the current result to this.observers without applying fetch
670
+ // policies or making network requests.
490
671
  ObservableQuery.prototype.observe = function () {
491
- this.reportResult(this.getCurrentResult(false), this.variables);
672
+ this.reportResult(
673
+ // Passing false is important so that this.getCurrentResult doesn't
674
+ // save the fetchMore result as this.lastResult, causing it to be
675
+ // ignored due to the this.isDifferentFromLastResult check in
676
+ // this.reportResult.
677
+ this.getCurrentResult(false), this.variables);
492
678
  };
493
679
  ObservableQuery.prototype.reportResult = function (result, variables) {
494
680
  var lastError = this.getLastError();
495
681
  var isDifferent = this.isDifferentFromLastResult(result, variables);
682
+ // Update the last result even when isDifferentFromLastResult returns false,
683
+ // because the query may be using the @nonreactive directive, and we want to
684
+ // save the the latest version of any nonreactive subtrees (in case
685
+ // getCurrentResult is called), even though we skip broadcasting changes.
496
686
  if (lastError || !result.partial || this.options.returnPartialData) {
497
687
  this.updateLastResult(result, variables);
498
688
  }
@@ -501,6 +691,8 @@ var ObservableQuery = (function (_super) {
501
691
  }
502
692
  };
503
693
  ObservableQuery.prototype.reportError = function (error, variables) {
694
+ // Since we don't get the current result on errors, only the error, we
695
+ // must mirror the updates that occur in QueryStore.markQueryError here
504
696
  var errorResult = __assign(__assign({}, this.getLastResult()), { error: error, errors: error.graphQLErrors, networkStatus: NetworkStatus.error, loading: false });
505
697
  this.updateLastResult(errorResult, variables);
506
698
  iterateObserversSafely(this.observers, "error", (this.last.error = error));
@@ -517,6 +709,7 @@ var ObservableQuery = (function (_super) {
517
709
  delete this.observer;
518
710
  }
519
711
  this.stopPolling();
712
+ // stop all active GraphQL subscriptions
520
713
  this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
521
714
  this.subscriptions.clear();
522
715
  this.queryManager.stopQuery(this.queryId);
@@ -529,17 +722,33 @@ var ObservableQuery = (function (_super) {
529
722
  return ObservableQuery;
530
723
  }(Observable));
531
724
  export { ObservableQuery };
725
+ // Necessary because the ObservableQuery constructor has a different
726
+ // signature than the Observable constructor.
532
727
  fixObservableSubclass(ObservableQuery);
728
+ // Reobserve with fetchPolicy effectively set to "cache-first", triggering
729
+ // delivery of any new data from the cache, possibly falling back to the network
730
+ // if any cache data are missing. This allows _complete_ cache results to be
731
+ // delivered without also kicking off unnecessary network requests when
732
+ // this.options.fetchPolicy is "cache-and-network" or "network-only". When
733
+ // this.options.fetchPolicy is any other policy ("cache-first", "cache-only",
734
+ // "standby", or "no-cache"), we call this.reobserve() as usual.
533
735
  export function reobserveCacheFirst(obsQuery) {
534
736
  var _a = obsQuery.options, fetchPolicy = _a.fetchPolicy, nextFetchPolicy = _a.nextFetchPolicy;
535
737
  if (fetchPolicy === "cache-and-network" || fetchPolicy === "network-only") {
536
738
  return obsQuery.reobserve({
537
739
  fetchPolicy: "cache-first",
538
- nextFetchPolicy: function () {
740
+ // Use a temporary nextFetchPolicy function that replaces itself with the
741
+ // previous nextFetchPolicy value and returns the original fetchPolicy.
742
+ nextFetchPolicy: function (currentFetchPolicy, context) {
743
+ // Replace this nextFetchPolicy function in the options object with the
744
+ // original this.options.nextFetchPolicy value.
539
745
  this.nextFetchPolicy = nextFetchPolicy;
540
- if (typeof nextFetchPolicy === "function") {
541
- return nextFetchPolicy.apply(this, arguments);
746
+ // If the original nextFetchPolicy value was a function, give it a
747
+ // chance to decide what happens here.
748
+ if (typeof this.nextFetchPolicy === "function") {
749
+ return this.nextFetchPolicy(currentFetchPolicy, context);
542
750
  }
751
+ // Otherwise go back to the original this.options.fetchPolicy.
543
752
  return fetchPolicy;
544
753
  },
545
754
  });
@@ -554,7 +763,7 @@ export function logMissingFieldErrors(missing) {
554
763
  globalThis.__DEV__ !== false && invariant.debug(24, missing);
555
764
  }
556
765
  }
557
- function skipCacheDataFor(fetchPolicy) {
766
+ function skipCacheDataFor(fetchPolicy /* `undefined` would mean `"cache-first"` */) {
558
767
  return (fetchPolicy === "network-only" ||
559
768
  fetchPolicy === "no-cache" ||
560
769
  fetchPolicy === "standby");