@isograph/react 0.4.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/.turbo/turbo-compile-libs.log +10 -3
  2. package/dist/_virtual/rolldown_runtime.js +25 -0
  3. package/dist/core/FragmentReference.d.mts +38 -0
  4. package/dist/core/FragmentReference.d.mts.map +1 -0
  5. package/dist/core/FragmentReference.d.ts +31 -27
  6. package/dist/core/FragmentReference.d.ts.map +1 -1
  7. package/dist/core/FragmentReference.js +8 -6
  8. package/dist/core/FragmentReference.mjs +10 -0
  9. package/dist/core/FragmentReference.mjs.map +1 -0
  10. package/dist/core/IsographEnvironment.d.mts +89 -0
  11. package/dist/core/IsographEnvironment.d.mts.map +1 -0
  12. package/dist/core/IsographEnvironment.d.ts +77 -72
  13. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  14. package/dist/core/IsographEnvironment.js +62 -59
  15. package/dist/core/IsographEnvironment.mjs +67 -0
  16. package/dist/core/IsographEnvironment.mjs.map +1 -0
  17. package/dist/core/PromiseWrapper.d.mts +36 -0
  18. package/dist/core/PromiseWrapper.d.mts.map +1 -0
  19. package/dist/core/PromiseWrapper.d.ts +27 -18
  20. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  21. package/dist/core/PromiseWrapper.js +45 -43
  22. package/dist/core/PromiseWrapper.mjs +49 -0
  23. package/dist/core/PromiseWrapper.mjs.map +1 -0
  24. package/dist/core/areEqualWithDeepComparison.js +56 -108
  25. package/dist/core/areEqualWithDeepComparison.mjs +62 -0
  26. package/dist/core/areEqualWithDeepComparison.mjs.map +1 -0
  27. package/dist/core/brand.d.mts +19 -0
  28. package/dist/core/brand.d.mts.map +1 -0
  29. package/dist/core/brand.d.ts +18 -1
  30. package/dist/core/brand.d.ts.map +1 -1
  31. package/dist/core/cache.d.mts +20 -0
  32. package/dist/core/cache.d.mts.map +1 -0
  33. package/dist/core/cache.d.ts +18 -34
  34. package/dist/core/cache.d.ts.map +1 -1
  35. package/dist/core/cache.js +210 -516
  36. package/dist/core/cache.mjs +237 -0
  37. package/dist/core/cache.mjs.map +1 -0
  38. package/dist/core/check.d.mts +28 -0
  39. package/dist/core/check.d.mts.map +1 -0
  40. package/dist/core/check.d.ts +24 -18
  41. package/dist/core/check.d.ts.map +1 -1
  42. package/dist/core/check.js +80 -124
  43. package/dist/core/check.mjs +84 -0
  44. package/dist/core/check.mjs.map +1 -0
  45. package/dist/core/componentCache.js +10 -34
  46. package/dist/core/componentCache.mjs +12 -0
  47. package/dist/core/componentCache.mjs.map +1 -0
  48. package/dist/core/entrypoint.d.mts +99 -0
  49. package/dist/core/entrypoint.d.mts.map +1 -0
  50. package/dist/core/entrypoint.d.ts +83 -68
  51. package/dist/core/entrypoint.d.ts.map +1 -1
  52. package/dist/core/entrypoint.js +6 -5
  53. package/dist/core/entrypoint.mjs +8 -0
  54. package/dist/core/entrypoint.mjs.map +1 -0
  55. package/dist/core/garbageCollection.d.mts +18 -0
  56. package/dist/core/garbageCollection.d.mts.map +1 -0
  57. package/dist/core/garbageCollection.d.ts +15 -10
  58. package/dist/core/garbageCollection.d.ts.map +1 -1
  59. package/dist/core/garbageCollection.js +82 -99
  60. package/dist/core/garbageCollection.mjs +89 -0
  61. package/dist/core/garbageCollection.mjs.map +1 -0
  62. package/dist/core/getOrCreateCacheForArtifact.js +37 -0
  63. package/dist/core/getOrCreateCacheForArtifact.mjs +38 -0
  64. package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -0
  65. package/dist/core/logging.d.mts +95 -0
  66. package/dist/core/logging.d.mts.map +1 -0
  67. package/dist/core/logging.d.ts +78 -60
  68. package/dist/core/logging.d.ts.map +1 -1
  69. package/dist/core/logging.js +17 -18
  70. package/dist/core/logging.mjs +20 -0
  71. package/dist/core/logging.mjs.map +1 -0
  72. package/dist/core/makeNetworkRequest.d.mts +13 -0
  73. package/dist/core/makeNetworkRequest.d.mts.map +1 -0
  74. package/dist/core/makeNetworkRequest.d.ts +12 -8
  75. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  76. package/dist/core/makeNetworkRequest.js +188 -195
  77. package/dist/core/makeNetworkRequest.mjs +195 -0
  78. package/dist/core/makeNetworkRequest.mjs.map +1 -0
  79. package/dist/core/optimisticProxy.d.mts +43 -0
  80. package/dist/core/optimisticProxy.d.mts.map +1 -0
  81. package/dist/core/optimisticProxy.d.ts +43 -0
  82. package/dist/core/optimisticProxy.d.ts.map +1 -0
  83. package/dist/core/optimisticProxy.js +273 -0
  84. package/dist/core/optimisticProxy.mjs +268 -0
  85. package/dist/core/optimisticProxy.mjs.map +1 -0
  86. package/dist/core/read.d.mts +29 -0
  87. package/dist/core/read.d.mts.map +1 -0
  88. package/dist/core/read.d.ts +23 -27
  89. package/dist/core/read.d.ts.map +1 -1
  90. package/dist/core/read.js +438 -618
  91. package/dist/core/read.mjs +456 -0
  92. package/dist/core/read.mjs.map +1 -0
  93. package/dist/core/reader.d.mts +89 -0
  94. package/dist/core/reader.d.mts.map +1 -0
  95. package/dist/core/reader.d.ts +78 -74
  96. package/dist/core/reader.d.ts.map +1 -1
  97. package/dist/core/startUpdate.js +118 -156
  98. package/dist/core/startUpdate.mjs +125 -0
  99. package/dist/core/startUpdate.mjs.map +1 -0
  100. package/dist/core/subscribe.d.mts +12 -0
  101. package/dist/core/subscribe.d.mts.map +1 -0
  102. package/dist/core/subscribe.d.ts +12 -0
  103. package/dist/core/subscribe.d.ts.map +1 -0
  104. package/dist/core/subscribe.js +79 -0
  105. package/dist/core/subscribe.mjs +79 -0
  106. package/dist/core/subscribe.mjs.map +1 -0
  107. package/dist/core/util.d.mts +27 -0
  108. package/dist/core/util.d.mts.map +1 -0
  109. package/dist/core/util.d.ts +21 -17
  110. package/dist/core/util.d.ts.map +1 -1
  111. package/dist/core/util.js +22 -2
  112. package/dist/core/util.mjs +21 -0
  113. package/dist/core/util.mjs.map +1 -0
  114. package/dist/core/writeData.d.mts +11 -0
  115. package/dist/core/writeData.d.mts.map +1 -0
  116. package/dist/core/writeData.d.ts +11 -0
  117. package/dist/core/writeData.d.ts.map +1 -0
  118. package/dist/core/writeData.js +41 -0
  119. package/dist/core/writeData.mjs +42 -0
  120. package/dist/core/writeData.mjs.map +1 -0
  121. package/dist/index.d.mts +32 -0
  122. package/dist/index.d.ts +32 -29
  123. package/dist/index.js +70 -68
  124. package/dist/index.mjs +31 -0
  125. package/dist/loadable-hooks/useClientSideDefer.d.mts +12 -0
  126. package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -0
  127. package/dist/loadable-hooks/useClientSideDefer.d.ts +10 -8
  128. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  129. package/dist/loadable-hooks/useClientSideDefer.js +14 -12
  130. package/dist/loadable-hooks/useClientSideDefer.mjs +14 -0
  131. package/dist/loadable-hooks/useClientSideDefer.mjs.map +1 -0
  132. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts +33 -0
  133. package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -0
  134. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +27 -21
  135. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  136. package/dist/loadable-hooks/useConnectionSpecPagination.js +133 -158
  137. package/dist/loadable-hooks/useConnectionSpecPagination.mjs +134 -0
  138. package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -0
  139. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts +8 -0
  140. package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -0
  141. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -3
  142. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  143. package/dist/loadable-hooks/useImperativeExposedMutationField.js +9 -12
  144. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs +11 -0
  145. package/dist/loadable-hooks/useImperativeExposedMutationField.mjs.map +1 -0
  146. package/dist/loadable-hooks/useImperativeLoadableField.d.mts +19 -0
  147. package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -0
  148. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +15 -11
  149. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  150. package/dist/loadable-hooks/useImperativeLoadableField.js +16 -12
  151. package/dist/loadable-hooks/useImperativeLoadableField.mjs +17 -0
  152. package/dist/loadable-hooks/useImperativeLoadableField.mjs.map +1 -0
  153. package/dist/loadable-hooks/useSkipLimitPagination.d.mts +24 -0
  154. package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -0
  155. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +19 -15
  156. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  157. package/dist/loadable-hooks/useSkipLimitPagination.js +118 -160
  158. package/dist/loadable-hooks/useSkipLimitPagination.mjs +119 -0
  159. package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -0
  160. package/dist/react/FragmentReader.d.mts +18 -0
  161. package/dist/react/FragmentReader.d.mts.map +1 -0
  162. package/dist/react/FragmentReader.d.ts +16 -7
  163. package/dist/react/FragmentReader.d.ts.map +1 -1
  164. package/dist/react/FragmentReader.js +8 -7
  165. package/dist/react/FragmentReader.mjs +10 -0
  166. package/dist/react/FragmentReader.mjs.map +1 -0
  167. package/dist/react/FragmentRenderer.d.mts +20 -0
  168. package/dist/react/FragmentRenderer.d.mts.map +1 -0
  169. package/dist/react/FragmentRenderer.d.ts +18 -13
  170. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  171. package/dist/react/FragmentRenderer.js +11 -33
  172. package/dist/react/FragmentRenderer.mjs +12 -0
  173. package/dist/react/FragmentRenderer.mjs.map +1 -0
  174. package/dist/react/IsographEnvironmentProvider.d.mts +17 -0
  175. package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -0
  176. package/dist/react/IsographEnvironmentProvider.d.ts +15 -9
  177. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  178. package/dist/react/IsographEnvironmentProvider.js +15 -39
  179. package/dist/react/IsographEnvironmentProvider.mjs +17 -0
  180. package/dist/react/IsographEnvironmentProvider.mjs.map +1 -0
  181. package/dist/react/LoadableFieldReader.d.mts +21 -0
  182. package/dist/react/LoadableFieldReader.d.mts.map +1 -0
  183. package/dist/react/LoadableFieldReader.d.ts +20 -11
  184. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  185. package/dist/react/LoadableFieldReader.js +13 -8
  186. package/dist/react/LoadableFieldReader.mjs +14 -0
  187. package/dist/react/LoadableFieldReader.mjs.map +1 -0
  188. package/dist/react/LoadableFieldRenderer.d.mts +22 -0
  189. package/dist/react/LoadableFieldRenderer.d.mts.map +1 -0
  190. package/dist/react/LoadableFieldRenderer.d.ts +21 -12
  191. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  192. package/dist/react/LoadableFieldRenderer.js +13 -35
  193. package/dist/react/LoadableFieldRenderer.mjs +14 -0
  194. package/dist/react/LoadableFieldRenderer.mjs.map +1 -0
  195. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +18 -0
  196. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -0
  197. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +11 -3
  198. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -1
  199. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +17 -13
  200. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs +18 -0
  201. package/dist/react/RenderAfterCommit__DO_NOT_USE.mjs.map +1 -0
  202. package/dist/react/createIsographEnvironment.d.mts +9 -0
  203. package/dist/react/createIsographEnvironment.d.mts.map +1 -0
  204. package/dist/react/createIsographEnvironment.d.ts +8 -0
  205. package/dist/react/createIsographEnvironment.d.ts.map +1 -0
  206. package/dist/react/createIsographEnvironment.js +10 -0
  207. package/dist/react/createIsographEnvironment.mjs +11 -0
  208. package/dist/react/createIsographEnvironment.mjs.map +1 -0
  209. package/dist/react/maybeUnwrapNetworkRequest.js +11 -0
  210. package/dist/react/maybeUnwrapNetworkRequest.mjs +12 -0
  211. package/dist/react/maybeUnwrapNetworkRequest.mjs.map +1 -0
  212. package/dist/react/useImperativeReference.d.mts +15 -0
  213. package/dist/react/useImperativeReference.d.mts.map +1 -0
  214. package/dist/react/useImperativeReference.d.ts +13 -7
  215. package/dist/react/useImperativeReference.d.ts.map +1 -1
  216. package/dist/react/useImperativeReference.js +34 -32
  217. package/dist/react/useImperativeReference.mjs +35 -0
  218. package/dist/react/useImperativeReference.mjs.map +1 -0
  219. package/dist/react/useLazyReference.d.mts +13 -0
  220. package/dist/react/useLazyReference.d.mts.map +1 -0
  221. package/dist/react/useLazyReference.d.ts +11 -5
  222. package/dist/react/useLazyReference.d.ts.map +1 -1
  223. package/dist/react/useLazyReference.js +17 -40
  224. package/dist/react/useLazyReference.mjs +18 -0
  225. package/dist/react/useLazyReference.mjs.map +1 -0
  226. package/dist/react/useReadAndSubscribe.d.mts +20 -0
  227. package/dist/react/useReadAndSubscribe.d.mts.map +1 -0
  228. package/dist/react/useReadAndSubscribe.d.ts +14 -9
  229. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  230. package/dist/react/useReadAndSubscribe.js +57 -39
  231. package/dist/react/useReadAndSubscribe.mjs +59 -0
  232. package/dist/react/useReadAndSubscribe.mjs.map +1 -0
  233. package/dist/react/useRerenderOnChange.d.mts +12 -0
  234. package/dist/react/useRerenderOnChange.d.mts.map +1 -0
  235. package/dist/react/useRerenderOnChange.d.ts +10 -6
  236. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  237. package/dist/react/useRerenderOnChange.js +16 -20
  238. package/dist/react/useRerenderOnChange.mjs +17 -0
  239. package/dist/react/useRerenderOnChange.mjs.map +1 -0
  240. package/dist/react/useResult.d.mts +8 -0
  241. package/dist/react/useResult.d.mts.map +1 -0
  242. package/dist/react/useResult.d.ts +7 -5
  243. package/dist/react/useResult.d.ts.map +1 -1
  244. package/dist/react/useResult.js +27 -39
  245. package/dist/react/useResult.mjs +30 -0
  246. package/dist/react/useResult.mjs.map +1 -0
  247. package/package.json +26 -19
  248. package/src/core/FragmentReference.ts +13 -7
  249. package/src/core/IsographEnvironment.ts +80 -21
  250. package/src/core/PromiseWrapper.ts +14 -7
  251. package/src/core/areEqualWithDeepComparison.ts +2 -18
  252. package/src/core/brand.ts +18 -0
  253. package/src/core/cache.ts +62 -332
  254. package/src/core/check.ts +30 -26
  255. package/src/core/componentCache.ts +11 -44
  256. package/src/core/entrypoint.ts +50 -9
  257. package/src/core/garbageCollection.ts +81 -28
  258. package/src/core/getOrCreateCacheForArtifact.ts +86 -0
  259. package/src/core/logging.ts +25 -13
  260. package/src/core/makeNetworkRequest.ts +320 -94
  261. package/src/core/optimisticProxy.ts +544 -0
  262. package/src/core/read.ts +251 -198
  263. package/src/core/reader.ts +18 -17
  264. package/src/core/startUpdate.ts +47 -36
  265. package/src/core/subscribe.ts +189 -0
  266. package/src/core/util.ts +26 -0
  267. package/src/core/writeData.ts +79 -0
  268. package/src/index.ts +6 -4
  269. package/src/loadable-hooks/useClientSideDefer.ts +80 -30
  270. package/src/loadable-hooks/useConnectionSpecPagination.ts +54 -35
  271. package/src/loadable-hooks/useImperativeLoadableField.ts +5 -5
  272. package/src/loadable-hooks/useSkipLimitPagination.ts +22 -21
  273. package/src/react/FragmentReader.tsx +3 -1
  274. package/src/react/FragmentRenderer.tsx +8 -1
  275. package/src/react/IsographEnvironmentProvider.tsx +2 -1
  276. package/src/react/LoadableFieldReader.tsx +125 -16
  277. package/src/react/LoadableFieldRenderer.tsx +124 -16
  278. package/src/react/createIsographEnvironment.ts +23 -0
  279. package/src/react/maybeUnwrapNetworkRequest.ts +17 -0
  280. package/src/react/useImperativeReference.ts +25 -15
  281. package/src/react/useLazyReference.ts +20 -10
  282. package/src/react/useReadAndSubscribe.ts +53 -12
  283. package/src/react/useRerenderOnChange.ts +3 -3
  284. package/src/react/useResult.ts +15 -35
  285. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +1 -1
  286. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +3 -1
  287. package/src/tests/__isograph/Query/linkedUpdate/raw_response_type.ts +13 -0
  288. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +1 -1
  289. package/src/tests/__isograph/Query/meName/entrypoint.ts +3 -1
  290. package/src/tests/__isograph/Query/meName/raw_response_type.ts +7 -0
  291. package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -1
  292. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +3 -1
  293. package/src/tests/__isograph/Query/meNameSuccessor/raw_response_type.ts +14 -0
  294. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -1
  295. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +3 -1
  296. package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +7 -0
  297. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -1
  298. package/src/tests/__isograph/Query/normalizeUndefinedField/entrypoint.ts +33 -0
  299. package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +25 -0
  300. package/src/tests/__isograph/Query/normalizeUndefinedField/output_type.ts +3 -0
  301. package/src/tests/__isograph/Query/normalizeUndefinedField/param_type.ts +9 -0
  302. package/src/tests/__isograph/Query/normalizeUndefinedField/query_text.ts +6 -0
  303. package/src/tests/__isograph/Query/normalizeUndefinedField/raw_response_type.ts +7 -0
  304. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +38 -0
  305. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +3 -1
  306. package/src/tests/__isograph/Query/startUpdate/raw_response_type.ts +8 -0
  307. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +1 -1
  308. package/src/tests/__isograph/Query/subquery/entrypoint.ts +3 -1
  309. package/src/tests/__isograph/Query/subquery/raw_response_type.ts +9 -0
  310. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -1
  311. package/src/tests/__isograph/iso.ts +11 -1
  312. package/src/tests/garbageCollection.test.ts +10 -10
  313. package/src/tests/meNameSuccessor.ts +7 -4
  314. package/src/tests/nodeQuery.ts +6 -4
  315. package/src/tests/normalizeData.test.ts +94 -18
  316. package/src/tests/optimisticProxy.test.ts +862 -0
  317. package/src/tests/startUpdate.test.ts +11 -11
  318. package/vitest.config.ts +5 -0
  319. package/dist/core/areEqualWithDeepComparison.d.ts +0 -3
  320. package/dist/core/areEqualWithDeepComparison.d.ts.map +0 -1
  321. package/dist/core/brand.js +0 -2
  322. package/dist/core/componentCache.d.ts +0 -5
  323. package/dist/core/componentCache.d.ts.map +0 -1
  324. package/dist/core/reader.js +0 -2
  325. package/dist/core/startUpdate.d.ts +0 -8
  326. package/dist/core/startUpdate.d.ts.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
@@ -1,21 +1,30 @@
1
- import { ParentCache } from '@isograph/react-disposable-state';
2
- import {
1
+ import type { ParentCache } from '@isograph/react-disposable-state';
2
+ import type { Brand } from './brand';
3
+ import type {
3
4
  IsographEntrypoint,
4
5
  IsographOperation,
5
6
  IsographPersistedOperation,
7
+ ReaderWithRefetchQueries,
8
+ ReaderWithRefetchQueriesLoader,
6
9
  } from './entrypoint';
7
- import {
10
+ import type {
11
+ ExtractStartUpdate,
8
12
  FragmentReference,
13
+ StableIdForFragmentReference,
14
+ UnknownTReadFromStore,
9
15
  Variables,
10
- type StableIdForFragmentReference,
11
- type UnknownTReadFromStore,
12
16
  } from './FragmentReference';
13
- import { RetainedQuery } from './garbageCollection';
14
- import { LogFunction, WrappedLogFunction } from './logging';
15
- import { PromiseWrapper, wrapPromise } from './PromiseWrapper';
16
- import { WithEncounteredRecords } from './read';
17
+ import type { RetainedQuery } from './garbageCollection';
18
+ import type { LogFunction, WrappedLogFunction } from './logging';
19
+ import { type StoreLayer } from './optimisticProxy';
20
+ import type { PromiseWrapper } from './PromiseWrapper';
21
+ import { wrapPromise, wrapResolvedValue } from './PromiseWrapper';
22
+ import type {
23
+ NetworkRequestReaderOptions,
24
+ WithEncounteredRecords,
25
+ } from './read';
17
26
  import type { ReaderAst, StartUpdate } from './reader';
18
- import type { Brand } from './brand';
27
+ import { isArray } from './util';
19
28
 
20
29
  export type ComponentOrFieldName = string;
21
30
  export type StringifiedArgs = string;
@@ -56,8 +65,9 @@ export type Subscriptions = Set<Subscription>;
56
65
  export type CacheMap<T> = { [index: string]: ParentCache<T> };
57
66
 
58
67
  export type IsographEnvironment = {
59
- readonly store: IsographStore;
68
+ store: StoreLayer;
60
69
  readonly networkFunction: IsographNetworkFunction;
70
+ readonly componentFunction: IsographComponentFunction;
61
71
  readonly missingFieldHandler: MissingFieldHandler | null;
62
72
  readonly componentCache: FieldCache<React.FC<any>>;
63
73
  readonly eagerReaderCache: FieldCache<StartUpdate<any> | undefined>;
@@ -68,7 +78,7 @@ export type IsographEnvironment = {
68
78
  // TODO make this a CacheMap and add GC
69
79
  readonly entrypointArtifactCache: Map<
70
80
  string,
71
- PromiseWrapper<IsographEntrypoint<any, any, any>>
81
+ PromiseWrapper<IsographEntrypoint<any, any, any, any>>
72
82
  >;
73
83
  readonly retainedQueries: Set<RetainedQuery>;
74
84
  readonly gcBuffer: Array<RetainedQuery>;
@@ -89,6 +99,15 @@ export type IsographNetworkFunction = (
89
99
  variables: Variables,
90
100
  ) => Promise<any>;
91
101
 
102
+ export type IsographComponentFunction = <
103
+ TReadFromStore extends UnknownTReadFromStore = any,
104
+ >(
105
+ environment: IsographEnvironment,
106
+ fragmentReference: FragmentReference<TReadFromStore, any>,
107
+ networkRequestOptions: NetworkRequestReaderOptions,
108
+ startUpdate: ExtractStartUpdate<TReadFromStore>,
109
+ ) => React.FC<any>;
110
+
92
111
  export interface Link<T extends TypeName> extends StoreLink {
93
112
  readonly __link: Brand<DataId, T>;
94
113
  readonly __typename: T;
@@ -111,7 +130,7 @@ export type DataTypeValue =
111
130
  // Singular linked fields:
112
131
  | StoreLink
113
132
  // Plural scalar and linked fields:
114
- | DataTypeValue[];
133
+ | readonly DataTypeValue[];
115
134
 
116
135
  export type StoreRecord = {
117
136
  [index: DataId | string]: DataTypeValue;
@@ -125,28 +144,39 @@ export type DataId = string;
125
144
 
126
145
  export const ROOT_ID: DataId & '__ROOT' = '__ROOT';
127
146
 
128
- export type IsographStore = {
147
+ export type StoreLayerData = {
129
148
  [index: TypeName]: {
130
149
  [index: DataId]: StoreRecord | null;
131
150
  } | null;
151
+ };
152
+
153
+ export interface BaseStoreLayerData extends StoreLayerData {
132
154
  readonly Query: {
133
155
  readonly __ROOT: StoreRecord;
134
156
  };
135
- };
157
+ }
136
158
 
137
159
  const DEFAULT_GC_BUFFER_SIZE = 10;
138
- export function createIsographEnvironment(
139
- store: IsographStore,
160
+ export function createIsographEnvironmentCore(
161
+ baseStoreLayerData: BaseStoreLayerData,
140
162
  networkFunction: IsographNetworkFunction,
163
+ componentFunction: IsographComponentFunction,
141
164
  missingFieldHandler?: MissingFieldHandler | null,
142
165
  logFunction?: LogFunction | null,
143
166
  ): IsographEnvironment {
144
167
  logFunction?.({
145
168
  kind: 'EnvironmentCreated',
146
169
  });
170
+ let store = {
171
+ kind: 'BaseStoreLayer',
172
+ data: baseStoreLayerData,
173
+ parentStoreLayer: null,
174
+ childStoreLayer: null,
175
+ } as const;
147
176
  return {
148
177
  store,
149
178
  networkFunction,
179
+ componentFunction,
150
180
  missingFieldHandler: missingFieldHandler ?? null,
151
181
  componentCache: {},
152
182
  eagerReaderCache: {},
@@ -160,7 +190,7 @@ export function createIsographEnvironment(
160
190
  };
161
191
  }
162
192
 
163
- export function createIsographStore(): IsographStore {
193
+ export function createIsographStore(): BaseStoreLayerData {
164
194
  return {
165
195
  Query: {
166
196
  [ROOT_ID]: {},
@@ -169,7 +199,7 @@ export function createIsographStore(): IsographStore {
169
199
  }
170
200
 
171
201
  export function assertLink(link: DataTypeValue): StoreLink | null | undefined {
172
- if (Array.isArray(link)) {
202
+ if (isArray(link)) {
173
203
  throw new Error('Unexpected array');
174
204
  }
175
205
  if (link == null) {
@@ -198,8 +228,8 @@ export function getLink(maybeLink: DataTypeValue): StoreLink | null {
198
228
  export function getOrLoadIsographArtifact(
199
229
  environment: IsographEnvironment,
200
230
  key: string,
201
- loader: () => Promise<IsographEntrypoint<any, any, any>>,
202
- ): PromiseWrapper<IsographEntrypoint<any, any, any>> {
231
+ loader: () => Promise<IsographEntrypoint<any, any, any, any>>,
232
+ ): PromiseWrapper<IsographEntrypoint<any, any, any, any>> {
203
233
  const value = environment.entrypointArtifactCache.get(key);
204
234
  if (value != null) {
205
235
  return value;
@@ -208,3 +238,32 @@ export function getOrLoadIsographArtifact(
208
238
  environment.entrypointArtifactCache.set(key, wrapped);
209
239
  return wrapped;
210
240
  }
241
+
242
+ export function getOrLoadReaderWithRefetchQueries(
243
+ _environment: IsographEnvironment,
244
+ readerWithRefetchQueries:
245
+ | ReaderWithRefetchQueries<any, any>
246
+ | ReaderWithRefetchQueriesLoader<any, any>,
247
+ ): {
248
+ readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<any, any>>;
249
+ fieldName: string;
250
+ readerArtifactKind: 'EagerReaderArtifact' | 'ComponentReaderArtifact';
251
+ } {
252
+ switch (readerWithRefetchQueries.kind) {
253
+ case 'ReaderWithRefetchQueries':
254
+ return {
255
+ readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
256
+ fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
257
+ readerArtifactKind: readerWithRefetchQueries.readerArtifact.kind,
258
+ };
259
+ case 'ReaderWithRefetchQueriesLoader':
260
+ return {
261
+ // TODO: cache promise wrapper
262
+ readerWithRefetchQueries: wrapPromise(
263
+ readerWithRefetchQueries.loader(),
264
+ ),
265
+ fieldName: readerWithRefetchQueries.fieldName,
266
+ readerArtifactKind: readerWithRefetchQueries.readerArtifactKind,
267
+ };
268
+ }
269
+ }
@@ -5,12 +5,12 @@ export type NotSet = typeof NOT_SET;
5
5
 
6
6
  export type Result<T, E> =
7
7
  | {
8
- kind: 'Ok';
9
- value: T;
8
+ readonly kind: 'Ok';
9
+ readonly value: T;
10
10
  }
11
11
  | {
12
- kind: 'Err';
13
- error: E;
12
+ readonly kind: 'Err';
13
+ readonly error: E;
14
14
  };
15
15
 
16
16
  /**
@@ -22,6 +22,13 @@ export type PromiseWrapper<T, E = any> = {
22
22
  result: Result<Exclude<T, NotSet>, E> | NotSet;
23
23
  };
24
24
 
25
+ export interface PromiseWrapperOk<T, E = any> extends PromiseWrapper<T, E> {
26
+ result: {
27
+ readonly kind: 'Ok';
28
+ readonly value: Exclude<T, NotSet>;
29
+ };
30
+ }
31
+
25
32
  export function wrapPromise<T>(
26
33
  promise: Promise<Exclude<T, NotSet>>,
27
34
  ): PromiseWrapper<T, unknown> {
@@ -39,7 +46,7 @@ export function wrapPromise<T>(
39
46
 
40
47
  export function wrapResolvedValue<T>(
41
48
  value: Exclude<T, NotSet>,
42
- ): PromiseWrapper<T, never> {
49
+ ): PromiseWrapperOk<T, never> {
43
50
  return {
44
51
  promise: Promise.resolve(value),
45
52
  result: {
@@ -65,8 +72,8 @@ export function readPromise<T, E>(p: PromiseWrapper<T, E>): T {
65
72
 
66
73
  export type PromiseState<T, E> =
67
74
  | {
68
- kind: 'Pending';
69
- promise: Promise<T>;
75
+ readonly kind: 'Pending';
76
+ readonly promise: Promise<T>;
70
77
  }
71
78
  | Result<T, E>;
72
79
 
@@ -6,12 +6,8 @@ function mergeUsingReaderAst(
6
6
  oldItem: unknown,
7
7
  newItem: unknown,
8
8
  ): unknown {
9
- if (newItem === null) {
10
- return oldItem === null ? oldItem : newItem;
11
- }
12
-
13
- if (newItem === undefined) {
14
- return oldItem === undefined ? oldItem : newItem;
9
+ if (newItem == null || oldItem == null) {
10
+ return newItem;
15
11
  }
16
12
 
17
13
  if (Array.isArray(newItem)) {
@@ -31,12 +27,6 @@ function mergeUsingReaderAst(
31
27
  }
32
28
 
33
29
  return mergeObjectsUsingReaderAst(field.selections, oldItem, newItem);
34
- default: {
35
- // Ensure we have covered all variants
36
- let _: never = field;
37
- _;
38
- throw new Error('Unexpected case.');
39
- }
40
30
  }
41
31
  }
42
32
 
@@ -124,12 +114,6 @@ export function mergeObjectsUsingReaderAst(
124
114
  case 'ImperativelyLoadedField':
125
115
  case 'LoadablySelectedField':
126
116
  break;
127
- default: {
128
- // Ensure we have covered all variants
129
- let _: never = field;
130
- _;
131
- throw new Error('Unexpected case.');
132
- }
133
117
  }
134
118
  }
135
119
 
package/src/core/brand.ts CHANGED
@@ -16,3 +16,21 @@ export type Brand<
16
16
  Brand extends symbol | string,
17
17
  // @ts-ignore
18
18
  > = infer _ extends Brand ? BaseType : never;
19
+
20
+ declare const PhantomDataBrand: unique symbol;
21
+ /**
22
+ * A phantom data type is one that shouldn't show up at runtime, but is checked statically (and only) at compile time.
23
+ * Data types can use extra properties to act as markers or to perform type checking at compile time. These extra properties should hold no storage values, and have no runtime behavior.
24
+ *
25
+ * ```tsx
26
+ * type MyType<T> = {
27
+ * readonly value: number;
28
+ * readonly '~T'?: PhantomData<T>;
29
+ * }
30
+ * ```
31
+ */
32
+ export type PhantomData<T> = Brand<T, typeof PhantomDataBrand>;
33
+
34
+ export type Invariant<T> = (_: T) => T;
35
+ export type Covariant<T> = (_: never) => T;
36
+ export type Contravariant<T> = (_: T) => void;