@isograph/react 0.4.3 → 0.5.1

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 (327) hide show
  1. package/.turbo/turbo-compile-libs.log +10 -3
  2. package/dist/_virtual/rolldown_runtime.js +25 -0
  3. package/dist/core/FragmentReference.d.mts +38 -0
  4. package/dist/core/FragmentReference.d.mts.map +1 -0
  5. package/dist/core/FragmentReference.d.ts +31 -27
  6. package/dist/core/FragmentReference.d.ts.map +1 -1
  7. package/dist/core/FragmentReference.js +8 -6
  8. package/dist/core/FragmentReference.mjs +10 -0
  9. package/dist/core/FragmentReference.mjs.map +1 -0
  10. package/dist/core/IsographEnvironment.d.mts +89 -0
  11. package/dist/core/IsographEnvironment.d.mts.map +1 -0
  12. package/dist/core/IsographEnvironment.d.ts +77 -72
  13. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  14. package/dist/core/IsographEnvironment.js +62 -59
  15. package/dist/core/IsographEnvironment.mjs +67 -0
  16. package/dist/core/IsographEnvironment.mjs.map +1 -0
  17. package/dist/core/PromiseWrapper.d.mts +36 -0
  18. package/dist/core/PromiseWrapper.d.mts.map +1 -0
  19. package/dist/core/PromiseWrapper.d.ts +27 -18
  20. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  21. package/dist/core/PromiseWrapper.js +45 -43
  22. package/dist/core/PromiseWrapper.mjs +49 -0
  23. package/dist/core/PromiseWrapper.mjs.map +1 -0
  24. package/dist/core/areEqualWithDeepComparison.js +56 -108
  25. package/dist/core/areEqualWithDeepComparison.mjs +62 -0
  26. package/dist/core/areEqualWithDeepComparison.mjs.map +1 -0
  27. package/dist/core/brand.d.mts +19 -0
  28. package/dist/core/brand.d.mts.map +1 -0
  29. package/dist/core/brand.d.ts +18 -1
  30. package/dist/core/brand.d.ts.map +1 -1
  31. package/dist/core/cache.d.mts +20 -0
  32. package/dist/core/cache.d.mts.map +1 -0
  33. package/dist/core/cache.d.ts +18 -34
  34. package/dist/core/cache.d.ts.map +1 -1
  35. package/dist/core/cache.js +210 -516
  36. package/dist/core/cache.mjs +237 -0
  37. package/dist/core/cache.mjs.map +1 -0
  38. package/dist/core/check.d.mts +28 -0
  39. package/dist/core/check.d.mts.map +1 -0
  40. package/dist/core/check.d.ts +24 -18
  41. package/dist/core/check.d.ts.map +1 -1
  42. package/dist/core/check.js +80 -124
  43. package/dist/core/check.mjs +84 -0
  44. package/dist/core/check.mjs.map +1 -0
  45. package/dist/core/componentCache.js +10 -34
  46. package/dist/core/componentCache.mjs +12 -0
  47. package/dist/core/componentCache.mjs.map +1 -0
  48. package/dist/core/entrypoint.d.mts +99 -0
  49. package/dist/core/entrypoint.d.mts.map +1 -0
  50. package/dist/core/entrypoint.d.ts +83 -68
  51. package/dist/core/entrypoint.d.ts.map +1 -1
  52. package/dist/core/entrypoint.js +6 -5
  53. package/dist/core/entrypoint.mjs +8 -0
  54. package/dist/core/entrypoint.mjs.map +1 -0
  55. package/dist/core/garbageCollection.d.mts +18 -0
  56. package/dist/core/garbageCollection.d.mts.map +1 -0
  57. package/dist/core/garbageCollection.d.ts +15 -10
  58. package/dist/core/garbageCollection.d.ts.map +1 -1
  59. package/dist/core/garbageCollection.js +82 -99
  60. package/dist/core/garbageCollection.mjs +89 -0
  61. package/dist/core/garbageCollection.mjs.map +1 -0
  62. package/dist/core/getOrCreateCacheForArtifact.js +37 -0
  63. package/dist/core/getOrCreateCacheForArtifact.mjs +38 -0
  64. package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -0
  65. package/dist/core/logging.d.mts +95 -0
  66. package/dist/core/logging.d.mts.map +1 -0
  67. package/dist/core/logging.d.ts +78 -60
  68. package/dist/core/logging.d.ts.map +1 -1
  69. package/dist/core/logging.js +17 -18
  70. package/dist/core/logging.mjs +20 -0
  71. package/dist/core/logging.mjs.map +1 -0
  72. package/dist/core/makeNetworkRequest.d.mts +13 -0
  73. package/dist/core/makeNetworkRequest.d.mts.map +1 -0
  74. package/dist/core/makeNetworkRequest.d.ts +12 -8
  75. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  76. package/dist/core/makeNetworkRequest.js +188 -195
  77. package/dist/core/makeNetworkRequest.mjs +195 -0
  78. package/dist/core/makeNetworkRequest.mjs.map +1 -0
  79. package/dist/core/optimisticProxy.d.mts +43 -0
  80. package/dist/core/optimisticProxy.d.mts.map +1 -0
  81. package/dist/core/optimisticProxy.d.ts +43 -0
  82. package/dist/core/optimisticProxy.d.ts.map +1 -0
  83. package/dist/core/optimisticProxy.js +273 -0
  84. package/dist/core/optimisticProxy.mjs +268 -0
  85. package/dist/core/optimisticProxy.mjs.map +1 -0
  86. package/dist/core/read.d.mts +29 -0
  87. package/dist/core/read.d.mts.map +1 -0
  88. package/dist/core/read.d.ts +23 -27
  89. package/dist/core/read.d.ts.map +1 -1
  90. package/dist/core/read.js +438 -618
  91. package/dist/core/read.mjs +456 -0
  92. package/dist/core/read.mjs.map +1 -0
  93. package/dist/core/reader.d.mts +89 -0
  94. package/dist/core/reader.d.mts.map +1 -0
  95. package/dist/core/reader.d.ts +78 -74
  96. package/dist/core/reader.d.ts.map +1 -1
  97. package/dist/core/startUpdate.js +118 -156
  98. package/dist/core/startUpdate.mjs +125 -0
  99. package/dist/core/startUpdate.mjs.map +1 -0
  100. package/dist/core/subscribe.d.mts +12 -0
  101. package/dist/core/subscribe.d.mts.map +1 -0
  102. package/dist/core/subscribe.d.ts +12 -0
  103. package/dist/core/subscribe.d.ts.map +1 -0
  104. package/dist/core/subscribe.js +79 -0
  105. package/dist/core/subscribe.mjs +79 -0
  106. package/dist/core/subscribe.mjs.map +1 -0
  107. package/dist/core/util.d.mts +27 -0
  108. package/dist/core/util.d.mts.map +1 -0
  109. package/dist/core/util.d.ts +21 -17
  110. package/dist/core/util.d.ts.map +1 -1
  111. package/dist/core/util.js +22 -2
  112. package/dist/core/util.mjs +21 -0
  113. package/dist/core/util.mjs.map +1 -0
  114. package/dist/core/writeData.d.mts +11 -0
  115. package/dist/core/writeData.d.mts.map +1 -0
  116. package/dist/core/writeData.d.ts +11 -0
  117. package/dist/core/writeData.d.ts.map +1 -0
  118. package/dist/core/writeData.js +41 -0
  119. package/dist/core/writeData.mjs +42 -0
  120. package/dist/core/writeData.mjs.map +1 -0
  121. package/dist/index.d.mts +32 -0
  122. package/dist/index.d.ts +32 -29
  123. package/dist/index.js +70 -68
  124. package/dist/index.mjs +31 -0
  125. package/dist/loadable-hooks/useClientSideDefer.d.mts +12 -0
  126. package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -0
  127. package/dist/loadable-hooks/useClientSideDefer.d.ts +10 -8
  128. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  129. package/dist/loadable-hooks/useClientSideDefer.js +14 -12
  130. package/dist/loadable-hooks/useClientSideDefer.mjs +14 -0
  131. package/dist/loadable-hooks/useClientSideDefer.mjs.map +1 -0
  132. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts +33 -0
  133. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -0
  134. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +27 -21
  135. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  136. package/dist/loadable-hooks/useConnectionSpecPagination.js +133 -158
  137. package/dist/loadable-hooks/useConnectionSpecPagination.mjs +134 -0
  138. package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -0
  139. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts +8 -0
  140. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -0
  141. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -3
  142. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  143. package/dist/loadable-hooks/useImperativeExposedMutationField.js +9 -12
  144. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs +11 -0
  145. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs.map +1 -0
  146. package/dist/loadable-hooks/useImperativeLoadableField.d.mts +19 -0
  147. package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -0
  148. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +15 -11
  149. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  150. package/dist/loadable-hooks/useImperativeLoadableField.js +16 -12
  151. package/dist/loadable-hooks/useImperativeLoadableField.mjs +17 -0
  152. package/dist/loadable-hooks/useImperativeLoadableField.mjs.map +1 -0
  153. package/dist/loadable-hooks/useSkipLimitPagination.d.mts +24 -0
  154. package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -0
  155. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +19 -15
  156. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  157. package/dist/loadable-hooks/useSkipLimitPagination.js +118 -160
  158. package/dist/loadable-hooks/useSkipLimitPagination.mjs +119 -0
  159. package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -0
  160. package/dist/react/FragmentReader.d.mts +18 -0
  161. package/dist/react/FragmentReader.d.mts.map +1 -0
  162. package/dist/react/FragmentReader.d.ts +16 -7
  163. package/dist/react/FragmentReader.d.ts.map +1 -1
  164. package/dist/react/FragmentReader.js +8 -7
  165. package/dist/react/FragmentReader.mjs +10 -0
  166. package/dist/react/FragmentReader.mjs.map +1 -0
  167. package/dist/react/FragmentRenderer.d.mts +20 -0
  168. package/dist/react/FragmentRenderer.d.mts.map +1 -0
  169. package/dist/react/FragmentRenderer.d.ts +18 -13
  170. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  171. package/dist/react/FragmentRenderer.js +11 -33
  172. package/dist/react/FragmentRenderer.mjs +12 -0
  173. package/dist/react/FragmentRenderer.mjs.map +1 -0
  174. package/dist/react/IsographEnvironmentProvider.d.mts +17 -0
  175. package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -0
  176. package/dist/react/IsographEnvironmentProvider.d.ts +15 -9
  177. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  178. package/dist/react/IsographEnvironmentProvider.js +15 -39
  179. package/dist/react/IsographEnvironmentProvider.mjs +17 -0
  180. package/dist/react/IsographEnvironmentProvider.mjs.map +1 -0
  181. package/dist/react/LoadableFieldReader.d.mts +21 -0
  182. package/dist/react/LoadableFieldReader.d.mts.map +1 -0
  183. package/dist/react/LoadableFieldReader.d.ts +20 -11
  184. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  185. package/dist/react/LoadableFieldReader.js +13 -8
  186. package/dist/react/LoadableFieldReader.mjs +14 -0
  187. package/dist/react/LoadableFieldReader.mjs.map +1 -0
  188. package/dist/react/LoadableFieldRenderer.d.mts +22 -0
  189. package/dist/react/LoadableFieldRenderer.d.mts.map +1 -0
  190. package/dist/react/LoadableFieldRenderer.d.ts +21 -12
  191. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  192. package/dist/react/LoadableFieldRenderer.js +13 -35
  193. package/dist/react/LoadableFieldRenderer.mjs +14 -0
  194. package/dist/react/LoadableFieldRenderer.mjs.map +1 -0
  195. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +18 -0
  196. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -0
  197. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +11 -3
  198. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -1
  199. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +17 -13
  200. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs +18 -0
  201. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs.map +1 -0
  202. package/dist/react/createIsographEnvironment.d.mts +9 -0
  203. package/dist/react/createIsographEnvironment.d.mts.map +1 -0
  204. package/dist/react/createIsographEnvironment.d.ts +8 -0
  205. package/dist/react/createIsographEnvironment.d.ts.map +1 -0
  206. package/dist/react/createIsographEnvironment.js +10 -0
  207. package/dist/react/createIsographEnvironment.mjs +11 -0
  208. package/dist/react/createIsographEnvironment.mjs.map +1 -0
  209. package/dist/react/maybeUnwrapNetworkRequest.js +11 -0
  210. package/dist/react/maybeUnwrapNetworkRequest.mjs +12 -0
  211. package/dist/react/maybeUnwrapNetworkRequest.mjs.map +1 -0
  212. package/dist/react/useImperativeReference.d.mts +15 -0
  213. package/dist/react/useImperativeReference.d.mts.map +1 -0
  214. package/dist/react/useImperativeReference.d.ts +13 -7
  215. package/dist/react/useImperativeReference.d.ts.map +1 -1
  216. package/dist/react/useImperativeReference.js +34 -32
  217. package/dist/react/useImperativeReference.mjs +35 -0
  218. package/dist/react/useImperativeReference.mjs.map +1 -0
  219. package/dist/react/useLazyReference.d.mts +13 -0
  220. package/dist/react/useLazyReference.d.mts.map +1 -0
  221. package/dist/react/useLazyReference.d.ts +11 -5
  222. package/dist/react/useLazyReference.d.ts.map +1 -1
  223. package/dist/react/useLazyReference.js +17 -40
  224. package/dist/react/useLazyReference.mjs +18 -0
  225. package/dist/react/useLazyReference.mjs.map +1 -0
  226. package/dist/react/useReadAndSubscribe.d.mts +20 -0
  227. package/dist/react/useReadAndSubscribe.d.mts.map +1 -0
  228. package/dist/react/useReadAndSubscribe.d.ts +14 -9
  229. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  230. package/dist/react/useReadAndSubscribe.js +57 -39
  231. package/dist/react/useReadAndSubscribe.mjs +59 -0
  232. package/dist/react/useReadAndSubscribe.mjs.map +1 -0
  233. package/dist/react/useRerenderOnChange.d.mts +12 -0
  234. package/dist/react/useRerenderOnChange.d.mts.map +1 -0
  235. package/dist/react/useRerenderOnChange.d.ts +10 -6
  236. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  237. package/dist/react/useRerenderOnChange.js +16 -20
  238. package/dist/react/useRerenderOnChange.mjs +17 -0
  239. package/dist/react/useRerenderOnChange.mjs.map +1 -0
  240. package/dist/react/useResult.d.mts +8 -0
  241. package/dist/react/useResult.d.mts.map +1 -0
  242. package/dist/react/useResult.d.ts +7 -5
  243. package/dist/react/useResult.d.ts.map +1 -1
  244. package/dist/react/useResult.js +27 -39
  245. package/dist/react/useResult.mjs +30 -0
  246. package/dist/react/useResult.mjs.map +1 -0
  247. package/package.json +26 -19
  248. package/src/core/FragmentReference.ts +13 -7
  249. package/src/core/IsographEnvironment.ts +80 -21
  250. package/src/core/PromiseWrapper.ts +14 -7
  251. package/src/core/areEqualWithDeepComparison.ts +2 -18
  252. package/src/core/brand.ts +18 -0
  253. package/src/core/cache.ts +62 -332
  254. package/src/core/check.ts +30 -26
  255. package/src/core/componentCache.ts +11 -44
  256. package/src/core/entrypoint.ts +50 -9
  257. package/src/core/garbageCollection.ts +81 -28
  258. package/src/core/getOrCreateCacheForArtifact.ts +86 -0
  259. package/src/core/logging.ts +25 -13
  260. package/src/core/makeNetworkRequest.ts +320 -94
  261. package/src/core/optimisticProxy.ts +544 -0
  262. package/src/core/read.ts +251 -198
  263. package/src/core/reader.ts +18 -17
  264. package/src/core/startUpdate.ts +47 -36
  265. package/src/core/subscribe.ts +189 -0
  266. package/src/core/util.ts +26 -0
  267. package/src/core/writeData.ts +79 -0
  268. package/src/index.ts +6 -4
  269. package/src/loadable-hooks/useClientSideDefer.ts +80 -30
  270. package/src/loadable-hooks/useConnectionSpecPagination.ts +54 -35
  271. package/src/loadable-hooks/useImperativeLoadableField.ts +5 -5
  272. package/src/loadable-hooks/useSkipLimitPagination.ts +22 -21
  273. package/src/react/FragmentReader.tsx +3 -1
  274. package/src/react/FragmentRenderer.tsx +8 -1
  275. package/src/react/IsographEnvironmentProvider.tsx +2 -1
  276. package/src/react/LoadableFieldReader.tsx +125 -16
  277. package/src/react/LoadableFieldRenderer.tsx +124 -16
  278. package/src/react/createIsographEnvironment.ts +23 -0
  279. package/src/react/maybeUnwrapNetworkRequest.ts +17 -0
  280. package/src/react/useImperativeReference.ts +25 -15
  281. package/src/react/useLazyReference.ts +20 -10
  282. package/src/react/useReadAndSubscribe.ts +53 -12
  283. package/src/react/useRerenderOnChange.ts +3 -3
  284. package/src/react/useResult.ts +15 -35
  285. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +1 -1
  286. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +3 -1
  287. package/src/tests/__isograph/Query/linkedUpdate/raw_response_type.ts +13 -0
  288. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +1 -1
  289. package/src/tests/__isograph/Query/meName/entrypoint.ts +3 -1
  290. package/src/tests/__isograph/Query/meName/raw_response_type.ts +7 -0
  291. package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -1
  292. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +3 -1
  293. package/src/tests/__isograph/Query/meNameSuccessor/raw_response_type.ts +14 -0
  294. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -1
  295. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +3 -1
  296. package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +7 -0
  297. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -1
  298. package/src/tests/__isograph/Query/normalizeUndefinedField/entrypoint.ts +33 -0
  299. package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +25 -0
  300. package/src/tests/__isograph/Query/normalizeUndefinedField/output_type.ts +3 -0
  301. package/src/tests/__isograph/Query/normalizeUndefinedField/param_type.ts +9 -0
  302. package/src/tests/__isograph/Query/normalizeUndefinedField/query_text.ts +6 -0
  303. package/src/tests/__isograph/Query/normalizeUndefinedField/raw_response_type.ts +7 -0
  304. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +38 -0
  305. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +3 -1
  306. package/src/tests/__isograph/Query/startUpdate/raw_response_type.ts +8 -0
  307. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +1 -1
  308. package/src/tests/__isograph/Query/subquery/entrypoint.ts +3 -1
  309. package/src/tests/__isograph/Query/subquery/raw_response_type.ts +9 -0
  310. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -1
  311. package/src/tests/__isograph/iso.ts +11 -1
  312. package/src/tests/garbageCollection.test.ts +10 -10
  313. package/src/tests/meNameSuccessor.ts +7 -4
  314. package/src/tests/nodeQuery.ts +6 -4
  315. package/src/tests/normalizeData.test.ts +94 -18
  316. package/src/tests/optimisticProxy.test.ts +862 -0
  317. package/src/tests/startUpdate.test.ts +11 -11
  318. package/vitest.config.ts +5 -0
  319. package/dist/core/areEqualWithDeepComparison.d.ts +0 -3
  320. package/dist/core/areEqualWithDeepComparison.d.ts.map +0 -1
  321. package/dist/core/brand.js +0 -2
  322. package/dist/core/componentCache.d.ts +0 -5
  323. package/dist/core/componentCache.d.ts.map +0 -1
  324. package/dist/core/reader.js +0 -2
  325. package/dist/core/startUpdate.d.ts +0 -8
  326. package/dist/core/startUpdate.d.ts.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
@@ -0,0 +1,195 @@
1
+ import { wrapPromise, wrapResolvedValue } from "./PromiseWrapper.mjs";
2
+ import { ROOT_ID } from "./IsographEnvironment.mjs";
3
+ import { logMessage } from "./logging.mjs";
4
+ import { getOrCreateCachedStartUpdate } from "./startUpdate.mjs";
5
+ import { getOrCreateCachedComponent } from "./componentCache.mjs";
6
+ import { DEFAULT_SHOULD_FETCH_VALUE, check } from "./check.mjs";
7
+ import { readButDoNotEvaluate } from "./read.mjs";
8
+ import { callSubscriptions } from "./subscribe.mjs";
9
+ import { addNetworkResponseStoreLayer, addOptimisticNetworkResponseStoreLayer, revertOptimisticStoreLayerAndMaybeReplace } from "./optimisticProxy.mjs";
10
+ import { normalizeData } from "./cache.mjs";
11
+ import { garbageCollectEnvironment, retainQuery, unretainQuery } from "./garbageCollection.mjs";
12
+
13
+ //#region src/core/makeNetworkRequest.ts
14
+ let networkRequestId = 0;
15
+ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions) {
16
+ switch (fetchOptions?.shouldFetch ?? DEFAULT_SHOULD_FETCH_VALUE) {
17
+ case "Yes": return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
18
+ case "No": return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
19
+ case "IfNecessary":
20
+ if (artifact.networkRequestInfo.normalizationAst.kind === "NormalizationAstLoader") throw new Error("Using lazy loaded normalizationAst with shouldFetch: \"IfNecessary\" is not supported as it will lead to a network waterfall.");
21
+ if (check(environment, artifact.networkRequestInfo.normalizationAst.selections, variables, {
22
+ __link: ROOT_ID,
23
+ __typename: artifact.concreteType
24
+ }).kind === "EnoughData") return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
25
+ else return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
26
+ }
27
+ }
28
+ function retainQueryWithoutMakingNetworkRequest(environment, artifact, variables) {
29
+ let status = {
30
+ kind: "UndisposedComplete",
31
+ retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables)
32
+ };
33
+ return [wrapResolvedValue(void 0), () => {
34
+ if (status.kind !== "Disposed") status = unretainAndGarbageCollect(environment, status);
35
+ }];
36
+ }
37
+ function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions) {
38
+ const myNetworkRequestId = networkRequestId + "";
39
+ networkRequestId++;
40
+ let status = {
41
+ kind: "UndisposedIncomplete",
42
+ retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables),
43
+ optimistic: fetchOptions?.optimisticNetworkResponse != null ? makeOptimisticUpdate(environment, artifact, variables, fetchOptions?.optimisticNetworkResponse) : null
44
+ };
45
+ logMessage(environment, () => ({
46
+ kind: "MakeNetworkRequest",
47
+ artifact,
48
+ variables,
49
+ networkRequestId: myNetworkRequestId
50
+ }));
51
+ return [wrapPromise(Promise.all([
52
+ environment.networkFunction(artifact.networkRequestInfo.operation, variables),
53
+ status.retainedQuery.normalizationAst.promise,
54
+ readerWithRefetchQueries?.promise
55
+ ]).then(([networkResponse, normalizationAst, readerWithRefetchQueries$1]) => {
56
+ logMessage(environment, () => ({
57
+ kind: "ReceivedNetworkResponse",
58
+ networkResponse,
59
+ networkRequestId: myNetworkRequestId
60
+ }));
61
+ if (networkResponse.errors != null) {
62
+ try {
63
+ fetchOptions?.onError?.();
64
+ } catch {}
65
+ throw new Error("Network response had errors", { cause: networkResponse });
66
+ }
67
+ const root = {
68
+ __link: ROOT_ID,
69
+ __typename: artifact.concreteType
70
+ };
71
+ if (status.kind === "UndisposedIncomplete") if (status.optimistic != null) status = revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, (storeLayer) => normalizeData(environment, storeLayer, normalizationAst.selections, networkResponse.data ?? {}, variables, root, /* @__PURE__ */ new Map()));
72
+ else {
73
+ const encounteredIds = /* @__PURE__ */ new Map();
74
+ environment.store = addNetworkResponseStoreLayer(environment.store);
75
+ normalizeData(environment, environment.store, normalizationAst.selections, networkResponse.data ?? {}, variables, root, encounteredIds);
76
+ logMessage(environment, () => ({
77
+ kind: "AfterNormalization",
78
+ store: environment.store,
79
+ encounteredIds
80
+ }));
81
+ callSubscriptions(environment, encounteredIds);
82
+ status = {
83
+ kind: "UndisposedComplete",
84
+ retainedQuery: status.retainedQuery
85
+ };
86
+ }
87
+ const onComplete = fetchOptions?.onComplete;
88
+ if (onComplete != null) {
89
+ let data = readDataForOnComplete(artifact, environment, root, variables, readerWithRefetchQueries$1);
90
+ try {
91
+ onComplete(data);
92
+ } catch {}
93
+ }
94
+ }).catch((e) => {
95
+ logMessage(environment, () => ({
96
+ kind: "ReceivedNetworkError",
97
+ networkRequestId: myNetworkRequestId,
98
+ error: e
99
+ }));
100
+ try {
101
+ fetchOptions?.onError?.();
102
+ } catch {}
103
+ if (status.kind === "UndisposedIncomplete") status = revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, null);
104
+ throw e;
105
+ })), () => {
106
+ if (status.kind === "UndisposedIncomplete") status = revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, null);
107
+ if (status.kind !== "Disposed") status = unretainAndGarbageCollect(environment, status);
108
+ }];
109
+ }
110
+ function readDataForOnComplete(artifact, environment, root, variables, readerWithRefetchQueries) {
111
+ if (artifact.kind === "Entrypoint") {
112
+ const fakeNetworkRequest = wrapResolvedValue(void 0);
113
+ const fakeNetworkRequestOptions = {
114
+ suspendIfInFlight: false,
115
+ throwOnNetworkError: false
116
+ };
117
+ const resolvedReaderWithRefetchQueries = readerWithRefetchQueries;
118
+ const fragment = {
119
+ kind: "FragmentReference",
120
+ readerWithRefetchQueries: wrapResolvedValue(resolvedReaderWithRefetchQueries),
121
+ fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
122
+ readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,
123
+ root,
124
+ variables,
125
+ networkRequest: fakeNetworkRequest
126
+ };
127
+ const fragmentResult = readButDoNotEvaluate(environment, fragment, fakeNetworkRequestOptions).item;
128
+ const readerArtifact = resolvedReaderWithRefetchQueries.readerArtifact;
129
+ switch (readerArtifact.kind) {
130
+ case "ComponentReaderArtifact": return getOrCreateCachedComponent(environment, {
131
+ kind: "FragmentReference",
132
+ readerWithRefetchQueries: wrapResolvedValue({
133
+ kind: "ReaderWithRefetchQueries",
134
+ readerArtifact,
135
+ nestedRefetchQueries: resolvedReaderWithRefetchQueries.nestedRefetchQueries
136
+ }),
137
+ fieldName: readerArtifact.fieldName,
138
+ readerArtifactKind: readerArtifact.kind,
139
+ root,
140
+ variables,
141
+ networkRequest: fakeNetworkRequest
142
+ }, fakeNetworkRequestOptions);
143
+ case "EagerReaderArtifact": return readerArtifact.resolver({
144
+ data: fragmentResult,
145
+ parameters: variables,
146
+ ...readerArtifact.hasUpdatable ? { startUpdate: getOrCreateCachedStartUpdate(environment, fragment, fakeNetworkRequestOptions) } : void 0
147
+ });
148
+ }
149
+ }
150
+ return null;
151
+ }
152
+ function fetchNormalizationAstAndRetainArtifact(environment, artifact, variables) {
153
+ const retainedQuery = {
154
+ normalizationAst: artifact.networkRequestInfo.normalizationAst.kind === "NormalizationAst" ? wrapResolvedValue(artifact.networkRequestInfo.normalizationAst) : wrapPromise(artifact.networkRequestInfo.normalizationAst.loader()),
155
+ variables,
156
+ root: {
157
+ __link: ROOT_ID,
158
+ __typename: artifact.concreteType
159
+ }
160
+ };
161
+ retainQuery(environment, retainedQuery);
162
+ return retainedQuery;
163
+ }
164
+ function makeOptimisticUpdate(environment, artifact, variables, optimisticNetworkResponse) {
165
+ const root = {
166
+ __link: ROOT_ID,
167
+ __typename: artifact.concreteType
168
+ };
169
+ if (artifact.networkRequestInfo.normalizationAst.kind === "NormalizationAstLoader") throw new Error("Using lazy loaded normalizationAst with optimisticNetworkResponse is not supported.");
170
+ const encounteredIds = /* @__PURE__ */ new Map();
171
+ const optimistic = environment.store = addOptimisticNetworkResponseStoreLayer(environment.store);
172
+ normalizeData(environment, environment.store, artifact.networkRequestInfo.normalizationAst.selections, optimisticNetworkResponse, variables, root, encounteredIds);
173
+ logMessage(environment, () => ({
174
+ kind: "AfterNormalization",
175
+ store: environment.store,
176
+ encounteredIds
177
+ }));
178
+ callSubscriptions(environment, encounteredIds);
179
+ return optimistic;
180
+ }
181
+ function revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, normalizeData$1) {
182
+ if (status.optimistic != null) revertOptimisticStoreLayerAndMaybeReplace(environment, status.optimistic, normalizeData$1);
183
+ return {
184
+ kind: "UndisposedComplete",
185
+ retainedQuery: status.retainedQuery
186
+ };
187
+ }
188
+ function unretainAndGarbageCollect(environment, status) {
189
+ if (unretainQuery(environment, status.retainedQuery)) garbageCollectEnvironment(environment);
190
+ return { kind: "Disposed" };
191
+ }
192
+
193
+ //#endregion
194
+ export { makeNetworkRequest, maybeMakeNetworkRequest, retainQueryWithoutMakingNetworkRequest };
195
+ //# sourceMappingURL=makeNetworkRequest.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeNetworkRequest.mjs","names":["status:\n | NetworkRequestStatusUndisposedComplete\n | NetworkRequestStatusDisposed","status: NetworkRequestStatus","readerWithRefetchQueries","encounteredIds: EncounteredIds","fragment: FragmentReference<TReadFromStore, TClientFieldValue>","retainedQuery: RetainedQuery","normalizeData"],"sources":["../../src/core/makeNetworkRequest.ts"],"sourcesContent":["import type { ItemCleanupPair } from '@isograph/disposable-types';\nimport {\n normalizeData,\n type EncounteredIds,\n type NetworkResponseObject,\n} from './cache';\nimport type { FetchOptions } from './check';\nimport { check, DEFAULT_SHOULD_FETCH_VALUE } from './check';\nimport { getOrCreateCachedComponent } from './componentCache';\nimport type {\n IsographEntrypoint,\n NormalizationAst,\n NormalizationAstLoader,\n ReaderWithRefetchQueries,\n RefetchQueryNormalizationArtifact,\n} from './entrypoint';\nimport type {\n ExtractParameters,\n FragmentReference,\n UnknownTReadFromStore,\n} from './FragmentReference';\nimport type { RetainedQuery } from './garbageCollection';\nimport {\n garbageCollectEnvironment,\n retainQuery,\n unretainQuery,\n} from './garbageCollection';\nimport type { IsographEnvironment, StoreLink } from './IsographEnvironment';\nimport { ROOT_ID } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n addNetworkResponseStoreLayer,\n addOptimisticNetworkResponseStoreLayer,\n revertOptimisticStoreLayerAndMaybeReplace,\n type OptimisticStoreLayer,\n type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { AnyError, PromiseWrapper } from './PromiseWrapper';\nimport { wrapPromise, wrapResolvedValue } from './PromiseWrapper';\nimport { readButDoNotEvaluate } from './read';\nimport { getOrCreateCachedStartUpdate } from './startUpdate';\nimport { callSubscriptions } from './subscribe';\n\nlet networkRequestId = 0;\n\nexport function maybeMakeNetworkRequest<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n TRawResponseType extends NetworkResponseObject,\n>(\n environment: IsographEnvironment,\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n TNormalizationAst,\n TRawResponseType\n >,\n variables: ExtractParameters<TReadFromStore>,\n readerWithRefetchQueries: PromiseWrapper<\n ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n > | null,\n fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n switch (fetchOptions?.shouldFetch ?? DEFAULT_SHOULD_FETCH_VALUE) {\n case 'Yes': {\n return makeNetworkRequest(\n environment,\n artifact,\n variables,\n readerWithRefetchQueries,\n fetchOptions,\n );\n }\n case 'No': {\n return retainQueryWithoutMakingNetworkRequest(\n environment,\n artifact,\n variables,\n );\n }\n case 'IfNecessary': {\n if (\n artifact.networkRequestInfo.normalizationAst.kind ===\n 'NormalizationAstLoader'\n ) {\n throw new Error(\n 'Using lazy loaded normalizationAst with shouldFetch: \"IfNecessary\" is ' +\n 'not supported as it will lead to a network waterfall.',\n );\n }\n const result = check(\n environment,\n artifact.networkRequestInfo.normalizationAst.selections,\n variables,\n {\n __link: ROOT_ID,\n __typename: artifact.concreteType,\n },\n );\n\n if (result.kind === 'EnoughData') {\n return retainQueryWithoutMakingNetworkRequest(\n environment,\n artifact,\n variables,\n );\n } else {\n return makeNetworkRequest(\n environment,\n artifact,\n variables,\n readerWithRefetchQueries,\n fetchOptions,\n );\n }\n }\n }\n}\n\nexport function retainQueryWithoutMakingNetworkRequest<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TRawResponseType extends NetworkResponseObject,\n>(\n environment: IsographEnvironment,\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n NormalizationAst | NormalizationAstLoader,\n TRawResponseType\n >,\n variables: ExtractParameters<TReadFromStore>,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n let status:\n | NetworkRequestStatusUndisposedComplete\n | NetworkRequestStatusDisposed = {\n kind: 'UndisposedComplete',\n retainedQuery: fetchNormalizationAstAndRetainArtifact(\n environment,\n artifact,\n variables,\n ),\n };\n return [\n wrapResolvedValue(undefined),\n () => {\n if (status.kind !== 'Disposed') {\n status = unretainAndGarbageCollect(environment, status);\n }\n },\n ];\n}\n\nexport function makeNetworkRequest<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n TRawResponseType extends NetworkResponseObject,\n>(\n environment: IsographEnvironment,\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n TNormalizationAst,\n TRawResponseType\n >,\n variables: ExtractParameters<TReadFromStore>,\n readerWithRefetchQueries: PromiseWrapper<\n ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n > | null,\n fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,\n): ItemCleanupPair<PromiseWrapper<void, AnyError>> {\n // TODO this should be a DataId and stored in the store\n const myNetworkRequestId = networkRequestId + '';\n networkRequestId++;\n let status: NetworkRequestStatus = {\n kind: 'UndisposedIncomplete',\n retainedQuery: fetchNormalizationAstAndRetainArtifact(\n environment,\n artifact,\n variables,\n ),\n optimistic:\n fetchOptions?.optimisticNetworkResponse != null\n ? makeOptimisticUpdate(\n environment,\n artifact,\n variables,\n fetchOptions?.optimisticNetworkResponse,\n )\n : null,\n };\n\n logMessage(environment, () => ({\n kind: 'MakeNetworkRequest',\n artifact,\n variables,\n networkRequestId: myNetworkRequestId,\n }));\n\n // This should be an observable, not a promise\n const promise = Promise.all([\n environment.networkFunction(\n artifact.networkRequestInfo.operation,\n variables,\n ),\n status.retainedQuery.normalizationAst.promise,\n readerWithRefetchQueries?.promise,\n ])\n .then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {\n logMessage(environment, () => ({\n kind: 'ReceivedNetworkResponse',\n networkResponse,\n networkRequestId: myNetworkRequestId,\n }));\n\n if (networkResponse.errors != null) {\n try {\n fetchOptions?.onError?.();\n } catch {}\n throw new Error('Network response had errors', {\n cause: networkResponse,\n });\n }\n\n const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n\n if (status.kind === 'UndisposedIncomplete') {\n if (status.optimistic != null) {\n status =\n revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n environment,\n status,\n (storeLayer) =>\n normalizeData(\n environment,\n storeLayer,\n normalizationAst.selections,\n networkResponse.data ?? {},\n variables,\n root,\n new Map(),\n ),\n );\n } else {\n const encounteredIds: EncounteredIds = new Map();\n environment.store = addNetworkResponseStoreLayer(environment.store);\n normalizeData(\n environment,\n environment.store,\n normalizationAst.selections,\n networkResponse.data ?? {},\n variables,\n root,\n encounteredIds,\n );\n\n logMessage(environment, () => ({\n kind: 'AfterNormalization',\n store: environment.store,\n encounteredIds: encounteredIds,\n }));\n\n callSubscriptions(environment, encounteredIds);\n\n status = {\n kind: 'UndisposedComplete',\n retainedQuery: status.retainedQuery,\n };\n }\n }\n\n const onComplete = fetchOptions?.onComplete;\n if (onComplete != null) {\n let data = readDataForOnComplete(\n artifact,\n environment,\n root,\n variables,\n readerWithRefetchQueries,\n );\n\n try {\n // @ts-expect-error this problem will be fixed when we remove RefetchQueryNormalizationArtifact\n // (or we can fix this by having a single param of type { kind: 'Entrypoint', entrypoint,\n // fetchOptions: FetchOptions<TReadFromStore> } | { kind: 'RefetchQuery', refetchQuery,\n // fetchOptions: FetchOptions<void> }).\n onComplete(data);\n } catch {}\n }\n })\n .catch((e) => {\n logMessage(environment, () => ({\n kind: 'ReceivedNetworkError',\n networkRequestId: myNetworkRequestId,\n error: e,\n }));\n try {\n fetchOptions?.onError?.();\n } catch {}\n\n if (status.kind === 'UndisposedIncomplete') {\n status =\n revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n environment,\n status,\n null,\n );\n }\n\n throw e;\n });\n\n const wrapper = wrapPromise(promise);\n\n const response: ItemCleanupPair<PromiseWrapper<void, AnyError>> = [\n wrapper,\n () => {\n if (status.kind === 'UndisposedIncomplete') {\n status =\n revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n environment,\n status,\n null,\n );\n }\n if (status.kind !== 'Disposed') {\n status = unretainAndGarbageCollect(environment, status);\n }\n },\n ];\n return response;\n}\n\ntype NetworkRequestStatusUndisposedIncomplete = {\n readonly kind: 'UndisposedIncomplete';\n readonly retainedQuery: RetainedQuery;\n readonly optimistic: OptimisticStoreLayer | null;\n};\n\ntype NetworkRequestStatusUndisposedComplete = {\n readonly kind: 'UndisposedComplete';\n readonly retainedQuery: RetainedQuery;\n};\n\ntype NetworkRequestStatusDisposed = {\n readonly kind: 'Disposed';\n};\n\ntype NetworkRequestStatus =\n | NetworkRequestStatusUndisposedIncomplete\n | NetworkRequestStatusUndisposedComplete\n | NetworkRequestStatusDisposed;\n\nfunction readDataForOnComplete<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n TRawResponseType extends NetworkResponseObject,\n>(\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n TNormalizationAst,\n TRawResponseType\n >,\n environment: IsographEnvironment,\n root: StoreLink,\n variables: ExtractParameters<TReadFromStore>,\n readerWithRefetchQueries:\n | ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>\n | undefined,\n): TClientFieldValue | null {\n // An entrypoint, but not a RefetchQueryNormalizationArtifact, has a reader ASTs.\n // So, we can only pass data to onComplete if makeNetworkRequest was passed an entrypoint.\n // This is awkward, since we don't express that in the types of the parameters\n // (i.e. FetchOptions could be passed, along with a RefetchQueryNormalizationArtifact).\n //\n // However, this isn't a big deal: RefetchQueryNormalizationArtifact is going away.\n if (artifact.kind === 'Entrypoint') {\n // TODO this is a smell!\n const fakeNetworkRequest = wrapResolvedValue(undefined);\n // TODO this is a smell — we know the network response is not in flight,\n // so we don't really care!\n const fakeNetworkRequestOptions = {\n suspendIfInFlight: false,\n throwOnNetworkError: false,\n };\n const resolvedReaderWithRefetchQueries =\n readerWithRefetchQueries as ReaderWithRefetchQueries<\n TReadFromStore,\n TClientFieldValue\n >;\n\n const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {\n kind: 'FragmentReference',\n // TODO this smells.\n readerWithRefetchQueries: wrapResolvedValue(\n resolvedReaderWithRefetchQueries,\n ),\n fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,\n readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,\n root,\n variables,\n networkRequest: fakeNetworkRequest,\n };\n const fragmentResult = readButDoNotEvaluate(\n environment,\n fragment,\n fakeNetworkRequestOptions,\n ).item;\n const readerArtifact = resolvedReaderWithRefetchQueries.readerArtifact;\n switch (readerArtifact.kind) {\n case 'ComponentReaderArtifact': {\n // @ts-expect-error We should find a way to encode this in the type system:\n // if we have a ComponentReaderArtifact, we will necessarily have a\n // TClientFieldValue which is a React.FC<...>\n return getOrCreateCachedComponent(\n environment,\n {\n kind: 'FragmentReference',\n readerWithRefetchQueries: wrapResolvedValue({\n kind: 'ReaderWithRefetchQueries',\n readerArtifact: readerArtifact,\n nestedRefetchQueries:\n resolvedReaderWithRefetchQueries.nestedRefetchQueries,\n }),\n fieldName: readerArtifact.fieldName,\n readerArtifactKind: readerArtifact.kind,\n root,\n variables,\n networkRequest: fakeNetworkRequest,\n } as const,\n fakeNetworkRequestOptions,\n );\n }\n case 'EagerReaderArtifact': {\n return readerArtifact.resolver({\n data: fragmentResult,\n parameters: variables,\n ...(readerArtifact.hasUpdatable\n ? {\n startUpdate: getOrCreateCachedStartUpdate(\n environment,\n fragment,\n fakeNetworkRequestOptions,\n ),\n }\n : undefined),\n });\n }\n }\n }\n return null;\n}\n\nfunction fetchNormalizationAstAndRetainArtifact<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TRawResponseType extends NetworkResponseObject,\n>(\n environment: IsographEnvironment,\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n NormalizationAst | NormalizationAstLoader,\n TRawResponseType\n >,\n variables: ExtractParameters<TReadFromStore>,\n): RetainedQuery {\n const normalizationAst =\n artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'\n ? wrapResolvedValue(artifact.networkRequestInfo.normalizationAst)\n : wrapPromise(artifact.networkRequestInfo.normalizationAst.loader());\n\n const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n const retainedQuery: RetainedQuery = {\n normalizationAst: normalizationAst,\n variables,\n root,\n };\n retainQuery(environment, retainedQuery);\n return retainedQuery;\n}\n\nfunction makeOptimisticUpdate<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n TNormalizationAst extends NormalizationAst | NormalizationAstLoader,\n TRawResponseType extends NetworkResponseObject,\n>(\n environment: IsographEnvironment,\n artifact:\n | RefetchQueryNormalizationArtifact\n | IsographEntrypoint<\n TReadFromStore,\n TClientFieldValue,\n TNormalizationAst,\n TRawResponseType\n >,\n variables: ExtractParameters<TReadFromStore>,\n optimisticNetworkResponse: TRawResponseType,\n): OptimisticStoreLayer {\n const root = { __link: ROOT_ID, __typename: artifact.concreteType };\n\n if (\n artifact.networkRequestInfo.normalizationAst.kind ===\n 'NormalizationAstLoader'\n ) {\n throw new Error(\n 'Using lazy loaded normalizationAst with optimisticNetworkResponse is not supported.',\n );\n }\n const encounteredIds: EncounteredIds = new Map();\n const optimistic = (environment.store =\n addOptimisticNetworkResponseStoreLayer(environment.store));\n normalizeData(\n environment,\n environment.store,\n artifact.networkRequestInfo.normalizationAst.selections,\n optimisticNetworkResponse,\n variables,\n root,\n encounteredIds,\n );\n\n logMessage(environment, () => ({\n kind: 'AfterNormalization',\n store: environment.store,\n encounteredIds: encounteredIds,\n }));\n\n callSubscriptions(environment, encounteredIds);\n return optimistic;\n}\n\nfunction revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(\n environment: IsographEnvironment,\n status: NetworkRequestStatusUndisposedIncomplete,\n normalizeData: null | ((storeLayer: StoreLayerWithData) => void),\n): NetworkRequestStatusUndisposedComplete {\n if (status.optimistic != null) {\n revertOptimisticStoreLayerAndMaybeReplace(\n environment,\n status.optimistic,\n normalizeData,\n );\n }\n\n return {\n kind: 'UndisposedComplete',\n retainedQuery: status.retainedQuery,\n };\n}\n\nfunction unretainAndGarbageCollect(\n environment: IsographEnvironment,\n status: NetworkRequestStatusUndisposedComplete,\n): NetworkRequestStatusDisposed {\n const didUnretainSomeQuery = unretainQuery(environment, status.retainedQuery);\n if (didUnretainSomeQuery) {\n garbageCollectEnvironment(environment);\n }\n\n return {\n kind: 'Disposed',\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { BaseStoreLayerData, StoreLayerData } from "./IsographEnvironment.mjs";
2
+
3
+ //#region src/core/optimisticProxy.d.ts
4
+
5
+ type BaseStoreLayer = {
6
+ readonly kind: 'BaseStoreLayer';
7
+ childStoreLayer: OptimisticStoreLayer | null;
8
+ readonly parentStoreLayer: null;
9
+ readonly data: BaseStoreLayerData;
10
+ };
11
+ type NetworkResponseStoreLayer = {
12
+ readonly kind: 'NetworkResponseStoreLayer';
13
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | null;
14
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer;
15
+ readonly data: StoreLayerData;
16
+ };
17
+ type DataUpdate<TStoreLayer extends StoreLayer> = (storeLayer: TStoreLayer) => void;
18
+ type StartUpdateStoreLayer = {
19
+ readonly kind: 'StartUpdateStoreLayer';
20
+ childStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer | null;
21
+ parentStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer;
22
+ data: StoreLayerData;
23
+ startUpdate: DataUpdate<StartUpdateStoreLayer | BaseStoreLayer>;
24
+ };
25
+ type OptimisticStoreLayer = OptimisticUpdaterStoreLayer | OptimisticNetworkResponseStoreLayer;
26
+ type OptimisticUpdaterStoreLayer = {
27
+ readonly kind: 'OptimisticUpdaterStoreLayer';
28
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
29
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
30
+ data: StoreLayerData;
31
+ readonly startUpdate: DataUpdate<OptimisticUpdaterStoreLayer>;
32
+ };
33
+ type OptimisticNetworkResponseStoreLayer = {
34
+ readonly kind: 'OptimisticNetworkResponseStoreLayer';
35
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
36
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
37
+ data: StoreLayerData;
38
+ };
39
+ type StoreLayer = OptimisticStoreLayer | NetworkResponseStoreLayer | StartUpdateStoreLayer | BaseStoreLayer;
40
+ type StoreLayerWithData = BaseStoreLayer | NetworkResponseStoreLayer | OptimisticNetworkResponseStoreLayer;
41
+ //#endregion
42
+ export { StoreLayer, StoreLayerWithData };
43
+ //# sourceMappingURL=optimisticProxy.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimisticProxy.d.mts","names":[],"sources":["../../src/core/optimisticProxy.ts"],"sourcesContent":[],"mappings":";;;;AA8GiB,KAXL,cAAA,GAWK;EAAc,SAAA,IAAA,EAAA,gBAAA;EAGnB,eAAU,EAZH,oBAYwB,GAAA,IAAA;EAI/B,SAAA,gBAAqB,EAAA,IAAA;EAEd,SAAA,IAAA,EAhBF,kBAgBE;CAAuB;AACtB,KAdR,yBAAA,GAcQ;EAAuB,SAAA,IAAA,EAAA,2BAAA;EACnC,eAAA,EAbW,oBAaX,GAbkC,qBAalC,GAAA,IAAA;EACkB,gBAAA,EAbN,oBAaM,GAbiB,qBAajB;EAAwB,SAAA,IAAA,EAZjC,cAYiC;CAAnC;AAAU,KATb,UASa,CAAA,oBATkB,UASlB,CAAA,GAAA,CAAA,UAAA,EARX,WAQW,EAAA,GAAA,IAAA;AAGb,KARA,qBAAA,GAQoB;EAIpB,SAAA,IAAA,EAAA,uBAA2B;EAGjC,eAAA,EAba,oBAab,GAboC,yBAapC,GAAA,IAAA;EACA,gBAAA,EAbc,oBAad,GAbqC,yBAarC;EACA,IAAA,EAbE,cAaF;EAGA,WAAA,EAfS,UAeT,CAfoB,qBAepB,GAf4C,cAe5C,CAAA;CACA;AACA,KAdM,oBAAA,GACR,2BAaE,GAZF,mCAYE;AACA,KAXM,2BAAA,GAWN;EACE,SAAA,IAAA,EAAA,6BAAA;EAC2B,eAAA,EAV7B,oBAU6B,GAT7B,qBAS6B,GAR7B,yBAQ6B,GAAA,IAAA;EAAX,gBAAA,EALlB,oBAKkB,GAJlB,qBAIkB,GAHlB,yBAGkB,GAFlB,cAEkB;EAAU,IAAA,EAD1B,cAC0B;EAGtB,SAAA,WAAA,EAHY,UAGZ,CAHuB,2BAGY,CAAA;CAGzC;AACA,KAJM,mCAAA,GAIN;EACA,SAAA,IAAA,EAAA,qCAAA;EAGA,eAAA,EALA,oBAKA,GAJA,qBAIA,GAHA,yBAGA,GAAA,IAAA;EACA,gBAAA,EADA,oBACA,GAAA,qBAAA,GACA,yBADA,GAEA,cAFA;EACA,IAAA,EAEE,cAFF;CACA;KAkVM,UAAA,GACR,uBACA,4BACA,wBACA;KAEQ,kBAAA,GACR,iBACA,4BACA"}
@@ -0,0 +1,43 @@
1
+ import { BaseStoreLayerData, StoreLayerData } from "./IsographEnvironment.js";
2
+
3
+ //#region src/core/optimisticProxy.d.ts
4
+
5
+ type BaseStoreLayer = {
6
+ readonly kind: 'BaseStoreLayer';
7
+ childStoreLayer: OptimisticStoreLayer | null;
8
+ readonly parentStoreLayer: null;
9
+ readonly data: BaseStoreLayerData;
10
+ };
11
+ type NetworkResponseStoreLayer = {
12
+ readonly kind: 'NetworkResponseStoreLayer';
13
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | null;
14
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer;
15
+ readonly data: StoreLayerData;
16
+ };
17
+ type DataUpdate<TStoreLayer extends StoreLayer> = (storeLayer: TStoreLayer) => void;
18
+ type StartUpdateStoreLayer = {
19
+ readonly kind: 'StartUpdateStoreLayer';
20
+ childStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer | null;
21
+ parentStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer;
22
+ data: StoreLayerData;
23
+ startUpdate: DataUpdate<StartUpdateStoreLayer | BaseStoreLayer>;
24
+ };
25
+ type OptimisticStoreLayer = OptimisticUpdaterStoreLayer | OptimisticNetworkResponseStoreLayer;
26
+ type OptimisticUpdaterStoreLayer = {
27
+ readonly kind: 'OptimisticUpdaterStoreLayer';
28
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
29
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
30
+ data: StoreLayerData;
31
+ readonly startUpdate: DataUpdate<OptimisticUpdaterStoreLayer>;
32
+ };
33
+ type OptimisticNetworkResponseStoreLayer = {
34
+ readonly kind: 'OptimisticNetworkResponseStoreLayer';
35
+ childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
36
+ parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
37
+ data: StoreLayerData;
38
+ };
39
+ type StoreLayer = OptimisticStoreLayer | NetworkResponseStoreLayer | StartUpdateStoreLayer | BaseStoreLayer;
40
+ type StoreLayerWithData = BaseStoreLayer | NetworkResponseStoreLayer | OptimisticNetworkResponseStoreLayer;
41
+ //#endregion
42
+ export { StoreLayer, StoreLayerWithData };
43
+ //# sourceMappingURL=optimisticProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimisticProxy.d.ts","names":[],"sources":["../../src/core/optimisticProxy.ts"],"sourcesContent":[],"mappings":";;;;AA8GiB,KAXL,cAAA,GAWK;EAAc,SAAA,IAAA,EAAA,gBAAA;EAGnB,eAAU,EAZH,oBAYwB,GAAA,IAAA;EAI/B,SAAA,gBAAqB,EAAA,IAAA;EAEd,SAAA,IAAA,EAhBF,kBAgBE;CAAuB;AACtB,KAdR,yBAAA,GAcQ;EAAuB,SAAA,IAAA,EAAA,2BAAA;EACnC,eAAA,EAbW,oBAaX,GAbkC,qBAalC,GAAA,IAAA;EACkB,gBAAA,EAbN,oBAaM,GAbiB,qBAajB;EAAwB,SAAA,IAAA,EAZjC,cAYiC;CAAnC;AAAU,KATb,UASa,CAAA,oBATkB,UASlB,CAAA,GAAA,CAAA,UAAA,EARX,WAQW,EAAA,GAAA,IAAA;AAGb,KARA,qBAAA,GAQoB;EAIpB,SAAA,IAAA,EAAA,uBAA2B;EAGjC,eAAA,EAba,oBAab,GAboC,yBAapC,GAAA,IAAA;EACA,gBAAA,EAbc,oBAad,GAbqC,yBAarC;EACA,IAAA,EAbE,cAaF;EAGA,WAAA,EAfS,UAeT,CAfoB,qBAepB,GAf4C,cAe5C,CAAA;CACA;AACA,KAdM,oBAAA,GACR,2BAaE,GAZF,mCAYE;AACA,KAXM,2BAAA,GAWN;EACE,SAAA,IAAA,EAAA,6BAAA;EAC2B,eAAA,EAV7B,oBAU6B,GAT7B,qBAS6B,GAR7B,yBAQ6B,GAAA,IAAA;EAAX,gBAAA,EALlB,oBAKkB,GAJlB,qBAIkB,GAHlB,yBAGkB,GAFlB,cAEkB;EAAU,IAAA,EAD1B,cAC0B;EAGtB,SAAA,WAAA,EAHY,UAGZ,CAHuB,2BAGY,CAAA;CAGzC;AACA,KAJM,mCAAA,GAIN;EACA,SAAA,IAAA,EAAA,qCAAA;EAGA,eAAA,EALA,oBAKA,GAJA,qBAIA,GAHA,yBAGA,GAAA,IAAA;EACA,gBAAA,EADA,oBACA,GAAA,qBAAA,GACA,yBADA,GAEA,cAFA;EACA,IAAA,EAEE,cAFF;CACA;KAkVM,UAAA,GACR,uBACA,4BACA,wBACA;KAEQ,kBAAA,GACR,iBACA,4BACA"}
@@ -0,0 +1,273 @@
1
+ const require_subscribe = require('./subscribe.js');
2
+ const require_cache = require('./cache.js');
3
+
4
+ //#region src/core/optimisticProxy.ts
5
+ function getOrInsertRecord(dataLayer, link) {
6
+ const recordsById = dataLayer[link.__typename] ??= {};
7
+ return recordsById[link.__link] ??= {};
8
+ }
9
+ /**
10
+ * Given the child-most store layer (i.e. environment.store) and a link (identifying a
11
+ * store record), create a proxy object that attempts to read through each successive
12
+ * store layer until a value (i.e. field name) is found. If found, return that value.
13
+ */
14
+ function getStoreRecordProxy(storeLayer, link) {
15
+ let startNode = storeLayer;
16
+ while (startNode != null) {
17
+ const storeRecord = startNode.data[link.__typename]?.[link.__link];
18
+ if (storeRecord === void 0) {
19
+ startNode = startNode.parentStoreLayer;
20
+ continue;
21
+ }
22
+ if (storeRecord == null) return null;
23
+ return getMutableStoreRecordProxy(startNode, link);
24
+ }
25
+ }
26
+ function getMutableStoreRecordProxy(childMostStoreLayer, link) {
27
+ return new Proxy({}, {
28
+ get(_, propertyName) {
29
+ let currentStoreLayer = childMostStoreLayer;
30
+ while (currentStoreLayer != null) {
31
+ const storeRecord = currentStoreLayer.data[link.__typename]?.[link.__link];
32
+ if (storeRecord !== void 0) {
33
+ if (storeRecord == null) return;
34
+ const value = Reflect.get(storeRecord, propertyName);
35
+ if (value !== void 0) return value;
36
+ }
37
+ currentStoreLayer = currentStoreLayer.parentStoreLayer;
38
+ }
39
+ },
40
+ has(_, propertyName) {
41
+ let currentStoreLayer = childMostStoreLayer;
42
+ while (currentStoreLayer != null) {
43
+ const storeRecord = currentStoreLayer.data[link.__typename]?.[link.__link];
44
+ if (storeRecord !== void 0) {
45
+ if (storeRecord == null) return false;
46
+ if (Reflect.has(storeRecord, propertyName)) return true;
47
+ }
48
+ currentStoreLayer = currentStoreLayer.parentStoreLayer;
49
+ }
50
+ return false;
51
+ },
52
+ set(_, p, newValue) {
53
+ return Reflect.set(getOrInsertRecord(childMostStoreLayer.data, link), p, newValue);
54
+ }
55
+ });
56
+ }
57
+ function addNetworkResponseStoreLayer(parent) {
58
+ switch (parent.kind) {
59
+ case "NetworkResponseStoreLayer":
60
+ case "BaseStoreLayer": return parent;
61
+ case "StartUpdateStoreLayer":
62
+ case "OptimisticNetworkResponseStoreLayer":
63
+ case "OptimisticUpdaterStoreLayer": {
64
+ const node = {
65
+ kind: "NetworkResponseStoreLayer",
66
+ parentStoreLayer: parent,
67
+ childStoreLayer: null,
68
+ data: {}
69
+ };
70
+ parent.childStoreLayer = node;
71
+ return node;
72
+ }
73
+ }
74
+ }
75
+ function mergeDataLayer(target, source) {
76
+ for (const [typeName, sourceById] of Object.entries(source)) {
77
+ if (sourceById == null) {
78
+ target[typeName] = sourceById;
79
+ continue;
80
+ }
81
+ const targetRecordById = target[typeName] ??= {};
82
+ for (const [id, sourceRecord] of Object.entries(sourceById)) {
83
+ if (sourceRecord == null) {
84
+ targetRecordById[id] = null;
85
+ continue;
86
+ }
87
+ const targetRecord = targetRecordById[id] ??= {};
88
+ Object.assign(targetRecord, sourceRecord);
89
+ }
90
+ }
91
+ }
92
+ function addStartUpdateStoreLayer(parent, startUpdate) {
93
+ switch (parent.kind) {
94
+ case "BaseStoreLayer":
95
+ startUpdate(parent);
96
+ return parent;
97
+ case "StartUpdateStoreLayer": {
98
+ const node = parent;
99
+ const prevStartUpdate = node.startUpdate;
100
+ node.startUpdate = () => {
101
+ prevStartUpdate(node);
102
+ startUpdate(node);
103
+ };
104
+ startUpdate(node);
105
+ return node;
106
+ }
107
+ case "NetworkResponseStoreLayer":
108
+ case "OptimisticNetworkResponseStoreLayer":
109
+ case "OptimisticUpdaterStoreLayer": {
110
+ const node = {
111
+ kind: "StartUpdateStoreLayer",
112
+ parentStoreLayer: parent,
113
+ childStoreLayer: null,
114
+ data: {},
115
+ startUpdate
116
+ };
117
+ parent.childStoreLayer = node;
118
+ startUpdate(node);
119
+ return node;
120
+ }
121
+ }
122
+ }
123
+ function addOptimisticNetworkResponseStoreLayer(parent) {
124
+ switch (parent.kind) {
125
+ case "BaseStoreLayer":
126
+ case "StartUpdateStoreLayer":
127
+ case "NetworkResponseStoreLayer":
128
+ case "OptimisticNetworkResponseStoreLayer":
129
+ case "OptimisticUpdaterStoreLayer": {
130
+ const node = {
131
+ kind: "OptimisticNetworkResponseStoreLayer",
132
+ parentStoreLayer: parent,
133
+ childStoreLayer: null,
134
+ data: {}
135
+ };
136
+ parent.childStoreLayer = node;
137
+ return node;
138
+ }
139
+ }
140
+ }
141
+ /**
142
+ * Merge storeLayerToMerge, and its children, into baseStoreLayer.
143
+ * We can merge until we reach a revertible layer (i.e. an optimistic layer).
144
+ * All other layers cannot be reverted, so for housekeeping + perf, we merge
145
+ * them into a single layer.
146
+ *
147
+ * Note that BaseStoreLayer.childStoreLayer has type OptimisticStoreLayer | null.
148
+ * So, the state of the stack is never e.g. base <- network response. Instead,
149
+ * we have a base + a child that we would like to attach to the base. So, we merge
150
+ * (flatten) until we reach an optimistic layer or null, at which point, we can
151
+ * set baseStoreLayer.childStoreLayer = storeLayerToMerge (via setChildOfNode).
152
+ */
153
+ function mergeLayersWithDataIntoBaseLayer(environment, storeLayerToMerge, baseStoreLayer) {
154
+ while (storeLayerToMerge != null && storeLayerToMerge.kind !== "OptimisticUpdaterStoreLayer") {
155
+ mergeDataLayer(baseStoreLayer.data, storeLayerToMerge.data);
156
+ storeLayerToMerge = storeLayerToMerge.childStoreLayer;
157
+ }
158
+ setChildOfNode(environment, baseStoreLayer, storeLayerToMerge);
159
+ }
160
+ /**
161
+ * Now that we have replaced the optimistic layer with a network response layer, we need
162
+ * to
163
+ * - re-execute startUpdate and optimistic nodes, in light of the replaced data, and
164
+ * - create two objects containing the old merged data (from the optimistic update layer
165
+ * onward) and the new merged data (from the network response layer onward).
166
+ * - we will compare the new and old merged data in order to determine the changed records
167
+ * and trigger subscriptions.
168
+ *
169
+ * Here, "merged data" means all of the records + fields that were modified, starting at
170
+ * storeLayer, e.g. in BaseLayer <- OptimisticLayer <- StartUpdateLayer, if we
171
+ * are replacing Optimistic, then oldData will contain the records + fields modified by
172
+ * OptimisticLayer + StartUpdateLayer.
173
+ */
174
+ function reexecuteUpdatesAndMergeData(storeLayer, oldMergedData, newMergedData) {
175
+ while (storeLayer != null) {
176
+ mergeDataLayer(oldMergedData, storeLayer.data);
177
+ switch (storeLayer.kind) {
178
+ case "OptimisticNetworkResponseStoreLayer":
179
+ case "NetworkResponseStoreLayer": break;
180
+ case "StartUpdateStoreLayer":
181
+ storeLayer.data = {};
182
+ storeLayer.startUpdate(storeLayer);
183
+ break;
184
+ case "OptimisticUpdaterStoreLayer":
185
+ storeLayer.data = {};
186
+ storeLayer.startUpdate(storeLayer);
187
+ break;
188
+ }
189
+ mergeDataLayer(newMergedData, storeLayer.data);
190
+ storeLayer = storeLayer.childStoreLayer;
191
+ }
192
+ }
193
+ /**
194
+ * Set storeLayerToModify's child to a given layer. This may be null!
195
+ * If it is null, set the environment.store to storeLayerToModify.
196
+ * If it is not null, then the existing environment.store value remains
197
+ * valid.
198
+ */
199
+ function setChildOfNode(environment, storeLayerToModify, newChildStoreLayer) {
200
+ storeLayerToModify.childStoreLayer = newChildStoreLayer;
201
+ if (newChildStoreLayer != null) newChildStoreLayer.parentStoreLayer = storeLayerToModify;
202
+ else environment.store = storeLayerToModify;
203
+ }
204
+ /**
205
+ * Remove an optimistic store layer from the stack, potentially replacing it
206
+ * with a network response.
207
+ *
208
+ * After we do this, we must re-execute all child startUpdate and optimistic
209
+ * layers (since their data may have changed.) We also keep track of changed
210
+ * records, in order to call affected subscriptions.
211
+ */
212
+ function revertOptimisticStoreLayerAndMaybeReplace(environment, optimisticNode, normalizeData) {
213
+ const oldMergedData = optimisticNode.data;
214
+ optimisticNode.data = {};
215
+ let newMergedData = {};
216
+ let childNode = optimisticNode.childStoreLayer;
217
+ if (normalizeData != null) {
218
+ const networkResponseStoreLayer = {
219
+ kind: "NetworkResponseStoreLayer",
220
+ data: {},
221
+ parentStoreLayer: optimisticNode,
222
+ childStoreLayer: null
223
+ };
224
+ normalizeData(networkResponseStoreLayer);
225
+ if (childNode?.kind === "NetworkResponseStoreLayer") {
226
+ mergeDataLayer(networkResponseStoreLayer.data, childNode.data);
227
+ mergeDataLayer(oldMergedData, childNode.data);
228
+ childNode = childNode.childStoreLayer;
229
+ }
230
+ newMergedData = structuredClone(networkResponseStoreLayer.data);
231
+ setChildOfNode(environment, networkResponseStoreLayer, childNode);
232
+ optimisticNode.childStoreLayer = networkResponseStoreLayer;
233
+ }
234
+ reexecuteUpdatesAndMergeData(childNode, oldMergedData, newMergedData);
235
+ if (optimisticNode.parentStoreLayer.kind === "BaseStoreLayer") mergeLayersWithDataIntoBaseLayer(environment, optimisticNode.childStoreLayer, optimisticNode.parentStoreLayer);
236
+ else if (optimisticNode.parentStoreLayer.kind === "NetworkResponseStoreLayer" && optimisticNode.childStoreLayer?.kind === "NetworkResponseStoreLayer") {
237
+ mergeDataLayer(optimisticNode.parentStoreLayer.data, optimisticNode.childStoreLayer.data);
238
+ setChildOfNode(environment, optimisticNode.parentStoreLayer, optimisticNode.childStoreLayer.childStoreLayer);
239
+ } else setChildOfNode(environment, optimisticNode.parentStoreLayer, optimisticNode.childStoreLayer);
240
+ let encounteredIds = /* @__PURE__ */ new Map();
241
+ compareData(oldMergedData, newMergedData, encounteredIds);
242
+ require_subscribe.callSubscriptions(environment, encounteredIds);
243
+ }
244
+ function compareData(oldData, newData, encounteredIds) {
245
+ const oldDataTypeNames = new Set(Object.keys(oldData));
246
+ const newDataTypeNames = new Set(Object.keys(newData));
247
+ for (const oldTypeName of oldDataTypeNames.difference(newDataTypeNames)) {
248
+ const set = require_cache.insertEmptySetIfMissing(encounteredIds, oldTypeName);
249
+ for (const id in oldData[oldTypeName]) set.add(id);
250
+ }
251
+ for (const [typeName, newRecords] of Object.entries(newData)) {
252
+ if (newRecords == null) continue;
253
+ const oldRecords = oldData[typeName];
254
+ outer: for (const [id, newRecord] of Object.entries(newRecords)) {
255
+ if (newRecord == null) continue;
256
+ const oldRecord = oldRecords?.[id];
257
+ for (const [recordKey, newRecordValue] of Object.entries(newRecord)) if (newRecordValue !== oldRecord?.[recordKey]) {
258
+ require_cache.insertEmptySetIfMissing(encounteredIds, typeName).add(id);
259
+ continue outer;
260
+ }
261
+ encounteredIds.get(typeName)?.delete(id);
262
+ }
263
+ }
264
+ }
265
+
266
+ //#endregion
267
+ exports.addNetworkResponseStoreLayer = addNetworkResponseStoreLayer;
268
+ exports.addOptimisticNetworkResponseStoreLayer = addOptimisticNetworkResponseStoreLayer;
269
+ exports.addStartUpdateStoreLayer = addStartUpdateStoreLayer;
270
+ exports.getMutableStoreRecordProxy = getMutableStoreRecordProxy;
271
+ exports.getOrInsertRecord = getOrInsertRecord;
272
+ exports.getStoreRecordProxy = getStoreRecordProxy;
273
+ exports.revertOptimisticStoreLayerAndMaybeReplace = revertOptimisticStoreLayerAndMaybeReplace;