@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
@@ -1,53 +1,68 @@
1
- import { ItemCleanupPair } from '@isograph/disposable-types';
2
- import { normalizeData } from './cache';
3
- import { check, DEFAULT_SHOULD_FETCH_VALUE, FetchOptions } from './check';
4
- import { getOrCreateCachedComponent } from './componentCache';
1
+ import type { ItemCleanupPair } from '@isograph/disposable-types';
5
2
  import {
3
+ normalizeData,
4
+ type EncounteredIds,
5
+ type NetworkResponseObject,
6
+ } from './cache';
7
+ import type { FetchOptions } from './check';
8
+ import { check, DEFAULT_SHOULD_FETCH_VALUE } from './check';
9
+ import { getOrCreateCachedComponent } from './componentCache';
10
+ import type {
6
11
  IsographEntrypoint,
12
+ NormalizationAst,
13
+ NormalizationAstLoader,
7
14
  ReaderWithRefetchQueries,
8
15
  RefetchQueryNormalizationArtifact,
9
- type NormalizationAst,
10
- type NormalizationAstLoader,
11
16
  } from './entrypoint';
12
- import {
17
+ import type {
13
18
  ExtractParameters,
14
- type FragmentReference,
15
- type UnknownTReadFromStore,
19
+ FragmentReference,
20
+ UnknownTReadFromStore,
16
21
  } from './FragmentReference';
22
+ import type { RetainedQuery } from './garbageCollection';
17
23
  import {
18
24
  garbageCollectEnvironment,
19
- RetainedQuery,
20
25
  retainQuery,
21
26
  unretainQuery,
22
27
  } from './garbageCollection';
23
- import { IsographEnvironment, ROOT_ID, StoreLink } from './IsographEnvironment';
28
+ import type { IsographEnvironment, StoreLink } from './IsographEnvironment';
29
+ import { ROOT_ID } from './IsographEnvironment';
24
30
  import { logMessage } from './logging';
25
31
  import {
26
- AnyError,
27
- PromiseWrapper,
28
- wrapPromise,
29
- wrapResolvedValue,
30
- } from './PromiseWrapper';
32
+ addNetworkResponseStoreLayer,
33
+ addOptimisticNetworkResponseStoreLayer,
34
+ revertOptimisticStoreLayerAndMaybeReplace,
35
+ type OptimisticStoreLayer,
36
+ type StoreLayerWithData,
37
+ } from './optimisticProxy';
38
+ import type { AnyError, PromiseWrapper } from './PromiseWrapper';
39
+ import { wrapPromise, wrapResolvedValue } from './PromiseWrapper';
31
40
  import { readButDoNotEvaluate } from './read';
32
41
  import { getOrCreateCachedStartUpdate } from './startUpdate';
42
+ import { callSubscriptions } from './subscribe';
33
43
 
34
44
  let networkRequestId = 0;
35
45
 
36
46
  export function maybeMakeNetworkRequest<
37
47
  TReadFromStore extends UnknownTReadFromStore,
38
48
  TClientFieldValue,
39
- TArtifact extends
40
- | RefetchQueryNormalizationArtifact
41
- | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
42
49
  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
50
+ TRawResponseType extends NetworkResponseObject,
43
51
  >(
44
52
  environment: IsographEnvironment,
45
- artifact: TArtifact,
53
+ artifact:
54
+ | RefetchQueryNormalizationArtifact
55
+ | IsographEntrypoint<
56
+ TReadFromStore,
57
+ TClientFieldValue,
58
+ TNormalizationAst,
59
+ TRawResponseType
60
+ >,
46
61
  variables: ExtractParameters<TReadFromStore>,
47
62
  readerWithRefetchQueries: PromiseWrapper<
48
63
  ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
49
64
  > | null,
50
- fetchOptions: FetchOptions<TClientFieldValue> | null,
65
+ fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,
51
66
  ): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
52
67
  switch (fetchOptions?.shouldFetch ?? DEFAULT_SHOULD_FETCH_VALUE) {
53
68
  case 'Yes': {
@@ -60,7 +75,11 @@ export function maybeMakeNetworkRequest<
60
75
  );
61
76
  }
62
77
  case 'No': {
63
- return [wrapResolvedValue(undefined), () => {}];
78
+ return retainQueryWithoutMakingNetworkRequest(
79
+ environment,
80
+ artifact,
81
+ variables,
82
+ );
64
83
  }
65
84
  case 'IfNecessary': {
66
85
  if (
@@ -68,7 +87,8 @@ export function maybeMakeNetworkRequest<
68
87
  'NormalizationAstLoader'
69
88
  ) {
70
89
  throw new Error(
71
- 'Using lazy loaded normalizationAst with shouldFetch: "IfNecessary" is not supported as it will lead to slower initial load time.',
90
+ 'Using lazy loaded normalizationAst with shouldFetch: "IfNecessary" is ' +
91
+ 'not supported as it will lead to a network waterfall.',
72
92
  );
73
93
  }
74
94
  const result = check(
@@ -82,7 +102,11 @@ export function maybeMakeNetworkRequest<
82
102
  );
83
103
 
84
104
  if (result.kind === 'EnoughData') {
85
- return [wrapResolvedValue(undefined), () => {}];
105
+ return retainQueryWithoutMakingNetworkRequest(
106
+ environment,
107
+ artifact,
108
+ variables,
109
+ );
86
110
  } else {
87
111
  return makeNetworkRequest(
88
112
  environment,
@@ -96,38 +120,83 @@ export function maybeMakeNetworkRequest<
96
120
  }
97
121
  }
98
122
 
99
- function loadNormalizationAst(
100
- normalizationAst: NormalizationAstLoader | NormalizationAst,
101
- ) {
102
- switch (normalizationAst.kind) {
103
- case 'NormalizationAst': {
104
- return normalizationAst;
105
- }
106
- case 'NormalizationAstLoader': {
107
- return normalizationAst.loader();
108
- }
109
- }
123
+ export function retainQueryWithoutMakingNetworkRequest<
124
+ TReadFromStore extends UnknownTReadFromStore,
125
+ TClientFieldValue,
126
+ TRawResponseType extends NetworkResponseObject,
127
+ >(
128
+ environment: IsographEnvironment,
129
+ artifact:
130
+ | RefetchQueryNormalizationArtifact
131
+ | IsographEntrypoint<
132
+ TReadFromStore,
133
+ TClientFieldValue,
134
+ NormalizationAst | NormalizationAstLoader,
135
+ TRawResponseType
136
+ >,
137
+ variables: ExtractParameters<TReadFromStore>,
138
+ ): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
139
+ let status:
140
+ | NetworkRequestStatusUndisposedComplete
141
+ | NetworkRequestStatusDisposed = {
142
+ kind: 'UndisposedComplete',
143
+ retainedQuery: fetchNormalizationAstAndRetainArtifact(
144
+ environment,
145
+ artifact,
146
+ variables,
147
+ ),
148
+ };
149
+ return [
150
+ wrapResolvedValue(undefined),
151
+ () => {
152
+ if (status.kind !== 'Disposed') {
153
+ status = unretainAndGarbageCollect(environment, status);
154
+ }
155
+ },
156
+ ];
110
157
  }
111
158
 
112
159
  export function makeNetworkRequest<
113
160
  TReadFromStore extends UnknownTReadFromStore,
114
161
  TClientFieldValue,
115
- TArtifact extends
116
- | RefetchQueryNormalizationArtifact
117
- | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
118
162
  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
163
+ TRawResponseType extends NetworkResponseObject,
119
164
  >(
120
165
  environment: IsographEnvironment,
121
- artifact: TArtifact,
166
+ artifact:
167
+ | RefetchQueryNormalizationArtifact
168
+ | IsographEntrypoint<
169
+ TReadFromStore,
170
+ TClientFieldValue,
171
+ TNormalizationAst,
172
+ TRawResponseType
173
+ >,
122
174
  variables: ExtractParameters<TReadFromStore>,
123
175
  readerWithRefetchQueries: PromiseWrapper<
124
176
  ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
125
177
  > | null,
126
- fetchOptions: FetchOptions<TClientFieldValue> | null,
178
+ fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null,
127
179
  ): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
128
180
  // TODO this should be a DataId and stored in the store
129
181
  const myNetworkRequestId = networkRequestId + '';
130
182
  networkRequestId++;
183
+ let status: NetworkRequestStatus = {
184
+ kind: 'UndisposedIncomplete',
185
+ retainedQuery: fetchNormalizationAstAndRetainArtifact(
186
+ environment,
187
+ artifact,
188
+ variables,
189
+ ),
190
+ optimistic:
191
+ fetchOptions?.optimisticNetworkResponse != null
192
+ ? makeOptimisticUpdate(
193
+ environment,
194
+ artifact,
195
+ variables,
196
+ fetchOptions?.optimisticNetworkResponse,
197
+ )
198
+ : null,
199
+ };
131
200
 
132
201
  logMessage(environment, () => ({
133
202
  kind: 'MakeNetworkRequest',
@@ -136,16 +205,13 @@ export function makeNetworkRequest<
136
205
  networkRequestId: myNetworkRequestId,
137
206
  }));
138
207
 
139
- let status: NetworkRequestStatus = {
140
- kind: 'UndisposedIncomplete',
141
- };
142
208
  // This should be an observable, not a promise
143
209
  const promise = Promise.all([
144
210
  environment.networkFunction(
145
211
  artifact.networkRequestInfo.operation,
146
212
  variables,
147
213
  ),
148
- loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
214
+ status.retainedQuery.normalizationAst.promise,
149
215
  readerWithRefetchQueries?.promise,
150
216
  ])
151
217
  .then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {
@@ -159,30 +225,56 @@ export function makeNetworkRequest<
159
225
  try {
160
226
  fetchOptions?.onError?.();
161
227
  } catch {}
162
- throw new Error('GraphQL network response had errors', {
228
+ throw new Error('Network response had errors', {
163
229
  cause: networkResponse,
164
230
  });
165
231
  }
166
232
 
167
233
  const root = { __link: ROOT_ID, __typename: artifact.concreteType };
234
+
168
235
  if (status.kind === 'UndisposedIncomplete') {
169
- normalizeData(
170
- environment,
171
- normalizationAst.selections,
172
- networkResponse.data ?? {},
173
- variables,
174
- root,
175
- );
176
- const retainedQuery = {
177
- normalizationAst: normalizationAst.selections,
178
- variables,
179
- root,
180
- };
181
- status = {
182
- kind: 'UndisposedComplete',
183
- retainedQuery,
184
- };
185
- retainQuery(environment, retainedQuery);
236
+ if (status.optimistic != null) {
237
+ status =
238
+ revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(
239
+ environment,
240
+ status,
241
+ (storeLayer) =>
242
+ normalizeData(
243
+ environment,
244
+ storeLayer,
245
+ normalizationAst.selections,
246
+ networkResponse.data ?? {},
247
+ variables,
248
+ root,
249
+ new Map(),
250
+ ),
251
+ );
252
+ } else {
253
+ const encounteredIds: EncounteredIds = new Map();
254
+ environment.store = addNetworkResponseStoreLayer(environment.store);
255
+ normalizeData(
256
+ environment,
257
+ environment.store,
258
+ normalizationAst.selections,
259
+ networkResponse.data ?? {},
260
+ variables,
261
+ root,
262
+ encounteredIds,
263
+ );
264
+
265
+ logMessage(environment, () => ({
266
+ kind: 'AfterNormalization',
267
+ store: environment.store,
268
+ encounteredIds: encounteredIds,
269
+ }));
270
+
271
+ callSubscriptions(environment, encounteredIds);
272
+
273
+ status = {
274
+ kind: 'UndisposedComplete',
275
+ retainedQuery: status.retainedQuery,
276
+ };
277
+ }
186
278
  }
187
279
 
188
280
  const onComplete = fetchOptions?.onComplete;
@@ -213,6 +305,16 @@ export function makeNetworkRequest<
213
305
  try {
214
306
  fetchOptions?.onError?.();
215
307
  } catch {}
308
+
309
+ if (status.kind === 'UndisposedIncomplete') {
310
+ status =
311
+ revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(
312
+ environment,
313
+ status,
314
+ null,
315
+ );
316
+ }
317
+
216
318
  throw e;
217
319
  });
218
320
 
@@ -221,44 +323,56 @@ export function makeNetworkRequest<
221
323
  const response: ItemCleanupPair<PromiseWrapper<void, AnyError>> = [
222
324
  wrapper,
223
325
  () => {
224
- if (status.kind === 'UndisposedComplete') {
225
- const didUnretainSomeQuery = unretainQuery(
226
- environment,
227
- status.retainedQuery,
228
- );
229
- if (didUnretainSomeQuery) {
230
- garbageCollectEnvironment(environment);
231
- }
326
+ if (status.kind === 'UndisposedIncomplete') {
327
+ status =
328
+ revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(
329
+ environment,
330
+ status,
331
+ null,
332
+ );
333
+ }
334
+ if (status.kind !== 'Disposed') {
335
+ status = unretainAndGarbageCollect(environment, status);
232
336
  }
233
- status = {
234
- kind: 'Disposed',
235
- };
236
337
  },
237
338
  ];
238
339
  return response;
239
340
  }
240
341
 
342
+ type NetworkRequestStatusUndisposedIncomplete = {
343
+ readonly kind: 'UndisposedIncomplete';
344
+ readonly retainedQuery: RetainedQuery;
345
+ readonly optimistic: OptimisticStoreLayer | null;
346
+ };
347
+
348
+ type NetworkRequestStatusUndisposedComplete = {
349
+ readonly kind: 'UndisposedComplete';
350
+ readonly retainedQuery: RetainedQuery;
351
+ };
352
+
353
+ type NetworkRequestStatusDisposed = {
354
+ readonly kind: 'Disposed';
355
+ };
356
+
241
357
  type NetworkRequestStatus =
242
- | {
243
- readonly kind: 'UndisposedIncomplete';
244
- }
245
- | {
246
- readonly kind: 'Disposed';
247
- }
248
- | {
249
- readonly kind: 'UndisposedComplete';
250
- readonly retainedQuery: RetainedQuery;
251
- };
358
+ | NetworkRequestStatusUndisposedIncomplete
359
+ | NetworkRequestStatusUndisposedComplete
360
+ | NetworkRequestStatusDisposed;
252
361
 
253
362
  function readDataForOnComplete<
254
363
  TReadFromStore extends UnknownTReadFromStore,
255
364
  TClientFieldValue,
256
- TArtifact extends
257
- | RefetchQueryNormalizationArtifact
258
- | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
259
365
  TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
366
+ TRawResponseType extends NetworkResponseObject,
260
367
  >(
261
- artifact: TArtifact,
368
+ artifact:
369
+ | RefetchQueryNormalizationArtifact
370
+ | IsographEntrypoint<
371
+ TReadFromStore,
372
+ TClientFieldValue,
373
+ TNormalizationAst,
374
+ TRawResponseType
375
+ >,
262
376
  environment: IsographEnvironment,
263
377
  root: StoreLink,
264
378
  variables: ExtractParameters<TReadFromStore>,
@@ -293,6 +407,8 @@ function readDataForOnComplete<
293
407
  readerWithRefetchQueries: wrapResolvedValue(
294
408
  resolvedReaderWithRefetchQueries,
295
409
  ),
410
+ fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
411
+ readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,
296
412
  root,
297
413
  variables,
298
414
  networkRequest: fakeNetworkRequest,
@@ -310,7 +426,6 @@ function readDataForOnComplete<
310
426
  // TClientFieldValue which is a React.FC<...>
311
427
  return getOrCreateCachedComponent(
312
428
  environment,
313
- readerArtifact.fieldName,
314
429
  {
315
430
  kind: 'FragmentReference',
316
431
  readerWithRefetchQueries: wrapResolvedValue({
@@ -319,6 +434,8 @@ function readDataForOnComplete<
319
434
  nestedRefetchQueries:
320
435
  resolvedReaderWithRefetchQueries.nestedRefetchQueries,
321
436
  }),
437
+ fieldName: readerArtifact.fieldName,
438
+ readerArtifactKind: readerArtifact.kind,
322
439
  root,
323
440
  variables,
324
441
  networkRequest: fakeNetworkRequest,
@@ -335,19 +452,128 @@ function readDataForOnComplete<
335
452
  startUpdate: getOrCreateCachedStartUpdate(
336
453
  environment,
337
454
  fragment,
338
- resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
339
455
  fakeNetworkRequestOptions,
340
456
  ),
341
457
  }
342
458
  : undefined),
343
459
  });
344
460
  }
345
- default: {
346
- const _: never = readerArtifact;
347
- _;
348
- throw new Error('Expected case');
349
- }
350
461
  }
351
462
  }
352
463
  return null;
353
464
  }
465
+
466
+ function fetchNormalizationAstAndRetainArtifact<
467
+ TReadFromStore extends UnknownTReadFromStore,
468
+ TClientFieldValue,
469
+ TRawResponseType extends NetworkResponseObject,
470
+ >(
471
+ environment: IsographEnvironment,
472
+ artifact:
473
+ | RefetchQueryNormalizationArtifact
474
+ | IsographEntrypoint<
475
+ TReadFromStore,
476
+ TClientFieldValue,
477
+ NormalizationAst | NormalizationAstLoader,
478
+ TRawResponseType
479
+ >,
480
+ variables: ExtractParameters<TReadFromStore>,
481
+ ): RetainedQuery {
482
+ const normalizationAst =
483
+ artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'
484
+ ? wrapResolvedValue(artifact.networkRequestInfo.normalizationAst)
485
+ : wrapPromise(artifact.networkRequestInfo.normalizationAst.loader());
486
+
487
+ const root = { __link: ROOT_ID, __typename: artifact.concreteType };
488
+ const retainedQuery: RetainedQuery = {
489
+ normalizationAst: normalizationAst,
490
+ variables,
491
+ root,
492
+ };
493
+ retainQuery(environment, retainedQuery);
494
+ return retainedQuery;
495
+ }
496
+
497
+ function makeOptimisticUpdate<
498
+ TReadFromStore extends UnknownTReadFromStore,
499
+ TClientFieldValue,
500
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
501
+ TRawResponseType extends NetworkResponseObject,
502
+ >(
503
+ environment: IsographEnvironment,
504
+ artifact:
505
+ | RefetchQueryNormalizationArtifact
506
+ | IsographEntrypoint<
507
+ TReadFromStore,
508
+ TClientFieldValue,
509
+ TNormalizationAst,
510
+ TRawResponseType
511
+ >,
512
+ variables: ExtractParameters<TReadFromStore>,
513
+ optimisticNetworkResponse: TRawResponseType,
514
+ ): OptimisticStoreLayer {
515
+ const root = { __link: ROOT_ID, __typename: artifact.concreteType };
516
+
517
+ if (
518
+ artifact.networkRequestInfo.normalizationAst.kind ===
519
+ 'NormalizationAstLoader'
520
+ ) {
521
+ throw new Error(
522
+ 'Using lazy loaded normalizationAst with optimisticNetworkResponse is not supported.',
523
+ );
524
+ }
525
+ const encounteredIds: EncounteredIds = new Map();
526
+ const optimistic = (environment.store =
527
+ addOptimisticNetworkResponseStoreLayer(environment.store));
528
+ normalizeData(
529
+ environment,
530
+ environment.store,
531
+ artifact.networkRequestInfo.normalizationAst.selections,
532
+ optimisticNetworkResponse,
533
+ variables,
534
+ root,
535
+ encounteredIds,
536
+ );
537
+
538
+ logMessage(environment, () => ({
539
+ kind: 'AfterNormalization',
540
+ store: environment.store,
541
+ encounteredIds: encounteredIds,
542
+ }));
543
+
544
+ callSubscriptions(environment, encounteredIds);
545
+ return optimistic;
546
+ }
547
+
548
+ function revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(
549
+ environment: IsographEnvironment,
550
+ status: NetworkRequestStatusUndisposedIncomplete,
551
+ normalizeData: null | ((storeLayer: StoreLayerWithData) => void),
552
+ ): NetworkRequestStatusUndisposedComplete {
553
+ if (status.optimistic != null) {
554
+ revertOptimisticStoreLayerAndMaybeReplace(
555
+ environment,
556
+ status.optimistic,
557
+ normalizeData,
558
+ );
559
+ }
560
+
561
+ return {
562
+ kind: 'UndisposedComplete',
563
+ retainedQuery: status.retainedQuery,
564
+ };
565
+ }
566
+
567
+ function unretainAndGarbageCollect(
568
+ environment: IsographEnvironment,
569
+ status: NetworkRequestStatusUndisposedComplete,
570
+ ): NetworkRequestStatusDisposed {
571
+ const didUnretainSomeQuery = unretainQuery(environment, status.retainedQuery);
572
+ if (didUnretainSomeQuery) {
573
+ garbageCollectEnvironment(environment);
574
+ }
575
+
576
+ return {
577
+ kind: 'Disposed',
578
+ };
579
+ }