@isograph/react 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/.turbo/turbo-compile-libs.log +9 -2
  2. package/dist/_virtual/rolldown_runtime.js +25 -0
  3. package/dist/core/FragmentReference.d.mts +38 -0
  4. package/dist/core/FragmentReference.d.mts.map +1 -0
  5. package/dist/core/FragmentReference.d.ts +31 -29
  6. package/dist/core/FragmentReference.d.ts.map +1 -1
  7. package/dist/core/FragmentReference.js +7 -5
  8. package/dist/core/FragmentReference.mjs +10 -0
  9. package/dist/core/FragmentReference.mjs.map +1 -0
  10. package/dist/core/IsographEnvironment.d.mts +89 -0
  11. package/dist/core/IsographEnvironment.d.mts.map +1 -0
  12. package/dist/core/IsographEnvironment.d.ts +76 -79
  13. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  14. package/dist/core/IsographEnvironment.js +60 -82
  15. package/dist/core/IsographEnvironment.mjs +67 -0
  16. package/dist/core/IsographEnvironment.mjs.map +1 -0
  17. package/dist/core/PromiseWrapper.d.mts +36 -0
  18. package/dist/core/PromiseWrapper.d.mts.map +1 -0
  19. package/dist/core/PromiseWrapper.d.ts +26 -23
  20. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  21. package/dist/core/PromiseWrapper.js +45 -43
  22. package/dist/core/PromiseWrapper.mjs +49 -0
  23. package/dist/core/PromiseWrapper.mjs.map +1 -0
  24. package/dist/core/areEqualWithDeepComparison.js +56 -108
  25. package/dist/core/areEqualWithDeepComparison.mjs +62 -0
  26. package/dist/core/areEqualWithDeepComparison.mjs.map +1 -0
  27. package/dist/core/brand.d.mts +19 -0
  28. package/dist/core/brand.d.mts.map +1 -0
  29. package/dist/core/brand.d.ts +6 -6
  30. package/dist/core/brand.d.ts.map +1 -1
  31. package/dist/core/cache.d.mts +20 -0
  32. package/dist/core/cache.d.mts.map +1 -0
  33. package/dist/core/cache.d.ts +18 -37
  34. package/dist/core/cache.d.ts.map +1 -1
  35. package/dist/core/cache.js +203 -537
  36. package/dist/core/cache.mjs +237 -0
  37. package/dist/core/cache.mjs.map +1 -0
  38. package/dist/core/check.d.mts +28 -0
  39. package/dist/core/check.d.mts.map +1 -0
  40. package/dist/core/check.d.ts +21 -19
  41. package/dist/core/check.d.ts.map +1 -1
  42. package/dist/core/check.js +80 -127
  43. package/dist/core/check.mjs +84 -0
  44. package/dist/core/check.mjs.map +1 -0
  45. package/dist/core/componentCache.js +9 -35
  46. package/dist/core/componentCache.mjs +12 -0
  47. package/dist/core/componentCache.mjs.map +1 -0
  48. package/dist/core/entrypoint.d.mts +99 -0
  49. package/dist/core/entrypoint.d.mts.map +1 -0
  50. package/dist/core/entrypoint.d.ts +83 -78
  51. package/dist/core/entrypoint.d.ts.map +1 -1
  52. package/dist/core/entrypoint.js +6 -5
  53. package/dist/core/entrypoint.mjs +8 -0
  54. package/dist/core/entrypoint.mjs.map +1 -0
  55. package/dist/core/garbageCollection.d.mts +18 -0
  56. package/dist/core/garbageCollection.d.mts.map +1 -0
  57. package/dist/core/garbageCollection.d.ts +15 -16
  58. package/dist/core/garbageCollection.d.ts.map +1 -1
  59. package/dist/core/garbageCollection.js +76 -115
  60. package/dist/core/garbageCollection.mjs +89 -0
  61. package/dist/core/garbageCollection.mjs.map +1 -0
  62. package/dist/core/getOrCreateCacheForArtifact.js +37 -0
  63. package/dist/core/getOrCreateCacheForArtifact.mjs +38 -0
  64. package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -0
  65. package/dist/core/logging.d.mts +95 -0
  66. package/dist/core/logging.d.mts.map +1 -0
  67. package/dist/core/logging.d.ts +66 -61
  68. package/dist/core/logging.d.ts.map +1 -1
  69. package/dist/core/logging.js +17 -18
  70. package/dist/core/logging.mjs +20 -0
  71. package/dist/core/logging.mjs.map +1 -0
  72. package/dist/core/makeNetworkRequest.d.mts +13 -0
  73. package/dist/core/makeNetworkRequest.d.mts.map +1 -0
  74. package/dist/core/makeNetworkRequest.d.ts +12 -10
  75. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  76. package/dist/core/makeNetworkRequest.js +180 -264
  77. package/dist/core/makeNetworkRequest.mjs +195 -0
  78. package/dist/core/makeNetworkRequest.mjs.map +1 -0
  79. package/dist/core/optimisticProxy.d.mts +43 -0
  80. package/dist/core/optimisticProxy.d.mts.map +1 -0
  81. package/dist/core/optimisticProxy.d.ts +37 -53
  82. package/dist/core/optimisticProxy.d.ts.map +1 -1
  83. package/dist/core/optimisticProxy.js +245 -371
  84. package/dist/core/optimisticProxy.mjs +268 -0
  85. package/dist/core/optimisticProxy.mjs.map +1 -0
  86. package/dist/core/read.d.mts +29 -0
  87. package/dist/core/read.d.mts.map +1 -0
  88. package/dist/core/read.d.ts +23 -28
  89. package/dist/core/read.d.ts.map +1 -1
  90. package/dist/core/read.js +435 -650
  91. package/dist/core/read.mjs +456 -0
  92. package/dist/core/read.mjs.map +1 -0
  93. package/dist/core/reader.d.mts +89 -0
  94. package/dist/core/reader.d.mts.map +1 -0
  95. package/dist/core/reader.d.ts +78 -77
  96. package/dist/core/reader.d.ts.map +1 -1
  97. package/dist/core/startUpdate.js +115 -152
  98. package/dist/core/startUpdate.mjs +125 -0
  99. package/dist/core/startUpdate.mjs.map +1 -0
  100. package/dist/core/subscribe.d.mts +12 -0
  101. package/dist/core/subscribe.d.mts.map +1 -0
  102. package/dist/core/subscribe.d.ts +12 -0
  103. package/dist/core/subscribe.d.ts.map +1 -0
  104. package/dist/core/subscribe.js +79 -0
  105. package/dist/core/subscribe.mjs +79 -0
  106. package/dist/core/subscribe.mjs.map +1 -0
  107. package/dist/core/util.d.mts +27 -0
  108. package/dist/core/util.d.mts.map +1 -0
  109. package/dist/core/util.d.ts +21 -17
  110. package/dist/core/util.d.ts.map +1 -1
  111. package/dist/core/util.js +22 -2
  112. package/dist/core/util.mjs +21 -0
  113. package/dist/core/util.mjs.map +1 -0
  114. package/dist/core/writeData.d.mts +11 -0
  115. package/dist/core/writeData.d.mts.map +1 -0
  116. package/dist/core/writeData.d.ts +11 -0
  117. package/dist/core/writeData.d.ts.map +1 -0
  118. package/dist/core/writeData.js +41 -0
  119. package/dist/core/writeData.mjs +42 -0
  120. package/dist/core/writeData.mjs.map +1 -0
  121. package/dist/index.d.mts +32 -0
  122. package/dist/index.d.ts +32 -29
  123. package/dist/index.js +70 -69
  124. package/dist/index.mjs +31 -0
  125. package/dist/loadable-hooks/useClientSideDefer.d.mts +12 -0
  126. package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -0
  127. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -12
  128. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  129. package/dist/loadable-hooks/useClientSideDefer.js +13 -44
  130. package/dist/loadable-hooks/useClientSideDefer.mjs +14 -0
  131. package/dist/loadable-hooks/useClientSideDefer.mjs.map +1 -0
  132. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts +33 -0
  133. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -0
  134. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +26 -22
  135. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  136. package/dist/loadable-hooks/useConnectionSpecPagination.js +133 -172
  137. package/dist/loadable-hooks/useConnectionSpecPagination.mjs +134 -0
  138. package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -0
  139. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts +8 -0
  140. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -0
  141. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -3
  142. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  143. package/dist/loadable-hooks/useImperativeExposedMutationField.js +9 -12
  144. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs +11 -0
  145. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs.map +1 -0
  146. package/dist/loadable-hooks/useImperativeLoadableField.d.mts +19 -0
  147. package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -0
  148. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +15 -11
  149. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  150. package/dist/loadable-hooks/useImperativeLoadableField.js +16 -12
  151. package/dist/loadable-hooks/useImperativeLoadableField.mjs +17 -0
  152. package/dist/loadable-hooks/useImperativeLoadableField.mjs.map +1 -0
  153. package/dist/loadable-hooks/useSkipLimitPagination.d.mts +24 -0
  154. package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -0
  155. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +19 -15
  156. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  157. package/dist/loadable-hooks/useSkipLimitPagination.js +118 -160
  158. package/dist/loadable-hooks/useSkipLimitPagination.mjs +119 -0
  159. package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -0
  160. package/dist/react/FragmentReader.d.mts +18 -0
  161. package/dist/react/FragmentReader.d.mts.map +1 -0
  162. package/dist/react/FragmentReader.d.ts +16 -8
  163. package/dist/react/FragmentReader.d.ts.map +1 -1
  164. package/dist/react/FragmentReader.js +8 -7
  165. package/dist/react/FragmentReader.mjs +10 -0
  166. package/dist/react/FragmentReader.mjs.map +1 -0
  167. package/dist/react/FragmentRenderer.d.mts +20 -0
  168. package/dist/react/FragmentRenderer.d.mts.map +1 -0
  169. package/dist/react/FragmentRenderer.d.ts +18 -14
  170. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  171. package/dist/react/FragmentRenderer.js +11 -33
  172. package/dist/react/FragmentRenderer.mjs +12 -0
  173. package/dist/react/FragmentRenderer.mjs.map +1 -0
  174. package/dist/react/IsographEnvironmentProvider.d.mts +17 -0
  175. package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -0
  176. package/dist/react/IsographEnvironmentProvider.d.ts +15 -9
  177. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  178. package/dist/react/IsographEnvironmentProvider.js +15 -39
  179. package/dist/react/IsographEnvironmentProvider.mjs +17 -0
  180. package/dist/react/IsographEnvironmentProvider.mjs.map +1 -0
  181. package/dist/react/LoadableFieldReader.d.mts +21 -0
  182. package/dist/react/LoadableFieldReader.d.mts.map +1 -0
  183. package/dist/react/LoadableFieldReader.d.ts +15 -12
  184. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  185. package/dist/react/LoadableFieldReader.js +13 -47
  186. package/dist/react/LoadableFieldReader.mjs +14 -0
  187. package/dist/react/LoadableFieldReader.mjs.map +1 -0
  188. package/dist/react/LoadableFieldRenderer.d.mts +22 -0
  189. package/dist/react/LoadableFieldRenderer.d.mts.map +1 -0
  190. package/dist/react/LoadableFieldRenderer.d.ts +16 -13
  191. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  192. package/dist/react/LoadableFieldRenderer.js +13 -70
  193. package/dist/react/LoadableFieldRenderer.mjs +14 -0
  194. package/dist/react/LoadableFieldRenderer.mjs.map +1 -0
  195. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +18 -0
  196. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -0
  197. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +11 -3
  198. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -1
  199. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +17 -13
  200. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs +18 -0
  201. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs.map +1 -0
  202. package/dist/react/createIsographEnvironment.d.mts +9 -0
  203. package/dist/react/createIsographEnvironment.d.mts.map +1 -0
  204. package/dist/react/createIsographEnvironment.d.ts +8 -0
  205. package/dist/react/createIsographEnvironment.d.ts.map +1 -0
  206. package/dist/react/createIsographEnvironment.js +10 -0
  207. package/dist/react/createIsographEnvironment.mjs +11 -0
  208. package/dist/react/createIsographEnvironment.mjs.map +1 -0
  209. package/dist/react/maybeUnwrapNetworkRequest.js +11 -0
  210. package/dist/react/maybeUnwrapNetworkRequest.mjs +12 -0
  211. package/dist/react/maybeUnwrapNetworkRequest.mjs.map +1 -0
  212. package/dist/react/useImperativeReference.d.mts +15 -0
  213. package/dist/react/useImperativeReference.d.mts.map +1 -0
  214. package/dist/react/useImperativeReference.d.ts +13 -8
  215. package/dist/react/useImperativeReference.d.ts.map +1 -1
  216. package/dist/react/useImperativeReference.js +34 -30
  217. package/dist/react/useImperativeReference.mjs +35 -0
  218. package/dist/react/useImperativeReference.mjs.map +1 -0
  219. package/dist/react/useLazyReference.d.mts +13 -0
  220. package/dist/react/useLazyReference.d.mts.map +1 -0
  221. package/dist/react/useLazyReference.d.ts +11 -6
  222. package/dist/react/useLazyReference.d.ts.map +1 -1
  223. package/dist/react/useLazyReference.js +17 -40
  224. package/dist/react/useLazyReference.mjs +18 -0
  225. package/dist/react/useLazyReference.mjs.map +1 -0
  226. package/dist/react/useReadAndSubscribe.d.mts +20 -0
  227. package/dist/react/useReadAndSubscribe.d.mts.map +1 -0
  228. package/dist/react/useReadAndSubscribe.d.ts +14 -9
  229. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  230. package/dist/react/useReadAndSubscribe.js +57 -37
  231. package/dist/react/useReadAndSubscribe.mjs +59 -0
  232. package/dist/react/useReadAndSubscribe.mjs.map +1 -0
  233. package/dist/react/useRerenderOnChange.d.mts +12 -0
  234. package/dist/react/useRerenderOnChange.d.mts.map +1 -0
  235. package/dist/react/useRerenderOnChange.d.ts +10 -6
  236. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  237. package/dist/react/useRerenderOnChange.js +16 -20
  238. package/dist/react/useRerenderOnChange.mjs +17 -0
  239. package/dist/react/useRerenderOnChange.mjs.map +1 -0
  240. package/dist/react/useResult.d.mts +8 -0
  241. package/dist/react/useResult.d.mts.map +1 -0
  242. package/dist/react/useResult.d.ts +7 -5
  243. package/dist/react/useResult.d.ts.map +1 -1
  244. package/dist/react/useResult.js +27 -40
  245. package/dist/react/useResult.mjs +30 -0
  246. package/dist/react/useResult.mjs.map +1 -0
  247. package/package.json +17 -9
  248. package/src/core/FragmentReference.ts +3 -3
  249. package/src/core/IsographEnvironment.ts +29 -16
  250. package/src/core/areEqualWithDeepComparison.ts +2 -18
  251. package/src/core/cache.ts +18 -383
  252. package/src/core/check.ts +9 -16
  253. package/src/core/componentCache.ts +10 -47
  254. package/src/core/entrypoint.ts +15 -3
  255. package/src/core/garbageCollection.ts +21 -10
  256. package/src/core/getOrCreateCacheForArtifact.ts +86 -0
  257. package/src/core/logging.ts +10 -10
  258. package/src/core/makeNetworkRequest.ts +16 -23
  259. package/src/core/optimisticProxy.ts +28 -47
  260. package/src/core/read.ts +21 -38
  261. package/src/core/reader.ts +8 -11
  262. package/src/core/startUpdate.ts +2 -6
  263. package/src/core/subscribe.ts +189 -0
  264. package/src/core/util.ts +26 -0
  265. package/src/core/writeData.ts +79 -0
  266. package/src/index.ts +5 -4
  267. package/src/loadable-hooks/useClientSideDefer.ts +4 -4
  268. package/src/loadable-hooks/useConnectionSpecPagination.ts +20 -18
  269. package/src/loadable-hooks/useImperativeLoadableField.ts +3 -3
  270. package/src/loadable-hooks/useSkipLimitPagination.ts +20 -18
  271. package/src/react/IsographEnvironmentProvider.tsx +2 -1
  272. package/src/react/LoadableFieldReader.tsx +2 -4
  273. package/src/react/LoadableFieldRenderer.tsx +2 -4
  274. package/src/react/createIsographEnvironment.ts +23 -0
  275. package/src/react/maybeUnwrapNetworkRequest.ts +17 -0
  276. package/src/react/useImperativeReference.ts +5 -4
  277. package/src/react/useLazyReference.ts +7 -8
  278. package/src/react/useReadAndSubscribe.ts +53 -5
  279. package/src/react/useRerenderOnChange.ts +3 -3
  280. package/src/react/useResult.ts +6 -24
  281. package/src/tests/__isograph/Economist/__link/output_type.ts +2 -0
  282. package/src/tests/garbageCollection.test.ts +3 -6
  283. package/src/tests/meNameSuccessor.ts +1 -1
  284. package/src/tests/nodeQuery.ts +2 -2
  285. package/src/tests/normalizeData.test.ts +5 -3
  286. package/src/tests/optimisticProxy.test.ts +7 -5
  287. package/src/tests/startUpdate.test.ts +5 -7
  288. package/vitest.config.ts +5 -0
  289. package/dist/core/areEqualWithDeepComparison.d.ts +0 -3
  290. package/dist/core/areEqualWithDeepComparison.d.ts.map +0 -1
  291. package/dist/core/brand.js +0 -2
  292. package/dist/core/componentCache.d.ts +0 -5
  293. package/dist/core/componentCache.d.ts.map +0 -1
  294. package/dist/core/reader.js +0 -2
  295. package/dist/core/startUpdate.d.ts +0 -9
  296. package/dist/core/startUpdate.d.ts.map +0 -1
  297. package/dist/index.d.ts.map +0 -1
package/src/core/check.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { getParentRecordKey } from './cache';
2
- import { NormalizationAstNodes } from './entrypoint';
3
- import { Variables } from './FragmentReference';
4
- import {
5
- getLink,
2
+ import type { NormalizationAstNodes } from './entrypoint';
3
+ import type { Variables } from './FragmentReference';
4
+ import type {
6
5
  IsographEnvironment,
7
6
  StoreLink,
8
7
  StoreRecord,
9
8
  } from './IsographEnvironment';
9
+ import { getLink } from './IsographEnvironment';
10
10
  import { logMessage } from './logging';
11
11
  import { getStoreRecordProxy } from './optimisticProxy';
12
12
 
@@ -108,12 +108,12 @@ function checkFromRecord(
108
108
  kind: 'MissingData',
109
109
  record: recordLink,
110
110
  };
111
- } else if (linkedValue === null) {
111
+ } else if (linkedValue == null) {
112
112
  continue;
113
113
  } else if (Array.isArray(linkedValue)) {
114
114
  arrayItemsLoop: for (const item of linkedValue) {
115
115
  const link = getLink(item);
116
- if (link === null) {
116
+ if (link == null) {
117
117
  throw new Error(
118
118
  'Unexpected non-link in the Isograph store. ' +
119
119
  'This is indicative of a bug in Isograph.',
@@ -127,7 +127,7 @@ function checkFromRecord(
127
127
  kind: 'MissingData',
128
128
  record: link,
129
129
  };
130
- } else if (linkedRecord === null) {
130
+ } else if (linkedRecord == null) {
131
131
  continue arrayItemsLoop;
132
132
  } else {
133
133
  // TODO in __DEV__ assert linkedRecord is an object
@@ -146,7 +146,7 @@ function checkFromRecord(
146
146
  }
147
147
  } else {
148
148
  const link = getLink(linkedValue);
149
- if (link === null) {
149
+ if (link == null) {
150
150
  throw new Error(
151
151
  'Unexpected non-link in the Isograph store. ' +
152
152
  'This is indicative of a bug in Isograph.',
@@ -160,7 +160,7 @@ function checkFromRecord(
160
160
  kind: 'MissingData',
161
161
  record: link,
162
162
  };
163
- } else if (linkedRecord === null) {
163
+ } else if (linkedRecord == null) {
164
164
  continue normalizationAstLoop;
165
165
  } else {
166
166
  // TODO in __DEV__ assert linkedRecord is an object
@@ -206,13 +206,6 @@ function checkFromRecord(
206
206
 
207
207
  continue normalizationAstLoop;
208
208
  }
209
- default: {
210
- let _: never = normalizationAstNode;
211
- _;
212
- throw new Error(
213
- 'Unexpected case. This is indicative of a bug in Isograph.',
214
- );
215
- }
216
209
  }
217
210
  }
218
211
 
@@ -1,13 +1,7 @@
1
- import { useReadAndSubscribe } from '../react/useReadAndSubscribe';
2
- import { maybeUnwrapNetworkRequest } from '../react/useResult';
3
- import {
4
- FragmentReference,
5
- stableIdForFragmentReference,
6
- } from './FragmentReference';
7
- import { IsographEnvironment } from './IsographEnvironment';
8
- import { logMessage } from './logging';
9
- import { readPromise } from './PromiseWrapper';
10
- import { NetworkRequestReaderOptions } from './read';
1
+ import type { FragmentReference } from './FragmentReference';
2
+ import { stableIdForFragmentReference } from './FragmentReference';
3
+ import type { IsographEnvironment } from './IsographEnvironment';
4
+ import type { NetworkRequestReaderOptions } from './read';
11
5
  import { createStartUpdate } from './startUpdate';
12
6
 
13
7
  export function getOrCreateCachedComponent(
@@ -24,41 +18,10 @@ export function getOrCreateCachedComponent(
24
18
 
25
19
  return (environment.componentCache[
26
20
  stableIdForFragmentReference(fragmentReference)
27
- ] ??= (() => {
28
- function Component(additionalRuntimeProps: { [key: string]: any }) {
29
- maybeUnwrapNetworkRequest(
30
- fragmentReference.networkRequest,
31
- networkRequestOptions,
32
- );
33
- const readerWithRefetchQueries = readPromise(
34
- fragmentReference.readerWithRefetchQueries,
35
- );
36
-
37
- const data = useReadAndSubscribe(
38
- fragmentReference,
39
- networkRequestOptions,
40
- readerWithRefetchQueries.readerArtifact.readerAst,
41
- );
42
-
43
- logMessage(environment, () => ({
44
- kind: 'ComponentRerendered',
45
- componentName: fragmentReference.fieldName,
46
- rootLink: fragmentReference.root,
47
- }));
48
-
49
- return readerWithRefetchQueries.readerArtifact.resolver(
50
- {
51
- data,
52
- parameters: fragmentReference.variables,
53
- startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
54
- ? startUpdate
55
- : undefined,
56
- },
57
- additionalRuntimeProps,
58
- );
59
- }
60
- const idString = `(type: ${fragmentReference.root.__typename}, id: ${fragmentReference.root.__link})`;
61
- Component.displayName = `${fragmentReference.fieldName} ${idString} @component`;
62
- return Component;
63
- })());
21
+ ] ??= environment.componentFunction(
22
+ environment,
23
+ fragmentReference,
24
+ networkRequestOptions,
25
+ startUpdate,
26
+ ));
64
27
  }
@@ -1,9 +1,12 @@
1
1
  import type { Contravariant, PhantomData } from './brand';
2
2
  import type { NetworkResponseObject } from './cache';
3
- import type { UnknownTReadFromStore } from './FragmentReference';
3
+ import type {
4
+ FragmentReference,
5
+ UnknownTReadFromStore,
6
+ } from './FragmentReference';
4
7
  import type { ComponentOrFieldName, TypeName } from './IsographEnvironment';
5
- import { TopLevelReaderArtifact } from './reader';
6
- import { Arguments } from './util';
8
+ import type { TopLevelReaderArtifact } from './reader';
9
+ import type { Arguments } from './util';
7
10
 
8
11
  export type ReaderWithRefetchQueries<
9
12
  TReadFromStore extends UnknownTReadFromStore,
@@ -75,6 +78,13 @@ export type IsographEntrypoint<
75
78
  readonly '~TRawResponseType'?: PhantomData<Contravariant<TRawResponseType>>;
76
79
  };
77
80
 
81
+ export type FragmentReferenceOfEntrypoint<
82
+ TEntrypoint extends IsographEntrypoint<any, any, any, any>,
83
+ > = FragmentReference<
84
+ ExtractReadFromStore<TEntrypoint>,
85
+ ExtractClientFieldValue<TEntrypoint>
86
+ >;
87
+
78
88
  export type IsographEntrypointLoader<
79
89
  TReadFromStore extends UnknownTReadFromStore,
80
90
  TClientFieldValue,
@@ -173,6 +183,8 @@ export function assertIsEntrypoint<
173
183
 
174
184
  export type ExtractReadFromStore<Type> =
175
185
  Type extends IsographEntrypoint<infer X, any, any, any> ? X : never;
186
+ export type ExtractClientFieldValue<Type> =
187
+ Type extends IsographEntrypoint<any, infer X, any, any> ? X : never;
176
188
  export type ExtractRawResponseType<Type> =
177
189
  Type extends IsographEntrypoint<any, any, any, infer X> ? X : never;
178
190
  export type ExtractResolverResult<Type> =
@@ -1,11 +1,11 @@
1
- import { getParentRecordKey } from './cache';
2
- import { NormalizationAstNodes, type NormalizationAst } from './entrypoint';
3
- import { Variables } from './FragmentReference';
1
+ import { getParentRecordKey, TYPENAME_FIELD_NAME } from './cache';
2
+ import type { NormalizationAstNodes, NormalizationAst } from './entrypoint';
3
+ import type { Variables } from './FragmentReference';
4
4
  import {
5
5
  assertLink,
6
- DataId,
7
- IsographEnvironment,
8
- StoreRecord,
6
+ type DataId,
7
+ type IsographEnvironment,
8
+ type StoreRecord,
9
9
  type StoreLayerData,
10
10
  type StoreLink,
11
11
  type TypeName,
@@ -101,7 +101,7 @@ export function garbageCollectBaseStoreLayer(
101
101
  const retainedTypeIds = retainedIds[typeName];
102
102
 
103
103
  // delete all objects
104
- if (retainedTypeIds == undefined || retainedTypeIds.size == 0) {
104
+ if (retainedTypeIds === undefined || retainedTypeIds.size === 0) {
105
105
  delete baseStoreLayer.data[typeName];
106
106
  continue;
107
107
  }
@@ -135,7 +135,7 @@ function recordReachableIds(
135
135
  ] ??= new Set());
136
136
  retainedRecordsIds.add(retainedQuery.root.__link);
137
137
 
138
- if (record) {
138
+ if (record != null) {
139
139
  recordReachableIdsFromRecord(
140
140
  dataLayer,
141
141
  record,
@@ -155,6 +155,17 @@ function recordReachableIdsFromRecord(
155
155
  ) {
156
156
  for (const selection of selections) {
157
157
  switch (selection.kind) {
158
+ case 'InlineFragment':
159
+ if (currentRecord[TYPENAME_FIELD_NAME] === selection.type) {
160
+ recordReachableIdsFromRecord(
161
+ dataLayer,
162
+ currentRecord,
163
+ mutableRetainedIds,
164
+ selection.selections,
165
+ variables,
166
+ );
167
+ }
168
+ continue;
158
169
  case 'Linked':
159
170
  const linkKey = getParentRecordKey(selection, variables ?? {});
160
171
  const linkedFieldOrFields = currentRecord[linkKey];
@@ -175,11 +186,11 @@ function recordReachableIdsFromRecord(
175
186
  }
176
187
 
177
188
  let typeStore =
178
- selection.concreteType !== null
189
+ selection.concreteType != null
179
190
  ? dataLayer[selection.concreteType]
180
191
  : null;
181
192
 
182
- if (typeStore == null && selection.concreteType !== null) {
193
+ if (typeStore == null && selection.concreteType != null) {
183
194
  continue;
184
195
  }
185
196
 
@@ -0,0 +1,86 @@
1
+ import type { ItemCleanupPair } from '@isograph/isograph-disposable-types/dist';
2
+ import type { ParentCache } from '@isograph/isograph-react-disposable-state/dist';
3
+ import {
4
+ type NetworkResponseObject,
5
+ getOrCreateItemInSuspenseCache,
6
+ } from './cache';
7
+ import type { FetchOptions } from './check';
8
+ import type {
9
+ IsographEntrypoint,
10
+ NormalizationAst,
11
+ NormalizationAstLoader,
12
+ } from './entrypoint';
13
+ import type {
14
+ ExtractParameters,
15
+ FragmentReference,
16
+ UnknownTReadFromStore,
17
+ } from './FragmentReference';
18
+ import {
19
+ type IsographEnvironment,
20
+ getOrLoadReaderWithRefetchQueries,
21
+ ROOT_ID,
22
+ } from './IsographEnvironment';
23
+ import { maybeMakeNetworkRequest } from './makeNetworkRequest';
24
+ import { stableCopy } from './util';
25
+
26
+ export function getOrCreateCacheForArtifact<
27
+ TReadFromStore extends UnknownTReadFromStore,
28
+ TClientFieldValue,
29
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
30
+ TRawResponseType extends NetworkResponseObject,
31
+ >(
32
+ environment: IsographEnvironment,
33
+ entrypoint: IsographEntrypoint<
34
+ TReadFromStore,
35
+ TClientFieldValue,
36
+ TNormalizationAst,
37
+ TRawResponseType
38
+ >,
39
+ variables: ExtractParameters<TReadFromStore>,
40
+ fetchOptions?: FetchOptions<TClientFieldValue, TRawResponseType>,
41
+ ): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {
42
+ let cacheKey = '';
43
+ switch (entrypoint.networkRequestInfo.operation.kind) {
44
+ case 'Operation':
45
+ cacheKey =
46
+ entrypoint.networkRequestInfo.operation.text +
47
+ JSON.stringify(stableCopy(variables));
48
+ break;
49
+ case 'PersistedOperation':
50
+ cacheKey =
51
+ entrypoint.networkRequestInfo.operation.operationId +
52
+ JSON.stringify(stableCopy(variables));
53
+ break;
54
+ }
55
+ const factory = () => {
56
+ const { fieldName, readerArtifactKind, readerWithRefetchQueries } =
57
+ getOrLoadReaderWithRefetchQueries(
58
+ environment,
59
+ entrypoint.readerWithRefetchQueries,
60
+ );
61
+ const [networkRequest, disposeNetworkRequest] = maybeMakeNetworkRequest(
62
+ environment,
63
+ entrypoint,
64
+ variables,
65
+ readerWithRefetchQueries,
66
+ fetchOptions ?? null,
67
+ );
68
+
69
+ const itemCleanupPair: ItemCleanupPair<
70
+ FragmentReference<TReadFromStore, TClientFieldValue>
71
+ > = [
72
+ {
73
+ kind: 'FragmentReference',
74
+ readerWithRefetchQueries,
75
+ fieldName,
76
+ readerArtifactKind,
77
+ root: { __link: ROOT_ID, __typename: entrypoint.concreteType },
78
+ variables,
79
+ networkRequest: networkRequest,
80
+ },
81
+ disposeNetworkRequest,
82
+ ];
83
+ return itemCleanupPair;
84
+ };
85
+ return getOrCreateItemInSuspenseCache(environment, cacheKey, factory);
86
+ }
@@ -1,19 +1,19 @@
1
- import { CleanupFn } from '@isograph/disposable-types';
2
- import { NetworkResponseObject, type EncounteredIds } from './cache';
3
- import { CheckResult } from './check';
4
- import {
1
+ import type { CleanupFn } from '@isograph/disposable-types';
2
+ import type { NetworkResponseObject, EncounteredIds } from './cache';
3
+ import type { CheckResult } from './check';
4
+ import type {
5
5
  IsographEntrypoint,
6
6
  RefetchQueryNormalizationArtifact,
7
- type NormalizationAstNodes,
7
+ NormalizationAstNodes,
8
8
  } from './entrypoint';
9
- import { FragmentReference, Variables } from './FragmentReference';
10
- import {
9
+ import type { FragmentReference, Variables } from './FragmentReference';
10
+ import type {
11
11
  IsographEnvironment,
12
12
  StoreRecord,
13
- type StoreLink,
13
+ StoreLink,
14
14
  } from './IsographEnvironment';
15
- import { ReadDataResult } from './read';
16
- import { Arguments } from './util';
15
+ import type { ReadDataResult } from './read';
16
+ import type { Arguments } from './util';
17
17
  import type { StoreLayer } from './optimisticProxy';
18
18
 
19
19
  /**
@@ -1,31 +1,32 @@
1
- import { ItemCleanupPair } from '@isograph/disposable-types';
1
+ import type { ItemCleanupPair } from '@isograph/disposable-types';
2
2
  import {
3
- callSubscriptions,
4
3
  normalizeData,
5
4
  type EncounteredIds,
6
5
  type NetworkResponseObject,
7
6
  } from './cache';
8
- import { check, DEFAULT_SHOULD_FETCH_VALUE, FetchOptions } from './check';
7
+ import type { FetchOptions } from './check';
8
+ import { check, DEFAULT_SHOULD_FETCH_VALUE } from './check';
9
9
  import { getOrCreateCachedComponent } from './componentCache';
10
- import {
10
+ import type {
11
11
  IsographEntrypoint,
12
+ NormalizationAst,
13
+ NormalizationAstLoader,
12
14
  ReaderWithRefetchQueries,
13
15
  RefetchQueryNormalizationArtifact,
14
- type NormalizationAst,
15
- type NormalizationAstLoader,
16
16
  } from './entrypoint';
17
- import {
17
+ import type {
18
18
  ExtractParameters,
19
- type FragmentReference,
20
- type UnknownTReadFromStore,
19
+ FragmentReference,
20
+ UnknownTReadFromStore,
21
21
  } from './FragmentReference';
22
+ import type { RetainedQuery } from './garbageCollection';
22
23
  import {
23
24
  garbageCollectEnvironment,
24
- RetainedQuery,
25
25
  retainQuery,
26
26
  unretainQuery,
27
27
  } from './garbageCollection';
28
- import { IsographEnvironment, ROOT_ID, StoreLink } from './IsographEnvironment';
28
+ import type { IsographEnvironment, StoreLink } from './IsographEnvironment';
29
+ import { ROOT_ID } from './IsographEnvironment';
29
30
  import { logMessage } from './logging';
30
31
  import {
31
32
  addNetworkResponseStoreLayer,
@@ -34,14 +35,11 @@ import {
34
35
  type OptimisticStoreLayer,
35
36
  type StoreLayerWithData,
36
37
  } from './optimisticProxy';
37
- import {
38
- AnyError,
39
- PromiseWrapper,
40
- wrapPromise,
41
- wrapResolvedValue,
42
- } from './PromiseWrapper';
38
+ import type { AnyError, PromiseWrapper } from './PromiseWrapper';
39
+ import { wrapPromise, wrapResolvedValue } from './PromiseWrapper';
43
40
  import { readButDoNotEvaluate } from './read';
44
41
  import { getOrCreateCachedStartUpdate } from './startUpdate';
42
+ import { callSubscriptions } from './subscribe';
45
43
 
46
44
  let networkRequestId = 0;
47
45
 
@@ -460,11 +458,6 @@ function readDataForOnComplete<
460
458
  : undefined),
461
459
  });
462
460
  }
463
- default: {
464
- const _: never = readerArtifact;
465
- _;
466
- throw new Error('Expected case');
467
- }
468
461
  }
469
462
  }
470
463
  return null;
@@ -557,7 +550,7 @@ function revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(
557
550
  status: NetworkRequestStatusUndisposedIncomplete,
558
551
  normalizeData: null | ((storeLayer: StoreLayerWithData) => void),
559
552
  ): NetworkRequestStatusUndisposedComplete {
560
- if (status.optimistic) {
553
+ if (status.optimistic != null) {
561
554
  revertOptimisticStoreLayerAndMaybeReplace(
562
555
  environment,
563
556
  status.optimistic,
@@ -1,8 +1,5 @@
1
- import {
2
- callSubscriptions,
3
- insertEmptySetIfMissing,
4
- type EncounteredIds,
5
- } from './cache';
1
+ import { insertEmptySetIfMissing, type EncounteredIds } from './cache';
2
+ import { callSubscriptions } from './subscribe';
6
3
  import type {
7
4
  BaseStoreLayerData,
8
5
  IsographEnvironment,
@@ -29,15 +26,18 @@ export function getStoreRecordProxy(
29
26
  link: StoreLink,
30
27
  ): Readonly<StoreRecord> | null | undefined {
31
28
  let startNode: StoreLayer | null = storeLayer;
32
- while (startNode !== null) {
29
+ while (startNode != null) {
33
30
  const storeRecord = startNode.data[link.__typename]?.[link.__link];
34
- if (storeRecord === null) {
35
- return null;
31
+ if (storeRecord === undefined) {
32
+ startNode = startNode.parentStoreLayer;
33
+ continue;
36
34
  }
37
- if (storeRecord != null) {
38
- return getMutableStoreRecordProxy(startNode, link);
35
+
36
+ if (storeRecord == null) {
37
+ return null;
39
38
  }
40
- startNode = startNode.parentStoreLayer;
39
+
40
+ return getMutableStoreRecordProxy(startNode, link);
41
41
  }
42
42
 
43
43
  return undefined;
@@ -52,13 +52,13 @@ export function getMutableStoreRecordProxy(
52
52
  {
53
53
  get(_, propertyName) {
54
54
  let currentStoreLayer: StoreLayer | null = childMostStoreLayer;
55
- while (currentStoreLayer !== null) {
55
+ while (currentStoreLayer != null) {
56
56
  const storeRecord =
57
57
  currentStoreLayer.data[link.__typename]?.[link.__link];
58
- if (storeRecord === null) {
59
- return undefined;
60
- }
61
- if (storeRecord != null) {
58
+ if (storeRecord !== undefined) {
59
+ if (storeRecord == null) {
60
+ return undefined;
61
+ }
62
62
  const value = Reflect.get(storeRecord, propertyName);
63
63
  if (value !== undefined) {
64
64
  return value;
@@ -69,15 +69,16 @@ export function getMutableStoreRecordProxy(
69
69
  },
70
70
  has(_, propertyName) {
71
71
  let currentStoreLayer: StoreLayer | null = childMostStoreLayer;
72
- while (currentStoreLayer !== null) {
72
+ while (currentStoreLayer != null) {
73
73
  const storeRecord =
74
74
  currentStoreLayer.data[link.__typename]?.[link.__link];
75
- if (storeRecord === null) {
76
- return false;
77
- }
78
- if (storeRecord != null) {
75
+ if (storeRecord !== undefined) {
76
+ if (storeRecord == null) {
77
+ return false;
78
+ }
79
+
79
80
  const value = Reflect.has(storeRecord, propertyName);
80
- if (value !== undefined) {
81
+ if (value) {
81
82
  return true;
82
83
  }
83
84
  }
@@ -178,10 +179,6 @@ export function addNetworkResponseStoreLayer(
178
179
 
179
180
  return node;
180
181
  }
181
- default: {
182
- parent satisfies never;
183
- throw new Error('Unreachable. This is a bug in Isograph.');
184
- }
185
182
  }
186
183
  }
187
184
 
@@ -193,7 +190,7 @@ function mergeDataLayer(target: StoreLayerData, source: StoreLayerData): void {
193
190
  }
194
191
  const targetRecordById = (target[typeName] ??= {});
195
192
  for (const [id, sourceRecord] of Object.entries(sourceById)) {
196
- if (sourceRecord === null) {
193
+ if (sourceRecord == null) {
197
194
  targetRecordById[id] = null;
198
195
  continue;
199
196
  }
@@ -239,10 +236,6 @@ export function addStartUpdateStoreLayer(
239
236
  startUpdate(node);
240
237
  return node;
241
238
  }
242
- default: {
243
- parent satisfies never;
244
- throw new Error('Unreachable. This is a bug in Isograph.');
245
- }
246
239
  }
247
240
  }
248
241
 
@@ -269,10 +262,6 @@ export function addOptimisticUpdaterStoreLayer(
269
262
 
270
263
  return node;
271
264
  }
272
- default: {
273
- parent satisfies never;
274
- throw new Error('Unreachable. This is a bug in Isograph.');
275
- }
276
265
  }
277
266
  }
278
267
 
@@ -296,10 +285,6 @@ export function addOptimisticNetworkResponseStoreLayer(
296
285
 
297
286
  return node;
298
287
  }
299
- default: {
300
- parent satisfies never;
301
- throw new Error('Unreachable. This is a bug in Isograph.');
302
- }
303
288
  }
304
289
  }
305
290
 
@@ -321,7 +306,7 @@ function mergeLayersWithDataIntoBaseLayer(
321
306
  baseStoreLayer: BaseStoreLayer,
322
307
  ) {
323
308
  while (
324
- storeLayerToMerge &&
309
+ storeLayerToMerge != null &&
325
310
  storeLayerToMerge.kind !== 'OptimisticUpdaterStoreLayer'
326
311
  ) {
327
312
  mergeDataLayer(baseStoreLayer.data, storeLayerToMerge.data);
@@ -355,7 +340,7 @@ function reexecuteUpdatesAndMergeData(
355
340
  // reflects whatever replaced the optimistic layer
356
341
  newMergedData: StoreLayerData,
357
342
  ): void {
358
- while (storeLayer !== null) {
343
+ while (storeLayer != null) {
359
344
  mergeDataLayer(oldMergedData, storeLayer.data);
360
345
  switch (storeLayer.kind) {
361
346
  case 'OptimisticNetworkResponseStoreLayer':
@@ -371,10 +356,6 @@ function reexecuteUpdatesAndMergeData(
371
356
  storeLayer.startUpdate(storeLayer);
372
357
  break;
373
358
  }
374
- default: {
375
- storeLayer satisfies never;
376
- throw new Error('Unreachable. This is a bug in Isograph.');
377
- }
378
359
  }
379
360
  mergeDataLayer(newMergedData, storeLayer.data);
380
361
 
@@ -394,7 +375,7 @@ function setChildOfNode<TStoreLayer extends StoreLayer>(
394
375
  newChildStoreLayer: TStoreLayer['childStoreLayer'],
395
376
  ) {
396
377
  storeLayerToModify.childStoreLayer = newChildStoreLayer;
397
- if (newChildStoreLayer !== null) {
378
+ if (newChildStoreLayer != null) {
398
379
  newChildStoreLayer.parentStoreLayer = storeLayerToModify;
399
380
  } else {
400
381
  environment.store = storeLayerToModify;
@@ -427,7 +408,7 @@ export function revertOptimisticStoreLayerAndMaybeReplace(
427
408
 
428
409
  let newMergedData = {};
429
410
  let childNode = optimisticNode.childStoreLayer;
430
- if (normalizeData !== null) {
411
+ if (normalizeData != null) {
431
412
  const networkResponseStoreLayer: NetworkResponseStoreLayer = {
432
413
  kind: 'NetworkResponseStoreLayer',
433
414
  data: {},