@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,15 +1,14 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
2
- const require_util = require('./util.js');
3
- const require_IsographEnvironment = require('./IsographEnvironment.js');
4
- const require_logging = require('./logging.js');
5
- const require_optimisticProxy = require('./optimisticProxy.js');
6
- let __isograph_react_disposable_state = require("@isograph/react-disposable-state");
7
- __isograph_react_disposable_state = require_rolldown_runtime.__toESM(__isograph_react_disposable_state);
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_util = require('./util.cjs');
3
+ const require_IsographEnvironment = require('./IsographEnvironment.cjs');
4
+ const require_logging = require('./logging.cjs');
5
+ const require_optimisticProxy = require('./optimisticProxy.cjs');
6
+ let _isograph_react_disposable_state = require("@isograph/react-disposable-state");
8
7
 
9
8
  //#region src/core/cache.ts
10
9
  const TYPENAME_FIELD_NAME = "__typename";
11
10
  function getOrCreateItemInSuspenseCache(environment, index, factory) {
12
- if (environment.fragmentCache[index] == null) environment.fragmentCache[index] = new __isograph_react_disposable_state.ParentCache(factory);
11
+ if (environment.fragmentCache[index] == null) environment.fragmentCache[index] = new _isograph_react_disposable_state.ParentCache(factory);
13
12
  return environment.fragmentCache[index];
14
13
  }
15
14
  function normalizeData(environment, storeLayer, normalizationAst, networkResponse, variables, root, encounteredIds) {
@@ -88,10 +87,8 @@ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreR
88
87
  targetStoreRecord[parentRecordKey] = null;
89
88
  return existingValue === void 0 || existingValue != null;
90
89
  }
91
- if (isScalarOrEmptyArray(networkResponseData)) {
92
- targetStoreRecord[parentRecordKey] = networkResponseData;
93
- return existingValue !== networkResponseData;
94
- } else throw new Error("Unexpected object array when normalizing scalar");
90
+ targetStoreRecord[parentRecordKey] = networkResponseData;
91
+ return existingValue !== networkResponseData;
95
92
  }
96
93
  /**
97
94
  * Mutate targetParentRecord with a given linked field ast node.
@@ -104,7 +101,6 @@ function normalizeLinkedField(environment, storeLayer, astNode, networkResponseP
104
101
  targetParentRecord[parentRecordKey] = null;
105
102
  return existingValue === void 0 || existingValue != null;
106
103
  }
107
- if (isScalarOrEmptyArray(networkResponseData) && !isNullOrEmptyArray(networkResponseData)) throw new Error("Unexpected scalar network response when normalizing a linked field");
108
104
  if (require_util.isArray(networkResponseData)) {
109
105
  const dataIds = [];
110
106
  for (let i = 0; i < networkResponseData.length; i++) {
@@ -165,17 +161,6 @@ function normalizeNetworkResponseObject(environment, storeLayer, astNode, networ
165
161
  normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseData, newStoreRecord, link, variables, mutableEncounteredIds);
166
162
  return newStoreRecordId;
167
163
  }
168
- function isScalarOrEmptyArray(data) {
169
- if (require_util.isArray(data)) return data.every((x) => isScalarOrEmptyArray(x));
170
- return data == null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
171
- }
172
- function isNullOrEmptyArray(data) {
173
- if (require_util.isArray(data)) {
174
- if (data.length === 0) return true;
175
- return data.every((x) => isNullOrEmptyArray(x));
176
- }
177
- return data == null;
178
- }
179
164
  function getParentRecordKey(astNode, variables) {
180
165
  let parentRecordKey = astNode.fieldName;
181
166
  const fieldParameters = astNode.arguments;
@@ -184,8 +169,8 @@ function getParentRecordKey(astNode, variables) {
184
169
  }
185
170
  function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
186
171
  switch (argumentValue.kind) {
187
- case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue$1]) => {
188
- return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue$1, variables)];
172
+ case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue]) => {
173
+ return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue, variables)];
189
174
  }));
190
175
  case "Literal": return argumentValue.value;
191
176
  case "Variable": return variables[argumentValue.name] ?? "null";
@@ -210,8 +195,8 @@ function getNetworkResponseKey(astNode) {
210
195
  }
211
196
  function getArgumentValueChunk(argumentValue) {
212
197
  switch (argumentValue.kind) {
213
- case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue$1]) => {
214
- return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue$1);
198
+ case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue]) => {
199
+ return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue);
215
200
  }).join("_") + "_c";
216
201
  case "Literal": return "l_" + argumentValue.value;
217
202
  case "Variable": return "v_" + argumentValue.name;
@@ -223,7 +208,9 @@ const FIRST_SPLIT_KEY = "____";
223
208
  const SECOND_SPLIT_KEY = "___";
224
209
  const THIRD_SPLIT_KEY = "__";
225
210
  function getDataIdOfNetworkResponse(parentRecordLink, dataToNormalize, astNode, variables, index) {
226
- if (astNode.concreteType === "Query") return require_IsographEnvironment.ROOT_ID;
211
+ const __typename = astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];
212
+ 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.");
213
+ if (__typename === "Query") return require_IsographEnvironment.ROOT_ID;
227
214
  const dataId = dataToNormalize.id;
228
215
  if (dataId != null) return dataId;
229
216
  let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;
@@ -0,0 +1,44 @@
1
+ import { StoreLayerWithData } from "./optimisticProxy.cjs";
2
+ import { DataId, IsographEnvironment, StoreLink, TypeName } from "./IsographEnvironment.cjs";
3
+ import { Variables } from "./FragmentReference.cjs";
4
+ import { NormalizationAstNodes } from "./entrypoint.cjs";
5
+ import { ParentCache } from "@isograph/react-disposable-state";
6
+
7
+ //#region src/core/cache.d.ts
8
+ type NetworkResponsePlural<T> = null | T | readonly T[] | readonly (null | T)[];
9
+ type NetworkResponseScalarValue = string | number | boolean | unknown;
10
+ type NetworkResponseValue = NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
11
+ type NetworkResponseObject = {
12
+ readonly [key: ScalarNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue>;
13
+ readonly [key: LinkedNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseObject>;
14
+ readonly [key: NetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
15
+ readonly id?: DataId;
16
+ readonly __typename?: TypeName;
17
+ };
18
+ declare function normalizeData(environment: IsographEnvironment, storeLayer: StoreLayerWithData, normalizationAst: NormalizationAstNodes, networkResponse: NetworkResponseObject, variables: Variables, root: StoreLink, encounteredIds: EncounteredIds): EncounteredIds;
19
+ type EncounteredIds = Map<TypeName, Set<DataId>>;
20
+ type ParentRecordKey = string;
21
+ /**
22
+ * these don't actually start with the different prefixes, but they let
23
+ * us use multiple indexes, e.g.
24
+ * {
25
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...
26
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...
27
+ * }
28
+ */
29
+ type LinkedParentRecordKey = `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;
30
+ type ScalarParentRecordKey = `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;
31
+ type NetworkResponseKey = string;
32
+ /**
33
+ * these don't actually start with the different prefixes, but they let
34
+ * us use multiple indexes, e.g.
35
+ * {
36
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...
37
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...
38
+ * }
39
+ */
40
+ type LinkedNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;
41
+ type ScalarNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;
42
+ //#endregion
43
+ export { EncounteredIds, LinkedParentRecordKey, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, ParentRecordKey, ScalarParentRecordKey, normalizeData };
44
+ //# sourceMappingURL=cache.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.cts","names":[],"sources":["../../src/core/cache.ts"],"mappings":";;;;;;;KAgDY,qBAAA,aAER,CAAA,YACS,CAAA,sBACQ,CAAA;AAAA,KACT,0BAAA;AAAA,KAEA,oBAAA,GACR,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;AAAA,KAEd,qBAAA;EAAA,UAGA,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,0BAAA;EAAA,UAChB,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,qBAAA;EAAA,UAChB,GAAA,EAAK,kBAAA,eAEX,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;EAAA,SACjB,EAAA,GAAK,MAAA;EAAA,SACL,UAAA,GAAa,QAAA;AAAA;AAAA,iBAGR,aAAA,CACd,WAAA,EAAa,mBAAA,EACb,UAAA,EAAY,kBAAA,EACZ,gBAAA,EAAkB,qBAAA,EAClB,eAAA,EAAiB,qBAAA,EACjB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,EACN,cAAA,EAAgB,cAAA,GACf,cAAA;AAAA,KAkES,cAAA,GAAiB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,MAAA;AAAA,KAgSnC,eAAA;;AA/XZ;;;;;;;KAyYY,qBAAA;AAAA,KAEA,qBAAA;AAAA,KAwEA,kBAAA;;;;AA/cZ;;;;;KAydY,wBAAA;AAAA,KAEA,wBAAA"}
@@ -6,15 +6,40 @@ import { NormalizationAstNodes } from "./entrypoint.mjs";
6
6
  import { ParentCache } from "@isograph/react-disposable-state";
7
7
 
8
8
  //#region src/core/cache.d.ts
9
- type NetworkResponseScalarValue = string | number | boolean;
10
- type NetworkResponseValue = NetworkResponseScalarValue | null | NetworkResponseObject | readonly (NetworkResponseObject | null)[] | readonly (NetworkResponseScalarValue | null)[];
9
+ type NetworkResponsePlural<T> = null | T | readonly T[] | readonly (null | T)[];
10
+ type NetworkResponseScalarValue = string | number | boolean | unknown;
11
+ type NetworkResponseValue = NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
11
12
  type NetworkResponseObject = {
12
- readonly [index: string]: undefined | NetworkResponseValue;
13
+ readonly [key: ScalarNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue>;
14
+ readonly [key: LinkedNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseObject>;
15
+ readonly [key: NetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
13
16
  readonly id?: DataId;
14
17
  readonly __typename?: TypeName;
15
18
  };
16
19
  declare function normalizeData(environment: IsographEnvironment, storeLayer: StoreLayerWithData, normalizationAst: NormalizationAstNodes, networkResponse: NetworkResponseObject, variables: Variables, root: StoreLink, encounteredIds: EncounteredIds): EncounteredIds;
17
20
  type EncounteredIds = Map<TypeName, Set<DataId>>;
21
+ type ParentRecordKey = string;
22
+ /**
23
+ * these don't actually start with the different prefixes, but they let
24
+ * us use multiple indexes, e.g.
25
+ * {
26
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...
27
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...
28
+ * }
29
+ */
30
+ type LinkedParentRecordKey = `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;
31
+ type ScalarParentRecordKey = `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;
32
+ type NetworkResponseKey = string;
33
+ /**
34
+ * these don't actually start with the different prefixes, but they let
35
+ * us use multiple indexes, e.g.
36
+ * {
37
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...
38
+ * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...
39
+ * }
40
+ */
41
+ type LinkedNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;
42
+ type ScalarNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;
18
43
  //#endregion
19
- export { EncounteredIds, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, normalizeData };
44
+ export { EncounteredIds, LinkedParentRecordKey, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, ParentRecordKey, ScalarParentRecordKey, normalizeData };
20
45
  //# sourceMappingURL=cache.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.mts","names":[],"sources":["../../src/core/cache.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAgDY,KAAA,0BAAA,GAA0B,MAAA,GAAA,MAAA,GAAA,OAAA;AAC1B,KAAA,oBAAA,GACR,0BAD4B,GAAA,IAAA,GAG5B,qBAH4B,GAAA,SAAA,CAIlB,qBAJkB,GAAA,IAAA,CAAA,EAAA,GAAA,SAAA,CAKlB,0BALkB,GAAA,IAAA,CAAA,EAAA;AAC5B,KAMQ,qBAAA,GANR;EAEA,UAAA,KAAA,EAAA,MAAA,CAAA,EAAA,SAAA,GAOoC,oBAPpC;EACU,SAAA,EAAA,CAAA,EAOE,MAPF;EACA,SAAA,UAAA,CAAA,EAOU,QAPV;CAA0B;AAE5B,iBAQI,aAAA,CARiB,WAAA,EASlB,mBATkB,EAAA,UAAA,EAUnB,kBAVmB,EAAA,gBAAA,EAWb,qBAXa,EAAA,eAAA,EAYd,qBAZc,EAAA,SAAA,EAapB,SAboB,EAAA,IAAA,EAczB,SAdyB,EAAA,cAAA,EAef,cAfe,CAAA,EAgB9B,cAhB8B;AAKD,KA6EpB,cAAA,GAAiB,GA7EG,CA6EC,QA7ED,EA6EW,GA7EX,CA6Ee,MA7Ef,CAAA,CAAA"}
1
+ {"version":3,"file":"cache.d.mts","names":[],"sources":["../../src/core/cache.ts"],"mappings":";;;;;;;;KAgDY,qBAAA,aAER,CAAA,YACS,CAAA,sBACQ,CAAA;AAAA,KACT,0BAAA;AAAA,KAEA,oBAAA,GACR,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;AAAA,KAEd,qBAAA;EAAA,UAGA,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,0BAAA;EAAA,UAChB,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,qBAAA;EAAA,UAChB,GAAA,EAAK,kBAAA,eAEX,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;EAAA,SACjB,EAAA,GAAK,MAAA;EAAA,SACL,UAAA,GAAa,QAAA;AAAA;AAAA,iBAGR,aAAA,CACd,WAAA,EAAa,mBAAA,EACb,UAAA,EAAY,kBAAA,EACZ,gBAAA,EAAkB,qBAAA,EAClB,eAAA,EAAiB,qBAAA,EACjB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,EACN,cAAA,EAAgB,cAAA,GACf,cAAA;AAAA,KAkES,cAAA,GAAiB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,MAAA;AAAA,KAgSnC,eAAA;;;AA/XZ;;;;;;KAyYY,qBAAA;AAAA,KAEA,qBAAA;AAAA,KAwEA,kBAAA;;;;;AA/cZ;;;;KAydY,wBAAA;AAAA,KAEA,wBAAA"}
@@ -86,10 +86,8 @@ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreR
86
86
  targetStoreRecord[parentRecordKey] = null;
87
87
  return existingValue === void 0 || existingValue != null;
88
88
  }
89
- if (isScalarOrEmptyArray(networkResponseData)) {
90
- targetStoreRecord[parentRecordKey] = networkResponseData;
91
- return existingValue !== networkResponseData;
92
- } else throw new Error("Unexpected object array when normalizing scalar");
89
+ targetStoreRecord[parentRecordKey] = networkResponseData;
90
+ return existingValue !== networkResponseData;
93
91
  }
94
92
  /**
95
93
  * Mutate targetParentRecord with a given linked field ast node.
@@ -102,7 +100,6 @@ function normalizeLinkedField(environment, storeLayer, astNode, networkResponseP
102
100
  targetParentRecord[parentRecordKey] = null;
103
101
  return existingValue === void 0 || existingValue != null;
104
102
  }
105
- if (isScalarOrEmptyArray(networkResponseData) && !isNullOrEmptyArray(networkResponseData)) throw new Error("Unexpected scalar network response when normalizing a linked field");
106
103
  if (isArray(networkResponseData)) {
107
104
  const dataIds = [];
108
105
  for (let i = 0; i < networkResponseData.length; i++) {
@@ -163,17 +160,6 @@ function normalizeNetworkResponseObject(environment, storeLayer, astNode, networ
163
160
  normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseData, newStoreRecord, link, variables, mutableEncounteredIds);
164
161
  return newStoreRecordId;
165
162
  }
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
163
  function getParentRecordKey(astNode, variables) {
178
164
  let parentRecordKey = astNode.fieldName;
179
165
  const fieldParameters = astNode.arguments;
@@ -182,8 +168,8 @@ function getParentRecordKey(astNode, variables) {
182
168
  }
183
169
  function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
184
170
  switch (argumentValue.kind) {
185
- case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue$1]) => {
186
- return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue$1, variables)];
171
+ case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue]) => {
172
+ return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue, variables)];
187
173
  }));
188
174
  case "Literal": return argumentValue.value;
189
175
  case "Variable": return variables[argumentValue.name] ?? "null";
@@ -208,8 +194,8 @@ function getNetworkResponseKey(astNode) {
208
194
  }
209
195
  function getArgumentValueChunk(argumentValue) {
210
196
  switch (argumentValue.kind) {
211
- case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue$1]) => {
212
- return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue$1);
197
+ case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue]) => {
198
+ return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue);
213
199
  }).join("_") + "_c";
214
200
  case "Literal": return "l_" + argumentValue.value;
215
201
  case "Variable": return "v_" + argumentValue.name;
@@ -221,7 +207,9 @@ const FIRST_SPLIT_KEY = "____";
221
207
  const SECOND_SPLIT_KEY = "___";
222
208
  const THIRD_SPLIT_KEY = "__";
223
209
  function getDataIdOfNetworkResponse(parentRecordLink, dataToNormalize, astNode, variables, index) {
224
- if (astNode.concreteType === "Query") return ROOT_ID;
210
+ const __typename = astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];
211
+ 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.");
212
+ if (__typename === "Query") return ROOT_ID;
225
213
  const dataId = dataToNormalize.id;
226
214
  if (dataId != null) return dataId;
227
215
  let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;
@@ -1 +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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"}
1
+ {"version":3,"file":"cache.mjs","names":[],"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 DataTypeValueLinked,\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 NetworkResponsePlural<T> =\n | null\n | T\n | readonly T[]\n | readonly (null | T)[];\nexport type NetworkResponseScalarValue = string | number | boolean | unknown;\n\nexport type NetworkResponseValue =\n | NetworkResponsePlural<NetworkResponseScalarValue>\n | NetworkResponsePlural<NetworkResponseObject>;\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 [key: ScalarNetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseScalarValue>;\n readonly [key: LinkedNetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseObject>;\n readonly [key: NetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseScalarValue>\n | NetworkResponsePlural<NetworkResponseObject>;\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 targetStoreRecord[parentRecordKey] = networkResponseData;\n return existingValue !== networkResponseData;\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 (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: DataTypeValueLinked,\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\nexport type ParentRecordKey = string;\n\n/**\n * these don't actually start with the different prefixes, but they let\n * us use multiple indexes, e.g.\n * {\n * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...\n * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...\n * }\n */\nexport type LinkedParentRecordKey =\n `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;\nexport type ScalarParentRecordKey =\n `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;\n\nexport function getParentRecordKey(\n astNode: NormalizationLinkedField | ReaderLinkedField,\n variables: Variables,\n): LinkedParentRecordKey;\nexport function getParentRecordKey(\n astNode: NormalizationScalarField | ReaderScalarField,\n variables: Variables,\n): ScalarParentRecordKey;\nexport function getParentRecordKey(\n astNode:\n | NormalizationLinkedField\n | NormalizationScalarField\n | ReaderLinkedField\n | ReaderScalarField,\n variables: Variables,\n): ParentRecordKey {\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\nexport type NetworkResponseKey = string;\n\n/**\n * these don't actually start with the different prefixes, but they let\n * us use multiple indexes, e.g.\n * {\n * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...\n * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...\n * }\n */\nexport type LinkedNetworkResponseKey =\n `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;\nexport type ScalarNetworkResponseKey =\n `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;\n\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField,\n): LinkedNetworkResponseKey;\nfunction getNetworkResponseKey(\n astNode: NormalizationScalarField,\n): ScalarNetworkResponseKey;\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField | NormalizationScalarField,\n): NetworkResponseKey {\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 const __typename =\n astNode.concreteType ?? dataToNormalize[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 // If we are dealing with nested Query, use __ROOT as id\n // TODO do not hard code this value here\n if (__typename === '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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"}
@@ -1,7 +1,7 @@
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');
1
+ const require_IsographEnvironment = require('./IsographEnvironment.cjs');
2
+ const require_logging = require('./logging.cjs');
3
+ const require_optimisticProxy = require('./optimisticProxy.cjs');
4
+ const require_cache = require('./cache.cjs');
5
5
 
6
6
  //#region src/core/check.ts
7
7
  const DEFAULT_SHOULD_FETCH_VALUE = "IfNecessary";
@@ -1,6 +1,6 @@
1
- import { IsographEnvironment, StoreLink } from "./IsographEnvironment.js";
2
- import { Variables } from "./FragmentReference.js";
3
- import { NormalizationAstNodes } from "./entrypoint.js";
1
+ import { IsographEnvironment, StoreLink } from "./IsographEnvironment.cjs";
2
+ import { Variables } from "./FragmentReference.cjs";
3
+ import { NormalizationAstNodes } from "./entrypoint.cjs";
4
4
 
5
5
  //#region src/core/check.d.ts
6
6
  type ShouldFetch = RequiredShouldFetch | 'IfNecessary';
@@ -25,4 +25,4 @@ type CheckResult = {
25
25
  declare function check(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, variables: Variables, root: StoreLink): CheckResult;
26
26
  //#endregion
27
27
  export { CheckResult, FetchOptions, RequiredFetchOptions, RequiredShouldFetch, ShouldFetch, check };
28
- //# sourceMappingURL=check.d.ts.map
28
+ //# sourceMappingURL=check.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.cts","names":[],"sources":["../../src/core/check.ts"],"mappings":";;;;;KAYY,WAAA,GAAc,mBAAA;AAAA,KACd,mBAAA;AAAA,KAIP,kBAAA;EACH,UAAA,IAAc,IAAA,EAAM,YAAA;EACpB,OAAA;AAAA;AAAA,UAGe,YAAA,yCACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,GAAc,WAAA;EACd,yBAAA,GAA4B,gBAAA;AAAA;AAAA,UAGb,oBAAA,uBACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,EAAa,mBAAA;AAAA;AAAA,KAGH,WAAA;EAEN,IAAA;AAAA;EAGA,IAAA;EACA,MAAA,EAAQ,SAAA;AAAA;AAAA,iBAGE,KAAA,CACd,WAAA,EAAa,mBAAA,EACb,gBAAA,EAAkB,qBAAA,EAClB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,GACL,WAAA"}
@@ -1 +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
+ {"version":3,"file":"check.d.mts","names":[],"sources":["../../src/core/check.ts"],"mappings":";;;;;KAYY,WAAA,GAAc,mBAAA;AAAA,KACd,mBAAA;AAAA,KAIP,kBAAA;EACH,UAAA,IAAc,IAAA,EAAM,YAAA;EACpB,OAAA;AAAA;AAAA,UAGe,YAAA,yCACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,GAAc,WAAA;EACd,yBAAA,GAA4B,gBAAA;AAAA;AAAA,UAGb,oBAAA,uBACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,EAAa,mBAAA;AAAA;AAAA,KAGH,WAAA;EAEN,IAAA;AAAA;EAGA,IAAA;EACA,MAAA,EAAQ,SAAA;AAAA;AAAA,iBAGE,KAAA,CACd,WAAA,EAAa,mBAAA,EACb,gBAAA,EAAkB,qBAAA,EAClB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,GACL,WAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"check.mjs","names":["DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch"],"sources":["../../src/core/check.ts"],"sourcesContent":["import { getParentRecordKey } from './cache';\nimport type { NormalizationAstNodes } from './entrypoint';\nimport type { Variables } from './FragmentReference';\nimport type {\n IsographEnvironment,\n StoreLink,\n StoreRecord,\n} from './IsographEnvironment';\nimport { getLink } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { getStoreRecordProxy } from './optimisticProxy';\n\nexport type ShouldFetch = RequiredShouldFetch | 'IfNecessary';\nexport type RequiredShouldFetch = 'Yes' | 'No';\n\nexport const DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch = 'IfNecessary';\n\ntype FetchOptionsShared<TReadOutData> = {\n onComplete?: (data: TReadOutData) => void;\n onError?: () => void;\n};\n\nexport interface FetchOptions<TReadOutData, TRawResponseType>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch?: ShouldFetch;\n optimisticNetworkResponse?: TRawResponseType;\n}\n\nexport interface RequiredFetchOptions<TReadOutData>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch: RequiredShouldFetch;\n}\n\nexport type CheckResult =\n | {\n kind: 'EnoughData';\n }\n | {\n kind: 'MissingData';\n record: StoreLink;\n };\n\nexport function check(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n root: StoreLink,\n): CheckResult {\n const newStoreRecord = getStoreRecordProxy(environment.store, root);\n\n if (newStoreRecord == null) {\n return {\n kind: 'MissingData',\n record: root,\n };\n }\n\n const checkResult = checkFromRecord(\n environment,\n normalizationAst,\n variables,\n newStoreRecord,\n root,\n );\n logMessage(environment, () => ({\n kind: 'EnvironmentCheck',\n result: checkResult,\n }));\n return checkResult;\n}\n\nfunction checkFromRecord(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n record: StoreRecord,\n recordLink: StoreLink,\n): CheckResult {\n normalizationAstLoop: for (const normalizationAstNode of normalizationAst) {\n switch (normalizationAstNode.kind) {\n case 'Scalar': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n const scalarValue = record[parentRecordKey];\n\n // null means the value is known to be missing, so it must\n // be exactly undefined\n if (scalarValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n continue normalizationAstLoop;\n }\n case 'Linked': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n\n const linkedValue = record[parentRecordKey];\n\n if (linkedValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n } else if (linkedValue == null) {\n continue;\n } else if (Array.isArray(linkedValue)) {\n arrayItemsLoop: for (const item of linkedValue) {\n const link = getLink(item);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue arrayItemsLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n } else {\n const link = getLink(linkedValue);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue normalizationAstLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n\n continue normalizationAstLoop;\n }\n case 'InlineFragment': {\n const existingRecordTypename = record['__typename'];\n\n if (existingRecordTypename == null) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n\n if (existingRecordTypename === normalizationAstNode.type) {\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n record,\n recordLink,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n\n continue normalizationAstLoop;\n }\n }\n }\n\n return {\n kind: 'EnoughData',\n };\n}\n"],"mappings":";;;;;;AAeA,MAAaA,6BAA0C;AA2BvD,SAAgB,MACd,aACA,kBACA,WACA,MACa;CACb,MAAM,iBAAiB,oBAAoB,YAAY,OAAO,KAAK;AAEnE,KAAI,kBAAkB,KACpB,QAAO;EACL,MAAM;EACN,QAAQ;EACT;CAGH,MAAM,cAAc,gBAClB,aACA,kBACA,WACA,gBACA,KACD;AACD,YAAW,oBAAoB;EAC7B,MAAM;EACN,QAAQ;EACT,EAAE;AACH,QAAO;;AAGT,SAAS,gBACP,aACA,kBACA,WACA,QACA,YACa;AACb,sBAAsB,MAAK,MAAM,wBAAwB,iBACvD,SAAQ,qBAAqB,MAA7B;EACE,KAAK;AASH,OAJoB,OAJI,mBACtB,sBACA,UACD,MAKmB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAEH,YAAS;EAEX,KAAK,UAAU;GAMb,MAAM,cAAc,OALI,mBACtB,sBACA,UACD;AAID,OAAI,gBAAgB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;YACQ,eAAe,KACxB;YACS,MAAM,QAAQ,YAAY,CACnC,gBAAgB,MAAK,MAAM,QAAQ,aAAa;IAC9C,MAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;QAIR;IACL,MAAM,OAAO,QAAQ,YAAY;AACjC,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;AAKb,YAAS;;EAEX,KAAK,kBAAkB;GACrB,MAAM,yBAAyB,OAAO;AAEtC,OAAI,0BAA0B,KAC5B,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAGH,OAAI,2BAA2B,qBAAqB,MAAM;IACxD,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,QACA,WACD;AAED,QAAI,OAAO,SAAS,cAClB,QAAO;;AAIX,YAAS;;;AAKf,QAAO,EACL,MAAM,cACP"}
1
+ {"version":3,"file":"check.mjs","names":[],"sources":["../../src/core/check.ts"],"sourcesContent":["import { getParentRecordKey } from './cache';\nimport type { NormalizationAstNodes } from './entrypoint';\nimport type { Variables } from './FragmentReference';\nimport type {\n IsographEnvironment,\n StoreLink,\n StoreRecord,\n} from './IsographEnvironment';\nimport { getLink } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { getStoreRecordProxy } from './optimisticProxy';\n\nexport type ShouldFetch = RequiredShouldFetch | 'IfNecessary';\nexport type RequiredShouldFetch = 'Yes' | 'No';\n\nexport const DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch = 'IfNecessary';\n\ntype FetchOptionsShared<TReadOutData> = {\n onComplete?: (data: TReadOutData) => void;\n onError?: () => void;\n};\n\nexport interface FetchOptions<TReadOutData, TRawResponseType>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch?: ShouldFetch;\n optimisticNetworkResponse?: TRawResponseType;\n}\n\nexport interface RequiredFetchOptions<TReadOutData>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch: RequiredShouldFetch;\n}\n\nexport type CheckResult =\n | {\n kind: 'EnoughData';\n }\n | {\n kind: 'MissingData';\n record: StoreLink;\n };\n\nexport function check(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n root: StoreLink,\n): CheckResult {\n const newStoreRecord = getStoreRecordProxy(environment.store, root);\n\n if (newStoreRecord == null) {\n return {\n kind: 'MissingData',\n record: root,\n };\n }\n\n const checkResult = checkFromRecord(\n environment,\n normalizationAst,\n variables,\n newStoreRecord,\n root,\n );\n logMessage(environment, () => ({\n kind: 'EnvironmentCheck',\n result: checkResult,\n }));\n return checkResult;\n}\n\nfunction checkFromRecord(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n record: StoreRecord,\n recordLink: StoreLink,\n): CheckResult {\n normalizationAstLoop: for (const normalizationAstNode of normalizationAst) {\n switch (normalizationAstNode.kind) {\n case 'Scalar': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n const scalarValue = record[parentRecordKey];\n\n // null means the value is known to be missing, so it must\n // be exactly undefined\n if (scalarValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n continue normalizationAstLoop;\n }\n case 'Linked': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n\n const linkedValue = record[parentRecordKey];\n\n if (linkedValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n } else if (linkedValue == null) {\n continue;\n } else if (Array.isArray(linkedValue)) {\n arrayItemsLoop: for (const item of linkedValue) {\n const link = getLink(item);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue arrayItemsLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n } else {\n const link = getLink(linkedValue);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue normalizationAstLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n\n continue normalizationAstLoop;\n }\n case 'InlineFragment': {\n const existingRecordTypename = record['__typename'];\n\n if (existingRecordTypename == null) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n\n if (existingRecordTypename === normalizationAstNode.type) {\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n record,\n recordLink,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n\n continue normalizationAstLoop;\n }\n }\n }\n\n return {\n kind: 'EnoughData',\n };\n}\n"],"mappings":";;;;;;AAeA,MAAa,6BAA0C;AA2BvD,SAAgB,MACd,aACA,kBACA,WACA,MACa;CACb,MAAM,iBAAiB,oBAAoB,YAAY,OAAO,KAAK;AAEnE,KAAI,kBAAkB,KACpB,QAAO;EACL,MAAM;EACN,QAAQ;EACT;CAGH,MAAM,cAAc,gBAClB,aACA,kBACA,WACA,gBACA,KACD;AACD,YAAW,oBAAoB;EAC7B,MAAM;EACN,QAAQ;EACT,EAAE;AACH,QAAO;;AAGT,SAAS,gBACP,aACA,kBACA,WACA,QACA,YACa;AACb,sBAAsB,MAAK,MAAM,wBAAwB,iBACvD,SAAQ,qBAAqB,MAA7B;EACE,KAAK;AASH,OAJoB,OAJI,mBACtB,sBACA,UACD,MAKmB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAEH,YAAS;EAEX,KAAK,UAAU;GAMb,MAAM,cAAc,OALI,mBACtB,sBACA,UACD;AAID,OAAI,gBAAgB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;YACQ,eAAe,KACxB;YACS,MAAM,QAAQ,YAAY,CACnC,gBAAgB,MAAK,MAAM,QAAQ,aAAa;IAC9C,MAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;QAIR;IACL,MAAM,OAAO,QAAQ,YAAY;AACjC,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;AAKb,YAAS;;EAEX,KAAK,kBAAkB;GACrB,MAAM,yBAAyB,OAAO;AAEtC,OAAI,0BAA0B,KAC5B,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAGH,OAAI,2BAA2B,qBAAqB,MAAM;IACxD,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,QACA,WACD;AAED,QAAI,OAAO,SAAS,cAClB,QAAO;;AAIX,YAAS;;;AAKf,QAAO,EACL,MAAM,cACP"}
@@ -1,5 +1,5 @@
1
- const require_FragmentReference = require('./FragmentReference.js');
2
- const require_startUpdate = require('./startUpdate.js');
1
+ const require_FragmentReference = require('./FragmentReference.cjs');
2
+ const require_startUpdate = require('./startUpdate.cjs');
3
3
 
4
4
  //#region src/core/componentCache.ts
5
5
  function getOrCreateCachedComponent(environment, fragmentReference, networkRequestOptions) {
@@ -1,9 +1,9 @@
1
- import { Contravariant, PhantomData } from "./brand.js";
2
- import { Arguments } from "./util.js";
3
- import { TopLevelReaderArtifact } from "./reader.js";
4
- import { ComponentOrFieldName, TypeName } from "./IsographEnvironment.js";
5
- import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.js";
6
- import { NetworkResponseObject } from "./cache.js";
1
+ import { Contravariant, PhantomData } from "./brand.cjs";
2
+ import { Arguments } from "./util.cjs";
3
+ import { TopLevelReaderArtifact } from "./reader.cjs";
4
+ import { ComponentOrFieldName, TypeName } from "./IsographEnvironment.cjs";
5
+ import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.cjs";
6
+ import { NetworkResponseObject } from "./cache.cjs";
7
7
 
8
8
  //#region src/core/entrypoint.d.ts
9
9
  type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
@@ -11,11 +11,16 @@ type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TCli
11
11
  readonly readerArtifact: TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
12
12
  readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
13
13
  };
14
+ type RawReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
15
+ readonly kind: 'ReaderWithRefetchQueries';
16
+ readonly readerArtifact: () => TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
17
+ readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
18
+ };
14
19
  type ReaderWithRefetchQueriesLoader<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
15
20
  readonly kind: 'ReaderWithRefetchQueriesLoader';
16
21
  readonly fieldName: ComponentOrFieldName;
17
22
  readonly readerArtifactKind: 'EagerReaderArtifact' | 'ComponentReaderArtifact';
18
- readonly loader: () => Promise<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
23
+ readonly loader: () => Promise<RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
19
24
  };
20
25
  type NetworkRequestInfo<TNormalizationAst> = {
21
26
  readonly kind: 'NetworkRequestInfo';
@@ -39,7 +44,7 @@ type IsographPersistedOperationExtraInfo = {
39
44
  type IsographEntrypoint<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject> = {
40
45
  readonly kind: 'Entrypoint';
41
46
  readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
42
- readonly readerWithRefetchQueries: ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
47
+ readonly readerWithRefetchQueries: RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
43
48
  readonly concreteType: TypeName;
44
49
  /**
45
50
  * This field exists solely for typechecking, and will not exist at runtime.
@@ -65,11 +70,13 @@ type NormalizationAstLoader = {
65
70
  };
66
71
  type NormalizationScalarField = {
67
72
  readonly kind: 'Scalar';
73
+ readonly isFallible: boolean;
68
74
  readonly fieldName: string;
69
75
  readonly arguments: Arguments | null;
70
76
  };
71
77
  type NormalizationLinkedField = {
72
78
  readonly kind: 'Linked';
79
+ readonly isFallible: boolean;
73
80
  readonly fieldName: string;
74
81
  readonly arguments: Arguments | null;
75
82
  readonly selections: NormalizationAstNodes;
@@ -96,4 +103,4 @@ type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X,
96
103
  type ExtractProps<Type> = Type extends React.FC<infer X> ? X : never;
97
104
  //#endregion
98
105
  export { ExtractClientFieldValue, ExtractProps, ExtractReadFromStore, ExtractResolverResult, FragmentReferenceOfEntrypoint, IsographEntrypoint, IsographEntrypointLoader, IsographOperation, IsographPersistedOperation, IsographPersistedOperationExtraInfo, NetworkRequestInfo, NormalizationAst, NormalizationAstLoader, NormalizationAstNode, NormalizationAstNodes, NormalizationInlineFragment, NormalizationLinkedField, NormalizationScalarField, ReaderWithRefetchQueries, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper, assertIsEntrypoint };
99
- //# sourceMappingURL=entrypoint.d.ts.map
106
+ //# sourceMappingURL=entrypoint.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoint.d.cts","names":[],"sources":["../../src/core/entrypoint.ts"],"mappings":";;;;;;;;KAUY,wBAAA,wBACa,qBAAA;EAAA,SAGd,IAAA;EAAA,SACA,cAAA,EAAgB,sBAAA,CACvB,cAAA,EACA,iBAAA;EAAA,SAIO,oBAAA,EAAsB,wCAAA;AAAA;AAAA,KAGrB,2BAAA,wBACa,qBAAA;EAAA,SAGd,IAAA;EAAA,SACA,cAAA,QAAsB,sBAAA,CAC7B,cAAA,EACA,iBAAA;EAAA,SAIO,oBAAA,EAAsB,wCAAA;AAAA;AAAA,KAGrB,8BAAA,wBACa,qBAAA;EAAA,SAGd,IAAA;EAAA,SACA,SAAA,EAAW,oBAAA;EAAA,SACX,kBAAA;EAAA,SAGA,MAAA,QAAc,OAAA,CACrB,2BAAA,CAA4B,cAAA,EAAgB,iBAAA;AAAA;AAAA,KAIpC,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,SAAA,EAAW,iBAAA,GAAoB,0BAAA;EAAA,SAC/B,gBAAA,EAAkB,iBAAA;AAAA;AAAA,KAGjB,iBAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAA;AAAA;AAAA,KAGC,0BAAA;EAAA,SACD,IAAA;EAAA,SACA,WAAA;EAAA,SACA,SAAA,EAAW,mCAAA;AAAA;AAAA,KAGV,mCAAA;EAAA,SACD,IAAA;EAAA,SACA,aAAA;EAAA,SACA,aAAA;AAAA;AAAA,KAIC,kBAAA,wBACa,qBAAA,+CAEG,gBAAA,GAAmB,sBAAA,2BACpB,qBAAA;EAAA,SAEhB,IAAA;EAAA,SACA,kBAAA,EAAoB,kBAAA,CAAmB,iBAAA;EAAA,SACvC,wBAAA,EACL,2BAAA,CAA4B,cAAA,EAAgB,iBAAA,IAC5C,8BAAA,CAA+B,cAAA,EAAgB,iBAAA;EAAA,SAC1C,YAAA,EAAc,QAAA;EAzDrB;;;EAAA,SA6DO,mBAAA,GAAsB,WAAA,CAAY,aAAA,CAAc,gBAAA;AAAA;AAAA,KAG/C,6BAAA,qBACU,kBAAA,wBAClB,iBAAA,CACF,oBAAA,CAAqB,WAAA,GACrB,uBAAA,CAAwB,WAAA;AAAA,KAGd,wBAAA,wBACa,qBAAA,8CAEE,qBAAA;EAAA,SAEhB,IAAA;EAAA,SACA,YAAA;EAAA,SACA,kBAAA;EAAA,SAGA,MAAA,QAAc,OAAA,CACrB,kBAAA,CACE,cAAA,EACA,iBAAA,EACA,gBAAA,EACA,gBAAA;AAAA;AAAA,KAKM,oBAAA,GACR,wBAAA,GACA,wBAAA,GACA,2BAAA;AAAA,KAEQ,qBAAA,GAAwB,aAAA,CAAc,oBAAA;AAAA,KAEtC,gBAAA;EAAA,SACD,IAAA;EAAA,SACA,UAAA,EAAY,qBAAA;AAAA;AAAA,KAGX,sBAAA;EAAA,SACD,IAAA;EAAA,SACA,MAAA,QAAc,OAAA,CAAQ,gBAAA;AAAA;AAAA,KAGrB,wBAAA;EAAA,SACD,IAAA;EAAA,SACA,UAAA;EAAA,SACA,SAAA;EAAA,SACA,SAAA,EAAW,SAAA;AAAA;AAAA,KAGV,wBAAA;EAAA,SACD,IAAA;EAAA,SACA,UAAA;EAAA,SACA,SAAA;EAAA,SACA,SAAA,EAAW,SAAA;EAAA,SACX,UAAA,EAAY,qBAAA;EAAA,SACZ,YAAA,EAAc,QAAA;AAAA;AAAA,KAGb,2BAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAA;EAAA,SACA,UAAA,EAAY,qBAAA;AAAA;AAAA,KAIX,iCAAA;EAAA,SACD,IAAA;EAAA,SACA,kBAAA,EAAoB,kBAAA,CAAmB,gBAAA;EAAA,SACvC,YAAA,EAAc,QAAA;AAAA;AAAA,KAIb,wCAAA;EAAA,SACD,QAAA,EAAU,iCAAA;EAAA,SACV,gBAAA;AAAA;AAAA,iBAGK,kBAAA,wBACS,qBAAA,+CAEG,gBAAA,GAAmB,sBAAA,2BACpB,qBAAA,CAAA,CAEzB,KAAA,EACI,kBAAA,CACE,cAAA,EACA,iBAAA,EACA,iBAAA,EACA,gBAAA,MAEA,CAAA,+BAIG,KAAA,IAAS,kBAAA,CAClB,cAAA,EACA,iBAAA,EACA,iBAAA,EACA,gBAAA;AAAA,KAKU,oBAAA,SACV,IAAA,SAAa,kBAAA,2BAA6C,CAAA;AAAA,KAChD,uBAAA,SACV,IAAA,SAAa,kBAAA,2BAA6C,CAAA;AAAA,KAGhD,qBAAA,SACV,IAAA,SAAa,kBAAA,2BAA6C,CAAA;AAAA,KAChD,YAAA,SAAqB,IAAA,SAAa,KAAA,CAAM,EAAA,YAAc,CAAA"}
@@ -11,11 +11,16 @@ type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TCli
11
11
  readonly readerArtifact: TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
12
12
  readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
13
13
  };
14
+ type RawReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
15
+ readonly kind: 'ReaderWithRefetchQueries';
16
+ readonly readerArtifact: () => TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
17
+ readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
18
+ };
14
19
  type ReaderWithRefetchQueriesLoader<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
15
20
  readonly kind: 'ReaderWithRefetchQueriesLoader';
16
21
  readonly fieldName: ComponentOrFieldName;
17
22
  readonly readerArtifactKind: 'EagerReaderArtifact' | 'ComponentReaderArtifact';
18
- readonly loader: () => Promise<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
23
+ readonly loader: () => Promise<RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
19
24
  };
20
25
  type NetworkRequestInfo<TNormalizationAst> = {
21
26
  readonly kind: 'NetworkRequestInfo';
@@ -39,7 +44,7 @@ type IsographPersistedOperationExtraInfo = {
39
44
  type IsographEntrypoint<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject> = {
40
45
  readonly kind: 'Entrypoint';
41
46
  readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
42
- readonly readerWithRefetchQueries: ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
47
+ readonly readerWithRefetchQueries: RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
43
48
  readonly concreteType: TypeName;
44
49
  /**
45
50
  * This field exists solely for typechecking, and will not exist at runtime.
@@ -65,11 +70,13 @@ type NormalizationAstLoader = {
65
70
  };
66
71
  type NormalizationScalarField = {
67
72
  readonly kind: 'Scalar';
73
+ readonly isFallible: boolean;
68
74
  readonly fieldName: string;
69
75
  readonly arguments: Arguments | null;
70
76
  };
71
77
  type NormalizationLinkedField = {
72
78
  readonly kind: 'Linked';
79
+ readonly isFallible: boolean;
73
80
  readonly fieldName: string;
74
81
  readonly arguments: Arguments | null;
75
82
  readonly selections: NormalizationAstNodes;