@isograph/react 0.5.2 → 0.5.5

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 (254) hide show
  1. package/.turbo/turbo-compile-libs.log +9 -6
  2. package/.turbo/turbo-tsc.log +5 -0
  3. package/dist/_virtual/{rolldown_runtime.js → rolldown_runtime.cjs} +10 -6
  4. package/dist/core/{FragmentReference.js → FragmentReference.cjs} +1 -1
  5. package/dist/core/{FragmentReference.d.ts → FragmentReference.d.cts} +5 -5
  6. package/dist/core/FragmentReference.d.cts.map +1 -0
  7. package/dist/core/FragmentReference.d.mts.map +1 -1
  8. package/dist/core/{IsographEnvironment.js → IsographEnvironment.cjs} +19 -9
  9. package/dist/core/{IsographEnvironment.d.ts → IsographEnvironment.d.cts} +19 -15
  10. package/dist/core/IsographEnvironment.d.cts.map +1 -0
  11. package/dist/core/IsographEnvironment.d.mts +9 -5
  12. package/dist/core/IsographEnvironment.d.mts.map +1 -1
  13. package/dist/core/IsographEnvironment.mjs +17 -7
  14. package/dist/core/IsographEnvironment.mjs.map +1 -1
  15. package/dist/core/{PromiseWrapper.d.ts → PromiseWrapper.d.cts} +1 -1
  16. package/dist/core/PromiseWrapper.d.cts.map +1 -0
  17. package/dist/core/PromiseWrapper.d.mts.map +1 -1
  18. package/dist/core/PromiseWrapper.mjs.map +1 -1
  19. package/dist/core/{areEqualWithDeepComparison.js → areEqualWithDeepComparison.cjs} +7 -7
  20. package/dist/core/areEqualWithDeepComparison.mjs +7 -7
  21. package/dist/core/areEqualWithDeepComparison.mjs.map +1 -1
  22. package/dist/core/{brand.d.ts → brand.d.cts} +2 -2
  23. package/dist/core/brand.d.cts.map +1 -0
  24. package/dist/core/brand.d.mts +1 -1
  25. package/dist/core/brand.d.mts.map +1 -1
  26. package/dist/core/{cache.js → cache.cjs} +16 -29
  27. package/dist/core/cache.d.cts +44 -0
  28. package/dist/core/cache.d.cts.map +1 -0
  29. package/dist/core/cache.d.mts +29 -4
  30. package/dist/core/cache.d.mts.map +1 -1
  31. package/dist/core/cache.mjs +9 -21
  32. package/dist/core/cache.mjs.map +1 -1
  33. package/dist/core/{check.js → check.cjs} +4 -4
  34. package/dist/core/{check.d.ts → check.d.cts} +4 -4
  35. package/dist/core/check.d.cts.map +1 -0
  36. package/dist/core/check.d.mts.map +1 -1
  37. package/dist/core/check.mjs.map +1 -1
  38. package/dist/core/{componentCache.js → componentCache.cjs} +2 -2
  39. package/dist/core/{entrypoint.d.ts → entrypoint.d.cts} +16 -9
  40. package/dist/core/entrypoint.d.cts.map +1 -0
  41. package/dist/core/entrypoint.d.mts +9 -2
  42. package/dist/core/entrypoint.d.mts.map +1 -1
  43. package/dist/core/entrypoint.mjs.map +1 -1
  44. package/dist/core/{garbageCollection.js → garbageCollection.cjs} +3 -3
  45. package/dist/core/{garbageCollection.d.ts → garbageCollection.d.cts} +4 -4
  46. package/dist/core/garbageCollection.d.cts.map +1 -0
  47. package/dist/core/garbageCollection.d.mts.map +1 -1
  48. package/dist/core/garbageCollection.mjs.map +1 -1
  49. package/dist/core/{getOrCreateCacheForArtifact.js → getOrCreateCacheForArtifact.cjs} +4 -4
  50. package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -1
  51. package/dist/core/{logging.d.ts → logging.d.cts} +9 -10
  52. package/dist/core/logging.d.cts.map +1 -0
  53. package/dist/core/logging.d.mts +0 -1
  54. package/dist/core/logging.d.mts.map +1 -1
  55. package/dist/core/{makeNetworkRequest.js → makeNetworkRequest.cjs} +21 -21
  56. package/dist/core/{makeNetworkRequest.d.ts → makeNetworkRequest.d.cts} +7 -7
  57. package/dist/core/makeNetworkRequest.d.cts.map +1 -0
  58. package/dist/core/makeNetworkRequest.d.mts.map +1 -1
  59. package/dist/core/makeNetworkRequest.mjs +10 -10
  60. package/dist/core/makeNetworkRequest.mjs.map +1 -1
  61. package/dist/core/{optimisticProxy.js → optimisticProxy.cjs} +2 -2
  62. package/dist/core/{optimisticProxy.d.ts → optimisticProxy.d.cts} +2 -3
  63. package/dist/core/optimisticProxy.d.cts.map +1 -0
  64. package/dist/core/optimisticProxy.d.mts +0 -1
  65. package/dist/core/optimisticProxy.d.mts.map +1 -1
  66. package/dist/core/optimisticProxy.mjs.map +1 -1
  67. package/dist/core/{read.js → read.cjs} +66 -63
  68. package/dist/core/{read.d.ts → read.d.cts} +4 -5
  69. package/dist/core/read.d.cts.map +1 -0
  70. package/dist/core/read.d.mts.map +1 -1
  71. package/dist/core/read.mjs +58 -55
  72. package/dist/core/read.mjs.map +1 -1
  73. package/dist/core/{reader.d.ts → reader.d.cts} +11 -9
  74. package/dist/core/reader.d.cts.map +1 -0
  75. package/dist/core/reader.d.mts +5 -3
  76. package/dist/core/reader.d.mts.map +1 -1
  77. package/dist/core/{startUpdate.js → startUpdate.cjs} +14 -14
  78. package/dist/core/startUpdate.mjs +6 -6
  79. package/dist/core/startUpdate.mjs.map +1 -1
  80. package/dist/core/{subscribe.js → subscribe.cjs} +3 -3
  81. package/dist/core/{subscribe.d.ts → subscribe.d.cts} +6 -6
  82. package/dist/core/subscribe.d.cts.map +1 -0
  83. package/dist/core/subscribe.d.mts.map +1 -1
  84. package/dist/core/subscribe.mjs.map +1 -1
  85. package/dist/core/{util.d.ts → util.d.cts} +1 -1
  86. package/dist/core/util.d.cts.map +1 -0
  87. package/dist/core/util.d.mts.map +1 -1
  88. package/dist/core/util.mjs.map +1 -1
  89. package/dist/core/{writeData.js → writeData.cjs} +6 -6
  90. package/dist/core/{writeData.d.ts → writeData.d.cts} +6 -6
  91. package/dist/core/writeData.d.cts.map +1 -0
  92. package/dist/core/writeData.d.mts +1 -1
  93. package/dist/core/writeData.d.mts.map +1 -1
  94. package/dist/core/writeData.mjs.map +1 -1
  95. package/dist/{index.js → index.cjs} +29 -29
  96. package/dist/index.d.cts +32 -0
  97. package/dist/index.d.mts +2 -2
  98. package/dist/loadable-hooks/useClientSideDefer.cjs +14 -0
  99. package/dist/loadable-hooks/{useClientSideDefer.d.ts → useClientSideDefer.d.cts} +4 -4
  100. package/dist/loadable-hooks/useClientSideDefer.d.cts.map +1 -0
  101. package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -1
  102. package/dist/loadable-hooks/{useConnectionSpecPagination.js → useConnectionSpecPagination.cjs} +13 -16
  103. package/dist/loadable-hooks/{useConnectionSpecPagination.d.ts → useConnectionSpecPagination.d.cts} +4 -4
  104. package/dist/loadable-hooks/useConnectionSpecPagination.d.cts.map +1 -0
  105. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -1
  106. package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -1
  107. package/dist/loadable-hooks/{useImperativeExposedMutationField.d.ts → useImperativeExposedMutationField.d.cts} +1 -1
  108. package/dist/loadable-hooks/useImperativeExposedMutationField.d.cts.map +1 -0
  109. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -1
  110. package/dist/loadable-hooks/{useImperativeLoadableField.js → useImperativeLoadableField.cjs} +4 -5
  111. package/dist/loadable-hooks/{useImperativeLoadableField.d.ts → useImperativeLoadableField.d.cts} +4 -4
  112. package/dist/loadable-hooks/useImperativeLoadableField.d.cts.map +1 -0
  113. package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -1
  114. package/dist/loadable-hooks/{useSkipLimitPagination.js → useSkipLimitPagination.cjs} +13 -16
  115. package/dist/loadable-hooks/{useSkipLimitPagination.d.ts → useSkipLimitPagination.d.cts} +4 -4
  116. package/dist/loadable-hooks/useSkipLimitPagination.d.cts.map +1 -0
  117. package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -1
  118. package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -1
  119. package/dist/react/{FragmentReader.js → FragmentReader.cjs} +1 -1
  120. package/dist/react/{FragmentReader.d.ts → FragmentReader.d.cts} +5 -5
  121. package/dist/react/FragmentReader.d.cts.map +1 -0
  122. package/dist/react/FragmentReader.d.mts.map +1 -1
  123. package/dist/react/{FragmentRenderer.js → FragmentRenderer.cjs} +2 -2
  124. package/dist/react/{FragmentRenderer.d.ts → FragmentRenderer.d.cts} +5 -5
  125. package/dist/react/FragmentRenderer.d.cts.map +1 -0
  126. package/dist/react/FragmentRenderer.d.mts.map +1 -1
  127. package/dist/react/{IsographEnvironmentProvider.js → IsographEnvironmentProvider.cjs} +1 -1
  128. package/dist/react/{IsographEnvironmentProvider.d.ts → IsographEnvironmentProvider.d.cts} +2 -2
  129. package/dist/react/IsographEnvironmentProvider.d.cts.map +1 -0
  130. package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -1
  131. package/dist/react/{LoadableFieldReader.js → LoadableFieldReader.cjs} +3 -3
  132. package/dist/react/{LoadableFieldReader.d.ts → LoadableFieldReader.d.cts} +5 -5
  133. package/dist/react/LoadableFieldReader.d.cts.map +1 -0
  134. package/dist/react/LoadableFieldReader.d.mts.map +1 -1
  135. package/dist/react/{LoadableFieldRenderer.js → LoadableFieldRenderer.cjs} +3 -3
  136. package/dist/react/{LoadableFieldRenderer.d.ts → LoadableFieldRenderer.d.cts} +5 -5
  137. package/dist/react/LoadableFieldRenderer.d.cts.map +1 -0
  138. package/dist/react/LoadableFieldRenderer.d.mts.map +1 -1
  139. package/dist/react/{RenderAfterCommit__DO_NOT_USE.js → RenderAfterCommit__DO_NOT_USE.cjs} +1 -2
  140. package/dist/react/{RenderAfterCommit__DO_NOT_USE.d.ts → RenderAfterCommit__DO_NOT_USE.d.cts} +1 -2
  141. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.cts.map +1 -0
  142. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +0 -1
  143. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -1
  144. package/dist/react/{createIsographEnvironment.js → createIsographEnvironment.cjs} +2 -2
  145. package/dist/react/{createIsographEnvironment.d.ts → createIsographEnvironment.d.cts} +3 -3
  146. package/dist/react/createIsographEnvironment.d.cts.map +1 -0
  147. package/dist/react/createIsographEnvironment.d.mts +0 -1
  148. package/dist/react/createIsographEnvironment.d.mts.map +1 -1
  149. package/dist/react/{maybeUnwrapNetworkRequest.js → maybeUnwrapNetworkRequest.cjs} +1 -1
  150. package/dist/react/{useImperativeReference.js → useImperativeReference.cjs} +7 -8
  151. package/dist/react/{useImperativeReference.d.ts → useImperativeReference.d.cts} +5 -6
  152. package/dist/react/useImperativeReference.d.cts.map +1 -0
  153. package/dist/react/useImperativeReference.d.mts +0 -1
  154. package/dist/react/useImperativeReference.d.mts.map +1 -1
  155. package/dist/react/useLazyReference.cjs +18 -0
  156. package/dist/react/{useLazyReference.d.ts → useLazyReference.d.cts} +5 -6
  157. package/dist/react/useLazyReference.d.cts.map +1 -0
  158. package/dist/react/useLazyReference.d.mts +0 -1
  159. package/dist/react/useLazyReference.d.mts.map +1 -1
  160. package/dist/react/{useReadAndSubscribe.js → useReadAndSubscribe.cjs} +9 -10
  161. package/dist/react/{useReadAndSubscribe.d.ts → useReadAndSubscribe.d.cts} +4 -5
  162. package/dist/react/useReadAndSubscribe.d.cts.map +1 -0
  163. package/dist/react/useReadAndSubscribe.d.mts +0 -1
  164. package/dist/react/useReadAndSubscribe.d.mts.map +1 -1
  165. package/dist/react/useReadAndSubscribe.mjs.map +1 -1
  166. package/dist/react/{useRerenderOnChange.js → useRerenderOnChange.cjs} +3 -4
  167. package/dist/react/{useRerenderOnChange.d.ts → useRerenderOnChange.d.cts} +4 -4
  168. package/dist/react/useRerenderOnChange.d.cts.map +1 -0
  169. package/dist/react/useRerenderOnChange.d.mts.map +1 -1
  170. package/dist/react/{useResult.js → useResult.cjs} +7 -7
  171. package/dist/react/{useResult.d.ts → useResult.d.cts} +3 -3
  172. package/dist/react/useResult.d.cts.map +1 -0
  173. package/dist/react/useResult.d.mts.map +1 -1
  174. package/package.json +9 -9
  175. package/src/core/IsographEnvironment.ts +47 -22
  176. package/src/core/cache.ts +76 -55
  177. package/src/core/entrypoint.ts +18 -2
  178. package/src/core/getOrCreateCacheForArtifact.ts +2 -2
  179. package/src/core/makeNetworkRequest.ts +10 -12
  180. package/src/core/read.ts +21 -19
  181. package/src/core/reader.ts +9 -5
  182. package/src/core/writeData.ts +4 -4
  183. package/src/index.ts +2 -1
  184. package/src/tests/__isograph/Economist/__link/output_type.ts +2 -1
  185. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +4 -3
  186. package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +12 -0
  187. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +9 -3
  188. package/src/tests/__isograph/Query/meName/normalization_ast.ts +3 -0
  189. package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -3
  190. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +8 -0
  191. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +8 -3
  192. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +3 -0
  193. package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +1 -1
  194. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -3
  195. package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +3 -0
  196. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +5 -3
  197. package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +6 -0
  198. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +6 -3
  199. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +4 -0
  200. package/src/tests/__isograph/Query/subquery/raw_response_type.ts +1 -1
  201. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +6 -3
  202. package/src/tests/garbageCollection.test.ts +11 -11
  203. package/src/tests/normalizeData.test.ts +11 -3
  204. package/src/tests/optimisticProxy.test.ts +23 -23
  205. package/src/tests/startUpdate.test.ts +2 -2
  206. package/tsconfig.json +5 -4
  207. package/tsconfig.package.json +8 -0
  208. package/tsconfig.test.json +12 -0
  209. package/tsdown.config.ts +8 -0
  210. package/vitest.config.ts +1 -1
  211. package/dist/core/FragmentReference.d.ts.map +0 -1
  212. package/dist/core/IsographEnvironment.d.ts.map +0 -1
  213. package/dist/core/PromiseWrapper.d.ts.map +0 -1
  214. package/dist/core/brand.d.ts.map +0 -1
  215. package/dist/core/cache.d.ts +0 -20
  216. package/dist/core/cache.d.ts.map +0 -1
  217. package/dist/core/check.d.ts.map +0 -1
  218. package/dist/core/entrypoint.d.ts.map +0 -1
  219. package/dist/core/garbageCollection.d.ts.map +0 -1
  220. package/dist/core/logging.d.ts.map +0 -1
  221. package/dist/core/makeNetworkRequest.d.ts.map +0 -1
  222. package/dist/core/optimisticProxy.d.ts.map +0 -1
  223. package/dist/core/read.d.ts.map +0 -1
  224. package/dist/core/reader.d.ts.map +0 -1
  225. package/dist/core/subscribe.d.ts.map +0 -1
  226. package/dist/core/util.d.ts.map +0 -1
  227. package/dist/core/writeData.d.ts.map +0 -1
  228. package/dist/index.d.ts +0 -32
  229. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +0 -1
  230. package/dist/loadable-hooks/useClientSideDefer.js +0 -15
  231. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +0 -1
  232. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +0 -1
  233. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +0 -1
  234. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +0 -1
  235. package/dist/react/FragmentReader.d.ts.map +0 -1
  236. package/dist/react/FragmentRenderer.d.ts.map +0 -1
  237. package/dist/react/IsographEnvironmentProvider.d.ts.map +0 -1
  238. package/dist/react/LoadableFieldReader.d.ts.map +0 -1
  239. package/dist/react/LoadableFieldRenderer.d.ts.map +0 -1
  240. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +0 -1
  241. package/dist/react/createIsographEnvironment.d.ts.map +0 -1
  242. package/dist/react/useImperativeReference.d.ts.map +0 -1
  243. package/dist/react/useLazyReference.d.ts.map +0 -1
  244. package/dist/react/useLazyReference.js +0 -19
  245. package/dist/react/useReadAndSubscribe.d.ts.map +0 -1
  246. package/dist/react/useRerenderOnChange.d.ts.map +0 -1
  247. package/dist/react/useResult.d.ts.map +0 -1
  248. package/src/tests/tsconfig.json +0 -21
  249. package/tsconfig.pkg.json +0 -16
  250. /package/dist/core/{PromiseWrapper.js → PromiseWrapper.cjs} +0 -0
  251. /package/dist/core/{entrypoint.js → entrypoint.cjs} +0 -0
  252. /package/dist/core/{logging.js → logging.cjs} +0 -0
  253. /package/dist/core/{util.js → util.cjs} +0 -0
  254. /package/dist/loadable-hooks/{useImperativeExposedMutationField.js → useImperativeExposedMutationField.cjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"optimisticProxy.mjs","names":["startNode: StoreLayer | null","currentStoreLayer: StoreLayer | null","node: NetworkResponseStoreLayer","node: StartUpdateStoreLayer","node: OptimisticNetworkResponseStoreLayer","networkResponseStoreLayer: NetworkResponseStoreLayer","encounteredIds: EncounteredIds"],"sources":["../../src/core/optimisticProxy.ts"],"sourcesContent":["import { insertEmptySetIfMissing, type EncounteredIds } from './cache';\nimport { callSubscriptions } from './subscribe';\nimport type {\n BaseStoreLayerData,\n IsographEnvironment,\n StoreLayerData,\n StoreLink,\n StoreRecord,\n} from './IsographEnvironment';\n\nexport function getOrInsertRecord(\n dataLayer: StoreLayerData,\n link: StoreLink,\n): StoreRecord {\n const recordsById = (dataLayer[link.__typename] ??= {});\n return (recordsById[link.__link] ??= {});\n}\n\n/**\n * Given the child-most store layer (i.e. environment.store) and a link (identifying a\n * store record), create a proxy object that attempts to read through each successive\n * store layer until a value (i.e. field name) is found. If found, return that value.\n */\nexport function getStoreRecordProxy(\n storeLayer: StoreLayer,\n link: StoreLink,\n): Readonly<StoreRecord> | null | undefined {\n let startNode: StoreLayer | null = storeLayer;\n while (startNode != null) {\n const storeRecord = startNode.data[link.__typename]?.[link.__link];\n if (storeRecord === undefined) {\n startNode = startNode.parentStoreLayer;\n continue;\n }\n\n if (storeRecord == null) {\n return null;\n }\n\n return getMutableStoreRecordProxy(startNode, link);\n }\n\n return undefined;\n}\n\nexport function getMutableStoreRecordProxy(\n childMostStoreLayer: StoreLayer,\n link: StoreLink,\n): StoreRecord {\n return new Proxy<StoreRecord>(\n {},\n {\n get(_, propertyName) {\n let currentStoreLayer: StoreLayer | null = childMostStoreLayer;\n while (currentStoreLayer != null) {\n const storeRecord =\n currentStoreLayer.data[link.__typename]?.[link.__link];\n if (storeRecord !== undefined) {\n if (storeRecord == null) {\n return undefined;\n }\n const value = Reflect.get(storeRecord, propertyName);\n if (value !== undefined) {\n return value;\n }\n }\n currentStoreLayer = currentStoreLayer.parentStoreLayer;\n }\n },\n has(_, propertyName) {\n let currentStoreLayer: StoreLayer | null = childMostStoreLayer;\n while (currentStoreLayer != null) {\n const storeRecord =\n currentStoreLayer.data[link.__typename]?.[link.__link];\n if (storeRecord !== undefined) {\n if (storeRecord == null) {\n return false;\n }\n\n const value = Reflect.has(storeRecord, propertyName);\n if (value) {\n return true;\n }\n }\n currentStoreLayer = currentStoreLayer.parentStoreLayer;\n }\n return false;\n },\n set(_, p, newValue) {\n return Reflect.set(\n getOrInsertRecord(childMostStoreLayer.data, link),\n p,\n newValue,\n );\n },\n },\n );\n}\n\nexport type BaseStoreLayer = {\n readonly kind: 'BaseStoreLayer';\n childStoreLayer: OptimisticStoreLayer | null;\n readonly parentStoreLayer: null;\n readonly data: BaseStoreLayerData;\n};\n\nexport type NetworkResponseStoreLayer = {\n readonly kind: 'NetworkResponseStoreLayer';\n childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | null;\n parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer;\n readonly data: StoreLayerData;\n};\n\nexport type DataUpdate<TStoreLayer extends StoreLayer> = (\n storeLayer: TStoreLayer,\n) => void;\n\nexport type StartUpdateStoreLayer = {\n readonly kind: 'StartUpdateStoreLayer';\n childStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer | null;\n parentStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer;\n data: StoreLayerData;\n startUpdate: DataUpdate<StartUpdateStoreLayer | BaseStoreLayer>;\n};\n\nexport type OptimisticStoreLayer =\n | OptimisticUpdaterStoreLayer\n | OptimisticNetworkResponseStoreLayer;\n\nexport type OptimisticUpdaterStoreLayer = {\n readonly kind: 'OptimisticUpdaterStoreLayer';\n childStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | null;\n parentStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | BaseStoreLayer;\n data: StoreLayerData;\n readonly startUpdate: DataUpdate<OptimisticUpdaterStoreLayer>;\n};\n\nexport type OptimisticNetworkResponseStoreLayer = {\n readonly kind: 'OptimisticNetworkResponseStoreLayer';\n childStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | null;\n parentStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | BaseStoreLayer;\n data: StoreLayerData;\n};\n\nexport function addNetworkResponseStoreLayer(\n parent: StoreLayer,\n): StoreLayerWithData {\n switch (parent.kind) {\n case 'NetworkResponseStoreLayer':\n case 'BaseStoreLayer': {\n return parent;\n }\n case 'StartUpdateStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: NetworkResponseStoreLayer = {\n kind: 'NetworkResponseStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n };\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\nfunction mergeDataLayer(target: StoreLayerData, source: StoreLayerData): void {\n for (const [typeName, sourceById] of Object.entries(source)) {\n if (sourceById == null) {\n target[typeName] = sourceById;\n continue;\n }\n const targetRecordById = (target[typeName] ??= {});\n for (const [id, sourceRecord] of Object.entries(sourceById)) {\n if (sourceRecord == null) {\n targetRecordById[id] = null;\n continue;\n }\n const targetRecord = (targetRecordById[id] ??= {});\n Object.assign(targetRecord, sourceRecord);\n }\n }\n}\n\nexport function addStartUpdateStoreLayer(\n parent: StoreLayer,\n startUpdate: StartUpdateStoreLayer['startUpdate'],\n): StoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer': {\n startUpdate(parent);\n return parent;\n }\n case 'StartUpdateStoreLayer': {\n const node = parent;\n\n const prevStartUpdate = node.startUpdate;\n node.startUpdate = () => {\n prevStartUpdate(node);\n startUpdate(node);\n };\n\n startUpdate(node);\n return node;\n }\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: StartUpdateStoreLayer = {\n kind: 'StartUpdateStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n startUpdate: startUpdate,\n };\n parent.childStoreLayer = node;\n\n startUpdate(node);\n return node;\n }\n }\n}\n\nexport function addOptimisticUpdaterStoreLayer(\n parent: StoreLayer,\n startUpdate: OptimisticUpdaterStoreLayer['startUpdate'],\n): OptimisticUpdaterStoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer':\n case 'StartUpdateStoreLayer':\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: OptimisticUpdaterStoreLayer = {\n kind: 'OptimisticUpdaterStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n startUpdate: startUpdate,\n };\n\n startUpdate(node);\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\nexport function addOptimisticNetworkResponseStoreLayer(\n parent: StoreLayer,\n): OptimisticNetworkResponseStoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer':\n case 'StartUpdateStoreLayer':\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: OptimisticNetworkResponseStoreLayer = {\n kind: 'OptimisticNetworkResponseStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n };\n\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\n/**\n * Merge storeLayerToMerge, and its children, into baseStoreLayer.\n * We can merge until we reach a revertible layer (i.e. an optimistic layer).\n * All other layers cannot be reverted, so for housekeeping + perf, we merge\n * them into a single layer.\n *\n * Note that BaseStoreLayer.childStoreLayer has type OptimisticStoreLayer | null.\n * So, the state of the stack is never e.g. base <- network response. Instead,\n * we have a base + a child that we would like to attach to the base. So, we merge\n * (flatten) until we reach an optimistic layer or null, at which point, we can\n * set baseStoreLayer.childStoreLayer = storeLayerToMerge (via setChildOfNode).\n */\nfunction mergeLayersWithDataIntoBaseLayer(\n environment: IsographEnvironment,\n storeLayerToMerge: StoreLayer | null,\n baseStoreLayer: BaseStoreLayer,\n) {\n while (\n storeLayerToMerge != null &&\n storeLayerToMerge.kind !== 'OptimisticUpdaterStoreLayer'\n ) {\n mergeDataLayer(baseStoreLayer.data, storeLayerToMerge.data);\n storeLayerToMerge = storeLayerToMerge.childStoreLayer;\n }\n setChildOfNode(environment, baseStoreLayer, storeLayerToMerge);\n}\n\n/**\n * Now that we have replaced the optimistic layer with a network response layer, we need\n * to\n * - re-execute startUpdate and optimistic nodes, in light of the replaced data, and\n * - create two objects containing the old merged data (from the optimistic update layer\n * onward) and the new merged data (from the network response layer onward).\n * - we will compare the new and old merged data in order to determine the changed records\n * and trigger subscriptions.\n *\n * Here, \"merged data\" means all of the records + fields that were modified, starting at\n * storeLayer, e.g. in BaseLayer <- OptimisticLayer <- StartUpdateLayer, if we\n * are replacing Optimistic, then oldData will contain the records + fields modified by\n * OptimisticLayer + StartUpdateLayer.\n */\nfunction reexecuteUpdatesAndMergeData(\n storeLayer:\n | OptimisticStoreLayer\n | NetworkResponseStoreLayer\n | StartUpdateStoreLayer\n | null,\n // reflects the (now reverted) optimistic layer\n oldMergedData: StoreLayerData,\n // reflects whatever replaced the optimistic layer\n newMergedData: StoreLayerData,\n): void {\n while (storeLayer != null) {\n mergeDataLayer(oldMergedData, storeLayer.data);\n switch (storeLayer.kind) {\n case 'OptimisticNetworkResponseStoreLayer':\n case 'NetworkResponseStoreLayer':\n break;\n case 'StartUpdateStoreLayer': {\n storeLayer.data = {};\n storeLayer.startUpdate(storeLayer);\n break;\n }\n case 'OptimisticUpdaterStoreLayer': {\n storeLayer.data = {};\n storeLayer.startUpdate(storeLayer);\n break;\n }\n }\n mergeDataLayer(newMergedData, storeLayer.data);\n\n storeLayer = storeLayer.childStoreLayer;\n }\n}\n\n/**\n * Set storeLayerToModify's child to a given layer. This may be null!\n * If it is null, set the environment.store to storeLayerToModify.\n * If it is not null, then the existing environment.store value remains\n * valid.\n */\nfunction setChildOfNode<TStoreLayer extends StoreLayer>(\n environment: IsographEnvironment,\n storeLayerToModify: TStoreLayer,\n newChildStoreLayer: TStoreLayer['childStoreLayer'],\n) {\n storeLayerToModify.childStoreLayer = newChildStoreLayer;\n if (newChildStoreLayer != null) {\n newChildStoreLayer.parentStoreLayer = storeLayerToModify;\n } else {\n environment.store = storeLayerToModify;\n }\n}\n\n/**\n * Remove an optimistic store layer from the stack, potentially replacing it\n * with a network response.\n *\n * After we do this, we must re-execute all child startUpdate and optimistic\n * layers (since their data may have changed.) We also keep track of changed\n * records, in order to call affected subscriptions.\n */\nexport function revertOptimisticStoreLayerAndMaybeReplace(\n environment: IsographEnvironment,\n optimisticNode: OptimisticStoreLayer,\n normalizeData: null | ((storeLayer: StoreLayerWithData) => void),\n): void {\n // We cannot just replace the optimistic node with the network response node,\n // because (e.g.) the types allow Base <- Opt, but not Base <- NetworkResponse.\n // We also may be removing the optimistic layer without replacing it with\n // anything, which would also be disallowed if the original stack was\n // Base <- Opt <- NetworkResponse.\n //\n // Thus, instead, we will (1) replace the optimistic node's data with an empty object\n // and attach the network response as a child.\n const oldMergedData = optimisticNode.data;\n optimisticNode.data = {};\n\n let newMergedData = {};\n let childNode = optimisticNode.childStoreLayer;\n if (normalizeData != null) {\n const networkResponseStoreLayer: NetworkResponseStoreLayer = {\n kind: 'NetworkResponseStoreLayer',\n data: {},\n parentStoreLayer: optimisticNode,\n childStoreLayer: null,\n };\n normalizeData(networkResponseStoreLayer);\n\n if (childNode?.kind === 'NetworkResponseStoreLayer') {\n // (2) if the optimistic layer's child was a network response, and we are\n // replacing it with a network response, we must merge the replacement\n // and the child.\n mergeDataLayer(networkResponseStoreLayer.data, childNode.data);\n mergeDataLayer(oldMergedData, childNode.data);\n childNode = childNode.childStoreLayer;\n }\n newMergedData = structuredClone(networkResponseStoreLayer.data);\n setChildOfNode(environment, networkResponseStoreLayer, childNode);\n optimisticNode.childStoreLayer = networkResponseStoreLayer;\n }\n\n // (3) Re-execute all updates, accumulating all changed values into newMergedData.\n // Since we have already written the network response into newMergedData, we\n // can proceed from the child of the (potentially merged) network response layer.\n //\n // Note that it is important that reexecuteUpdatesAndMergeData is called here!\n // That is because we created newMergedData from the network response layer's data,\n // and later, we may merge that network response into the parent layer (if it is\n // a base layer). That merged layer will contain many extraneous records (unless the\n // base layer is empty).\n //\n // This would cause us to re-execute subscriptions unnecessarily, as these records\n // do not represent changes between the optimistic and network response layers.\n reexecuteUpdatesAndMergeData(childNode, oldMergedData, newMergedData);\n\n // (4) Now, we can finally remove the optimistic layer, i.e. do\n // optimistic.parent.child = optimistic.child.\n // But the types don't line up, so we handle the cases differently, based on the\n // parent layer type.\n if (optimisticNode.parentStoreLayer.kind === 'BaseStoreLayer') {\n // (4a) If the optimistic parent is the base layer, then we have a problem: base.child\n // must be an optimistic layer or null. So, we merge the optimistic children into the\n // base layer until we reach an optimistic layer.\n mergeLayersWithDataIntoBaseLayer(\n environment,\n optimisticNode.childStoreLayer,\n optimisticNode.parentStoreLayer,\n );\n } else if (\n optimisticNode.parentStoreLayer.kind === 'NetworkResponseStoreLayer' &&\n optimisticNode.childStoreLayer?.kind === 'NetworkResponseStoreLayer'\n ) {\n // (4b) if the parent is a network response layer, simply merge those. (We do not\n // attempt to merge other layers, e.g. startUpdate layers, because there is some\n // optimistic layer between this layer and the base, and the startUpdate will need\n // to be recalculated if the optimistic layer is reverted.)\n mergeDataLayer(\n optimisticNode.parentStoreLayer.data,\n optimisticNode.childStoreLayer.data,\n );\n\n setChildOfNode(\n environment,\n optimisticNode.parentStoreLayer,\n optimisticNode.childStoreLayer.childStoreLayer,\n );\n } else {\n // (4c) Otherwise, the parent is an optimistic or start update layer, and we can\n // set optimistic.parent.child = optimistic.child.\n setChildOfNode(\n environment,\n optimisticNode.parentStoreLayer,\n optimisticNode.childStoreLayer,\n );\n }\n\n // (5) finally, compare the oldMergedData and newMergedData objects, in order to extract\n // the modified IDs, and re-execute subscriptions.\n let encounteredIds: EncounteredIds = new Map();\n compareData(oldMergedData, newMergedData, encounteredIds);\n callSubscriptions(environment, encounteredIds);\n}\n\nexport type StoreLayer =\n | OptimisticStoreLayer\n | NetworkResponseStoreLayer\n | StartUpdateStoreLayer\n | BaseStoreLayer;\n\nexport type StoreLayerWithData =\n | BaseStoreLayer\n | NetworkResponseStoreLayer\n | OptimisticNetworkResponseStoreLayer;\n\nfunction compareData(\n oldData: StoreLayerData,\n newData: StoreLayerData,\n encounteredIds: EncounteredIds,\n): void {\n const oldDataTypeNames = new Set(Object.keys(oldData));\n const newDataTypeNames = new Set(Object.keys(newData));\n\n for (const oldTypeName of oldDataTypeNames.difference(newDataTypeNames)) {\n const set = insertEmptySetIfMissing(encounteredIds, oldTypeName);\n for (const id in oldData[oldTypeName]) {\n set.add(id);\n }\n }\n\n for (const [typeName, newRecords] of Object.entries(newData)) {\n if (newRecords == null) {\n continue;\n }\n const oldRecords = oldData[typeName];\n outer: for (const [id, newRecord] of Object.entries(newRecords)) {\n if (newRecord == null) {\n continue;\n }\n const oldRecord = oldRecords?.[id];\n\n for (const [recordKey, newRecordValue] of Object.entries(newRecord)) {\n // TODO: compare links, compare arrays\n if (newRecordValue !== oldRecord?.[recordKey]) {\n const set = insertEmptySetIfMissing(encounteredIds, typeName);\n set.add(id);\n continue outer;\n }\n }\n\n encounteredIds.get(typeName)?.delete(id);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"optimisticProxy.mjs","names":[],"sources":["../../src/core/optimisticProxy.ts"],"sourcesContent":["import { insertEmptySetIfMissing, type EncounteredIds } from './cache';\nimport { callSubscriptions } from './subscribe';\nimport type {\n BaseStoreLayerData,\n IsographEnvironment,\n StoreLayerData,\n StoreLink,\n StoreRecord,\n} from './IsographEnvironment';\n\nexport function getOrInsertRecord(\n dataLayer: StoreLayerData,\n link: StoreLink,\n): StoreRecord {\n const recordsById = (dataLayer[link.__typename] ??= {});\n return (recordsById[link.__link] ??= {});\n}\n\n/**\n * Given the child-most store layer (i.e. environment.store) and a link (identifying a\n * store record), create a proxy object that attempts to read through each successive\n * store layer until a value (i.e. field name) is found. If found, return that value.\n */\nexport function getStoreRecordProxy(\n storeLayer: StoreLayer,\n link: StoreLink,\n): Readonly<StoreRecord> | null | undefined {\n let startNode: StoreLayer | null = storeLayer;\n while (startNode != null) {\n const storeRecord = startNode.data[link.__typename]?.[link.__link];\n if (storeRecord === undefined) {\n startNode = startNode.parentStoreLayer;\n continue;\n }\n\n if (storeRecord == null) {\n return null;\n }\n\n return getMutableStoreRecordProxy(startNode, link);\n }\n\n return undefined;\n}\n\nexport function getMutableStoreRecordProxy(\n childMostStoreLayer: StoreLayer,\n link: StoreLink,\n): StoreRecord {\n return new Proxy<StoreRecord>(\n {},\n {\n get(_, propertyName) {\n let currentStoreLayer: StoreLayer | null = childMostStoreLayer;\n while (currentStoreLayer != null) {\n const storeRecord =\n currentStoreLayer.data[link.__typename]?.[link.__link];\n if (storeRecord !== undefined) {\n if (storeRecord == null) {\n return undefined;\n }\n const value = Reflect.get(storeRecord, propertyName);\n if (value !== undefined) {\n return value;\n }\n }\n currentStoreLayer = currentStoreLayer.parentStoreLayer;\n }\n },\n has(_, propertyName) {\n let currentStoreLayer: StoreLayer | null = childMostStoreLayer;\n while (currentStoreLayer != null) {\n const storeRecord =\n currentStoreLayer.data[link.__typename]?.[link.__link];\n if (storeRecord !== undefined) {\n if (storeRecord == null) {\n return false;\n }\n\n const value = Reflect.has(storeRecord, propertyName);\n if (value) {\n return true;\n }\n }\n currentStoreLayer = currentStoreLayer.parentStoreLayer;\n }\n return false;\n },\n set(_, p, newValue) {\n return Reflect.set(\n getOrInsertRecord(childMostStoreLayer.data, link),\n p,\n newValue,\n );\n },\n },\n );\n}\n\nexport type BaseStoreLayer = {\n readonly kind: 'BaseStoreLayer';\n childStoreLayer: OptimisticStoreLayer | null;\n readonly parentStoreLayer: null;\n readonly data: BaseStoreLayerData;\n};\n\nexport type NetworkResponseStoreLayer = {\n readonly kind: 'NetworkResponseStoreLayer';\n childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | null;\n parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer;\n readonly data: StoreLayerData;\n};\n\nexport type DataUpdate<TStoreLayer extends StoreLayer> = (\n storeLayer: TStoreLayer,\n) => void;\n\nexport type StartUpdateStoreLayer = {\n readonly kind: 'StartUpdateStoreLayer';\n childStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer | null;\n parentStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer;\n data: StoreLayerData;\n startUpdate: DataUpdate<StartUpdateStoreLayer | BaseStoreLayer>;\n};\n\nexport type OptimisticStoreLayer =\n | OptimisticUpdaterStoreLayer\n | OptimisticNetworkResponseStoreLayer;\n\nexport type OptimisticUpdaterStoreLayer = {\n readonly kind: 'OptimisticUpdaterStoreLayer';\n childStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | null;\n parentStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | BaseStoreLayer;\n data: StoreLayerData;\n readonly startUpdate: DataUpdate<OptimisticUpdaterStoreLayer>;\n};\n\nexport type OptimisticNetworkResponseStoreLayer = {\n readonly kind: 'OptimisticNetworkResponseStoreLayer';\n childStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | null;\n parentStoreLayer:\n | OptimisticStoreLayer\n | StartUpdateStoreLayer\n | NetworkResponseStoreLayer\n | BaseStoreLayer;\n data: StoreLayerData;\n};\n\nexport function addNetworkResponseStoreLayer(\n parent: StoreLayer,\n): StoreLayerWithData {\n switch (parent.kind) {\n case 'NetworkResponseStoreLayer':\n case 'BaseStoreLayer': {\n return parent;\n }\n case 'StartUpdateStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: NetworkResponseStoreLayer = {\n kind: 'NetworkResponseStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n };\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\nfunction mergeDataLayer(target: StoreLayerData, source: StoreLayerData): void {\n for (const [typeName, sourceById] of Object.entries(source)) {\n if (sourceById == null) {\n target[typeName] = sourceById;\n continue;\n }\n const targetRecordById = (target[typeName] ??= {});\n for (const [id, sourceRecord] of Object.entries(sourceById)) {\n if (sourceRecord == null) {\n targetRecordById[id] = null;\n continue;\n }\n const targetRecord = (targetRecordById[id] ??= {});\n Object.assign(targetRecord, sourceRecord);\n }\n }\n}\n\nexport function addStartUpdateStoreLayer(\n parent: StoreLayer,\n startUpdate: StartUpdateStoreLayer['startUpdate'],\n): StoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer': {\n startUpdate(parent);\n return parent;\n }\n case 'StartUpdateStoreLayer': {\n const node = parent;\n\n const prevStartUpdate = node.startUpdate;\n node.startUpdate = () => {\n prevStartUpdate(node);\n startUpdate(node);\n };\n\n startUpdate(node);\n return node;\n }\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: StartUpdateStoreLayer = {\n kind: 'StartUpdateStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n startUpdate: startUpdate,\n };\n parent.childStoreLayer = node;\n\n startUpdate(node);\n return node;\n }\n }\n}\n\nexport function addOptimisticUpdaterStoreLayer(\n parent: StoreLayer,\n startUpdate: OptimisticUpdaterStoreLayer['startUpdate'],\n): OptimisticUpdaterStoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer':\n case 'StartUpdateStoreLayer':\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: OptimisticUpdaterStoreLayer = {\n kind: 'OptimisticUpdaterStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n startUpdate: startUpdate,\n };\n\n startUpdate(node);\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\nexport function addOptimisticNetworkResponseStoreLayer(\n parent: StoreLayer,\n): OptimisticNetworkResponseStoreLayer {\n switch (parent.kind) {\n case 'BaseStoreLayer':\n case 'StartUpdateStoreLayer':\n case 'NetworkResponseStoreLayer':\n case 'OptimisticNetworkResponseStoreLayer':\n case 'OptimisticUpdaterStoreLayer': {\n const node: OptimisticNetworkResponseStoreLayer = {\n kind: 'OptimisticNetworkResponseStoreLayer',\n parentStoreLayer: parent,\n childStoreLayer: null,\n data: {},\n };\n\n parent.childStoreLayer = node;\n\n return node;\n }\n }\n}\n\n/**\n * Merge storeLayerToMerge, and its children, into baseStoreLayer.\n * We can merge until we reach a revertible layer (i.e. an optimistic layer).\n * All other layers cannot be reverted, so for housekeeping + perf, we merge\n * them into a single layer.\n *\n * Note that BaseStoreLayer.childStoreLayer has type OptimisticStoreLayer | null.\n * So, the state of the stack is never e.g. base <- network response. Instead,\n * we have a base + a child that we would like to attach to the base. So, we merge\n * (flatten) until we reach an optimistic layer or null, at which point, we can\n * set baseStoreLayer.childStoreLayer = storeLayerToMerge (via setChildOfNode).\n */\nfunction mergeLayersWithDataIntoBaseLayer(\n environment: IsographEnvironment,\n storeLayerToMerge: StoreLayer | null,\n baseStoreLayer: BaseStoreLayer,\n) {\n while (\n storeLayerToMerge != null &&\n storeLayerToMerge.kind !== 'OptimisticUpdaterStoreLayer'\n ) {\n mergeDataLayer(baseStoreLayer.data, storeLayerToMerge.data);\n storeLayerToMerge = storeLayerToMerge.childStoreLayer;\n }\n setChildOfNode(environment, baseStoreLayer, storeLayerToMerge);\n}\n\n/**\n * Now that we have replaced the optimistic layer with a network response layer, we need\n * to\n * - re-execute startUpdate and optimistic nodes, in light of the replaced data, and\n * - create two objects containing the old merged data (from the optimistic update layer\n * onward) and the new merged data (from the network response layer onward).\n * - we will compare the new and old merged data in order to determine the changed records\n * and trigger subscriptions.\n *\n * Here, \"merged data\" means all of the records + fields that were modified, starting at\n * storeLayer, e.g. in BaseLayer <- OptimisticLayer <- StartUpdateLayer, if we\n * are replacing Optimistic, then oldData will contain the records + fields modified by\n * OptimisticLayer + StartUpdateLayer.\n */\nfunction reexecuteUpdatesAndMergeData(\n storeLayer:\n | OptimisticStoreLayer\n | NetworkResponseStoreLayer\n | StartUpdateStoreLayer\n | null,\n // reflects the (now reverted) optimistic layer\n oldMergedData: StoreLayerData,\n // reflects whatever replaced the optimistic layer\n newMergedData: StoreLayerData,\n): void {\n while (storeLayer != null) {\n mergeDataLayer(oldMergedData, storeLayer.data);\n switch (storeLayer.kind) {\n case 'OptimisticNetworkResponseStoreLayer':\n case 'NetworkResponseStoreLayer':\n break;\n case 'StartUpdateStoreLayer': {\n storeLayer.data = {};\n storeLayer.startUpdate(storeLayer);\n break;\n }\n case 'OptimisticUpdaterStoreLayer': {\n storeLayer.data = {};\n storeLayer.startUpdate(storeLayer);\n break;\n }\n }\n mergeDataLayer(newMergedData, storeLayer.data);\n\n storeLayer = storeLayer.childStoreLayer;\n }\n}\n\n/**\n * Set storeLayerToModify's child to a given layer. This may be null!\n * If it is null, set the environment.store to storeLayerToModify.\n * If it is not null, then the existing environment.store value remains\n * valid.\n */\nfunction setChildOfNode<TStoreLayer extends StoreLayer>(\n environment: IsographEnvironment,\n storeLayerToModify: TStoreLayer,\n newChildStoreLayer: TStoreLayer['childStoreLayer'],\n) {\n storeLayerToModify.childStoreLayer = newChildStoreLayer;\n if (newChildStoreLayer != null) {\n newChildStoreLayer.parentStoreLayer = storeLayerToModify;\n } else {\n environment.store = storeLayerToModify;\n }\n}\n\n/**\n * Remove an optimistic store layer from the stack, potentially replacing it\n * with a network response.\n *\n * After we do this, we must re-execute all child startUpdate and optimistic\n * layers (since their data may have changed.) We also keep track of changed\n * records, in order to call affected subscriptions.\n */\nexport function revertOptimisticStoreLayerAndMaybeReplace(\n environment: IsographEnvironment,\n optimisticNode: OptimisticStoreLayer,\n normalizeData: null | ((storeLayer: StoreLayerWithData) => void),\n): void {\n // We cannot just replace the optimistic node with the network response node,\n // because (e.g.) the types allow Base <- Opt, but not Base <- NetworkResponse.\n // We also may be removing the optimistic layer without replacing it with\n // anything, which would also be disallowed if the original stack was\n // Base <- Opt <- NetworkResponse.\n //\n // Thus, instead, we will (1) replace the optimistic node's data with an empty object\n // and attach the network response as a child.\n const oldMergedData = optimisticNode.data;\n optimisticNode.data = {};\n\n let newMergedData = {};\n let childNode = optimisticNode.childStoreLayer;\n if (normalizeData != null) {\n const networkResponseStoreLayer: NetworkResponseStoreLayer = {\n kind: 'NetworkResponseStoreLayer',\n data: {},\n parentStoreLayer: optimisticNode,\n childStoreLayer: null,\n };\n normalizeData(networkResponseStoreLayer);\n\n if (childNode?.kind === 'NetworkResponseStoreLayer') {\n // (2) if the optimistic layer's child was a network response, and we are\n // replacing it with a network response, we must merge the replacement\n // and the child.\n mergeDataLayer(networkResponseStoreLayer.data, childNode.data);\n mergeDataLayer(oldMergedData, childNode.data);\n childNode = childNode.childStoreLayer;\n }\n newMergedData = structuredClone(networkResponseStoreLayer.data);\n setChildOfNode(environment, networkResponseStoreLayer, childNode);\n optimisticNode.childStoreLayer = networkResponseStoreLayer;\n }\n\n // (3) Re-execute all updates, accumulating all changed values into newMergedData.\n // Since we have already written the network response into newMergedData, we\n // can proceed from the child of the (potentially merged) network response layer.\n //\n // Note that it is important that reexecuteUpdatesAndMergeData is called here!\n // That is because we created newMergedData from the network response layer's data,\n // and later, we may merge that network response into the parent layer (if it is\n // a base layer). That merged layer will contain many extraneous records (unless the\n // base layer is empty).\n //\n // This would cause us to re-execute subscriptions unnecessarily, as these records\n // do not represent changes between the optimistic and network response layers.\n reexecuteUpdatesAndMergeData(childNode, oldMergedData, newMergedData);\n\n // (4) Now, we can finally remove the optimistic layer, i.e. do\n // optimistic.parent.child = optimistic.child.\n // But the types don't line up, so we handle the cases differently, based on the\n // parent layer type.\n if (optimisticNode.parentStoreLayer.kind === 'BaseStoreLayer') {\n // (4a) If the optimistic parent is the base layer, then we have a problem: base.child\n // must be an optimistic layer or null. So, we merge the optimistic children into the\n // base layer until we reach an optimistic layer.\n mergeLayersWithDataIntoBaseLayer(\n environment,\n optimisticNode.childStoreLayer,\n optimisticNode.parentStoreLayer,\n );\n } else if (\n optimisticNode.parentStoreLayer.kind === 'NetworkResponseStoreLayer' &&\n optimisticNode.childStoreLayer?.kind === 'NetworkResponseStoreLayer'\n ) {\n // (4b) if the parent is a network response layer, simply merge those. (We do not\n // attempt to merge other layers, e.g. startUpdate layers, because there is some\n // optimistic layer between this layer and the base, and the startUpdate will need\n // to be recalculated if the optimistic layer is reverted.)\n mergeDataLayer(\n optimisticNode.parentStoreLayer.data,\n optimisticNode.childStoreLayer.data,\n );\n\n setChildOfNode(\n environment,\n optimisticNode.parentStoreLayer,\n optimisticNode.childStoreLayer.childStoreLayer,\n );\n } else {\n // (4c) Otherwise, the parent is an optimistic or start update layer, and we can\n // set optimistic.parent.child = optimistic.child.\n setChildOfNode(\n environment,\n optimisticNode.parentStoreLayer,\n optimisticNode.childStoreLayer,\n );\n }\n\n // (5) finally, compare the oldMergedData and newMergedData objects, in order to extract\n // the modified IDs, and re-execute subscriptions.\n let encounteredIds: EncounteredIds = new Map();\n compareData(oldMergedData, newMergedData, encounteredIds);\n callSubscriptions(environment, encounteredIds);\n}\n\nexport type StoreLayer =\n | OptimisticStoreLayer\n | NetworkResponseStoreLayer\n | StartUpdateStoreLayer\n | BaseStoreLayer;\n\nexport type StoreLayerWithData =\n | BaseStoreLayer\n | NetworkResponseStoreLayer\n | OptimisticNetworkResponseStoreLayer;\n\nfunction compareData(\n oldData: StoreLayerData,\n newData: StoreLayerData,\n encounteredIds: EncounteredIds,\n): void {\n const oldDataTypeNames = new Set(Object.keys(oldData));\n const newDataTypeNames = new Set(Object.keys(newData));\n\n for (const oldTypeName of oldDataTypeNames.difference(newDataTypeNames)) {\n const set = insertEmptySetIfMissing(encounteredIds, oldTypeName);\n for (const id in oldData[oldTypeName]) {\n set.add(id);\n }\n }\n\n for (const [typeName, newRecords] of Object.entries(newData)) {\n if (newRecords == null) {\n continue;\n }\n const oldRecords = oldData[typeName];\n outer: for (const [id, newRecord] of Object.entries(newRecords)) {\n if (newRecord == null) {\n continue;\n }\n const oldRecord = oldRecords?.[id];\n\n for (const [recordKey, newRecordValue] of Object.entries(newRecord)) {\n // TODO: compare links, compare arrays\n if (newRecordValue !== oldRecord?.[recordKey]) {\n const set = insertEmptySetIfMissing(encounteredIds, typeName);\n set.add(id);\n continue outer;\n }\n }\n\n encounteredIds.get(typeName)?.delete(id);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- const require_PromiseWrapper = require('./PromiseWrapper.js');
2
- const require_IsographEnvironment = require('./IsographEnvironment.js');
3
- const require_logging = require('./logging.js');
4
- const require_startUpdate = require('./startUpdate.js');
5
- const require_componentCache = require('./componentCache.js');
6
- const require_makeNetworkRequest = require('./makeNetworkRequest.js');
7
- const require_optimisticProxy = require('./optimisticProxy.js');
8
- const require_cache = require('./cache.js');
1
+ const require_PromiseWrapper = require('./PromiseWrapper.cjs');
2
+ const require_IsographEnvironment = require('./IsographEnvironment.cjs');
3
+ const require_logging = require('./logging.cjs');
4
+ const require_startUpdate = require('./startUpdate.cjs');
5
+ const require_componentCache = require('./componentCache.cjs');
6
+ const require_makeNetworkRequest = require('./makeNetworkRequest.cjs');
7
+ const require_optimisticProxy = require('./optimisticProxy.cjs');
8
+ const require_cache = require('./cache.cjs');
9
9
 
10
10
  //#region src/core/read.ts
11
11
  function readButDoNotEvaluate(environment, fragmentReference, networkRequestOptions) {
@@ -57,7 +57,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
57
57
  target[field.alias] = root;
58
58
  break;
59
59
  case "Linked": {
60
- const data = readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, (ast$1, root$1) => readData(environment, ast$1, root$1, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords));
60
+ const data = readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, (ast, root) => readData(environment, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords));
61
61
  if (data.kind === "MissingData") return data;
62
62
  target[field.alias ?? field.fieldName] = data.data;
63
63
  break;
@@ -97,16 +97,16 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
97
97
  return {
98
98
  kind: "Success",
99
99
  data: (args, fetchOptions) => {
100
- const includeReadOutData = (variables$1, readOutData) => {
101
- variables$1.id = readOutData.id;
102
- return variables$1;
100
+ const includeReadOutData = (variables, readOutData) => {
101
+ variables.id = readOutData.id;
102
+ return variables;
103
103
  };
104
104
  const localVariables = includeReadOutData(args ?? {}, refetchReaderParams.data);
105
105
  writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
106
106
  return [root.__typename + ":" + root.__link + "/" + field.name + "/" + stableStringifyArgs(localVariables), () => {
107
107
  const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
108
108
  const { fieldName, readerArtifactKind, readerWithRefetchQueries } = require_IsographEnvironment.getOrLoadReaderWithRefetchQueries(environment, entrypoint.readerWithRefetchQueries);
109
- const [networkRequest$1, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions ?? null);
109
+ const [networkRequest, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions ?? null);
110
110
  return [{
111
111
  kind: "FragmentReference",
112
112
  readerWithRefetchQueries,
@@ -114,7 +114,7 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
114
114
  readerArtifactKind,
115
115
  root,
116
116
  variables: localVariables,
117
- networkRequest: networkRequest$1
117
+ networkRequest
118
118
  }, disposeNetworkRequest];
119
119
  };
120
120
  if (field.entrypoint.kind === "Entrypoint") return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
@@ -125,14 +125,14 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
125
125
  else {
126
126
  let entrypointLoaderState = { kind: "EntrypointNotLoaded" };
127
127
  const readerWithRefetchQueries = require_PromiseWrapper.wrapPromise(isographArtifactPromiseWrapper.promise.then((entrypoint) => require_IsographEnvironment.getOrLoadReaderWithRefetchQueries(environment, entrypoint.readerWithRefetchQueries).readerWithRefetchQueries.promise));
128
- const networkRequest$1 = require_PromiseWrapper.wrapPromise(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
128
+ const networkRequest = require_PromiseWrapper.wrapPromise(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
129
129
  if (entrypointLoaderState.kind === "EntrypointNotLoaded") {
130
- const [networkRequest$2, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions ?? null);
130
+ const [networkRequest, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions ?? null);
131
131
  entrypointLoaderState = {
132
132
  kind: "NetworkRequestStarted",
133
133
  disposeNetworkRequest
134
134
  };
135
- return networkRequest$2.promise;
135
+ return networkRequest.promise;
136
136
  }
137
137
  }));
138
138
  return [{
@@ -142,7 +142,7 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
142
142
  readerArtifactKind: field.entrypoint.readerArtifactKind,
143
143
  root,
144
144
  variables: localVariables,
145
- networkRequest: networkRequest$1
145
+ networkRequest
146
146
  }, () => {
147
147
  if (entrypointLoaderState.kind === "NetworkRequestStarted") entrypointLoaderState.disposeNetworkRequest();
148
148
  entrypointLoaderState = { kind: "Disposed" };
@@ -194,22 +194,23 @@ function readResolverFieldData(environment, field, root, variables, nestedRefetc
194
194
  if (resolverRefetchQuery == null) throw new Error("resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.");
195
195
  return resolverRefetchQuery;
196
196
  });
197
+ const readerWithRefetchQueries = {
198
+ kind: "ReaderWithRefetchQueries",
199
+ readerArtifact: field.readerArtifact(),
200
+ nestedRefetchQueries: resolverRefetchQueries
201
+ };
197
202
  const fragment = {
198
203
  kind: "FragmentReference",
199
- readerWithRefetchQueries: require_PromiseWrapper.wrapResolvedValue({
200
- kind: "ReaderWithRefetchQueries",
201
- readerArtifact: field.readerArtifact,
202
- nestedRefetchQueries: resolverRefetchQueries
203
- }),
204
- fieldName: field.readerArtifact.fieldName,
205
- readerArtifactKind: field.readerArtifact.kind,
204
+ readerWithRefetchQueries: require_PromiseWrapper.wrapResolvedValue(readerWithRefetchQueries),
205
+ fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
206
+ readerArtifactKind: readerWithRefetchQueries.readerArtifact.kind,
206
207
  root,
207
208
  variables: generateChildVariableMap(variables, field.arguments),
208
209
  networkRequest
209
210
  };
210
- switch (field.readerArtifact.kind) {
211
+ switch (readerWithRefetchQueries.readerArtifact.kind) {
211
212
  case "EagerReaderArtifact": {
212
- const data = readData(environment, field.readerArtifact.readerAst, root, generateChildVariableMap(variables, field.arguments), resolverRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
213
+ const data = readData(environment, readerWithRefetchQueries.readerArtifact.readerAst, root, generateChildVariableMap(variables, field.arguments), resolverRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
213
214
  if (data.kind === "MissingData") return {
214
215
  kind: "MissingData",
215
216
  reason: "Missing data for " + field.alias + " on root " + root.__link,
@@ -219,11 +220,11 @@ function readResolverFieldData(environment, field, root, variables, nestedRefetc
219
220
  const firstParameter = {
220
221
  data: data.data,
221
222
  parameters: variables,
222
- startUpdate: field.readerArtifact.hasUpdatable ? require_startUpdate.getOrCreateCachedStartUpdate(environment, fragment, networkRequestOptions) : void 0
223
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable ? require_startUpdate.getOrCreateCachedStartUpdate(environment, fragment, networkRequestOptions) : void 0
223
224
  };
224
225
  return {
225
226
  kind: "Success",
226
- data: field.readerArtifact.resolver(firstParameter)
227
+ data: readerWithRefetchQueries.readerArtifact.resolver(firstParameter)
227
228
  };
228
229
  }
229
230
  case "ComponentReaderArtifact": return {
@@ -245,61 +246,62 @@ function readScalarFieldData(field, storeRecord, root, variables) {
245
246
  data: value
246
247
  };
247
248
  }
248
- function readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, readData$1) {
249
+ function readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, readData) {
249
250
  const storeRecordName = require_cache.getParentRecordKey(field, variables);
250
251
  let value = storeRecord[storeRecordName];
251
252
  if (field.condition != null) {
252
- const data$1 = readData$1(field.condition.readerAst, root);
253
- if (data$1.kind === "MissingData") return {
253
+ const condition = field.condition();
254
+ const data = readData(condition.readerAst, root);
255
+ if (data.kind === "MissingData") return {
254
256
  kind: "MissingData",
255
257
  reason: "Missing data for " + storeRecordName + " on root " + root.__link,
256
- nestedReason: data$1,
257
- recordLink: data$1.recordLink
258
+ nestedReason: data,
259
+ recordLink: data.recordLink
258
260
  };
259
261
  const fragment = {
260
262
  kind: "FragmentReference",
261
263
  readerWithRefetchQueries: require_PromiseWrapper.wrapResolvedValue({
262
264
  kind: "ReaderWithRefetchQueries",
263
- readerArtifact: field.condition,
265
+ readerArtifact: condition,
264
266
  nestedRefetchQueries: []
265
267
  }),
266
268
  root,
267
- fieldName: field.condition.fieldName,
268
- readerArtifactKind: field.condition.kind,
269
+ fieldName: condition.fieldName,
270
+ readerArtifactKind: condition.kind,
269
271
  variables: generateChildVariableMap(variables, []),
270
272
  networkRequest
271
273
  };
272
- value = field.condition.resolver({
273
- data: data$1.data,
274
+ value = condition.resolver({
275
+ data: data.data,
274
276
  parameters: {},
275
- ...field.condition.hasUpdatable ? { startUpdate: require_startUpdate.getOrCreateCachedStartUpdate(environment, fragment, networkRequestOptions) } : void 0
277
+ ...condition.hasUpdatable ? { startUpdate: require_startUpdate.getOrCreateCachedStartUpdate(environment, fragment, networkRequestOptions) } : void 0
276
278
  });
277
279
  }
278
280
  if (Array.isArray(value)) {
279
281
  const results = [];
280
282
  for (const item of value) {
281
- const link$1 = require_IsographEnvironment.assertLink(item);
282
- if (link$1 === void 0) return {
283
+ const link = require_IsographEnvironment.assertLink(item);
284
+ if (link === void 0) return {
283
285
  kind: "MissingData",
284
286
  reason: "No link for " + storeRecordName + " on root " + root.__link + ". Link is " + JSON.stringify(item),
285
287
  recordLink: root
286
288
  };
287
- else if (link$1 == null) {
289
+ else if (link == null) {
288
290
  results.push(null);
289
291
  continue;
290
292
  }
291
293
  if (isClientPointer(field)) {
292
- const result$1 = readClientPointerData(environment, field, link$1, variables, nestedRefetchQueries, readData$1);
293
- if (result$1.kind === "MissingData") return {
294
+ const result = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
295
+ if (result.kind === "MissingData") return {
294
296
  kind: "MissingData",
295
297
  reason: "Missing data for " + storeRecordName + " on root " + root.__link + ". Link is " + JSON.stringify(item),
296
- nestedReason: result$1,
297
- recordLink: result$1.recordLink
298
+ nestedReason: result,
299
+ recordLink: result.recordLink
298
300
  };
299
- results.push(result$1.data);
301
+ results.push(result.data);
300
302
  continue;
301
303
  }
302
- const result = readData$1(field.selections, link$1);
304
+ const result = readData(field.selections, link);
303
305
  if (result.kind === "MissingData") return {
304
306
  kind: "MissingData",
305
307
  reason: "Missing data for " + storeRecordName + " on root " + root.__link + ". Link is " + JSON.stringify(item),
@@ -336,16 +338,16 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
336
338
  data: null
337
339
  };
338
340
  if (isClientPointer(field)) {
339
- const data$1 = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData$1);
340
- if (data$1.kind === "MissingData") return {
341
+ const data = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
342
+ if (data.kind === "MissingData") return {
341
343
  kind: "MissingData",
342
344
  reason: "Missing data for " + storeRecordName + " on root " + root.__link,
343
- nestedReason: data$1,
344
- recordLink: data$1.recordLink
345
+ nestedReason: data,
346
+ recordLink: data.recordLink
345
347
  };
346
- return data$1;
348
+ return data;
347
349
  }
348
- const data = readData$1(field.selections, link);
350
+ const data = readData(field.selections, link);
349
351
  if (data.kind === "MissingData") return {
350
352
  kind: "MissingData",
351
353
  reason: "Missing data for " + storeRecordName + " on root " + root.__link,
@@ -357,9 +359,10 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
357
359
  function isClientPointer(field) {
358
360
  return field.refetchQueryIndex != null;
359
361
  }
360
- function readClientPointerData(environment, field, root, variables, nestedRefetchQueries, readData$1) {
361
- const refetchReaderParams = readData$1([{
362
+ function readClientPointerData(environment, field, root, variables, nestedRefetchQueries, readData) {
363
+ const refetchReaderParams = readData([{
362
364
  kind: "Scalar",
365
+ isFallible: false,
363
366
  fieldName: "id",
364
367
  alias: null,
365
368
  arguments: null,
@@ -378,14 +381,14 @@ function readClientPointerData(environment, field, root, variables, nestedRefetc
378
381
  return {
379
382
  kind: "Success",
380
383
  data: (args, fetchOptions) => {
381
- const includeReadOutData = (variables$1, readOutData) => {
382
- variables$1.id = readOutData.id;
383
- return variables$1;
384
+ const includeReadOutData = (variables, readOutData) => {
385
+ variables.id = readOutData.id;
386
+ return variables;
384
387
  };
385
388
  const localVariables = includeReadOutData(args ?? {}, refetchReaderParams.data);
386
389
  writeQueryArgsToVariables(localVariables, field.arguments, variables);
387
390
  return [root.__typename + ":" + root.__link + "/" + field.fieldName + "/" + stableStringifyArgs(localVariables), () => {
388
- const variables$1 = includeReadOutData(filterVariables({
391
+ const variables = includeReadOutData(filterVariables({
389
392
  ...args,
390
393
  ...localVariables
391
394
  }, allowedVariables), refetchReaderParams.data);
@@ -400,14 +403,14 @@ function readClientPointerData(environment, field, root, variables, nestedRefetc
400
403
  },
401
404
  nestedRefetchQueries
402
405
  });
403
- const [networkRequest, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, refetchQueryArtifact, variables$1, readerWithRefetchQueries, fetchOptions ?? null);
406
+ const [networkRequest, disposeNetworkRequest] = require_makeNetworkRequest.maybeMakeNetworkRequest(environment, refetchQueryArtifact, variables, readerWithRefetchQueries, fetchOptions ?? null);
404
407
  return [{
405
408
  kind: "FragmentReference",
406
409
  fieldName: field.fieldName,
407
410
  readerArtifactKind: "EagerReaderArtifact",
408
411
  readerWithRefetchQueries,
409
412
  root,
410
- variables: variables$1,
413
+ variables,
411
414
  networkRequest
412
415
  }, disposeNetworkRequest];
413
416
  }];
@@ -1,9 +1,8 @@
1
- import { IsographEnvironment, StoreLink } from "./IsographEnvironment.js";
2
- import { ExtractData, FragmentReference, UnknownTReadFromStore } from "./FragmentReference.js";
3
- import { EncounteredIds } from "./cache.js";
1
+ import { IsographEnvironment, StoreLink } from "./IsographEnvironment.cjs";
2
+ import { ExtractData, FragmentReference, UnknownTReadFromStore } from "./FragmentReference.cjs";
3
+ import { EncounteredIds } from "./cache.cjs";
4
4
 
5
5
  //#region src/core/read.d.ts
6
-
7
6
  type WithEncounteredRecords<T> = {
8
7
  readonly encounteredRecords: EncounteredIds;
9
8
  readonly item: ExtractData<T>;
@@ -25,4 +24,4 @@ type NetworkRequestReaderOptions = {
25
24
  };
26
25
  //#endregion
27
26
  export { NetworkRequestReaderOptions, ReadDataResult, WithEncounteredRecords, readButDoNotEvaluate };
28
- //# sourceMappingURL=read.d.ts.map
27
+ //# sourceMappingURL=read.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.cts","names":[],"sources":["../../src/core/read.ts"],"mappings":";;;;;KAsDY,sBAAA;EAAA,SACD,kBAAA,EAAoB,cAAA;EAAA,SACpB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA;AAAA,iBAGb,oBAAA,wBACS,qBAAA,CAAA,CAEvB,WAAA,EAAa,mBAAA,EACb,iBAAA,EAAmB,iBAAA,CAAkB,cAAA,YACrC,qBAAA,EAAuB,2BAAA,GACtB,sBAAA,CAAuB,cAAA;AAAA,KAiEd,qBAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAA,EAAM,IAAA;AAAA;AAAA,KAGL,cAAA,SACR,qBAAA,CAAsB,IAAA;EAAA,SAEX,IAAA;EAAA,SACA,MAAA;EAAA,SACA,YAAA,GAAe,cAAA;EAAA,SACf,UAAA,EAAY,SAAA;AAAA;AAAA,KA8zBf,2BAAA;EACV,iBAAA;EACA,mBAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.mts","names":[],"sources":["../../src/core/read.ts"],"sourcesContent":[],"mappings":";;;;;;;AAoDY,KAAA,sBAAsB,CAAA,CAAA,CAAA,GAAA;EACH,SAAA,kBAAA,EAAA,cAAA;EACF,SAAA,IAAA,EAAZ,WAAY,CAAA,CAAA,CAAA;CAAZ;AAAW,iBAGZ,oBAHY,CAAA,uBAIH,qBAJG,CAAA,CAAA,WAAA,EAMb,mBANa,EAAA,iBAAA,EAOP,iBAPO,CAOW,cAPX,EAAA,OAAA,CAAA,EAAA,qBAAA,EAQH,2BARG,CAAA,EASzB,sBATyB,CASF,cATE,CAAA;AAGZ,KAuEJ,qBAvEwB,CAAA,IAAA,CAAA,GAAA;EACX,SAAA,IAAA,EAAA,SAAA;EAEV,SAAA,IAAA,EAsEE,IAtEF;CACwB;AAAlB,KAwET,cAxES,CAAA,IAAA,CAAA,GAyEjB,qBAzEiB,CAyEK,IAzEL,CAAA,GAAA;EACI,SAAA,IAAA,EAAA,aAAA;EACC,SAAA,MAAA,EAAA,MAAA;EAAvB,SAAA,YAAA,CAAA,EA2E2B,cA3E3B,CAAA,OAAA,CAAA;EAAsB,SAAA,UAAA,EA4EE,SA5EF;AAiEzB,CAAA;AAWoC,KA8zBxB,2BAAA,GA9zBwB;EA8zBxB,iBAAA,EAAA,OAAA"}
1
+ {"version":3,"file":"read.d.mts","names":[],"sources":["../../src/core/read.ts"],"mappings":";;;;;;;KAsDY,sBAAA;EAAA,SACD,kBAAA,EAAoB,cAAA;EAAA,SACpB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA;AAAA,iBAGb,oBAAA,wBACS,qBAAA,CAAA,CAEvB,WAAA,EAAa,mBAAA,EACb,iBAAA,EAAmB,iBAAA,CAAkB,cAAA,YACrC,qBAAA,EAAuB,2BAAA,GACtB,sBAAA,CAAuB,cAAA;AAAA,KAiEd,qBAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAA,EAAM,IAAA;AAAA;AAAA,KAGL,cAAA,SACR,qBAAA,CAAsB,IAAA;EAAA,SAEX,IAAA;EAAA,SACA,MAAA;EAAA,SACA,YAAA,GAAe,cAAA;EAAA,SACf,UAAA,EAAY,SAAA;AAAA;AAAA,KA8zBf,2BAAA;EACV,iBAAA;EACA,mBAAA;AAAA"}