@apollo/client 4.0.0-alpha.13 → 4.0.0-alpha.14

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 (594) hide show
  1. package/.changeset/curvy-flies-accept.md +5 -0
  2. package/.changeset/few-crabs-move.md +6 -0
  3. package/.changeset/funny-boats-wink.md +35 -0
  4. package/.changeset/gold-oranges-double.md +5 -0
  5. package/.changeset/little-parrots-bow.md +14 -0
  6. package/.changeset/olive-cougars-ring.md +9 -0
  7. package/.changeset/pre.json +13 -0
  8. package/.changeset/serious-items-develop.md +17 -0
  9. package/.changeset/sixty-bats-cry.md +6 -0
  10. package/.changeset/spotty-mugs-poke.md +5 -0
  11. package/.changeset/strong-rivers-fry.md +34 -0
  12. package/.changeset/stupid-pumpkins-travel.md +13 -0
  13. package/.changeset/thirty-pens-jump.md +5 -0
  14. package/.changeset/wicked-kiwis-buy.md +5 -0
  15. package/CHANGELOG.md +134 -0
  16. package/__cjs/cache/core/cache.cjs +9 -7
  17. package/__cjs/cache/core/cache.cjs.map +1 -1
  18. package/__cjs/cache/core/cache.d.cts +9 -7
  19. package/__cjs/cache/inmemory/entityStore.cjs +3 -3
  20. package/__cjs/cache/inmemory/inMemoryCache.cjs.map +1 -1
  21. package/__cjs/cache/inmemory/inMemoryCache.d.cts +9 -7
  22. package/__cjs/cache/inmemory/key-extractor.cjs +1 -1
  23. package/__cjs/cache/inmemory/policies.cjs +4 -4
  24. package/__cjs/cache/inmemory/policies.cjs.map +1 -1
  25. package/__cjs/cache/inmemory/readFromStore.cjs +2 -2
  26. package/__cjs/cache/inmemory/readFromStore.cjs.map +1 -1
  27. package/__cjs/cache/inmemory/writeToStore.cjs +4 -4
  28. package/__cjs/cache/inmemory/writeToStore.cjs.map +1 -1
  29. package/__cjs/core/ApolloClient.cjs +23 -45
  30. package/__cjs/core/ApolloClient.cjs.map +1 -1
  31. package/__cjs/core/ApolloClient.d.cts +9 -21
  32. package/__cjs/core/ObservableQuery.cjs +564 -346
  33. package/__cjs/core/ObservableQuery.cjs.map +1 -1
  34. package/__cjs/core/ObservableQuery.d.cts +95 -33
  35. package/__cjs/core/QueryInfo.cjs +109 -179
  36. package/__cjs/core/QueryInfo.cjs.map +1 -1
  37. package/__cjs/core/QueryInfo.d.cts +9 -14
  38. package/__cjs/core/QueryManager.cjs +168 -108
  39. package/__cjs/core/QueryManager.cjs.map +1 -1
  40. package/__cjs/core/QueryManager.d.cts +12 -8
  41. package/__cjs/core/index.cjs +2 -1
  42. package/__cjs/core/index.cjs.map +1 -1
  43. package/__cjs/core/index.d.cts +2 -3
  44. package/__cjs/core/types.d.cts +18 -6
  45. package/__cjs/errors/LinkError.cjs +5 -1
  46. package/__cjs/errors/LinkError.cjs.map +1 -1
  47. package/__cjs/errors/LinkError.d.cts +5 -1
  48. package/__cjs/errors/LocalStateError.cjs +27 -0
  49. package/__cjs/errors/LocalStateError.cjs.map +1 -0
  50. package/__cjs/errors/LocalStateError.d.cts +20 -0
  51. package/__cjs/errors/index.cjs +5 -1
  52. package/__cjs/errors/index.cjs.map +1 -1
  53. package/__cjs/errors/index.d.cts +2 -0
  54. package/__cjs/invariantErrorCodes.cjs +130 -57
  55. package/__cjs/link/core/ApolloLink.cjs +17 -11
  56. package/__cjs/link/core/ApolloLink.cjs.map +1 -1
  57. package/__cjs/link/core/ApolloLink.d.cts +15 -9
  58. package/__cjs/link/http/checkFetcher.cjs +1 -1
  59. package/__cjs/link/http/createHttpLink.cjs +1 -1
  60. package/__cjs/link/http/parseAndCheckHttpResponse.cjs +1 -1
  61. package/__cjs/link/http/serializeFetchParameter.cjs +1 -1
  62. package/__cjs/link/persisted-queries/index.cjs +2 -2
  63. package/__cjs/link/utils/transformOperation.cjs +1 -1
  64. package/__cjs/link/utils/transformOperation.cjs.map +1 -1
  65. package/__cjs/link/utils/validateOperation.cjs +1 -1
  66. package/__cjs/local-state/LocalState.cjs +535 -0
  67. package/__cjs/local-state/LocalState.cjs.map +1 -0
  68. package/__cjs/local-state/LocalState.d.cts +89 -0
  69. package/__cjs/local-state/index.cjs +6 -0
  70. package/__cjs/local-state/index.cjs.map +1 -0
  71. package/__cjs/local-state/index.d.cts +2 -0
  72. package/__cjs/masking/maskFragment.cjs +5 -1
  73. package/__cjs/masking/maskFragment.cjs.map +1 -1
  74. package/__cjs/masking/maskFragment.d.cts +5 -1
  75. package/__cjs/masking/maskOperation.cjs +5 -1
  76. package/__cjs/masking/maskOperation.cjs.map +1 -1
  77. package/__cjs/masking/maskOperation.d.cts +5 -1
  78. package/__cjs/masking/utils.cjs +5 -1
  79. package/__cjs/masking/utils.cjs.map +1 -1
  80. package/__cjs/masking/utils.d.cts +5 -1
  81. package/__cjs/react/hooks/internal/wrapHook.cjs +36 -34
  82. package/__cjs/react/hooks/internal/wrapHook.cjs.map +1 -1
  83. package/__cjs/react/hooks/internal/wrapHook.d.cts +42 -38
  84. package/__cjs/react/internal/cache/QueryReference.cjs +6 -9
  85. package/__cjs/react/internal/cache/QueryReference.cjs.map +1 -1
  86. package/__cjs/react/internal/cache/QueryReference.d.cts +25 -7
  87. package/__cjs/react/ssr/prerenderStatic.cjs +7 -0
  88. package/__cjs/react/ssr/prerenderStatic.cjs.map +1 -1
  89. package/__cjs/testing/core/mocking/mockLink.cjs +7 -3
  90. package/__cjs/testing/core/mocking/mockLink.cjs.map +1 -1
  91. package/__cjs/testing/core/mocking/mockLink.d.cts +10 -2
  92. package/__cjs/testing/internal/ObservableStream.cjs +13 -1
  93. package/__cjs/testing/internal/ObservableStream.cjs.map +1 -1
  94. package/__cjs/testing/internal/ObservableStream.d.cts +12 -1
  95. package/__cjs/testing/internal/disposables/withCleanup.cjs +5 -1
  96. package/__cjs/testing/internal/disposables/withCleanup.cjs.map +1 -1
  97. package/__cjs/testing/internal/disposables/withCleanup.d.cts +5 -1
  98. package/__cjs/testing/matchers/index.cjs +2 -2
  99. package/__cjs/testing/matchers/index.cjs.map +1 -1
  100. package/__cjs/testing/matchers/toEmitTypedValue.cjs +1 -1
  101. package/__cjs/testing/matchers/toEmitTypedValue.cjs.map +1 -1
  102. package/__cjs/testing/matchers/toEmitTypedValue.d.cts +6 -1
  103. package/__cjs/testing/matchers/toRerenderWithSimilarSnapshot.cjs +31 -18
  104. package/__cjs/testing/matchers/toRerenderWithSimilarSnapshot.cjs.map +1 -1
  105. package/__cjs/testing/matchers/toRerenderWithSimilarSnapshot.d.cts +13 -6
  106. package/__cjs/testing/matchers/toStrictEqualTyped.cjs +1 -1
  107. package/__cjs/testing/matchers/toStrictEqualTyped.cjs.map +1 -1
  108. package/__cjs/testing/matchers/toStrictEqualTyped.d.cts +4 -0
  109. package/__cjs/testing/matchers/utils/getSerializableProperties.cjs +14 -2
  110. package/__cjs/testing/matchers/utils/getSerializableProperties.cjs.map +1 -1
  111. package/__cjs/testing/react/MockedProvider.cjs +2 -2
  112. package/__cjs/testing/react/MockedProvider.cjs.map +1 -1
  113. package/__cjs/testing/react/MockedProvider.d.cts +2 -2
  114. package/__cjs/utilities/graphql/DocumentTransform.cjs +10 -6
  115. package/__cjs/utilities/graphql/DocumentTransform.cjs.map +1 -1
  116. package/__cjs/utilities/graphql/DocumentTransform.d.cts +10 -6
  117. package/__cjs/utilities/internal/DeepMerger.cjs +5 -1
  118. package/__cjs/utilities/internal/DeepMerger.cjs.map +1 -1
  119. package/__cjs/utilities/internal/DeepMerger.d.cts +5 -1
  120. package/__cjs/utilities/internal/argumentsObjectFromField.cjs +5 -1
  121. package/__cjs/utilities/internal/argumentsObjectFromField.cjs.map +1 -1
  122. package/__cjs/utilities/internal/argumentsObjectFromField.d.cts +5 -1
  123. package/__cjs/utilities/internal/caches.cjs +24 -20
  124. package/__cjs/utilities/internal/caches.cjs.map +1 -1
  125. package/__cjs/utilities/internal/caches.d.cts +32 -24
  126. package/__cjs/utilities/internal/canUseDOM.cjs +5 -1
  127. package/__cjs/utilities/internal/canUseDOM.cjs.map +1 -1
  128. package/__cjs/utilities/internal/canUseDOM.d.cts +5 -1
  129. package/__cjs/utilities/internal/checkDocument.cjs +6 -3
  130. package/__cjs/utilities/internal/checkDocument.cjs.map +1 -1
  131. package/__cjs/utilities/internal/checkDocument.d.cts +6 -3
  132. package/__cjs/utilities/internal/cloneDeep.cjs +6 -4
  133. package/__cjs/utilities/internal/cloneDeep.cjs.map +1 -1
  134. package/__cjs/utilities/internal/cloneDeep.d.cts +6 -4
  135. package/__cjs/utilities/internal/compact.cjs +7 -5
  136. package/__cjs/utilities/internal/compact.cjs.map +1 -1
  137. package/__cjs/utilities/internal/compact.d.cts +7 -5
  138. package/__cjs/utilities/internal/createFragmentMap.cjs +7 -4
  139. package/__cjs/utilities/internal/createFragmentMap.cjs.map +1 -1
  140. package/__cjs/utilities/internal/createFragmentMap.d.cts +7 -4
  141. package/__cjs/utilities/internal/createFulfilledPromise.cjs +5 -1
  142. package/__cjs/utilities/internal/createFulfilledPromise.cjs.map +1 -1
  143. package/__cjs/utilities/internal/createFulfilledPromise.d.cts +5 -1
  144. package/__cjs/utilities/internal/createRejectedPromise.cjs +5 -1
  145. package/__cjs/utilities/internal/createRejectedPromise.cjs.map +1 -1
  146. package/__cjs/utilities/internal/createRejectedPromise.d.cts +5 -1
  147. package/__cjs/utilities/internal/dealias.cjs +21 -0
  148. package/__cjs/utilities/internal/dealias.cjs.map +1 -0
  149. package/__cjs/utilities/internal/dealias.d.cts +5 -0
  150. package/__cjs/utilities/internal/decoratePromise.cjs +5 -1
  151. package/__cjs/utilities/internal/decoratePromise.cjs.map +1 -1
  152. package/__cjs/utilities/internal/decoratePromise.d.cts +5 -1
  153. package/__cjs/utilities/internal/deepFreeze.cjs +5 -1
  154. package/__cjs/utilities/internal/deepFreeze.cjs.map +1 -1
  155. package/__cjs/utilities/internal/deepFreeze.d.cts +5 -1
  156. package/__cjs/utilities/internal/filterMap.cjs +31 -0
  157. package/__cjs/utilities/internal/filterMap.cjs.map +1 -0
  158. package/__cjs/utilities/internal/filterMap.d.cts +4 -0
  159. package/__cjs/utilities/internal/getDefaultValues.cjs +5 -1
  160. package/__cjs/utilities/internal/getDefaultValues.cjs.map +1 -1
  161. package/__cjs/utilities/internal/getDefaultValues.d.cts +5 -1
  162. package/__cjs/utilities/internal/getFragmentDefinition.cjs +5 -1
  163. package/__cjs/utilities/internal/getFragmentDefinition.cjs.map +1 -1
  164. package/__cjs/utilities/internal/getFragmentDefinition.d.cts +5 -1
  165. package/__cjs/utilities/internal/getFragmentDefinitions.cjs +5 -1
  166. package/__cjs/utilities/internal/getFragmentDefinitions.cjs.map +1 -1
  167. package/__cjs/utilities/internal/getFragmentDefinitions.d.cts +5 -1
  168. package/__cjs/utilities/internal/getFragmentFromSelection.cjs +5 -1
  169. package/__cjs/utilities/internal/getFragmentFromSelection.cjs.map +1 -1
  170. package/__cjs/utilities/internal/getFragmentFromSelection.d.cts +5 -1
  171. package/__cjs/utilities/internal/getFragmentQueryDocument.cjs +25 -23
  172. package/__cjs/utilities/internal/getFragmentQueryDocument.cjs.map +1 -1
  173. package/__cjs/utilities/internal/getFragmentQueryDocument.d.cts +25 -23
  174. package/__cjs/utilities/internal/getGraphQLErrorsFromResult.cjs +5 -1
  175. package/__cjs/utilities/internal/getGraphQLErrorsFromResult.cjs.map +1 -1
  176. package/__cjs/utilities/internal/getGraphQLErrorsFromResult.d.cts +5 -1
  177. package/__cjs/utilities/internal/getMainDefinition.cjs +8 -6
  178. package/__cjs/utilities/internal/getMainDefinition.cjs.map +1 -1
  179. package/__cjs/utilities/internal/getMainDefinition.d.cts +8 -6
  180. package/__cjs/utilities/internal/getMemoryInternals.cjs +15 -9
  181. package/__cjs/utilities/internal/getMemoryInternals.cjs.map +1 -1
  182. package/__cjs/utilities/internal/getMemoryInternals.d.cts +15 -9
  183. package/__cjs/utilities/internal/getOperationDefinition.cjs +5 -1
  184. package/__cjs/utilities/internal/getOperationDefinition.cjs.map +1 -1
  185. package/__cjs/utilities/internal/getOperationDefinition.d.cts +5 -1
  186. package/__cjs/utilities/internal/getOperationName.cjs +7 -5
  187. package/__cjs/utilities/internal/getOperationName.cjs.map +1 -1
  188. package/__cjs/utilities/internal/getOperationName.d.cts +6 -2
  189. package/__cjs/utilities/internal/getQueryDefinition.cjs +5 -1
  190. package/__cjs/utilities/internal/getQueryDefinition.cjs.map +1 -1
  191. package/__cjs/utilities/internal/getQueryDefinition.d.cts +5 -1
  192. package/__cjs/utilities/internal/getStoreKeyName.cjs +5 -1
  193. package/__cjs/utilities/internal/getStoreKeyName.cjs.map +1 -1
  194. package/__cjs/utilities/internal/getStoreKeyName.d.cts +5 -1
  195. package/__cjs/utilities/internal/graphQLResultHasError.cjs +5 -1
  196. package/__cjs/utilities/internal/graphQLResultHasError.cjs.map +1 -1
  197. package/__cjs/utilities/internal/graphQLResultHasError.d.cts +5 -1
  198. package/__cjs/utilities/internal/hasDirectives.cjs +5 -1
  199. package/__cjs/utilities/internal/hasDirectives.cjs.map +1 -1
  200. package/__cjs/utilities/internal/hasDirectives.d.cts +5 -1
  201. package/__cjs/utilities/internal/hasForcedResolvers.cjs +23 -0
  202. package/__cjs/utilities/internal/hasForcedResolvers.cjs.map +1 -0
  203. package/__cjs/utilities/internal/hasForcedResolvers.d.cts +3 -0
  204. package/__cjs/utilities/internal/index.cjs +8 -4
  205. package/__cjs/utilities/internal/index.cjs.map +1 -1
  206. package/__cjs/utilities/internal/index.d.cts +3 -1
  207. package/__cjs/utilities/internal/isArray.cjs +6 -4
  208. package/__cjs/utilities/internal/isArray.cjs.map +1 -1
  209. package/__cjs/utilities/internal/isArray.d.cts +6 -4
  210. package/__cjs/utilities/internal/isDocumentNode.cjs +5 -1
  211. package/__cjs/utilities/internal/isDocumentNode.cjs.map +1 -1
  212. package/__cjs/utilities/internal/isDocumentNode.d.cts +5 -1
  213. package/__cjs/utilities/internal/isExecutionPatchIncrementalResult.cjs +5 -1
  214. package/__cjs/utilities/internal/isExecutionPatchIncrementalResult.cjs.map +1 -1
  215. package/__cjs/utilities/internal/isExecutionPatchIncrementalResult.d.cts +5 -1
  216. package/__cjs/utilities/internal/isExecutionPatchIninitialResult.cjs +5 -1
  217. package/__cjs/utilities/internal/isExecutionPatchIninitialResult.cjs.map +1 -1
  218. package/__cjs/utilities/internal/isExecutionPatchIninitialResult.d.cts +5 -1
  219. package/__cjs/utilities/internal/isExecutionPatchResult.cjs +5 -1
  220. package/__cjs/utilities/internal/isExecutionPatchResult.cjs.map +1 -1
  221. package/__cjs/utilities/internal/isExecutionPatchResult.d.cts +5 -1
  222. package/__cjs/utilities/internal/isField.cjs +5 -1
  223. package/__cjs/utilities/internal/isField.cjs.map +1 -1
  224. package/__cjs/utilities/internal/isField.d.cts +5 -1
  225. package/__cjs/utilities/internal/isNonEmptyArray.cjs +5 -1
  226. package/__cjs/utilities/internal/isNonEmptyArray.cjs.map +1 -1
  227. package/__cjs/utilities/internal/isNonEmptyArray.d.cts +5 -1
  228. package/__cjs/utilities/internal/isNonNullObject.cjs +5 -1
  229. package/__cjs/utilities/internal/isNonNullObject.cjs.map +1 -1
  230. package/__cjs/utilities/internal/isNonNullObject.d.cts +5 -1
  231. package/__cjs/utilities/internal/isPlainObject.cjs +5 -1
  232. package/__cjs/utilities/internal/isPlainObject.cjs.map +1 -1
  233. package/__cjs/utilities/internal/isPlainObject.d.cts +5 -1
  234. package/__cjs/utilities/internal/makeReference.cjs +5 -1
  235. package/__cjs/utilities/internal/makeReference.cjs.map +1 -1
  236. package/__cjs/utilities/internal/makeReference.d.cts +5 -1
  237. package/__cjs/utilities/internal/makeUniqueId.cjs +7 -5
  238. package/__cjs/utilities/internal/makeUniqueId.cjs.map +1 -1
  239. package/__cjs/utilities/internal/makeUniqueId.d.cts +7 -5
  240. package/__cjs/utilities/internal/maybeDeepFreeze.cjs +5 -1
  241. package/__cjs/utilities/internal/maybeDeepFreeze.cjs.map +1 -1
  242. package/__cjs/utilities/internal/maybeDeepFreeze.d.cts +5 -1
  243. package/__cjs/utilities/internal/mergeDeep.cjs +5 -1
  244. package/__cjs/utilities/internal/mergeDeep.cjs.map +1 -1
  245. package/__cjs/utilities/internal/mergeDeep.d.cts +5 -1
  246. package/__cjs/utilities/internal/mergeDeepArray.cjs +5 -1
  247. package/__cjs/utilities/internal/mergeDeepArray.cjs.map +1 -1
  248. package/__cjs/utilities/internal/mergeDeepArray.d.cts +5 -1
  249. package/__cjs/utilities/internal/mergeIncrementalData.cjs +5 -1
  250. package/__cjs/utilities/internal/mergeIncrementalData.cjs.map +1 -1
  251. package/__cjs/utilities/internal/mergeIncrementalData.d.cts +5 -1
  252. package/__cjs/utilities/internal/mergeOptions.cjs +5 -1
  253. package/__cjs/utilities/internal/mergeOptions.cjs.map +1 -1
  254. package/__cjs/utilities/internal/mergeOptions.d.cts +5 -1
  255. package/__cjs/utilities/internal/omitDeep.cjs +5 -1
  256. package/__cjs/utilities/internal/omitDeep.cjs.map +1 -1
  257. package/__cjs/utilities/internal/omitDeep.d.cts +5 -1
  258. package/__cjs/utilities/internal/onAnyEvent.cjs +5 -1
  259. package/__cjs/utilities/internal/onAnyEvent.cjs.map +1 -1
  260. package/__cjs/utilities/internal/onAnyEvent.d.cts +5 -1
  261. package/__cjs/utilities/internal/removeDirectivesFromDocument.cjs +5 -1
  262. package/__cjs/utilities/internal/removeDirectivesFromDocument.cjs.map +1 -1
  263. package/__cjs/utilities/internal/removeDirectivesFromDocument.d.cts +5 -1
  264. package/__cjs/utilities/internal/resultKeyNameFromField.cjs +5 -1
  265. package/__cjs/utilities/internal/resultKeyNameFromField.cjs.map +1 -1
  266. package/__cjs/utilities/internal/resultKeyNameFromField.d.cts +5 -1
  267. package/__cjs/utilities/internal/shouldInclude.cjs +5 -1
  268. package/__cjs/utilities/internal/shouldInclude.cjs.map +1 -1
  269. package/__cjs/utilities/internal/shouldInclude.d.cts +5 -1
  270. package/__cjs/utilities/internal/storeKeyNameFromField.cjs +5 -1
  271. package/__cjs/utilities/internal/storeKeyNameFromField.cjs.map +1 -1
  272. package/__cjs/utilities/internal/storeKeyNameFromField.d.cts +5 -1
  273. package/__cjs/utilities/internal/stringifyForDisplay.cjs +5 -1
  274. package/__cjs/utilities/internal/stringifyForDisplay.cjs.map +1 -1
  275. package/__cjs/utilities/internal/stringifyForDisplay.d.cts +5 -1
  276. package/__cjs/utilities/internal/toQueryResult.cjs +5 -1
  277. package/__cjs/utilities/internal/toQueryResult.cjs.map +1 -1
  278. package/__cjs/utilities/internal/toQueryResult.d.cts +5 -1
  279. package/__cjs/utilities/internal/types/DecoratedPromise.d.cts +5 -1
  280. package/__cjs/utilities/internal/types/DeepOmit.d.cts +5 -1
  281. package/__cjs/utilities/internal/types/DeepPartial.d.cts +5 -1
  282. package/__cjs/utilities/internal/types/FragmentMap.d.cts +6 -4
  283. package/__cjs/utilities/internal/types/FragmentMapFunction.d.cts +5 -1
  284. package/__cjs/utilities/internal/types/FulfilledPromise.d.cts +5 -1
  285. package/__cjs/utilities/internal/types/IsAny.d.cts +5 -1
  286. package/__cjs/utilities/internal/types/PendingPromise.d.cts +5 -1
  287. package/__cjs/utilities/internal/types/Prettify.d.cts +5 -1
  288. package/__cjs/utilities/internal/types/Primitive.d.cts +5 -1
  289. package/__cjs/utilities/internal/types/RejectedPromise.d.cts +5 -1
  290. package/__cjs/utilities/internal/types/RemoveIndexSignature.d.cts +5 -1
  291. package/__cjs/utilities/internal/types/VariablesOption.d.cts +5 -1
  292. package/__cjs/utilities/internal/valueToObjectRepresentation.cjs +5 -1
  293. package/__cjs/utilities/internal/valueToObjectRepresentation.cjs.map +1 -1
  294. package/__cjs/utilities/internal/valueToObjectRepresentation.d.cts +5 -1
  295. package/__cjs/version.cjs +1 -1
  296. package/cache/core/cache.d.ts +9 -7
  297. package/cache/core/cache.js +9 -7
  298. package/cache/core/cache.js.map +1 -1
  299. package/cache/inmemory/entityStore.js +3 -3
  300. package/cache/inmemory/inMemoryCache.d.ts +9 -7
  301. package/cache/inmemory/inMemoryCache.js.map +1 -1
  302. package/cache/inmemory/key-extractor.js +1 -1
  303. package/cache/inmemory/policies.js +4 -4
  304. package/cache/inmemory/policies.js.map +1 -1
  305. package/cache/inmemory/readFromStore.js +2 -2
  306. package/cache/inmemory/readFromStore.js.map +1 -1
  307. package/cache/inmemory/writeToStore.js +4 -4
  308. package/cache/inmemory/writeToStore.js.map +1 -1
  309. package/core/ApolloClient.d.ts +9 -21
  310. package/core/ApolloClient.js +23 -45
  311. package/core/ApolloClient.js.map +1 -1
  312. package/core/ObservableQuery.d.ts +95 -33
  313. package/core/ObservableQuery.js +569 -351
  314. package/core/ObservableQuery.js.map +1 -1
  315. package/core/QueryInfo.d.ts +9 -14
  316. package/core/QueryInfo.js +109 -179
  317. package/core/QueryInfo.js.map +1 -1
  318. package/core/QueryManager.d.ts +12 -8
  319. package/core/QueryManager.js +151 -110
  320. package/core/QueryManager.js.map +1 -1
  321. package/core/index.d.ts +2 -3
  322. package/core/index.js +1 -1
  323. package/core/index.js.map +1 -1
  324. package/core/types.d.ts +18 -6
  325. package/errors/LinkError.d.ts +5 -1
  326. package/errors/LinkError.js +5 -1
  327. package/errors/LinkError.js.map +1 -1
  328. package/errors/LocalStateError.d.ts +20 -0
  329. package/errors/LocalStateError.js +23 -0
  330. package/errors/LocalStateError.js.map +1 -0
  331. package/errors/index.d.ts +2 -0
  332. package/errors/index.js +2 -0
  333. package/errors/index.js.map +1 -1
  334. package/invariantErrorCodes.js +130 -57
  335. package/legacyEntryPoints/local-state/index.d.ts +1 -0
  336. package/legacyEntryPoints/local-state/index.js +1 -0
  337. package/legacyEntryPoints/local-state/local-state.cjs +1 -0
  338. package/legacyEntryPoints/local-state/local-state.d.cts +1 -0
  339. package/link/core/ApolloLink.d.ts +15 -9
  340. package/link/core/ApolloLink.js +17 -11
  341. package/link/core/ApolloLink.js.map +1 -1
  342. package/link/http/checkFetcher.js +1 -1
  343. package/link/http/createHttpLink.js +1 -1
  344. package/link/http/parseAndCheckHttpResponse.js +1 -1
  345. package/link/http/serializeFetchParameter.js +1 -1
  346. package/link/persisted-queries/index.js +2 -2
  347. package/link/utils/transformOperation.js +1 -1
  348. package/link/utils/transformOperation.js.map +1 -1
  349. package/link/utils/validateOperation.js +1 -1
  350. package/local-state/LocalState.d.ts +89 -0
  351. package/local-state/LocalState.js +527 -0
  352. package/local-state/LocalState.js.map +1 -0
  353. package/local-state/index.d.ts +2 -0
  354. package/local-state/index.js +2 -0
  355. package/local-state/index.js.map +1 -0
  356. package/masking/maskFragment.d.ts +5 -1
  357. package/masking/maskFragment.js +5 -1
  358. package/masking/maskFragment.js.map +1 -1
  359. package/masking/maskOperation.d.ts +5 -1
  360. package/masking/maskOperation.js +5 -1
  361. package/masking/maskOperation.js.map +1 -1
  362. package/masking/utils.d.ts +5 -1
  363. package/masking/utils.js +5 -1
  364. package/masking/utils.js.map +1 -1
  365. package/package.json +11 -1
  366. package/react/hooks/internal/wrapHook.d.ts +42 -38
  367. package/react/hooks/internal/wrapHook.js +36 -34
  368. package/react/hooks/internal/wrapHook.js.map +1 -1
  369. package/react/internal/cache/QueryReference.d.ts +25 -7
  370. package/react/internal/cache/QueryReference.js +6 -9
  371. package/react/internal/cache/QueryReference.js.map +1 -1
  372. package/react/ssr/prerenderStatic.js +7 -0
  373. package/react/ssr/prerenderStatic.js.map +1 -1
  374. package/testing/core/mocking/mockLink.d.ts +10 -2
  375. package/testing/core/mocking/mockLink.js +9 -5
  376. package/testing/core/mocking/mockLink.js.map +1 -1
  377. package/testing/internal/ObservableStream.d.ts +12 -1
  378. package/testing/internal/ObservableStream.js +13 -1
  379. package/testing/internal/ObservableStream.js.map +1 -1
  380. package/testing/internal/disposables/withCleanup.d.ts +5 -1
  381. package/testing/internal/disposables/withCleanup.js +5 -1
  382. package/testing/internal/disposables/withCleanup.js.map +1 -1
  383. package/testing/matchers/index.js +2 -2
  384. package/testing/matchers/index.js.map +1 -1
  385. package/testing/matchers/toEmitTypedValue.d.ts +6 -1
  386. package/testing/matchers/toEmitTypedValue.js +1 -1
  387. package/testing/matchers/toEmitTypedValue.js.map +1 -1
  388. package/testing/matchers/toRerenderWithSimilarSnapshot.d.ts +13 -6
  389. package/testing/matchers/toRerenderWithSimilarSnapshot.js +30 -15
  390. package/testing/matchers/toRerenderWithSimilarSnapshot.js.map +1 -1
  391. package/testing/matchers/toStrictEqualTyped.d.ts +4 -0
  392. package/testing/matchers/toStrictEqualTyped.js +1 -1
  393. package/testing/matchers/toStrictEqualTyped.js.map +1 -1
  394. package/testing/matchers/utils/getSerializableProperties.js +14 -2
  395. package/testing/matchers/utils/getSerializableProperties.js.map +1 -1
  396. package/testing/react/MockedProvider.d.ts +2 -2
  397. package/testing/react/MockedProvider.js +2 -2
  398. package/testing/react/MockedProvider.js.map +1 -1
  399. package/utilities/graphql/DocumentTransform.d.ts +10 -6
  400. package/utilities/graphql/DocumentTransform.js +10 -6
  401. package/utilities/graphql/DocumentTransform.js.map +1 -1
  402. package/utilities/internal/DeepMerger.d.ts +5 -1
  403. package/utilities/internal/DeepMerger.js +5 -1
  404. package/utilities/internal/DeepMerger.js.map +1 -1
  405. package/utilities/internal/argumentsObjectFromField.d.ts +5 -1
  406. package/utilities/internal/argumentsObjectFromField.js +5 -1
  407. package/utilities/internal/argumentsObjectFromField.js.map +1 -1
  408. package/utilities/internal/caches.d.ts +32 -24
  409. package/utilities/internal/caches.js +24 -20
  410. package/utilities/internal/caches.js.map +1 -1
  411. package/utilities/internal/canUseDOM.d.ts +5 -1
  412. package/utilities/internal/canUseDOM.js +5 -1
  413. package/utilities/internal/canUseDOM.js.map +1 -1
  414. package/utilities/internal/checkDocument.d.ts +6 -3
  415. package/utilities/internal/checkDocument.js +6 -3
  416. package/utilities/internal/checkDocument.js.map +1 -1
  417. package/utilities/internal/cloneDeep.d.ts +6 -4
  418. package/utilities/internal/cloneDeep.js +6 -4
  419. package/utilities/internal/cloneDeep.js.map +1 -1
  420. package/utilities/internal/compact.d.ts +7 -5
  421. package/utilities/internal/compact.js +7 -5
  422. package/utilities/internal/compact.js.map +1 -1
  423. package/utilities/internal/createFragmentMap.d.ts +7 -4
  424. package/utilities/internal/createFragmentMap.js +7 -4
  425. package/utilities/internal/createFragmentMap.js.map +1 -1
  426. package/utilities/internal/createFulfilledPromise.d.ts +5 -1
  427. package/utilities/internal/createFulfilledPromise.js +5 -1
  428. package/utilities/internal/createFulfilledPromise.js.map +1 -1
  429. package/utilities/internal/createRejectedPromise.d.ts +5 -1
  430. package/utilities/internal/createRejectedPromise.js +5 -1
  431. package/utilities/internal/createRejectedPromise.js.map +1 -1
  432. package/utilities/internal/dealias.d.ts +5 -0
  433. package/utilities/internal/dealias.js +18 -0
  434. package/utilities/internal/dealias.js.map +1 -0
  435. package/utilities/internal/decoratePromise.d.ts +5 -1
  436. package/utilities/internal/decoratePromise.js +5 -1
  437. package/utilities/internal/decoratePromise.js.map +1 -1
  438. package/utilities/internal/deepFreeze.d.ts +5 -1
  439. package/utilities/internal/deepFreeze.js +5 -1
  440. package/utilities/internal/deepFreeze.js.map +1 -1
  441. package/utilities/internal/filterMap.d.ts +4 -0
  442. package/utilities/internal/filterMap.js +28 -0
  443. package/utilities/internal/filterMap.js.map +1 -0
  444. package/utilities/internal/getDefaultValues.d.ts +5 -1
  445. package/utilities/internal/getDefaultValues.js +5 -1
  446. package/utilities/internal/getDefaultValues.js.map +1 -1
  447. package/utilities/internal/getFragmentDefinition.d.ts +5 -1
  448. package/utilities/internal/getFragmentDefinition.js +5 -1
  449. package/utilities/internal/getFragmentDefinition.js.map +1 -1
  450. package/utilities/internal/getFragmentDefinitions.d.ts +5 -1
  451. package/utilities/internal/getFragmentDefinitions.js +5 -1
  452. package/utilities/internal/getFragmentDefinitions.js.map +1 -1
  453. package/utilities/internal/getFragmentFromSelection.d.ts +5 -1
  454. package/utilities/internal/getFragmentFromSelection.js +5 -1
  455. package/utilities/internal/getFragmentFromSelection.js.map +1 -1
  456. package/utilities/internal/getFragmentQueryDocument.d.ts +25 -23
  457. package/utilities/internal/getFragmentQueryDocument.js +25 -23
  458. package/utilities/internal/getFragmentQueryDocument.js.map +1 -1
  459. package/utilities/internal/getGraphQLErrorsFromResult.d.ts +5 -1
  460. package/utilities/internal/getGraphQLErrorsFromResult.js +5 -1
  461. package/utilities/internal/getGraphQLErrorsFromResult.js.map +1 -1
  462. package/utilities/internal/getMainDefinition.d.ts +8 -6
  463. package/utilities/internal/getMainDefinition.js +8 -6
  464. package/utilities/internal/getMainDefinition.js.map +1 -1
  465. package/utilities/internal/getMemoryInternals.d.ts +15 -9
  466. package/utilities/internal/getMemoryInternals.js +15 -9
  467. package/utilities/internal/getMemoryInternals.js.map +1 -1
  468. package/utilities/internal/getOperationDefinition.d.ts +5 -1
  469. package/utilities/internal/getOperationDefinition.js +5 -1
  470. package/utilities/internal/getOperationDefinition.js.map +1 -1
  471. package/utilities/internal/getOperationName.d.ts +6 -2
  472. package/utilities/internal/getOperationName.js +7 -5
  473. package/utilities/internal/getOperationName.js.map +1 -1
  474. package/utilities/internal/getQueryDefinition.d.ts +5 -1
  475. package/utilities/internal/getQueryDefinition.js +5 -1
  476. package/utilities/internal/getQueryDefinition.js.map +1 -1
  477. package/utilities/internal/getStoreKeyName.d.ts +5 -1
  478. package/utilities/internal/getStoreKeyName.js +5 -1
  479. package/utilities/internal/getStoreKeyName.js.map +1 -1
  480. package/utilities/internal/globals/global.js +2 -2
  481. package/utilities/internal/globals/global.js.map +1 -1
  482. package/utilities/internal/graphQLResultHasError.d.ts +5 -1
  483. package/utilities/internal/graphQLResultHasError.js +5 -1
  484. package/utilities/internal/graphQLResultHasError.js.map +1 -1
  485. package/utilities/internal/hasDirectives.d.ts +5 -1
  486. package/utilities/internal/hasDirectives.js +5 -1
  487. package/utilities/internal/hasDirectives.js.map +1 -1
  488. package/utilities/internal/hasForcedResolvers.d.ts +3 -0
  489. package/utilities/internal/hasForcedResolvers.js +20 -0
  490. package/utilities/internal/hasForcedResolvers.js.map +1 -0
  491. package/utilities/internal/index.d.ts +3 -1
  492. package/utilities/internal/index.js +3 -1
  493. package/utilities/internal/index.js.map +1 -1
  494. package/utilities/internal/isArray.d.ts +6 -4
  495. package/utilities/internal/isArray.js +6 -4
  496. package/utilities/internal/isArray.js.map +1 -1
  497. package/utilities/internal/isDocumentNode.d.ts +5 -1
  498. package/utilities/internal/isDocumentNode.js +5 -1
  499. package/utilities/internal/isDocumentNode.js.map +1 -1
  500. package/utilities/internal/isExecutionPatchIncrementalResult.d.ts +5 -1
  501. package/utilities/internal/isExecutionPatchIncrementalResult.js +5 -1
  502. package/utilities/internal/isExecutionPatchIncrementalResult.js.map +1 -1
  503. package/utilities/internal/isExecutionPatchIninitialResult.d.ts +5 -1
  504. package/utilities/internal/isExecutionPatchIninitialResult.js +5 -1
  505. package/utilities/internal/isExecutionPatchIninitialResult.js.map +1 -1
  506. package/utilities/internal/isExecutionPatchResult.d.ts +5 -1
  507. package/utilities/internal/isExecutionPatchResult.js +5 -1
  508. package/utilities/internal/isExecutionPatchResult.js.map +1 -1
  509. package/utilities/internal/isField.d.ts +5 -1
  510. package/utilities/internal/isField.js +5 -1
  511. package/utilities/internal/isField.js.map +1 -1
  512. package/utilities/internal/isNonEmptyArray.d.ts +5 -1
  513. package/utilities/internal/isNonEmptyArray.js +5 -1
  514. package/utilities/internal/isNonEmptyArray.js.map +1 -1
  515. package/utilities/internal/isNonNullObject.d.ts +5 -1
  516. package/utilities/internal/isNonNullObject.js +5 -1
  517. package/utilities/internal/isNonNullObject.js.map +1 -1
  518. package/utilities/internal/isPlainObject.d.ts +5 -1
  519. package/utilities/internal/isPlainObject.js +5 -1
  520. package/utilities/internal/isPlainObject.js.map +1 -1
  521. package/utilities/internal/makeReference.d.ts +5 -1
  522. package/utilities/internal/makeReference.js +5 -1
  523. package/utilities/internal/makeReference.js.map +1 -1
  524. package/utilities/internal/makeUniqueId.d.ts +7 -5
  525. package/utilities/internal/makeUniqueId.js +7 -5
  526. package/utilities/internal/makeUniqueId.js.map +1 -1
  527. package/utilities/internal/maybeDeepFreeze.d.ts +5 -1
  528. package/utilities/internal/maybeDeepFreeze.js +5 -1
  529. package/utilities/internal/maybeDeepFreeze.js.map +1 -1
  530. package/utilities/internal/mergeDeep.d.ts +5 -1
  531. package/utilities/internal/mergeDeep.js +5 -1
  532. package/utilities/internal/mergeDeep.js.map +1 -1
  533. package/utilities/internal/mergeDeepArray.d.ts +5 -1
  534. package/utilities/internal/mergeDeepArray.js +5 -1
  535. package/utilities/internal/mergeDeepArray.js.map +1 -1
  536. package/utilities/internal/mergeIncrementalData.d.ts +5 -1
  537. package/utilities/internal/mergeIncrementalData.js +5 -1
  538. package/utilities/internal/mergeIncrementalData.js.map +1 -1
  539. package/utilities/internal/mergeOptions.d.ts +5 -1
  540. package/utilities/internal/mergeOptions.js +5 -1
  541. package/utilities/internal/mergeOptions.js.map +1 -1
  542. package/utilities/internal/omitDeep.d.ts +5 -1
  543. package/utilities/internal/omitDeep.js +5 -1
  544. package/utilities/internal/omitDeep.js.map +1 -1
  545. package/utilities/internal/onAnyEvent.d.ts +5 -1
  546. package/utilities/internal/onAnyEvent.js +5 -1
  547. package/utilities/internal/onAnyEvent.js.map +1 -1
  548. package/utilities/internal/removeDirectivesFromDocument.d.ts +5 -1
  549. package/utilities/internal/removeDirectivesFromDocument.js +5 -1
  550. package/utilities/internal/removeDirectivesFromDocument.js.map +1 -1
  551. package/utilities/internal/resultKeyNameFromField.d.ts +5 -1
  552. package/utilities/internal/resultKeyNameFromField.js +5 -1
  553. package/utilities/internal/resultKeyNameFromField.js.map +1 -1
  554. package/utilities/internal/shouldInclude.d.ts +5 -1
  555. package/utilities/internal/shouldInclude.js +5 -1
  556. package/utilities/internal/shouldInclude.js.map +1 -1
  557. package/utilities/internal/storeKeyNameFromField.d.ts +5 -1
  558. package/utilities/internal/storeKeyNameFromField.js +5 -1
  559. package/utilities/internal/storeKeyNameFromField.js.map +1 -1
  560. package/utilities/internal/stringifyForDisplay.d.ts +5 -1
  561. package/utilities/internal/stringifyForDisplay.js +5 -1
  562. package/utilities/internal/stringifyForDisplay.js.map +1 -1
  563. package/utilities/internal/toQueryResult.d.ts +5 -1
  564. package/utilities/internal/toQueryResult.js +5 -1
  565. package/utilities/internal/toQueryResult.js.map +1 -1
  566. package/utilities/internal/types/DecoratedPromise.d.ts +5 -1
  567. package/utilities/internal/types/DeepOmit.d.ts +5 -1
  568. package/utilities/internal/types/DeepPartial.d.ts +5 -1
  569. package/utilities/internal/types/FragmentMap.d.ts +6 -4
  570. package/utilities/internal/types/FragmentMapFunction.d.ts +5 -1
  571. package/utilities/internal/types/FulfilledPromise.d.ts +5 -1
  572. package/utilities/internal/types/IsAny.d.ts +5 -1
  573. package/utilities/internal/types/PendingPromise.d.ts +5 -1
  574. package/utilities/internal/types/Prettify.d.ts +5 -1
  575. package/utilities/internal/types/Primitive.d.ts +5 -1
  576. package/utilities/internal/types/RejectedPromise.d.ts +5 -1
  577. package/utilities/internal/types/RemoveIndexSignature.d.ts +5 -1
  578. package/utilities/internal/types/VariablesOption.d.ts +5 -1
  579. package/utilities/internal/valueToObjectRepresentation.d.ts +5 -1
  580. package/utilities/internal/valueToObjectRepresentation.js +5 -1
  581. package/utilities/internal/valueToObjectRepresentation.js.map +1 -1
  582. package/version.js +1 -1
  583. package/__cjs/core/LocalState.cjs +0 -355
  584. package/__cjs/core/LocalState.cjs.map +0 -1
  585. package/__cjs/core/LocalState.d.cts +0 -53
  586. package/__cjs/utilities/internal/removeClientSetsFromDocument.cjs +0 -21
  587. package/__cjs/utilities/internal/removeClientSetsFromDocument.cjs.map +0 -1
  588. package/__cjs/utilities/internal/removeClientSetsFromDocument.d.cts +0 -8
  589. package/core/LocalState.d.ts +0 -53
  590. package/core/LocalState.js +0 -351
  591. package/core/LocalState.js.map +0 -1
  592. package/utilities/internal/removeClientSetsFromDocument.d.ts +0 -8
  593. package/utilities/internal/removeClientSetsFromDocument.js +0 -18
  594. package/utilities/internal/removeClientSetsFromDocument.js.map +0 -1
@@ -1,22 +1,35 @@
1
1
  import { equal } from "@wry/equality";
2
2
  import { Slot } from "optimism";
3
- import { BehaviorSubject, filter, lastValueFrom, tap } from "rxjs";
3
+ import { BehaviorSubject, lastValueFrom, Observable, Subject, tap } from "rxjs";
4
4
  import { __DEV__ } from "@apollo/client/utilities/environment";
5
- import { cloneDeep, compact, getOperationDefinition, getQueryDefinition, preventUnhandledRejection, toQueryResult, } from "@apollo/client/utilities/internal";
5
+ import { compact, filterMap, getOperationDefinition, getQueryDefinition, preventUnhandledRejection, toQueryResult, } from "@apollo/client/utilities/internal";
6
6
  import { invariant } from "@apollo/client/utilities/invariant";
7
7
  import { equalByQuery } from "./equalByQuery.js";
8
8
  import { isNetworkRequestInFlight, NetworkStatus } from "./networkStatus.js";
9
9
  const { assign, hasOwnProperty } = Object;
10
10
  const newNetworkStatusSymbol = Symbol();
11
- const uninitialized = {};
11
+ const uninitialized = {
12
+ loading: true,
13
+ networkStatus: NetworkStatus.loading,
14
+ data: undefined,
15
+ partial: true,
16
+ };
17
+ const empty = {
18
+ loading: false,
19
+ networkStatus: NetworkStatus.ready,
20
+ data: undefined,
21
+ partial: true,
22
+ };
12
23
  export class ObservableQuery {
13
24
  /**
14
- * @internal
15
- * A slot used by the `useQuery` hook to indicate that `client.watchQuery`
16
- * should not register the query immediately, but instead wait for the query to
17
- * be started registered with the `QueryManager` when `useSyncExternalStore`
18
- * actively subscribes to it.
19
- */
25
+ * @internal
26
+ * A slot used by the `useQuery` hook to indicate that `client.watchQuery`
27
+ * should not register the query immediately, but instead wait for the query to
28
+ * be started registered with the `QueryManager` when `useSyncExternalStore`
29
+ * actively subscribes to it.
30
+ *
31
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
32
+ */
20
33
  static inactiveOnCreation = new Slot();
21
34
  options;
22
35
  queryId;
@@ -34,23 +47,58 @@ export class ObservableQuery {
34
47
  get variables() {
35
48
  return this.options.variables;
36
49
  }
50
+ unsubscribeFromCache;
51
+ input;
37
52
  subject;
38
53
  observable;
39
54
  isTornDown;
40
55
  queryManager;
41
56
  subscriptions = new Set();
42
- waitForOwnResult;
43
- last;
57
+ /**
58
+ * If an `ObservableQuery` is created with a `network-only` fetch policy,
59
+ * it should actually start receiving cache updates, but not before it has
60
+ * received the first result from the network.
61
+ */
62
+ waitForNetworkResult;
44
63
  lastQuery;
45
64
  queryInfo;
46
65
  linkSubscription;
47
- linkObservable;
48
66
  pollingInfo;
49
- networkStatus;
67
+ get networkStatus() {
68
+ return this.subject.getValue().result.networkStatus;
69
+ }
50
70
  constructor({ queryManager, queryInfo, options, }) {
51
- this.networkStatus = NetworkStatus.loading;
52
71
  let startedInactive = ObservableQuery.inactiveOnCreation.getValue();
53
- this.subject = new BehaviorSubject(uninitialized);
72
+ // related classes
73
+ this.queryInfo = queryInfo;
74
+ this.queryManager = queryManager;
75
+ // active state
76
+ this.waitForNetworkResult = options.fetchPolicy === "network-only";
77
+ this.isTornDown = false;
78
+ this.subscribeToMore = this.subscribeToMore.bind(this);
79
+ this.maskResult = this.maskResult.bind(this);
80
+ const { watchQuery: { fetchPolicy: defaultFetchPolicy = "cache-first" } = {}, } = queryManager.defaultOptions;
81
+ const { fetchPolicy = defaultFetchPolicy,
82
+ // Make sure we don't store "standby" as the initialFetchPolicy.
83
+ initialFetchPolicy = fetchPolicy === "standby" ? defaultFetchPolicy : (fetchPolicy), } = options;
84
+ this.lastQuery = options.query;
85
+ this.options = {
86
+ ...options,
87
+ // Remember the initial options.fetchPolicy so we can revert back to this
88
+ // policy when variables change. This information can also be specified
89
+ // (or overridden) by providing options.initialFetchPolicy explicitly.
90
+ initialFetchPolicy,
91
+ // This ensures this.options.fetchPolicy always has a string value, in
92
+ // case options.fetchPolicy was not provided.
93
+ fetchPolicy,
94
+ variables: this.getVariablesWithDefaults(options.variables),
95
+ };
96
+ this.subject = new BehaviorSubject({
97
+ query: this.query,
98
+ variables: this.variables,
99
+ result: uninitialized,
100
+ meta: {},
101
+ });
54
102
  this.observable = this.subject.pipe(tap({
55
103
  subscribe: () => {
56
104
  if (startedInactive) {
@@ -58,22 +106,6 @@ export class ObservableQuery {
58
106
  startedInactive = false;
59
107
  }
60
108
  if (!this.subject.observed) {
61
- if (this.subject.value === uninitialized) {
62
- // Emitting a value in the `subscribe` callback of `tap` gives
63
- // the subject a chance to save this initial result without
64
- // emitting the placeholder value since this callback is executed
65
- // before `tap` subscribes to the source observable (the subject).
66
- // `reobserve` also has the chance to update this value if it
67
- // synchronously emits one (usually due to reporting a cache
68
- // value).
69
- //
70
- // We don't initialize the `BehaviorSubject` with
71
- // `getInitialResult` because its possible the cache might have
72
- // updated between when the `ObservableQuery` was instantiated and
73
- // when it is subscribed to. Updating the value here ensures we
74
- // report the most up-to-date result from the cache.
75
- this.subject.next(this.getInitialResult());
76
- }
77
109
  this.reobserve();
78
110
  // TODO: See if we can rework updatePolling to better handle this.
79
111
  // reobserve calls updatePolling but this `subscribe` callback is
@@ -88,45 +120,53 @@ export class ObservableQuery {
88
120
  this.tearDownQuery();
89
121
  }
90
122
  },
91
- }), filter((result) => {
92
- return (this.options.fetchPolicy !== "standby" &&
93
- (this.options.notifyOnNetworkStatusChange ||
94
- !result.loading ||
95
- // data could be defined for cache-and-network fetch policies
96
- // when emitting the cache result while loading the network result
97
- !!result.data));
98
- }));
123
+ }), filterMap(({ query, variables, result: current, meta }, context) => {
124
+ const { shouldEmit } = meta;
125
+ if (current === uninitialized) {
126
+ // reset internal state after `ObservableQuery.reset()`
127
+ context.previous = undefined;
128
+ context.previousVariables = undefined;
129
+ }
130
+ if (this.options.fetchPolicy === "standby" ||
131
+ shouldEmit === 2 /* EmitBehavior.never */)
132
+ return;
133
+ if (shouldEmit === 1 /* EmitBehavior.force */)
134
+ return emit();
135
+ const { previous, previousVariables } = context;
136
+ if (previous) {
137
+ const documentInfo = this.queryManager.getDocumentInfo(query);
138
+ const dataMasking = this.queryManager.dataMasking;
139
+ const maskedQuery = dataMasking ? documentInfo.nonReactiveQuery : query;
140
+ const resultIsEqual = dataMasking || documentInfo.hasNonreactiveDirective ?
141
+ equalByQuery(maskedQuery, previous, current, variables)
142
+ : equal(previous, current);
143
+ if (resultIsEqual && equal(previousVariables, variables)) {
144
+ return;
145
+ }
146
+ }
147
+ if (shouldEmit === 3 /* EmitBehavior.networkStatusChange */ &&
148
+ (!this.options.notifyOnNetworkStatusChange ||
149
+ equal(previous, current))) {
150
+ return;
151
+ }
152
+ return emit();
153
+ function emit() {
154
+ context.previous = current;
155
+ context.previousVariables = variables;
156
+ return current;
157
+ }
158
+ }, () => ({})));
99
159
  this["@@observable"] = () => this;
100
160
  if (Symbol.observable) {
101
161
  this[Symbol.observable] = () => this;
102
162
  }
103
163
  this.pipe = this.observable.pipe.bind(this.observable);
104
164
  this.subscribe = this.observable.subscribe.bind(this.observable);
105
- // related classes
106
- this.queryInfo = queryInfo;
107
- this.queryManager = queryManager;
108
- // active state
109
- this.waitForOwnResult = skipCacheDataFor(options.fetchPolicy);
110
- this.isTornDown = false;
111
- this.subscribe = this.subscribe.bind(this);
112
- this.subscribeToMore = this.subscribeToMore.bind(this);
113
- this.maskResult = this.maskResult.bind(this);
114
- const { watchQuery: { fetchPolicy: defaultFetchPolicy = "cache-first" } = {}, } = queryManager.defaultOptions;
115
- const { fetchPolicy = defaultFetchPolicy,
116
- // Make sure we don't store "standby" as the initialFetchPolicy.
117
- initialFetchPolicy = fetchPolicy === "standby" ? defaultFetchPolicy : (fetchPolicy), } = options;
118
- this.lastQuery = options.query;
119
- this.options = {
120
- ...options,
121
- // Remember the initial options.fetchPolicy so we can revert back to this
122
- // policy when variables change. This information can also be specified
123
- // (or overridden) by providing options.initialFetchPolicy explicitly.
124
- initialFetchPolicy,
125
- // This ensures this.options.fetchPolicy always has a string value, in
126
- // case options.fetchPolicy was not provided.
127
- fetchPolicy,
128
- variables: this.getVariablesWithDefaults(options.variables),
129
- };
165
+ this.input = new Subject();
166
+ // we want to feed many streams into `this.subject`, but none of them should
167
+ // be able to close `this.input`
168
+ this.input.complete = () => { };
169
+ this.input.pipe(this.operator).subscribe(this.subject);
130
170
  this.queryId = queryInfo.queryId || queryManager.generateQueryId();
131
171
  const opDef = getOperationDefinition(this.query);
132
172
  this.queryName = opDef && opDef.name && opDef.name.value;
@@ -138,14 +178,26 @@ export class ObservableQuery {
138
178
  pipe;
139
179
  [Symbol.observable];
140
180
  ["@@observable"];
141
- /** @internal */
181
+ /**
182
+ * @internal
183
+ *
184
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
185
+ */
142
186
  resetDiff() {
143
187
  this.queryInfo.resetDiff();
144
188
  }
145
- getInitialResult() {
189
+ getCacheDiff({ optimistic = true } = {}) {
190
+ return this.queryManager.cache.diff({
191
+ query: this.query,
192
+ variables: this.variables,
193
+ returnPartialData: true,
194
+ optimistic,
195
+ });
196
+ }
197
+ getInitialResult(initialFetchPolicy) {
146
198
  const fetchPolicy = this.queryManager.prioritizeCacheValues ?
147
199
  "cache-first"
148
- : this.options.fetchPolicy;
200
+ : initialFetchPolicy || this.options.fetchPolicy;
149
201
  const defaultResult = {
150
202
  data: undefined,
151
203
  loading: true,
@@ -153,7 +205,7 @@ export class ObservableQuery {
153
205
  partial: true,
154
206
  };
155
207
  const cacheResult = () => {
156
- const diff = this.queryInfo.getDiff();
208
+ const diff = this.getCacheDiff();
157
209
  return this.maskResult({
158
210
  data:
159
211
  // TODO: queryInfo.getDiff should handle this since cache.diff returns a
@@ -176,128 +228,101 @@ export class ObservableQuery {
176
228
  loading: true,
177
229
  networkStatus: NetworkStatus.loading,
178
230
  };
179
- case "standby":
180
- return {
181
- ...defaultResult,
182
- loading: false,
183
- networkStatus: NetworkStatus.ready,
184
- };
185
231
  default:
186
232
  return defaultResult;
187
233
  }
188
234
  }
189
- getCurrentFullResult(saveAsLastResult = true) {
190
- // Use the last result as long as the variables match this.variables.
191
- const lastResult = this.getLastResult(true);
192
- const networkStatus = this.networkStatus;
193
- const result = {
194
- data: undefined,
195
- partial: true,
196
- ...lastResult,
197
- loading: isNetworkRequestInFlight(networkStatus),
198
- networkStatus,
199
- };
200
- let { fetchPolicy = "cache-first" } = this.options;
201
- const { prioritizeCacheValues } = this.queryManager;
202
- if (prioritizeCacheValues) {
203
- fetchPolicy = "cache-first";
204
- }
205
- if (
206
- // These fetch policies should never deliver data from the cache, unless
207
- // redelivering a previously delivered result.
208
- skipCacheDataFor(fetchPolicy) ||
209
- // If this.options.query has @client(always: true) fields, we cannot
210
- // trust diff.result, since it was read from the cache without running
211
- // local resolvers (and it's too late to run resolvers now, since we must
212
- // return a result synchronously).
213
- this.queryManager.getDocumentInfo(this.query).hasForcedResolvers) {
214
- // Fall through.
215
- }
216
- else if (this.waitForOwnResult && !prioritizeCacheValues) {
217
- // This would usually be a part of `QueryInfo.getDiff()`.
218
- // which we skip in the waitForOwnResult case since we are not
219
- // interested in the diff.
220
- this.queryInfo["updateWatch"]();
235
+ resubscribeCache() {
236
+ const { variables, fetchPolicy } = this.options;
237
+ const query = this.query;
238
+ const shouldUnsubscribe = fetchPolicy === "standby" ||
239
+ fetchPolicy === "no-cache" ||
240
+ this.waitForNetworkResult;
241
+ const shouldResubscribe = !isEqualQuery({ query, variables }, this.unsubscribeFromCache) &&
242
+ !this.waitForNetworkResult;
243
+ if (shouldUnsubscribe || shouldResubscribe) {
244
+ this.unsubscribeFromCache?.();
221
245
  }
222
- else {
223
- const diff = this.queryInfo.getDiff();
224
- result.partial = !diff.complete;
225
- if (diff.complete || this.options.returnPartialData) {
226
- result.data = diff.result;
227
- }
228
- if (result.data === null) {
229
- result.data = void 0;
230
- }
231
- if (diff.complete) {
232
- // If the diff is complete, and we're using a FetchPolicy that
233
- // terminates after a complete cache read, we can assume the next result
234
- // we receive will have NetworkStatus.ready and !loading.
235
- if (diff.complete &&
236
- result.networkStatus === NetworkStatus.loading &&
237
- (fetchPolicy === "cache-first" || fetchPolicy === "cache-only")) {
238
- result.networkStatus = NetworkStatus.ready;
239
- result.loading = false;
246
+ if (shouldUnsubscribe || !shouldResubscribe) {
247
+ return;
248
+ }
249
+ const watch = {
250
+ query,
251
+ variables,
252
+ optimistic: true,
253
+ watcher: this,
254
+ callback: (diff) => {
255
+ const info = this.queryManager.getDocumentInfo(query);
256
+ if (info.hasClientExports || info.hasForcedResolvers) {
257
+ // If this is not set to something different than `diff`, we will
258
+ // not be notified about future cache changes with an equal `diff`.
259
+ // That would be the case if we are working with client-only fields
260
+ // that are forced or with `exports` fields that might change, causing
261
+ // local resovlers to return a new result.
262
+ // This is based on an implementation detail of `InMemoryCache`, which
263
+ // is not optimal - but the only alternative to this would be to
264
+ // resubscribe to the cache asynchonouly, which would bear the risk of
265
+ // missing further synchronous updates.
266
+ watch.lastDiff = undefined;
240
267
  }
241
- }
242
- // We need to check for both both `error` and `errors` field because there
243
- // are cases where sometimes `error` is set, but not `errors` and
244
- // vice-versa. This will be updated in the next major version when
245
- // `errors` is deprecated in favor of `error`.
246
- if (result.networkStatus === NetworkStatus.ready && result.error) {
247
- result.networkStatus = NetworkStatus.error;
248
- }
249
- if (__DEV__ &&
250
- !diff.complete &&
251
- !result.loading &&
252
- !result.data &&
253
- !result.error) {
254
- logMissingFieldErrors(diff.missing);
255
- }
268
+ if (watch.lastOwnDiff === diff) {
269
+ // skip cache updates that were caused by our own writes
270
+ return;
271
+ }
272
+ const { result: previousResult } = this.subject.getValue();
273
+ if (!diff.complete &&
274
+ // If we are trying to deliver an incomplete cache result, we avoid
275
+ // reporting it if the query has errored, otherwise we let the broadcast try
276
+ // and repair the partial result by refetching the query. This check avoids
277
+ // a situation where a query that errors and another succeeds with
278
+ // overlapping data does not report the partial data result to the errored
279
+ // query.
280
+ //
281
+ // See https://github.com/apollographql/apollo-client/issues/11400 for more
282
+ // information on this issue.
283
+ (previousResult.error ||
284
+ // Prevent to schedule a notify directly after the `ObservableQuery`
285
+ // has been `reset` (which will set the `previousResult` to `uninitialized` or `empty`)
286
+ // as in those cases, `resetCache` will manually call `refetch` with more intentional timing.
287
+ previousResult === uninitialized ||
288
+ previousResult === empty)) {
289
+ return;
290
+ }
291
+ if (!equal(previousResult.data, diff.result)) {
292
+ this.scheduleNotify();
293
+ }
294
+ },
295
+ };
296
+ const cancelWatch = this.queryManager.cache.watch(watch);
297
+ this.unsubscribeFromCache = Object.assign(() => {
298
+ this.unsubscribeFromCache = undefined;
299
+ cancelWatch();
300
+ }, { query, variables });
301
+ }
302
+ stableLastResult;
303
+ getCurrentResult() {
304
+ const { result: current } = this.subject.getValue();
305
+ let value = (
306
+ // if the `current` result is in an error state, we will always return that
307
+ // error state, even if we have no observers
308
+ (current.networkStatus === NetworkStatus.error ||
309
+ // if we have observers, we are watching the cache and
310
+ // this.subject.getValue() will always be up to date
311
+ this.hasObservers() || // if we are using a `no-cache` fetch policy in which case this
312
+ // `ObservableQuery` cannot have been updated from the outside - in
313
+ // that case, we prefer to keep the current value
314
+ this.options.fetchPolicy === "no-cache")) ?
315
+ current
316
+ // otherwise, the `current` value might be outdated due to missed
317
+ // external updates - calculate it again
318
+ : this.getInitialResult();
319
+ if (value === uninitialized) {
320
+ value = this.getInitialResult();
256
321
  }
257
- if (saveAsLastResult) {
258
- this.updateLastResult(result);
259
- }
260
- return result;
261
- }
262
- getCurrentResult(saveAsLastResult = true) {
263
- return this.maskResult(this.getCurrentFullResult(saveAsLastResult));
264
- }
265
- // Compares newResult to the snapshot we took of this.lastResult when it was
266
- // first received.
267
- isDifferentFromLastResult(newResult, variables) {
268
- if (!this.last) {
269
- return true;
270
- }
271
- const documentInfo = this.queryManager.getDocumentInfo(this.query);
272
- const dataMasking = this.queryManager.dataMasking;
273
- const query = dataMasking ? documentInfo.nonReactiveQuery : this.query;
274
- const resultIsDifferent = dataMasking || documentInfo.hasNonreactiveDirective ?
275
- !equalByQuery(query, this.last.result, newResult, this.variables)
276
- : !equal(this.last.result, newResult);
277
- return (resultIsDifferent || (variables && !equal(this.last.variables, variables)));
278
- }
279
- getLast(key, variablesMustMatch) {
280
- const last = this.last;
281
- if (last &&
282
- last[key] &&
283
- (!variablesMustMatch || equal(last.variables, this.variables))) {
284
- return last[key];
285
- }
286
- }
287
- // TODO: Consider deprecating this function
288
- getLastResult(variablesMustMatch) {
289
- return this.getLast("result", variablesMustMatch);
290
- }
291
- // TODO: Consider deprecating this function
292
- getLastError(variablesMustMatch) {
293
- return this.getLast("error", variablesMustMatch);
294
- }
295
- // TODO: Consider deprecating this function
296
- resetLastResults() {
297
- delete this.last;
298
- // TODO: This will need to be removed when tearing down an ObservableQuery
299
- // since the observable will terminate.
300
- this.isTornDown = false;
322
+ if (!equal(this.stableLastResult, value)) {
323
+ this.stableLastResult = value;
324
+ }
325
+ return this.stableLastResult;
301
326
  }
302
327
  /**
303
328
  * Update the variables of this observable query, and fetch the new results.
@@ -325,7 +350,7 @@ export class ObservableQuery {
325
350
  const queryDef = getQueryDefinition(this.query);
326
351
  const vars = queryDef.variableDefinitions;
327
352
  if (!vars || !vars.some((v) => v.variable.name.value === "variables")) {
328
- __DEV__ && invariant.warn(69, variables, queryDef.name?.value || queryDef);
353
+ __DEV__ && invariant.warn(77, variables, queryDef.name?.value || queryDef);
329
354
  }
330
355
  }
331
356
  if (variables && !equal(this.variables, variables)) {
@@ -372,26 +397,27 @@ export class ObservableQuery {
372
397
  fetchMoreOptions.query ?
373
398
  this.transformDocument(this.options.query)
374
399
  : combinedOptions.query;
375
- // Simulate a loading result for the original query with
376
- // result.networkStatus === NetworkStatus.fetchMore.
377
- const originalNetworkStatus = this.networkStatus;
378
- this.networkStatus = NetworkStatus.fetchMore;
379
- if (combinedOptions.notifyOnNetworkStatusChange) {
380
- this.observe();
381
- }
382
- const updatedQuerySet = new Set();
400
+ let wasUpdated = false;
383
401
  const updateQuery = fetchMoreOptions?.updateQuery;
384
402
  const isCached = this.options.fetchPolicy !== "no-cache";
385
403
  if (!isCached) {
386
- invariant(updateQuery, 70);
404
+ invariant(updateQuery, 78);
387
405
  }
406
+ const { finalize, pushNotification } = this.pushOperation(NetworkStatus.fetchMore);
407
+ pushNotification({
408
+ source: "newNetworkStatus",
409
+ kind: "N",
410
+ value: {},
411
+ }, { shouldEmit: 3 /* EmitBehavior.networkStatusChange */ });
388
412
  return this.queryManager
389
413
  .fetchQuery(qid, combinedOptions, NetworkStatus.fetchMore)
390
414
  .then((fetchMoreResult) => {
391
415
  this.queryManager.removeQuery(qid);
392
- if (this.networkStatus === NetworkStatus.fetchMore) {
393
- this.networkStatus = originalNetworkStatus;
394
- }
416
+ // disable the `fetchMore` override that is currently active
417
+ // the next updates caused by this should not be `fetchMore` anymore,
418
+ // but `ready` or whatever other calculated loading state is currently
419
+ // appropriate
420
+ finalize();
395
421
  if (isCached) {
396
422
  // Performing this cache update inside a cache.batch transaction ensures
397
423
  // any affected cache.watch watchers are notified at most once about any
@@ -426,9 +452,9 @@ export class ObservableQuery {
426
452
  }
427
453
  },
428
454
  onWatchUpdated: (watch) => {
429
- // Record the DocumentNode associated with any watched query whose
430
- // data were updated by the cache writes above.
431
- updatedQuerySet.add(watch.query);
455
+ if (watch.watcher === this) {
456
+ wasUpdated = true;
457
+ }
432
458
  },
433
459
  });
434
460
  }
@@ -447,28 +473,40 @@ export class ObservableQuery {
447
473
  // adjustment to the types on `updateQuery` since that function
448
474
  // expects that the first argument always contains previous result
449
475
  // data, but not `undefined`.
450
- const lastResult = this.getLast("result");
476
+ const lastResult = this.getCurrentResult();
451
477
  const data = updateQuery(lastResult.data, {
452
478
  fetchMoreResult: fetchMoreResult.data,
453
479
  variables: combinedOptions.variables,
454
480
  });
455
- this.reportResult({
456
- ...lastResult,
457
- networkStatus: originalNetworkStatus,
458
- loading: isNetworkRequestInFlight(originalNetworkStatus),
459
- data: data,
460
- }, this.variables);
481
+ // was reportResult
482
+ pushNotification({
483
+ kind: "N",
484
+ value: {
485
+ ...lastResult,
486
+ networkStatus: NetworkStatus.ready,
487
+ // will be overwritten anyways, just here for types sake
488
+ loading: false,
489
+ data: data,
490
+ },
491
+ source: "network",
492
+ });
461
493
  }
462
494
  return this.maskResult(fetchMoreResult);
463
495
  })
464
496
  .finally(() => {
497
+ // call `finalize` a second time in case the `.then` case above was not reached
498
+ finalize();
465
499
  // In case the cache writes above did not generate a broadcast
466
500
  // notification (which would have been intercepted by onWatchUpdated),
467
501
  // likely because the written data were the same as what was already in
468
502
  // the cache, we still want fetchMore to deliver its final loading:false
469
503
  // result with the unchanged data.
470
- if (isCached && !updatedQuerySet.has(this.query)) {
471
- this.reobserveCacheFirst();
504
+ if (isCached && !wasUpdated) {
505
+ pushNotification({
506
+ kind: "N",
507
+ source: "newNetworkStatus",
508
+ value: {},
509
+ }, { shouldEmit: 1 /* EmitBehavior.force */ });
472
510
  }
473
511
  });
474
512
  }
@@ -496,7 +534,7 @@ export class ObservableQuery {
496
534
  onError(error);
497
535
  }
498
536
  else {
499
- __DEV__ && invariant.error(71, error);
537
+ __DEV__ && invariant.error(79, error);
500
538
  }
501
539
  return;
502
540
  }
@@ -515,7 +553,11 @@ export class ObservableQuery {
515
553
  }
516
554
  };
517
555
  }
518
- /** @internal */
556
+ /**
557
+ * @internal
558
+ *
559
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
560
+ */
519
561
  silentSetOptions(newOptions) {
520
562
  const mergedOptions = compact(this.options, newOptions || {});
521
563
  assign(this.options, mergedOptions);
@@ -544,12 +586,12 @@ export class ObservableQuery {
544
586
  // If we have no observers, then we don't actually want to make a network
545
587
  // request. As soon as someone observes the query, the request will kick
546
588
  // off. For now, we just store any changes. (See #1077)
547
- return toQueryResult(this.subject.getValue());
589
+ return toQueryResult(this.getCurrentResult());
548
590
  }
549
591
  this.options.variables = variables;
550
592
  // See comment above
551
593
  if (!this.hasObservers()) {
552
- return toQueryResult(this.subject.getValue());
594
+ return toQueryResult(this.getCurrentResult());
553
595
  }
554
596
  return this.reobserve({
555
597
  // Reset options.fetchPolicy to its original value.
@@ -565,12 +607,7 @@ export class ObservableQuery {
565
607
  */
566
608
  updateQuery(mapFn) {
567
609
  const { queryManager } = this;
568
- const { result, complete } = queryManager.cache.diff({
569
- query: this.options.query,
570
- variables: this.variables,
571
- returnPartialData: true,
572
- optimistic: false,
573
- });
610
+ const { result, complete } = this.getCacheDiff({ optimistic: false });
574
611
  const newResult = mapFn(result, {
575
612
  variables: this.variables,
576
613
  complete: !!complete,
@@ -633,12 +670,95 @@ export class ObservableQuery {
633
670
  }
634
671
  return options.fetchPolicy;
635
672
  }
636
- fetch(options, newNetworkStatus, emitLoadingState, query) {
673
+ fetch(options, networkStatus, fetchQuery) {
637
674
  // TODO Make sure we update the networkStatus (and infer fetchVariables)
638
675
  // before actually committing to the fetch.
676
+ const initialFetchPolicy = this.options.fetchPolicy;
639
677
  const queryInfo = this.queryManager.getOrCreateQuery(this.queryId);
640
678
  queryInfo.setObservableQuery(this);
641
- return this.queryManager.fetchObservableWithInfo(queryInfo, options, newNetworkStatus, query, emitLoadingState);
679
+ options.context ??= {};
680
+ let synchronouslyEmitted = false;
681
+ const onCacheHit = () => {
682
+ synchronouslyEmitted = true;
683
+ };
684
+ const fetchQueryOperator = // we cannot use `tap` here, since it allows only for a "before subscription"
685
+
686
+ // hook with `subscribe` and we care for "directly before and after subscription"
687
+ (source) => new Observable((subscriber) => {
688
+ try {
689
+ return source.subscribe({
690
+ next(value) {
691
+ synchronouslyEmitted = true;
692
+ subscriber.next(value);
693
+ },
694
+ error: (error) => subscriber.error(error),
695
+ complete: () => subscriber.complete(),
696
+ });
697
+ }
698
+ finally {
699
+ if (!synchronouslyEmitted && this.activeOperations.has(operation)) {
700
+ operation.override = networkStatus;
701
+ this.input.next({
702
+ kind: "N",
703
+ source: "newNetworkStatus",
704
+ value: {
705
+ resetError: true,
706
+ },
707
+ query,
708
+ variables,
709
+ meta: {
710
+ shouldEmit: 3 /* EmitBehavior.networkStatusChange */,
711
+ /*
712
+ * The moment this notification is emitted, `nextFetchPolicy`
713
+ * might already have switched from a `network-only` to a
714
+ * `cache-something` policy, so we want to ensure that the
715
+ * loading state emit doesn't accidentally read from the cache
716
+ * in those cases.
717
+ */
718
+ fetchPolicy: initialFetchPolicy,
719
+ },
720
+ });
721
+ }
722
+ }
723
+ });
724
+ const { observable, fromLink } = this.queryManager.fetchObservableWithInfo(queryInfo, options, { networkStatus, query: fetchQuery, onCacheHit, fetchQueryOperator });
725
+ // track query and variables from the start of the operation
726
+ const { query, variables } = this;
727
+ const operation = {
728
+ abort: () => subscription.unsubscribe(),
729
+ query,
730
+ variables,
731
+ };
732
+ this.activeOperations.add(operation);
733
+ let forceFirstValueEmit = networkStatus == NetworkStatus.refetch ||
734
+ networkStatus == NetworkStatus.setVariables;
735
+ const subscription = observable
736
+ .pipe(tap({
737
+ next: (notification) => {
738
+ if (notification.source === "newNetworkStatus" ||
739
+ (notification.kind === "N" && notification.value.loading)) {
740
+ operation.override = networkStatus;
741
+ }
742
+ else {
743
+ delete operation.override;
744
+ }
745
+ },
746
+ finalize: () => this.activeOperations.delete(operation),
747
+ }))
748
+ .subscribe({
749
+ next: (value) => {
750
+ const meta = {};
751
+ if (forceFirstValueEmit &&
752
+ value.kind === "N" &&
753
+ "loading" in value.value &&
754
+ !value.value.loading) {
755
+ forceFirstValueEmit = false;
756
+ meta.shouldEmit = 1 /* EmitBehavior.force */;
757
+ }
758
+ this.input.next({ ...value, query, variables, meta });
759
+ },
760
+ });
761
+ return { fromLink, subscription, observable };
642
762
  }
643
763
  // Turns polling on or off based on this.options.pollInterval.
644
764
  updatePolling() {
@@ -654,7 +774,7 @@ export class ObservableQuery {
654
774
  if (pollingInfo && pollingInfo.interval === pollInterval) {
655
775
  return;
656
776
  }
657
- invariant(pollInterval, 72);
777
+ invariant(pollInterval, 80);
658
778
  const info = pollingInfo || (this.pollingInfo = {});
659
779
  info.interval = pollInterval;
660
780
  const maybeFetch = () => {
@@ -693,20 +813,6 @@ export class ObservableQuery {
693
813
  delete this.pollingInfo;
694
814
  }
695
815
  }
696
- updateLastResult(newResult, variables = this.variables) {
697
- let error = this.getLastError();
698
- // Preserve this.last.error unless the variables have changed.
699
- if (error && this.last && !equal(variables, this.last.variables)) {
700
- error = void 0;
701
- }
702
- return (this.last = {
703
- result: this.queryManager.assumeImmutableResults ?
704
- newResult
705
- : cloneDeep(newResult),
706
- variables,
707
- ...(error ? { error } : null),
708
- });
709
- }
710
816
  /**
711
817
  * Reevaluate the query, optionally against new options. New options will be
712
818
  * merged with the current options when given.
@@ -721,12 +827,9 @@ export class ObservableQuery {
721
827
  }
722
828
  const useDisposableObservable =
723
829
  // Refetching uses a disposable Observable to allow refetches using different
724
- // options/variables, without permanently altering the options of the
830
+ // options, without permanently altering the options of the
725
831
  // original ObservableQuery.
726
832
  newNetworkStatus === NetworkStatus.refetch ||
727
- // The fetchMore method does not actually call the reobserve method, but,
728
- // if it did, it would definitely use a disposable Observable.
729
- newNetworkStatus === NetworkStatus.fetchMore ||
730
833
  // Polling uses a disposable Observable so the polling options (which force
731
834
  // fetchPolicy to be "network-only" or "no-cache") won't override the original options.
732
835
  newNetworkStatus === NetworkStatus.poll;
@@ -795,47 +898,27 @@ export class ObservableQuery {
795
898
  if (options.fetchPolicy === "standby") {
796
899
  this.cancelPolling();
797
900
  }
798
- this.networkStatus = newNetworkStatus;
799
- this.waitForOwnResult &&= skipCacheDataFor(options.fetchPolicy);
800
- const finishWaitingForOwnResult = () => {
801
- if (this.linkObservable === observable) {
802
- this.waitForOwnResult = false;
803
- }
804
- };
805
- const variables = { ...options.variables };
806
- const { notifyOnNetworkStatusChange = true } = options;
807
- const { observable, fromLink } = this.fetch(options, newNetworkStatus, notifyOnNetworkStatusChange &&
808
- oldNetworkStatus !== newNetworkStatus &&
809
- isNetworkRequestInFlight(newNetworkStatus), query);
810
- const observer = {
811
- next: (result) => {
812
- if (equal(this.variables, variables)) {
813
- finishWaitingForOwnResult();
814
- this.reportResult(result, variables);
815
- }
816
- },
817
- error: (error) => {
818
- if (equal(this.variables, variables)) {
819
- finishWaitingForOwnResult();
820
- this.reportError(error, variables);
821
- }
822
- },
823
- };
901
+ this.resubscribeCache();
902
+ const { subscription, observable, fromLink } = this.fetch(options, newNetworkStatus, query);
824
903
  if (!useDisposableObservable && (fromLink || !this.linkSubscription)) {
825
904
  if (this.linkSubscription) {
826
905
  this.linkSubscription.unsubscribe();
827
906
  }
828
- this.linkObservable = observable;
829
- this.linkSubscription = observable.subscribe(observer);
830
- }
831
- else {
832
- observable.subscribe(observer);
907
+ this.linkSubscription = subscription;
833
908
  }
834
909
  return preventUnhandledRejection(
835
910
  // Note: lastValueFrom will create a separate subscription to the
836
911
  // observable which means that terminating this ObservableQuery will not
837
912
  // cancel the request from the link chain.
838
- lastValueFrom(observable, {
913
+ lastValueFrom(observable.pipe(filterMap((value) => {
914
+ switch (value.kind) {
915
+ case "E":
916
+ throw value.error;
917
+ case "N":
918
+ if (value.source !== "newNetworkStatus")
919
+ return value.value;
920
+ }
921
+ })), {
839
922
  // This default value should only be used when using a `fetchPolicy` of
840
923
  // `standby` since that fetch policy completes without emitting a
841
924
  // result. Since we are converting this to a QueryResult type, we
@@ -843,54 +926,16 @@ export class ObservableQuery {
843
926
  defaultValue: { data: undefined },
844
927
  }).then((result) => toQueryResult(this.maskResult(result))));
845
928
  }
846
- // (Re)deliver the current result to this.observers without applying fetch
847
- // policies or making network requests.
848
- observe() {
849
- this.reportResult(
850
- // Passing false is important so that this.getCurrentResult doesn't
851
- // save the fetchMore result as this.lastResult, causing it to be
852
- // ignored due to the this.isDifferentFromLastResult check in
853
- // this.reportResult.
854
- this.getCurrentFullResult(false), this.variables);
855
- }
856
- reportResult(result, variables) {
857
- const lastError = this.getLastError();
858
- const isDifferent = this.isDifferentFromLastResult(result, variables);
859
- // Update the last result even when isDifferentFromLastResult returns false,
860
- // because the query may be using the @nonreactive directive, and we want to
861
- // save the the latest version of any nonreactive subtrees (in case
862
- // getCurrentResult is called), even though we skip broadcasting changes.
863
- this.updateLastResult(result, variables);
864
- this.networkStatus = result.networkStatus;
865
- if (lastError || isDifferent) {
866
- this.subject.next(this.maskResult(result));
867
- }
868
- }
869
- reportError(error, variables) {
870
- // Since we don't get the current result on errors, only the error, we
871
- // must mirror the updates that occur in QueryStore.markQueryError here
872
- const errorResult = {
873
- data: undefined,
874
- partial: true,
875
- ...this.getLastResult(),
876
- error,
877
- networkStatus: NetworkStatus.error,
878
- loading: false,
879
- };
880
- this.updateLastResult(errorResult, variables);
881
- this.networkStatus = NetworkStatus.error;
882
- this.last.error = error;
883
- this.subject.next(errorResult);
884
- }
885
929
  hasObservers() {
886
930
  return this.subject.observed;
887
931
  }
888
932
  tearDownQuery() {
889
933
  if (this.isTornDown)
890
934
  return;
891
- if (this.linkObservable && this.linkSubscription) {
935
+ this.resetNotifications();
936
+ this.unsubscribeFromCache?.();
937
+ if (this.linkSubscription) {
892
938
  this.linkSubscription.unsubscribe();
893
- delete this.linkObservable;
894
939
  delete this.linkSubscription;
895
940
  }
896
941
  this.stopPolling();
@@ -899,6 +944,7 @@ export class ObservableQuery {
899
944
  this.subscriptions.clear();
900
945
  this.queryManager.removeQuery(this.queryId);
901
946
  this.isTornDown = true;
947
+ this.abortActiveOperations();
902
948
  }
903
949
  transformDocument(document) {
904
950
  return this.queryManager.transform(document);
@@ -918,57 +964,231 @@ export class ObservableQuery {
918
964
  }
919
965
  dirty = false;
920
966
  notifyTimeout;
921
- /** @internal */
967
+ /**
968
+ * @internal
969
+ *
970
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
971
+ */
922
972
  resetNotifications() {
923
- this.cancelNotifyTimeout();
924
- this.dirty = false;
925
- }
926
- cancelNotifyTimeout() {
927
973
  if (this.notifyTimeout) {
928
974
  clearTimeout(this.notifyTimeout);
929
975
  this.notifyTimeout = void 0;
930
976
  }
977
+ this.dirty = false;
931
978
  }
932
- /** @internal */
979
+ /**
980
+ * @internal
981
+ *
982
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
983
+ */
933
984
  scheduleNotify() {
934
985
  if (this.dirty)
935
986
  return;
936
987
  this.dirty = true;
937
988
  if (!this.notifyTimeout) {
938
- this.notifyTimeout = setTimeout(() => this.notify(), 0);
989
+ this.notifyTimeout = setTimeout(() => this.notify(true), 0);
939
990
  }
940
991
  }
941
- /** @internal */
942
- notify() {
943
- this.cancelNotifyTimeout();
944
- if (this.dirty) {
945
- if (this.options.fetchPolicy == "cache-only" ||
992
+ /**
993
+ * @internal
994
+ *
995
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
996
+ */
997
+ notify(scheduled = false) {
998
+ if (!scheduled) {
999
+ // For queries with client exports or forced resolvers, we don't want to
1000
+ // synchronously reobserve the cache on broadcast,
1001
+ // but actually wait for the `scheduleNotify` timeout triggered by the
1002
+ // `cache.watch` callback from `resubscribeCache`.
1003
+ const info = this.queryManager.getDocumentInfo(this.query);
1004
+ if (info.hasClientExports || info.hasForcedResolvers) {
1005
+ return;
1006
+ }
1007
+ }
1008
+ const { dirty } = this;
1009
+ this.resetNotifications();
1010
+ if (dirty &&
1011
+ (this.options.fetchPolicy == "cache-only" ||
946
1012
  this.options.fetchPolicy == "cache-and-network" ||
947
- !isNetworkRequestInFlight(this.networkStatus)) {
948
- const diff = this.queryInfo.getDiff();
949
- if (diff.fromOptimisticTransaction) {
950
- // If this diff came from an optimistic transaction, deliver the
951
- // current cache data to the ObservableQuery, but don't perform a
952
- // reobservation, since oq.reobserveCacheFirst might make a network
953
- // request, and we never want to trigger network requests in the
954
- // middle of optimistic updates.
955
- this.observe();
956
- }
957
- else {
958
- // Otherwise, make the ObservableQuery "reobserve" the latest data
959
- // using a temporary fetch policy of "cache-first", so complete cache
960
- // results have a chance to be delivered without triggering additional
961
- // network requests, even when options.fetchPolicy is "network-only"
962
- // or "cache-and-network". All other fetch policies are preserved by
963
- // this method, and are handled by calling oq.reobserve(). If this
964
- // reobservation is spurious, isDifferentFromLastResult still has a
965
- // chance to catch it before delivery to ObservableQuery subscribers.
966
- this.reobserveCacheFirst();
967
- }
1013
+ !this.activeOperations.size)) {
1014
+ const diff = this.getCacheDiff();
1015
+ if (
1016
+ // `fromOptimisticTransaction` is not avaiable through the `cache.diff`
1017
+ // code path, so we need to check it this way
1018
+ equal(diff.result, this.getCacheDiff({ optimistic: false }).result)) {
1019
+ //If this diff did not come from an optimistic transaction
1020
+ // make the ObservableQuery "reobserve" the latest data
1021
+ // using a temporary fetch policy of "cache-first", so complete cache
1022
+ // results have a chance to be delivered without triggering additional
1023
+ // network requests, even when options.fetchPolicy is "network-only"
1024
+ // or "cache-and-network". All other fetch policies are preserved by
1025
+ // this method, and are handled by calling oq.reobserve(). If this
1026
+ // reobservation is spurious, distinctUntilChanged still has a
1027
+ // chance to catch it before delivery to ObservableQuery subscribers.
1028
+ this.reobserveCacheFirst();
1029
+ }
1030
+ else {
1031
+ // If this diff came from an optimistic transaction, deliver the
1032
+ // current cache data to the ObservableQuery, but don't perform a
1033
+ // reobservation, since oq.reobserveCacheFirst might make a network
1034
+ // request, and we never want to trigger network requests in the
1035
+ // middle of optimistic updates.
1036
+ this.input.next({
1037
+ kind: "N",
1038
+ value: {
1039
+ data: diff.result,
1040
+ networkStatus: NetworkStatus.ready,
1041
+ loading: false,
1042
+ error: undefined,
1043
+ partial: !diff.complete,
1044
+ },
1045
+ source: "cache",
1046
+ query: this.query,
1047
+ variables: this.variables,
1048
+ meta: {},
1049
+ });
968
1050
  }
969
1051
  }
970
- this.dirty = false;
971
1052
  }
1053
+ activeOperations = new Set();
1054
+ pushOperation(networkStatus) {
1055
+ let aborted = false;
1056
+ // track query and variables from the start of the operation
1057
+ const { query, variables } = this;
1058
+ const finalize = () => {
1059
+ this.activeOperations.delete(operation);
1060
+ };
1061
+ const operation = {
1062
+ override: networkStatus,
1063
+ abort: () => {
1064
+ aborted = true;
1065
+ finalize();
1066
+ },
1067
+ query,
1068
+ variables,
1069
+ };
1070
+ this.activeOperations.add(operation);
1071
+ return {
1072
+ finalize,
1073
+ pushNotification: (notification, additionalMeta) => {
1074
+ if (!aborted) {
1075
+ this.input.next({
1076
+ ...notification,
1077
+ query,
1078
+ variables,
1079
+ meta: { ...additionalMeta },
1080
+ });
1081
+ }
1082
+ },
1083
+ };
1084
+ }
1085
+ calculateNetworkStatus(baseNetworkStatus) {
1086
+ // in the future, this could be more complex logic, e.g. "refetch" and
1087
+ // "fetchMore" having priority over "polling" or "loading" network statuses
1088
+ // as for now we just take the "latest" operation that is still active,
1089
+ // as that lines up best with previous behavior[]
1090
+ const operation = Array.from(this.activeOperations.values()).findLast((operation) => isEqualQuery(operation, this) && operation.override !== undefined);
1091
+ return operation?.override ?? baseNetworkStatus;
1092
+ }
1093
+ abortActiveOperations() {
1094
+ this.activeOperations.forEach((operation) => operation.abort());
1095
+ }
1096
+ /**
1097
+ * @internal
1098
+ * Called from `clearStore`.
1099
+ * * resets the query to its initial state
1100
+ * * cancels all active operations and their subscriptions
1101
+ *
1102
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
1103
+ */
1104
+ reset() {
1105
+ // exception for cache-only queries - we reset them into a "ready" state
1106
+ // as we won't trigger a refetch for them
1107
+ const resetToEmpty = this.options.fetchPolicy === "cache-only";
1108
+ this.setResult(resetToEmpty ? empty : uninitialized, {
1109
+ shouldEmit: resetToEmpty ? 1 /* EmitBehavior.force */ : 2 /* EmitBehavior.never */,
1110
+ });
1111
+ this.abortActiveOperations();
1112
+ }
1113
+ /**
1114
+ * @internal
1115
+ *
1116
+ * @deprecated This is an internal API and should not be used directly. This can be removed or changed at any time.
1117
+ */
1118
+ setResult(result, additionalMeta) {
1119
+ this.input.next({
1120
+ source: "setResult",
1121
+ kind: "N",
1122
+ value: result,
1123
+ query: this.query,
1124
+ variables: this.variables,
1125
+ meta: { ...additionalMeta },
1126
+ });
1127
+ }
1128
+ operator = filterMap((notification) => {
1129
+ const { query, variables, meta } = notification;
1130
+ if (notification.source === "setResult") {
1131
+ return { query, variables, result: notification.value, meta };
1132
+ }
1133
+ if (notification.kind === "C" || !isEqualQuery(notification, this)) {
1134
+ return;
1135
+ }
1136
+ let result;
1137
+ const previous = this.subject.getValue();
1138
+ if (notification.source === "cache") {
1139
+ result = notification.value;
1140
+ if (result.networkStatus === NetworkStatus.ready &&
1141
+ result.partial &&
1142
+ (!this.options.returnPartialData ||
1143
+ previous.result.networkStatus === NetworkStatus.error) &&
1144
+ this.options.fetchPolicy !== "cache-only") {
1145
+ return;
1146
+ }
1147
+ }
1148
+ else if (notification.source === "network") {
1149
+ if (this.waitForNetworkResult) {
1150
+ this.waitForNetworkResult = false;
1151
+ this.resubscribeCache();
1152
+ }
1153
+ result =
1154
+ notification.kind === "E" ?
1155
+ {
1156
+ data: undefined,
1157
+ partial: true,
1158
+ ...(isEqualQuery(previous, notification) ? previous.result : {}),
1159
+ error: notification.error,
1160
+ networkStatus: NetworkStatus.error,
1161
+ loading: false,
1162
+ }
1163
+ : notification.value;
1164
+ if (result.error) {
1165
+ meta.shouldEmit = 1 /* EmitBehavior.force */;
1166
+ }
1167
+ }
1168
+ else if (notification.source === "newNetworkStatus") {
1169
+ const baseResult = isEqualQuery(previous, notification) ?
1170
+ previous.result
1171
+ : this.getInitialResult(meta.fetchPolicy);
1172
+ const { resetError } = notification.value;
1173
+ const error = resetError ? undefined : baseResult.error;
1174
+ const networkStatus = error ? NetworkStatus.error : NetworkStatus.ready;
1175
+ result = {
1176
+ ...baseResult,
1177
+ error,
1178
+ networkStatus,
1179
+ };
1180
+ }
1181
+ // every code path until here should have either returned or set a result,
1182
+ // but typescript needs a little help
1183
+ invariant(result);
1184
+ // normalize result shape
1185
+ if (!result.error)
1186
+ delete result.error;
1187
+ result.networkStatus = this.calculateNetworkStatus(result.networkStatus);
1188
+ result.loading = isNetworkRequestInFlight(result.networkStatus);
1189
+ result = this.maskResult(result);
1190
+ return { query, variables, result, meta };
1191
+ });
972
1192
  // Reobserve with fetchPolicy effectively set to "cache-first", triggering
973
1193
  // delivery of any new data from the cache, possibly falling back to the network
974
1194
  // if any cache data are missing. This allows _complete_ cache results to be
@@ -1005,12 +1225,10 @@ export class ObservableQuery {
1005
1225
  }
1006
1226
  export function logMissingFieldErrors(missing) {
1007
1227
  if (__DEV__ && missing) {
1008
- __DEV__ && invariant.debug(73, missing);
1228
+ __DEV__ && invariant.debug(81, missing);
1009
1229
  }
1010
1230
  }
1011
- function skipCacheDataFor(fetchPolicy /* `undefined` would mean `"cache-first"` */) {
1012
- return (fetchPolicy === "network-only" ||
1013
- fetchPolicy === "no-cache" ||
1014
- fetchPolicy === "standby");
1231
+ function isEqualQuery(a, b) {
1232
+ return !!(a && b && a.query === b.query && equal(a.variables, b.variables));
1015
1233
  }
1016
1234
  //# sourceMappingURL=ObservableQuery.js.map