@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,237 @@
1
+ import { isArray, stableCopy } from "./util.mjs";
2
+ import { ROOT_ID, getLink } from "./IsographEnvironment.mjs";
3
+ import { logMessage } from "./logging.mjs";
4
+ import { getMutableStoreRecordProxy } from "./optimisticProxy.mjs";
5
+ import { ParentCache } from "@isograph/react-disposable-state";
6
+
7
+ //#region src/core/cache.ts
8
+ const TYPENAME_FIELD_NAME = "__typename";
9
+ function getOrCreateItemInSuspenseCache(environment, index, factory) {
10
+ if (environment.fragmentCache[index] == null) environment.fragmentCache[index] = new ParentCache(factory);
11
+ return environment.fragmentCache[index];
12
+ }
13
+ function normalizeData(environment, storeLayer, normalizationAst, networkResponse, variables, root, encounteredIds) {
14
+ logMessage(environment, () => ({
15
+ kind: "AboutToNormalize",
16
+ normalizationAst,
17
+ networkResponse,
18
+ variables
19
+ }));
20
+ normalizeDataIntoRecord(environment, storeLayer, normalizationAst, networkResponse, getMutableStoreRecordProxy(storeLayer, root), root, variables, encounteredIds);
21
+ return encounteredIds;
22
+ }
23
+ function subscribeToAnyChange(environment, callback) {
24
+ const subscription = {
25
+ kind: "AnyRecords",
26
+ callback
27
+ };
28
+ environment.subscriptions.add(subscription);
29
+ return () => environment.subscriptions.delete(subscription);
30
+ }
31
+ function subscribeToAnyChangesToRecord(environment, recordLink, callback) {
32
+ const subscription = {
33
+ kind: "AnyChangesToRecord",
34
+ recordLink,
35
+ callback
36
+ };
37
+ environment.subscriptions.add(subscription);
38
+ return () => environment.subscriptions.delete(subscription);
39
+ }
40
+ function onNextChangeToRecord(environment, recordLink) {
41
+ return new Promise((resolve) => {
42
+ const unsubscribe = subscribeToAnyChangesToRecord(environment, recordLink, () => {
43
+ unsubscribe();
44
+ resolve();
45
+ });
46
+ });
47
+ }
48
+ /**
49
+ * Mutate targetParentRecord according to the normalizationAst and networkResponseParentRecord.
50
+ */
51
+ function normalizeDataIntoRecord(environment, storeLayer, normalizationAst, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds) {
52
+ let recordHasBeenUpdated = false;
53
+ for (const normalizationNode of normalizationAst) switch (normalizationNode.kind) {
54
+ case "Scalar": {
55
+ const scalarFieldResultedInChange = normalizeScalarField(normalizationNode, networkResponseParentRecord, targetParentRecord, variables);
56
+ recordHasBeenUpdated = recordHasBeenUpdated || scalarFieldResultedInChange;
57
+ break;
58
+ }
59
+ case "Linked": {
60
+ const linkedFieldResultedInChange = normalizeLinkedField(environment, storeLayer, normalizationNode, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds);
61
+ recordHasBeenUpdated = recordHasBeenUpdated || linkedFieldResultedInChange;
62
+ break;
63
+ }
64
+ case "InlineFragment": {
65
+ const inlineFragmentResultedInChange = normalizeInlineFragment(environment, storeLayer, normalizationNode, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds);
66
+ recordHasBeenUpdated = recordHasBeenUpdated || inlineFragmentResultedInChange;
67
+ break;
68
+ }
69
+ }
70
+ if (recordHasBeenUpdated) insertEmptySetIfMissing(mutableEncounteredIds, targetParentRecordLink.__typename).add(targetParentRecordLink.__link);
71
+ return recordHasBeenUpdated;
72
+ }
73
+ function insertEmptySetIfMissing(map, key) {
74
+ let result = map.get(key);
75
+ if (result === void 0) {
76
+ result = /* @__PURE__ */ new Set();
77
+ map.set(key, result);
78
+ }
79
+ return result;
80
+ }
81
+ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreRecord, variables) {
82
+ const networkResponseData = networkResponseParentRecord[getNetworkResponseKey(astNode)];
83
+ const parentRecordKey = getParentRecordKey(astNode, variables);
84
+ const existingValue = targetStoreRecord[parentRecordKey];
85
+ if (networkResponseData == null) {
86
+ targetStoreRecord[parentRecordKey] = null;
87
+ return existingValue === void 0 || existingValue != null;
88
+ }
89
+ if (isScalarOrEmptyArray(networkResponseData)) {
90
+ targetStoreRecord[parentRecordKey] = networkResponseData;
91
+ return existingValue !== networkResponseData;
92
+ } else throw new Error("Unexpected object array when normalizing scalar");
93
+ }
94
+ /**
95
+ * Mutate targetParentRecord with a given linked field ast node.
96
+ */
97
+ function normalizeLinkedField(environment, storeLayer, astNode, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds) {
98
+ const networkResponseData = networkResponseParentRecord[getNetworkResponseKey(astNode)];
99
+ const parentRecordKey = getParentRecordKey(astNode, variables);
100
+ const existingValue = targetParentRecord[parentRecordKey];
101
+ if (networkResponseData == null) {
102
+ targetParentRecord[parentRecordKey] = null;
103
+ return existingValue === void 0 || existingValue != null;
104
+ }
105
+ if (isScalarOrEmptyArray(networkResponseData) && !isNullOrEmptyArray(networkResponseData)) throw new Error("Unexpected scalar network response when normalizing a linked field");
106
+ if (isArray(networkResponseData)) {
107
+ const dataIds = [];
108
+ for (let i = 0; i < networkResponseData.length; i++) {
109
+ const networkResponseObject = networkResponseData[i];
110
+ if (networkResponseObject == null) {
111
+ dataIds.push(null);
112
+ continue;
113
+ }
114
+ const newStoreRecordId = normalizeNetworkResponseObject(environment, storeLayer, astNode, networkResponseObject, targetParentRecordLink, variables, i, mutableEncounteredIds);
115
+ const __typename = astNode.concreteType ?? networkResponseObject[TYPENAME_FIELD_NAME];
116
+ if (__typename == null) throw new Error("Unexpected missing __typename in network response when normalizing a linked field. This is indicative of a bug in Isograph.");
117
+ dataIds.push({
118
+ __link: newStoreRecordId,
119
+ __typename
120
+ });
121
+ }
122
+ targetParentRecord[parentRecordKey] = dataIds;
123
+ return !dataIdsAreTheSame(existingValue, dataIds);
124
+ } else {
125
+ const newStoreRecordId = normalizeNetworkResponseObject(environment, storeLayer, astNode, networkResponseData, targetParentRecordLink, variables, null, mutableEncounteredIds);
126
+ let __typename = astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];
127
+ if (__typename == null) throw new Error("Unexpected missing __typename in network response when normalizing a linked field. This is indicative of a bug in Isograph.");
128
+ targetParentRecord[parentRecordKey] = {
129
+ __link: newStoreRecordId,
130
+ __typename
131
+ };
132
+ const link = getLink(existingValue);
133
+ return link?.__link !== newStoreRecordId || link.__typename !== __typename;
134
+ }
135
+ }
136
+ /**
137
+ * Mutate targetParentRecord with a given linked field ast node.
138
+ */
139
+ function normalizeInlineFragment(environment, storeLayer, astNode, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds) {
140
+ const typeToRefineTo = astNode.type;
141
+ if (networkResponseParentRecord[TYPENAME_FIELD_NAME] === typeToRefineTo) return normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseParentRecord, targetParentRecord, targetParentRecordLink, variables, mutableEncounteredIds);
142
+ return false;
143
+ }
144
+ function dataIdsAreTheSame(existingValue, newDataIds) {
145
+ if (isArray(existingValue)) {
146
+ if (newDataIds.length !== existingValue.length) return false;
147
+ for (let i = 0; i < newDataIds.length; i++) {
148
+ const maybeLink = getLink(existingValue[i]);
149
+ if (newDataIds[i]?.__link !== maybeLink?.__link || newDataIds[i]?.__typename !== maybeLink?.__typename) return false;
150
+ }
151
+ return true;
152
+ } else return false;
153
+ }
154
+ function normalizeNetworkResponseObject(environment, storeLayer, astNode, networkResponseData, targetParentRecordLink, variables, index, mutableEncounteredIds) {
155
+ const newStoreRecordId = getDataIdOfNetworkResponse(targetParentRecordLink, networkResponseData, astNode, variables, index);
156
+ const __typename = astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];
157
+ if (__typename == null) throw new Error("Unexpected missing __typename in network response object. This is indicative of a bug in Isograph.");
158
+ const link = {
159
+ __link: newStoreRecordId,
160
+ __typename
161
+ };
162
+ const newStoreRecord = getMutableStoreRecordProxy(storeLayer, link);
163
+ normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseData, newStoreRecord, link, variables, mutableEncounteredIds);
164
+ return newStoreRecordId;
165
+ }
166
+ function isScalarOrEmptyArray(data) {
167
+ if (isArray(data)) return data.every((x) => isScalarOrEmptyArray(x));
168
+ return data == null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
169
+ }
170
+ function isNullOrEmptyArray(data) {
171
+ if (isArray(data)) {
172
+ if (data.length === 0) return true;
173
+ return data.every((x) => isNullOrEmptyArray(x));
174
+ }
175
+ return data == null;
176
+ }
177
+ function getParentRecordKey(astNode, variables) {
178
+ let parentRecordKey = astNode.fieldName;
179
+ const fieldParameters = astNode.arguments;
180
+ if (fieldParameters != null) for (const fieldParameter of fieldParameters) parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);
181
+ return parentRecordKey;
182
+ }
183
+ function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
184
+ switch (argumentValue.kind) {
185
+ case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue$1]) => {
186
+ return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue$1, variables)];
187
+ }));
188
+ case "Literal": return argumentValue.value;
189
+ case "Variable": return variables[argumentValue.name] ?? "null";
190
+ case "String": return argumentValue.value;
191
+ case "Enum": return argumentValue.value;
192
+ }
193
+ }
194
+ function getStoreKeyChunkForArgument(argument, variables) {
195
+ const [argumentName, argumentValue] = argument;
196
+ let chunk = getStoreKeyChunkForArgumentValue(argumentValue, variables);
197
+ if (typeof chunk === "object") chunk = JSON.stringify(stableCopy(chunk));
198
+ return `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${chunk}`;
199
+ }
200
+ function getNetworkResponseKey(astNode) {
201
+ let networkResponseKey = astNode.fieldName;
202
+ const fieldParameters = astNode.arguments;
203
+ if (fieldParameters != null) for (const [argumentName, argumentValue] of fieldParameters) {
204
+ let argumentValueChunk = getArgumentValueChunk(argumentValue);
205
+ networkResponseKey += `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${argumentValueChunk}`;
206
+ }
207
+ return networkResponseKey;
208
+ }
209
+ function getArgumentValueChunk(argumentValue) {
210
+ switch (argumentValue.kind) {
211
+ case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue$1]) => {
212
+ return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue$1);
213
+ }).join("_") + "_c";
214
+ case "Literal": return "l_" + argumentValue.value;
215
+ case "Variable": return "v_" + argumentValue.name;
216
+ case "String": return "s_" + argumentValue.value.replaceAll(/\W/g, "_");
217
+ case "Enum": return "e_" + argumentValue.value;
218
+ }
219
+ }
220
+ const FIRST_SPLIT_KEY = "____";
221
+ const SECOND_SPLIT_KEY = "___";
222
+ const THIRD_SPLIT_KEY = "__";
223
+ function getDataIdOfNetworkResponse(parentRecordLink, dataToNormalize, astNode, variables, index) {
224
+ if (astNode.concreteType === "Query") return ROOT_ID;
225
+ const dataId = dataToNormalize.id;
226
+ if (dataId != null) return dataId;
227
+ let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;
228
+ if (index != null) storeKey += `.${index}`;
229
+ const fieldParameters = astNode.arguments;
230
+ if (fieldParameters == null) return storeKey;
231
+ for (const fieldParameter of fieldParameters) storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);
232
+ return storeKey;
233
+ }
234
+
235
+ //#endregion
236
+ export { TYPENAME_FIELD_NAME, getOrCreateItemInSuspenseCache, getParentRecordKey, insertEmptySetIfMissing, normalizeData, onNextChangeToRecord, subscribeToAnyChange };
237
+ //# sourceMappingURL=cache.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.mjs","names":["dataIds: (StoreLink | null)[]","argumentValue"],"sources":["../../src/core/cache.ts"],"sourcesContent":["import { type Factory, ParentCache } from '@isograph/react-disposable-state';\nimport type {\n NormalizationAstNodes,\n NormalizationInlineFragment,\n NormalizationLinkedField,\n NormalizationScalarField,\n} from './entrypoint';\nimport type {\n FragmentReference,\n UnknownTReadFromStore,\n Variables,\n VariableValue,\n} from './FragmentReference';\nimport {\n type DataId,\n type DataTypeValue,\n getLink,\n type IsographEnvironment,\n ROOT_ID,\n type StoreLink,\n type StoreRecord,\n type TypeName,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n getMutableStoreRecordProxy,\n type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { ReaderLinkedField, ReaderScalarField } from './reader';\nimport { type Argument, type ArgumentValue, isArray, stableCopy } from './util';\n\nexport const TYPENAME_FIELD_NAME = '__typename';\n\nexport function getOrCreateItemInSuspenseCache<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n>(\n environment: IsographEnvironment,\n index: string,\n factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,\n): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {\n if (environment.fragmentCache[index] == null) {\n environment.fragmentCache[index] = new ParentCache(factory);\n }\n\n return environment.fragmentCache[index];\n}\n\nexport type NetworkResponseScalarValue = string | number | boolean;\nexport type NetworkResponseValue =\n | NetworkResponseScalarValue\n | null\n | NetworkResponseObject\n | readonly (NetworkResponseObject | null)[]\n | readonly (NetworkResponseScalarValue | null)[];\n\nexport type NetworkResponseObject = {\n // N.B. undefined is here to support optional id's, but\n // undefined should not *actually* be present in the network response.\n readonly [index: string]: undefined | NetworkResponseValue;\n readonly id?: DataId;\n readonly __typename?: TypeName;\n};\n\nexport function normalizeData(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponse: NetworkResponseObject,\n variables: Variables,\n root: StoreLink,\n encounteredIds: EncounteredIds,\n): EncounteredIds {\n logMessage(environment, () => ({\n kind: 'AboutToNormalize',\n normalizationAst,\n networkResponse,\n variables,\n }));\n\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, root);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n normalizationAst,\n networkResponse,\n newStoreRecord,\n root,\n variables,\n encounteredIds,\n );\n\n return encounteredIds;\n}\n\nexport function subscribeToAnyChange(\n environment: IsographEnvironment,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyRecords',\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function subscribeToAnyChangesToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyChangesToRecord',\n recordLink,\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function onNextChangeToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = subscribeToAnyChangesToRecord(\n environment,\n recordLink,\n () => {\n unsubscribe();\n resolve();\n },\n );\n });\n}\n\nexport type EncounteredIds = Map<TypeName, Set<DataId>>;\n/**\n * Mutate targetParentRecord according to the normalizationAst and networkResponseParentRecord.\n */\nfunction normalizeDataIntoRecord(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n let recordHasBeenUpdated = false;\n for (const normalizationNode of normalizationAst) {\n switch (normalizationNode.kind) {\n case 'Scalar': {\n const scalarFieldResultedInChange = normalizeScalarField(\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n variables,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || scalarFieldResultedInChange;\n break;\n }\n case 'Linked': {\n const linkedFieldResultedInChange = normalizeLinkedField(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || linkedFieldResultedInChange;\n break;\n }\n case 'InlineFragment': {\n const inlineFragmentResultedInChange = normalizeInlineFragment(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || inlineFragmentResultedInChange;\n break;\n }\n }\n }\n if (recordHasBeenUpdated) {\n let encounteredRecordsIds = insertEmptySetIfMissing(\n mutableEncounteredIds,\n targetParentRecordLink.__typename,\n );\n\n encounteredRecordsIds.add(targetParentRecordLink.__link);\n }\n return recordHasBeenUpdated;\n}\n\nexport function insertEmptySetIfMissing<K, V>(map: Map<K, Set<V>>, key: K) {\n let result = map.get(key);\n if (result === undefined) {\n result = new Set();\n map.set(key, result);\n }\n return result;\n}\n\ntype RecordHasBeenUpdated = boolean;\nfunction normalizeScalarField(\n astNode: NormalizationScalarField,\n networkResponseParentRecord: NetworkResponseObject,\n targetStoreRecord: StoreRecord,\n variables: Variables,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetStoreRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetStoreRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n if (isScalarOrEmptyArray(networkResponseData)) {\n targetStoreRecord[parentRecordKey] = networkResponseData;\n return existingValue !== networkResponseData;\n } else {\n throw new Error('Unexpected object array when normalizing scalar');\n }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeLinkedField(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetParentRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetParentRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n if (\n isScalarOrEmptyArray(networkResponseData) &&\n !isNullOrEmptyArray(networkResponseData)\n ) {\n throw new Error(\n 'Unexpected scalar network response when normalizing a linked field',\n );\n }\n\n if (isArray(networkResponseData)) {\n // TODO check astNode.plural or the like\n const dataIds: (StoreLink | null)[] = [];\n for (let i = 0; i < networkResponseData.length; i++) {\n const networkResponseObject = networkResponseData[i];\n if (networkResponseObject == null) {\n dataIds.push(null);\n continue;\n }\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseObject,\n targetParentRecordLink,\n variables,\n i,\n mutableEncounteredIds,\n );\n\n const __typename =\n astNode.concreteType ?? networkResponseObject[TYPENAME_FIELD_NAME];\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n dataIds.push({\n __link: newStoreRecordId,\n __typename,\n });\n }\n targetParentRecord[parentRecordKey] = dataIds;\n return !dataIdsAreTheSame(existingValue, dataIds);\n } else {\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseData,\n targetParentRecordLink,\n variables,\n null,\n mutableEncounteredIds,\n );\n\n let __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n targetParentRecord[parentRecordKey] = {\n __link: newStoreRecordId,\n __typename,\n };\n\n const link = getLink(existingValue);\n return link?.__link !== newStoreRecordId || link.__typename !== __typename;\n }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeInlineFragment(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationInlineFragment,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const typeToRefineTo = astNode.type;\n if (networkResponseParentRecord[TYPENAME_FIELD_NAME] === typeToRefineTo) {\n const hasBeenModified = normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n return hasBeenModified;\n }\n return false;\n}\n\nfunction dataIdsAreTheSame(\n existingValue: DataTypeValue,\n newDataIds: (StoreLink | null)[],\n): boolean {\n if (isArray(existingValue)) {\n if (newDataIds.length !== existingValue.length) {\n return false;\n }\n for (let i = 0; i < newDataIds.length; i++) {\n const maybeLink = getLink(existingValue[i]);\n if (\n newDataIds[i]?.__link !== maybeLink?.__link ||\n newDataIds[i]?.__typename !== maybeLink?.__typename\n ) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction normalizeNetworkResponseObject(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseData: NetworkResponseObject,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n index: number | null,\n mutableEncounteredIds: EncounteredIds,\n): DataId /* The id of the modified or newly created item */ {\n const newStoreRecordId = getDataIdOfNetworkResponse(\n targetParentRecordLink,\n networkResponseData,\n astNode,\n variables,\n index,\n );\n const __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response object. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const link = { __link: newStoreRecordId, __typename };\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, link);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseData,\n newStoreRecord,\n link,\n variables,\n mutableEncounteredIds,\n );\n\n return newStoreRecordId;\n}\n\nfunction isScalarOrEmptyArray(\n data: NetworkResponseValue,\n): data is\n | NetworkResponseScalarValue\n | readonly (NetworkResponseScalarValue | null)[] {\n // N.B. empty arrays count as empty arrays of scalar fields.\n if (isArray(data)) {\n return data.every((x) => isScalarOrEmptyArray(x));\n }\n const isScalarValue =\n data == null ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean';\n return isScalarValue;\n}\n\nfunction isNullOrEmptyArray(\n data: unknown,\n): data is readonly never[] | null[] | null {\n if (isArray(data)) {\n if (data.length === 0) {\n return true;\n }\n return data.every((x) => isNullOrEmptyArray(x));\n }\n\n return data == null;\n}\n\nexport function getParentRecordKey(\n astNode:\n | NormalizationLinkedField\n | NormalizationScalarField\n | ReaderLinkedField\n | ReaderScalarField,\n variables: Variables,\n): string {\n let parentRecordKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n if (fieldParameters != null) {\n for (const fieldParameter of fieldParameters) {\n parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n }\n\n return parentRecordKey;\n}\n\nfunction getStoreKeyChunkForArgumentValue(\n argumentValue: ArgumentValue,\n variables: Variables,\n): VariableValue {\n switch (argumentValue.kind) {\n case 'Object': {\n return Object.fromEntries(\n argumentValue.value.map(([argumentName, argumentValue]) => {\n return [\n argumentName,\n // substitute variables\n getStoreKeyChunkForArgumentValue(argumentValue, variables),\n ];\n }),\n );\n }\n case 'Literal': {\n return argumentValue.value;\n }\n case 'Variable': {\n return variables[argumentValue.name] ?? 'null';\n }\n case 'String': {\n return argumentValue.value;\n }\n case 'Enum': {\n return argumentValue.value;\n }\n }\n}\n\nfunction getStoreKeyChunkForArgument(argument: Argument, variables: Variables) {\n const [argumentName, argumentValue] = argument;\n let chunk = getStoreKeyChunkForArgumentValue(argumentValue, variables);\n\n if (typeof chunk === 'object') {\n chunk = JSON.stringify(stableCopy(chunk));\n }\n\n return `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${chunk}`;\n}\n\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField | NormalizationScalarField,\n): string {\n let networkResponseKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n\n if (fieldParameters != null) {\n for (const [argumentName, argumentValue] of fieldParameters) {\n let argumentValueChunk = getArgumentValueChunk(argumentValue);\n networkResponseKey += `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${argumentValueChunk}`;\n }\n }\n\n return networkResponseKey;\n}\n\nfunction getArgumentValueChunk(argumentValue: ArgumentValue): string {\n switch (argumentValue.kind) {\n case 'Object': {\n return (\n 'o_' +\n argumentValue.value\n .map(([argumentName, argumentValue]) => {\n return (\n argumentName +\n THIRD_SPLIT_KEY +\n getArgumentValueChunk(argumentValue)\n );\n })\n .join('_') +\n '_c'\n );\n }\n case 'Literal': {\n return 'l_' + argumentValue.value;\n }\n case 'Variable': {\n return 'v_' + argumentValue.name;\n }\n case 'String': {\n // replace all non-word characters (alphanumeric & underscore) with underscores\n return 's_' + argumentValue.value.replaceAll(/\\W/g, '_');\n }\n case 'Enum': {\n return 'e_' + argumentValue.value;\n }\n }\n}\n\n// an alias might be pullRequests____first___first____after___cursor\nexport const FIRST_SPLIT_KEY = '____';\nexport const SECOND_SPLIT_KEY = '___';\nexport const THIRD_SPLIT_KEY = '__';\n\n// Returns a key to look up an item in the store\nfunction getDataIdOfNetworkResponse(\n parentRecordLink: StoreLink,\n dataToNormalize: NetworkResponseObject,\n astNode: NormalizationLinkedField,\n variables: Variables,\n index: number | null,\n): DataId {\n // If we are dealing with nested Query, use __ROOT as id\n // TODO do not hard code this value here\n if (astNode.concreteType === 'Query') {\n return ROOT_ID;\n }\n\n // Check whether the dataToNormalize has an id field. If so, that is the key.\n // If not, we construct an id from the parentRecordId and the field parameters.\n\n const dataId = dataToNormalize.id;\n if (dataId != null) {\n return dataId;\n }\n\n let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;\n if (index != null) {\n storeKey += `.${index}`;\n }\n\n const fieldParameters = astNode.arguments;\n if (fieldParameters == null) {\n return storeKey;\n }\n\n for (const fieldParameter of fieldParameters) {\n storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n return storeKey;\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { IsographEnvironment, StoreLink } from "./IsographEnvironment.mjs";
2
+ import { Variables } from "./FragmentReference.mjs";
3
+ import { NormalizationAstNodes } from "./entrypoint.mjs";
4
+
5
+ //#region src/core/check.d.ts
6
+ type ShouldFetch = RequiredShouldFetch | 'IfNecessary';
7
+ type RequiredShouldFetch = 'Yes' | 'No';
8
+ type FetchOptionsShared<TReadOutData> = {
9
+ onComplete?: (data: TReadOutData) => void;
10
+ onError?: () => void;
11
+ };
12
+ interface FetchOptions<TReadOutData, TRawResponseType> extends FetchOptionsShared<TReadOutData> {
13
+ shouldFetch?: ShouldFetch;
14
+ optimisticNetworkResponse?: TRawResponseType;
15
+ }
16
+ interface RequiredFetchOptions<TReadOutData> extends FetchOptionsShared<TReadOutData> {
17
+ shouldFetch: RequiredShouldFetch;
18
+ }
19
+ type CheckResult = {
20
+ kind: 'EnoughData';
21
+ } | {
22
+ kind: 'MissingData';
23
+ record: StoreLink;
24
+ };
25
+ declare function check(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, variables: Variables, root: StoreLink): CheckResult;
26
+ //#endregion
27
+ export { CheckResult, FetchOptions, RequiredFetchOptions, RequiredShouldFetch, ShouldFetch, check };
28
+ //# sourceMappingURL=check.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.mts","names":[],"sources":["../../src/core/check.ts"],"sourcesContent":[],"mappings":";;;;;KAYY,WAAA,GAAc;KACd,mBAAA;AAAZ,KAIK,kBAJO,CAAA,YAAmB,CAAA,GAAA;EAI1B,UAAA,CAAA,EAAA,CAAA,IAAA,EACiB,YADC,EAAA,GAAA,IAAA;EAKN,OAAA,CAAA,EAAA,GAAA,GAAY,IAAA;CACA;AACb,UAFC,YAED,CAAA,YAAA,EAAA,gBAAA,CAAA,SADN,kBACM,CADa,YACb,CAAA,CAAA;EACc,WAAA,CAAA,EADd,WACc;EAFpB,yBAAA,CAAA,EAEoB,gBAFpB;;AAKO,UAAA,oBAAoB,CAAA,YAAA,CAAA,SAC3B,kBAD2B,CACR,YADQ,CAAA,CAAA;EACR,WAAA,EACd,mBADc;;AAAnB,KAIE,WAAA,GAJF;EAAkB,IAAA,EAAA,YAAA;AAI5B,CAAA,GAAY;EASI,IAAA,EAAA,aAAK;EACN,MAAA,EAJD,SAIC;CACK;AACP,iBAHG,KAAA,CAGH,WAAA,EAFE,mBAEF,EAAA,gBAAA,EADO,qBACP,EAAA,SAAA,EAAA,SAAA,EAAA,IAAA,EACL,SADK,CAAA,EAEV,WAFU"}
@@ -1,22 +1,28 @@
1
- import { NormalizationAstNodes } from './entrypoint';
2
- import { Variables } from './FragmentReference';
3
- import { IsographEnvironment, StoreLink } from './IsographEnvironment';
4
- export type ShouldFetch = RequiredShouldFetch | 'IfNecessary';
5
- export type RequiredShouldFetch = 'Yes' | 'No';
6
- export declare const DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch;
7
- export type FetchOptions<TReadOutData> = {
8
- shouldFetch?: ShouldFetch;
9
- onComplete?: (data: TReadOutData) => void;
10
- onError?: () => void;
1
+ import { IsographEnvironment, StoreLink } from "./IsographEnvironment.js";
2
+ import { Variables } from "./FragmentReference.js";
3
+ import { NormalizationAstNodes } from "./entrypoint.js";
4
+
5
+ //#region src/core/check.d.ts
6
+ type ShouldFetch = RequiredShouldFetch | 'IfNecessary';
7
+ type RequiredShouldFetch = 'Yes' | 'No';
8
+ type FetchOptionsShared<TReadOutData> = {
9
+ onComplete?: (data: TReadOutData) => void;
10
+ onError?: () => void;
11
11
  };
12
- export type RequiredFetchOptions<TReadOutData> = {
13
- shouldFetch: RequiredShouldFetch;
14
- } & FetchOptions<TReadOutData>;
15
- export type CheckResult = {
16
- kind: 'EnoughData';
12
+ interface FetchOptions<TReadOutData, TRawResponseType> extends FetchOptionsShared<TReadOutData> {
13
+ shouldFetch?: ShouldFetch;
14
+ optimisticNetworkResponse?: TRawResponseType;
15
+ }
16
+ interface RequiredFetchOptions<TReadOutData> extends FetchOptionsShared<TReadOutData> {
17
+ shouldFetch: RequiredShouldFetch;
18
+ }
19
+ type CheckResult = {
20
+ kind: 'EnoughData';
17
21
  } | {
18
- kind: 'MissingData';
19
- record: StoreLink;
22
+ kind: 'MissingData';
23
+ record: StoreLink;
20
24
  };
21
- export declare function check(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, variables: Variables, root: StoreLink): CheckResult;
25
+ declare function check(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, variables: Variables, root: StoreLink): CheckResult;
26
+ //#endregion
27
+ export { CheckResult, FetchOptions, RequiredFetchOptions, RequiredShouldFetch, ShouldFetch, check };
22
28
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/core/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAEL,mBAAmB,EACnB,SAAS,EAEV,MAAM,uBAAuB,CAAC;AAG/B,MAAM,MAAM,WAAW,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,IAAI,CAAC;AAE/C,eAAO,MAAM,0BAA0B,EAAE,WAA2B,CAAC;AAErE,MAAM,MAAM,YAAY,CAAC,YAAY,IAAI;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,YAAY,IAAI;IAC/C,WAAW,EAAE,mBAAmB,CAAC;CAClC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,YAAY,CAAC;CACpB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEN,wBAAgB,KAAK,CACnB,WAAW,EAAE,mBAAmB,EAChC,gBAAgB,EAAE,qBAAqB,EACvC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,GACd,WAAW,CAgBb"}
1
+ {"version":3,"file":"check.d.ts","names":[],"sources":["../../src/core/check.ts"],"sourcesContent":[],"mappings":";;;;;KAYY,WAAA,GAAc;KACd,mBAAA;AAAZ,KAIK,kBAJO,CAAA,YAAmB,CAAA,GAAA;EAI1B,UAAA,CAAA,EAAA,CAAA,IAAA,EACiB,YADC,EAAA,GAAA,IAAA;EAKN,OAAA,CAAA,EAAA,GAAA,GAAY,IAAA;CACA;AACb,UAFC,YAED,CAAA,YAAA,EAAA,gBAAA,CAAA,SADN,kBACM,CADa,YACb,CAAA,CAAA;EACc,WAAA,CAAA,EADd,WACc;EAFpB,yBAAA,CAAA,EAEoB,gBAFpB;;AAKO,UAAA,oBAAoB,CAAA,YAAA,CAAA,SAC3B,kBAD2B,CACR,YADQ,CAAA,CAAA;EACR,WAAA,EACd,mBADc;;AAAnB,KAIE,WAAA,GAJF;EAAkB,IAAA,EAAA,YAAA;AAI5B,CAAA,GAAY;EASI,IAAA,EAAA,aAAK;EACN,MAAA,EAJD,SAIC;CACK;AACP,iBAHG,KAAA,CAGH,WAAA,EAFE,mBAEF,EAAA,gBAAA,EADO,qBACP,EAAA,SAAA,EAAA,SAAA,EAAA,IAAA,EACL,SADK,CAAA,EAEV,WAFU"}
@@ -1,128 +1,84 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_SHOULD_FETCH_VALUE = void 0;
4
- exports.check = check;
5
- const cache_1 = require("./cache");
6
- const IsographEnvironment_1 = require("./IsographEnvironment");
7
- const logging_1 = require("./logging");
8
- exports.DEFAULT_SHOULD_FETCH_VALUE = 'IfNecessary';
1
+ const require_IsographEnvironment = require('./IsographEnvironment.js');
2
+ const require_logging = require('./logging.js');
3
+ const require_optimisticProxy = require('./optimisticProxy.js');
4
+ const require_cache = require('./cache.js');
5
+
6
+ //#region src/core/check.ts
7
+ const DEFAULT_SHOULD_FETCH_VALUE = "IfNecessary";
9
8
  function check(environment, normalizationAst, variables, root) {
10
- var _a, _b;
11
- var _c, _d, _e;
12
- const recordsById = ((_a = (_c = environment.store)[_d = root.__typename]) !== null && _a !== void 0 ? _a : (_c[_d] = {}));
13
- const newStoreRecord = ((_b = recordsById[_e = root.__link]) !== null && _b !== void 0 ? _b : (recordsById[_e] = {}));
14
- const checkResult = checkFromRecord(environment, normalizationAst, variables, newStoreRecord, root);
15
- (0, logging_1.logMessage)(environment, () => ({
16
- kind: 'EnvironmentCheck',
17
- result: checkResult,
18
- }));
19
- return checkResult;
9
+ const newStoreRecord = require_optimisticProxy.getStoreRecordProxy(environment.store, root);
10
+ if (newStoreRecord == null) return {
11
+ kind: "MissingData",
12
+ record: root
13
+ };
14
+ const checkResult = checkFromRecord(environment, normalizationAst, variables, newStoreRecord, root);
15
+ require_logging.logMessage(environment, () => ({
16
+ kind: "EnvironmentCheck",
17
+ result: checkResult
18
+ }));
19
+ return checkResult;
20
20
  }
21
21
  function checkFromRecord(environment, normalizationAst, variables, record, recordLink) {
22
- var _a, _b;
23
- normalizationAstLoop: for (const normalizationAstNode of normalizationAst) {
24
- switch (normalizationAstNode.kind) {
25
- case 'Scalar': {
26
- const parentRecordKey = (0, cache_1.getParentRecordKey)(normalizationAstNode, variables);
27
- const scalarValue = record[parentRecordKey];
28
- // null means the value is known to be missing, so it must
29
- // be exactly undefined
30
- if (scalarValue === undefined) {
31
- return {
32
- kind: 'MissingData',
33
- record: recordLink,
34
- };
35
- }
36
- continue normalizationAstLoop;
37
- }
38
- case 'Linked': {
39
- const parentRecordKey = (0, cache_1.getParentRecordKey)(normalizationAstNode, variables);
40
- const linkedValue = record[parentRecordKey];
41
- if (linkedValue === undefined) {
42
- return {
43
- kind: 'MissingData',
44
- record: recordLink,
45
- };
46
- }
47
- else if (linkedValue === null) {
48
- continue;
49
- }
50
- else if (Array.isArray(linkedValue)) {
51
- arrayItemsLoop: for (const item of linkedValue) {
52
- const link = (0, IsographEnvironment_1.getLink)(item);
53
- if (link === null) {
54
- throw new Error('Unexpected non-link in the Isograph store. ' +
55
- 'This is indicative of a bug in Isograph.');
56
- }
57
- const linkedRecord = (_a = environment.store[link.__typename]) === null || _a === void 0 ? void 0 : _a[link.__link];
58
- if (linkedRecord === undefined) {
59
- return {
60
- kind: 'MissingData',
61
- record: link,
62
- };
63
- }
64
- else if (linkedRecord === null) {
65
- continue arrayItemsLoop;
66
- }
67
- else {
68
- // TODO in __DEV__ assert linkedRecord is an object
69
- const result = checkFromRecord(environment, normalizationAstNode.selections, variables, linkedRecord, link);
70
- if (result.kind === 'MissingData') {
71
- return result;
72
- }
73
- }
74
- }
75
- }
76
- else {
77
- const link = (0, IsographEnvironment_1.getLink)(linkedValue);
78
- if (link === null) {
79
- throw new Error('Unexpected non-link in the Isograph store. ' +
80
- 'This is indicative of a bug in Isograph.');
81
- }
82
- const linkedRecord = (_b = environment.store[link.__typename]) === null || _b === void 0 ? void 0 : _b[link.__link];
83
- if (linkedRecord === undefined) {
84
- return {
85
- kind: 'MissingData',
86
- record: link,
87
- };
88
- }
89
- else if (linkedRecord === null) {
90
- continue normalizationAstLoop;
91
- }
92
- else {
93
- // TODO in __DEV__ assert linkedRecord is an object
94
- const result = checkFromRecord(environment, normalizationAstNode.selections, variables, linkedRecord, link);
95
- if (result.kind === 'MissingData') {
96
- return result;
97
- }
98
- }
99
- }
100
- continue normalizationAstLoop;
101
- }
102
- case 'InlineFragment': {
103
- const existingRecordTypename = record['__typename'];
104
- if (existingRecordTypename == null) {
105
- return {
106
- kind: 'MissingData',
107
- record: recordLink,
108
- };
109
- }
110
- if (existingRecordTypename === normalizationAstNode.type) {
111
- const result = checkFromRecord(environment, normalizationAstNode.selections, variables, record, recordLink);
112
- if (result.kind === 'MissingData') {
113
- return result;
114
- }
115
- }
116
- continue normalizationAstLoop;
117
- }
118
- default: {
119
- let _ = normalizationAstNode;
120
- _;
121
- throw new Error('Unexpected case. This is indicative of a bug in Isograph.');
122
- }
123
- }
124
- }
125
- return {
126
- kind: 'EnoughData',
127
- };
22
+ normalizationAstLoop: for (const normalizationAstNode of normalizationAst) switch (normalizationAstNode.kind) {
23
+ case "Scalar":
24
+ if (record[require_cache.getParentRecordKey(normalizationAstNode, variables)] === void 0) return {
25
+ kind: "MissingData",
26
+ record: recordLink
27
+ };
28
+ continue normalizationAstLoop;
29
+ case "Linked": {
30
+ const linkedValue = record[require_cache.getParentRecordKey(normalizationAstNode, variables)];
31
+ if (linkedValue === void 0) return {
32
+ kind: "MissingData",
33
+ record: recordLink
34
+ };
35
+ else if (linkedValue == null) continue;
36
+ else if (Array.isArray(linkedValue)) arrayItemsLoop: for (const item of linkedValue) {
37
+ const link = require_IsographEnvironment.getLink(item);
38
+ if (link == null) throw new Error("Unexpected non-link in the Isograph store. This is indicative of a bug in Isograph.");
39
+ const linkedRecord = require_optimisticProxy.getStoreRecordProxy(environment.store, link);
40
+ if (linkedRecord === void 0) return {
41
+ kind: "MissingData",
42
+ record: link
43
+ };
44
+ else if (linkedRecord == null) continue arrayItemsLoop;
45
+ else {
46
+ const result = checkFromRecord(environment, normalizationAstNode.selections, variables, linkedRecord, link);
47
+ if (result.kind === "MissingData") return result;
48
+ }
49
+ }
50
+ else {
51
+ const link = require_IsographEnvironment.getLink(linkedValue);
52
+ if (link == null) throw new Error("Unexpected non-link in the Isograph store. This is indicative of a bug in Isograph.");
53
+ const linkedRecord = require_optimisticProxy.getStoreRecordProxy(environment.store, link);
54
+ if (linkedRecord === void 0) return {
55
+ kind: "MissingData",
56
+ record: link
57
+ };
58
+ else if (linkedRecord == null) continue normalizationAstLoop;
59
+ else {
60
+ const result = checkFromRecord(environment, normalizationAstNode.selections, variables, linkedRecord, link);
61
+ if (result.kind === "MissingData") return result;
62
+ }
63
+ }
64
+ continue normalizationAstLoop;
65
+ }
66
+ case "InlineFragment": {
67
+ const existingRecordTypename = record["__typename"];
68
+ if (existingRecordTypename == null) return {
69
+ kind: "MissingData",
70
+ record: recordLink
71
+ };
72
+ if (existingRecordTypename === normalizationAstNode.type) {
73
+ const result = checkFromRecord(environment, normalizationAstNode.selections, variables, record, recordLink);
74
+ if (result.kind === "MissingData") return result;
75
+ }
76
+ continue normalizationAstLoop;
77
+ }
78
+ }
79
+ return { kind: "EnoughData" };
128
80
  }
81
+
82
+ //#endregion
83
+ exports.DEFAULT_SHOULD_FETCH_VALUE = DEFAULT_SHOULD_FETCH_VALUE;
84
+ exports.check = check;