@playfast/reform 1.2.1 → 1.4.0

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 (416) hide show
  1. package/README.md +15 -6
  2. package/dist/boundary/boundary.d.ts +64 -0
  3. package/dist/boundary/boundary.d.ts.map +1 -0
  4. package/dist/boundary/boundary.js +102 -0
  5. package/dist/boundary/boundary.js.map +1 -0
  6. package/dist/calc/asyncCalc.d.ts +23 -0
  7. package/dist/calc/asyncCalc.d.ts.map +1 -0
  8. package/dist/calc/asyncCalc.js +100 -0
  9. package/dist/calc/asyncCalc.js.map +1 -0
  10. package/dist/calc/asyncCalcTypes.d.ts +80 -0
  11. package/dist/calc/asyncCalcTypes.d.ts.map +1 -0
  12. package/dist/calc/asyncCalcTypes.js +2 -0
  13. package/dist/calc/asyncCalcTypes.js.map +1 -0
  14. package/dist/calc/asyncData.d.ts +29 -0
  15. package/dist/calc/asyncData.d.ts.map +1 -0
  16. package/dist/calc/asyncData.js +21 -0
  17. package/dist/calc/asyncData.js.map +1 -0
  18. package/dist/calc/calc.d.ts +39 -0
  19. package/dist/calc/calc.d.ts.map +1 -0
  20. package/dist/calc/calc.js +48 -0
  21. package/dist/calc/calc.js.map +1 -0
  22. package/dist/calc/calcFamily.d.ts +40 -0
  23. package/dist/calc/calcFamily.d.ts.map +1 -0
  24. package/dist/calc/calcFamily.js +156 -0
  25. package/dist/calc/calcFamily.js.map +1 -0
  26. package/dist/calc/compose.d.ts +5 -0
  27. package/dist/calc/compose.d.ts.map +1 -0
  28. package/dist/calc/compose.js +5 -0
  29. package/dist/calc/compose.js.map +1 -0
  30. package/dist/calc/queryState.d.ts +14 -0
  31. package/dist/calc/queryState.d.ts.map +1 -0
  32. package/dist/calc/queryState.js +39 -0
  33. package/dist/calc/queryState.js.map +1 -0
  34. package/dist/channel/channel.d.ts +51 -0
  35. package/dist/channel/channel.d.ts.map +1 -0
  36. package/dist/channel/channel.js +91 -0
  37. package/dist/channel/channel.js.map +1 -0
  38. package/dist/channel/procedures.d.ts +24 -0
  39. package/dist/channel/procedures.d.ts.map +1 -0
  40. package/dist/channel/procedures.js +82 -0
  41. package/dist/channel/procedures.js.map +1 -0
  42. package/dist/compose/composition.d.ts +12 -0
  43. package/dist/compose/composition.d.ts.map +1 -0
  44. package/dist/compose/composition.js +62 -0
  45. package/dist/compose/composition.js.map +1 -0
  46. package/dist/compose/compositionTypes.d.ts +127 -0
  47. package/dist/compose/compositionTypes.d.ts.map +1 -0
  48. package/dist/compose/compositionTypes.js +2 -0
  49. package/dist/compose/compositionTypes.js.map +1 -0
  50. package/dist/compose/host.d.ts +6 -0
  51. package/dist/compose/host.d.ts.map +1 -0
  52. package/dist/compose/host.js +2 -0
  53. package/dist/compose/host.js.map +1 -0
  54. package/dist/compose/props.d.ts +10 -0
  55. package/dist/compose/props.d.ts.map +1 -0
  56. package/dist/compose/props.js +6 -0
  57. package/dist/compose/props.js.map +1 -0
  58. package/dist/compose/provide.d.ts +18 -0
  59. package/dist/compose/provide.d.ts.map +1 -0
  60. package/dist/compose/provide.js +49 -0
  61. package/dist/compose/provide.js.map +1 -0
  62. package/dist/compose/slot.d.ts +70 -0
  63. package/dist/compose/slot.d.ts.map +1 -0
  64. package/dist/compose/slot.js +26 -0
  65. package/dist/compose/slot.js.map +1 -0
  66. package/dist/compose/structure.d.ts +51 -0
  67. package/dist/compose/structure.d.ts.map +1 -0
  68. package/dist/compose/structure.js +117 -0
  69. package/dist/compose/structure.js.map +1 -0
  70. package/dist/compose/ui.d.ts +112 -0
  71. package/dist/compose/ui.d.ts.map +1 -0
  72. package/dist/compose/ui.js +58 -0
  73. package/dist/compose/ui.js.map +1 -0
  74. package/dist/definition/definition.d.ts +11 -0
  75. package/dist/definition/definition.d.ts.map +1 -0
  76. package/dist/definition/definition.js +35 -0
  77. package/dist/definition/definition.js.map +1 -0
  78. package/dist/event/event.d.ts +52 -0
  79. package/dist/event/event.d.ts.map +1 -0
  80. package/dist/event/event.js +88 -0
  81. package/dist/event/event.js.map +1 -0
  82. package/dist/event/eventGroup.d.ts +8 -0
  83. package/dist/event/eventGroup.d.ts.map +1 -0
  84. package/dist/event/eventGroup.js +3 -0
  85. package/dist/event/eventGroup.js.map +1 -0
  86. package/dist/feature/feature.d.ts +27 -0
  87. package/dist/feature/feature.d.ts.map +1 -0
  88. package/dist/feature/feature.js +20 -0
  89. package/dist/feature/feature.js.map +1 -0
  90. package/dist/feature/featureBinding.d.ts +85 -0
  91. package/dist/feature/featureBinding.d.ts.map +1 -0
  92. package/dist/feature/featureBinding.js +10 -0
  93. package/dist/feature/featureBinding.js.map +1 -0
  94. package/dist/feature/featureClass.d.ts +10 -0
  95. package/dist/feature/featureClass.d.ts.map +1 -0
  96. package/dist/feature/featureClass.js +2 -0
  97. package/dist/feature/featureClass.js.map +1 -0
  98. package/dist/feature/featureConfig.d.ts +86 -0
  99. package/dist/feature/featureConfig.d.ts.map +1 -0
  100. package/dist/feature/featureConfig.js +13 -0
  101. package/dist/feature/featureConfig.js.map +1 -0
  102. package/dist/feature/featureFactory.d.ts +15 -0
  103. package/dist/feature/featureFactory.d.ts.map +1 -0
  104. package/dist/feature/featureFactory.js +59 -0
  105. package/dist/feature/featureFactory.js.map +1 -0
  106. package/dist/feature/featureModule.d.ts +28 -0
  107. package/dist/feature/featureModule.d.ts.map +1 -0
  108. package/dist/feature/featureModule.js +33 -0
  109. package/dist/feature/featureModule.js.map +1 -0
  110. package/dist/feature/featureNativeTree.d.ts +26 -0
  111. package/dist/feature/featureNativeTree.d.ts.map +1 -0
  112. package/dist/feature/featureNativeTree.js +2 -0
  113. package/dist/feature/featureNativeTree.js.map +1 -0
  114. package/dist/feature/featureRequirement.d.ts +43 -0
  115. package/dist/feature/featureRequirement.d.ts.map +1 -0
  116. package/dist/feature/featureRequirement.js +6 -0
  117. package/dist/feature/featureRequirement.js.map +1 -0
  118. package/dist/feature/featureVariants.d.ts +9 -0
  119. package/dist/feature/featureVariants.d.ts.map +1 -0
  120. package/dist/feature/featureVariants.js +59 -0
  121. package/dist/feature/featureVariants.js.map +1 -0
  122. package/dist/feature/mountFeature.d.ts +10 -0
  123. package/dist/feature/mountFeature.d.ts.map +1 -0
  124. package/dist/feature/mountFeature.js +14 -0
  125. package/dist/feature/mountFeature.js.map +1 -0
  126. package/dist/graph/closure.d.ts +77 -0
  127. package/dist/graph/closure.d.ts.map +1 -0
  128. package/dist/graph/closure.js +4 -0
  129. package/dist/graph/closure.js.map +1 -0
  130. package/dist/graph/services.d.ts +30 -0
  131. package/dist/graph/services.d.ts.map +1 -0
  132. package/dist/graph/services.js +2 -0
  133. package/dist/graph/services.js.map +1 -0
  134. package/dist/graph/summary.d.ts +60 -0
  135. package/dist/graph/summary.d.ts.map +1 -0
  136. package/dist/graph/summary.js +7 -0
  137. package/dist/graph/summary.js.map +1 -0
  138. package/dist/index.d.ts +51 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +34 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/internal/bucketCache.d.ts +19 -0
  143. package/dist/internal/bucketCache.d.ts.map +1 -0
  144. package/dist/internal/bucketCache.js +20 -0
  145. package/dist/internal/bucketCache.js.map +1 -0
  146. package/dist/internal/capture.d.ts +17 -0
  147. package/dist/internal/capture.d.ts.map +1 -0
  148. package/dist/internal/capture.js +5 -0
  149. package/dist/internal/capture.js.map +1 -0
  150. package/dist/internal/env.d.ts +2 -0
  151. package/dist/internal/env.d.ts.map +1 -0
  152. package/dist/internal/env.js +5 -0
  153. package/dist/internal/env.js.map +1 -0
  154. package/dist/internal/errors.d.ts +48 -0
  155. package/dist/internal/errors.d.ts.map +1 -0
  156. package/dist/internal/errors.js +69 -0
  157. package/dist/internal/errors.js.map +1 -0
  158. package/dist/internal/familyKeys.d.ts +16 -0
  159. package/dist/internal/familyKeys.d.ts.map +1 -0
  160. package/dist/internal/familyKeys.js +35 -0
  161. package/dist/internal/familyKeys.js.map +1 -0
  162. package/dist/internal/inspect.d.ts +5 -0
  163. package/dist/internal/inspect.d.ts.map +1 -0
  164. package/dist/internal/inspect.js +20 -0
  165. package/dist/internal/inspect.js.map +1 -0
  166. package/dist/internal/platform.d.ts +43 -0
  167. package/dist/internal/platform.d.ts.map +1 -0
  168. package/dist/internal/platform.js +68 -0
  169. package/dist/internal/platform.js.map +1 -0
  170. package/dist/internal/queryDriver.d.ts +7 -0
  171. package/dist/internal/queryDriver.d.ts.map +1 -0
  172. package/dist/internal/queryDriver.js +222 -0
  173. package/dist/internal/queryDriver.js.map +1 -0
  174. package/dist/internal/queryDriverConsume.d.ts +9 -0
  175. package/dist/internal/queryDriverConsume.d.ts.map +1 -0
  176. package/dist/internal/queryDriverConsume.js +16 -0
  177. package/dist/internal/queryDriverConsume.js.map +1 -0
  178. package/dist/internal/queryDriverHydrate.d.ts +17 -0
  179. package/dist/internal/queryDriverHydrate.d.ts.map +1 -0
  180. package/dist/internal/queryDriverHydrate.js +25 -0
  181. package/dist/internal/queryDriverHydrate.js.map +1 -0
  182. package/dist/internal/queryDriverPersist.d.ts +16 -0
  183. package/dist/internal/queryDriverPersist.d.ts.map +1 -0
  184. package/dist/internal/queryDriverPersist.js +15 -0
  185. package/dist/internal/queryDriverPersist.js.map +1 -0
  186. package/dist/internal/queryDriverPersistWarn.d.ts +12 -0
  187. package/dist/internal/queryDriverPersistWarn.d.ts.map +1 -0
  188. package/dist/internal/queryDriverPersistWarn.js +31 -0
  189. package/dist/internal/queryDriverPersistWarn.js.map +1 -0
  190. package/dist/internal/queryDriverSettle.d.ts +23 -0
  191. package/dist/internal/queryDriverSettle.d.ts.map +1 -0
  192. package/dist/internal/queryDriverSettle.js +52 -0
  193. package/dist/internal/queryDriverSettle.js.map +1 -0
  194. package/dist/internal/queryDriverStore.d.ts +28 -0
  195. package/dist/internal/queryDriverStore.d.ts.map +1 -0
  196. package/dist/internal/queryDriverStore.js +53 -0
  197. package/dist/internal/queryDriverStore.js.map +1 -0
  198. package/dist/internal/queryDriverTypes.d.ts +44 -0
  199. package/dist/internal/queryDriverTypes.d.ts.map +1 -0
  200. package/dist/internal/queryDriverTypes.js +9 -0
  201. package/dist/internal/queryDriverTypes.js.map +1 -0
  202. package/dist/internal/queryEvents.d.ts +12 -0
  203. package/dist/internal/queryEvents.d.ts.map +1 -0
  204. package/dist/internal/queryEvents.js +11 -0
  205. package/dist/internal/queryEvents.js.map +1 -0
  206. package/dist/internal/queryStore.d.ts +13 -0
  207. package/dist/internal/queryStore.d.ts.map +1 -0
  208. package/dist/internal/queryStore.js +11 -0
  209. package/dist/internal/queryStore.js.map +1 -0
  210. package/dist/internal/reuse.d.ts +2 -0
  211. package/dist/internal/reuse.d.ts.map +1 -0
  212. package/dist/internal/reuse.js +55 -0
  213. package/dist/internal/reuse.js.map +1 -0
  214. package/dist/internal/scheduler.d.ts +14 -0
  215. package/dist/internal/scheduler.d.ts.map +1 -0
  216. package/dist/internal/scheduler.js +101 -0
  217. package/dist/internal/scheduler.js.map +1 -0
  218. package/dist/internal/seeds.d.ts +3 -0
  219. package/dist/internal/seeds.d.ts.map +1 -0
  220. package/dist/internal/seeds.js +3 -0
  221. package/dist/internal/seeds.js.map +1 -0
  222. package/dist/internal/sources.d.ts +20 -0
  223. package/dist/internal/sources.d.ts.map +1 -0
  224. package/dist/internal/sources.js +39 -0
  225. package/dist/internal/sources.js.map +1 -0
  226. package/dist/internal/stateRegistry.d.ts +2 -0
  227. package/dist/internal/stateRegistry.d.ts.map +1 -0
  228. package/dist/internal/stateRegistry.js +15 -0
  229. package/dist/internal/stateRegistry.js.map +1 -0
  230. package/dist/internal/store.d.ts +15 -0
  231. package/dist/internal/store.d.ts.map +1 -0
  232. package/dist/internal/store.js +61 -0
  233. package/dist/internal/store.js.map +1 -0
  234. package/dist/internal/track.d.ts +15 -0
  235. package/dist/internal/track.d.ts.map +1 -0
  236. package/dist/internal/track.js +11 -0
  237. package/dist/internal/track.js.map +1 -0
  238. package/dist/internal/variance.d.ts +4 -0
  239. package/dist/internal/variance.d.ts.map +1 -0
  240. package/dist/internal/variance.js +2 -0
  241. package/dist/internal/variance.js.map +1 -0
  242. package/dist/internal.d.ts +43 -0
  243. package/dist/internal.d.ts.map +1 -0
  244. package/dist/internal.js +59 -0
  245. package/dist/internal.js.map +1 -0
  246. package/dist/namespace/namespace.d.ts +24 -0
  247. package/dist/namespace/namespace.d.ts.map +1 -0
  248. package/dist/namespace/namespace.js +20 -0
  249. package/dist/namespace/namespace.js.map +1 -0
  250. package/dist/procedure/procedure.d.ts +32 -0
  251. package/dist/procedure/procedure.d.ts.map +1 -0
  252. package/dist/procedure/procedure.js +34 -0
  253. package/dist/procedure/procedure.js.map +1 -0
  254. package/dist/reducer/reducer.d.ts +35 -0
  255. package/dist/reducer/reducer.d.ts.map +1 -0
  256. package/dist/reducer/reducer.js +73 -0
  257. package/dist/reducer/reducer.js.map +1 -0
  258. package/dist/remote/pendingQueue.d.ts +22 -0
  259. package/dist/remote/pendingQueue.d.ts.map +1 -0
  260. package/dist/remote/pendingQueue.js +129 -0
  261. package/dist/remote/pendingQueue.js.map +1 -0
  262. package/dist/remote/remoteState.d.ts +13 -0
  263. package/dist/remote/remoteState.d.ts.map +1 -0
  264. package/dist/remote/remoteState.js +189 -0
  265. package/dist/remote/remoteState.js.map +1 -0
  266. package/dist/remote/remoteStateMake.d.ts +8 -0
  267. package/dist/remote/remoteStateMake.d.ts.map +1 -0
  268. package/dist/remote/remoteStateMake.js +46 -0
  269. package/dist/remote/remoteStateMake.js.map +1 -0
  270. package/dist/remote/remoteStateSend.d.ts +43 -0
  271. package/dist/remote/remoteStateSend.d.ts.map +1 -0
  272. package/dist/remote/remoteStateSend.js +83 -0
  273. package/dist/remote/remoteStateSend.js.map +1 -0
  274. package/dist/remote/remoteStateTypes.d.ts +106 -0
  275. package/dist/remote/remoteStateTypes.d.ts.map +1 -0
  276. package/dist/remote/remoteStateTypes.js +4 -0
  277. package/dist/remote/remoteStateTypes.js.map +1 -0
  278. package/dist/runtime/appRuntime.d.ts +10 -0
  279. package/dist/runtime/appRuntime.d.ts.map +1 -0
  280. package/dist/runtime/appRuntime.js +6 -0
  281. package/dist/runtime/appRuntime.js.map +1 -0
  282. package/dist/runtime/bus.d.ts +22 -0
  283. package/dist/runtime/bus.d.ts.map +1 -0
  284. package/dist/runtime/bus.js +12 -0
  285. package/dist/runtime/bus.js.map +1 -0
  286. package/dist/runtime/capturedAppRuntime.d.ts +7 -0
  287. package/dist/runtime/capturedAppRuntime.d.ts.map +1 -0
  288. package/dist/runtime/capturedAppRuntime.js +137 -0
  289. package/dist/runtime/capturedAppRuntime.js.map +1 -0
  290. package/dist/runtime/eventBudget.d.ts +32 -0
  291. package/dist/runtime/eventBudget.d.ts.map +1 -0
  292. package/dist/runtime/eventBudget.js +68 -0
  293. package/dist/runtime/eventBudget.js.map +1 -0
  294. package/dist/runtime/featureMount.d.ts +48 -0
  295. package/dist/runtime/featureMount.d.ts.map +1 -0
  296. package/dist/runtime/featureMount.js +118 -0
  297. package/dist/runtime/featureMount.js.map +1 -0
  298. package/dist/runtime/instrumentation.d.ts +18 -0
  299. package/dist/runtime/instrumentation.d.ts.map +1 -0
  300. package/dist/runtime/instrumentation.js +16 -0
  301. package/dist/runtime/instrumentation.js.map +1 -0
  302. package/dist/runtime/loop.d.ts +44 -0
  303. package/dist/runtime/loop.d.ts.map +1 -0
  304. package/dist/runtime/loop.js +131 -0
  305. package/dist/runtime/loop.js.map +1 -0
  306. package/dist/runtime/queries.d.ts +20 -0
  307. package/dist/runtime/queries.d.ts.map +1 -0
  308. package/dist/runtime/queries.js +21 -0
  309. package/dist/runtime/queries.js.map +1 -0
  310. package/dist/runtime/runtimeHandle.d.ts +56 -0
  311. package/dist/runtime/runtimeHandle.d.ts.map +1 -0
  312. package/dist/runtime/runtimeHandle.js +2 -0
  313. package/dist/runtime/runtimeHandle.js.map +1 -0
  314. package/dist/scene/scene.d.ts +55 -0
  315. package/dist/scene/scene.d.ts.map +1 -0
  316. package/dist/scene/scene.js +74 -0
  317. package/dist/scene/scene.js.map +1 -0
  318. package/dist/state/state.d.ts +54 -0
  319. package/dist/state/state.d.ts.map +1 -0
  320. package/dist/state/state.js +41 -0
  321. package/dist/state/state.js.map +1 -0
  322. package/dist/state/stateFamily.d.ts +59 -0
  323. package/dist/state/stateFamily.d.ts.map +1 -0
  324. package/dist/state/stateFamily.js +139 -0
  325. package/dist/state/stateFamily.js.map +1 -0
  326. package/dist/state/stateGroup.d.ts +36 -0
  327. package/dist/state/stateGroup.d.ts.map +1 -0
  328. package/dist/state/stateGroup.js +33 -0
  329. package/dist/state/stateGroup.js.map +1 -0
  330. package/dist/state/token.d.ts +35 -0
  331. package/dist/state/token.d.ts.map +1 -0
  332. package/dist/state/token.js +18 -0
  333. package/dist/state/token.js.map +1 -0
  334. package/dist/synced/syncedStore.d.ts +44 -0
  335. package/dist/synced/syncedStore.d.ts.map +1 -0
  336. package/dist/synced/syncedStore.js +32 -0
  337. package/dist/synced/syncedStore.js.map +1 -0
  338. package/dist/testkit/flight.testkit.d.ts +18 -0
  339. package/dist/testkit/flight.testkit.d.ts.map +1 -0
  340. package/dist/testkit/flight.testkit.js +46 -0
  341. package/dist/testkit/flight.testkit.js.map +1 -0
  342. package/dist/ui/node.d.ts +3 -0
  343. package/dist/ui/node.d.ts.map +1 -0
  344. package/dist/ui/node.js +2 -0
  345. package/dist/ui/node.js.map +1 -0
  346. package/dist/ui/trigger.d.ts +2 -0
  347. package/dist/ui/trigger.d.ts.map +1 -0
  348. package/dist/ui/trigger.js +2 -0
  349. package/dist/ui/trigger.js.map +1 -0
  350. package/dist/wire/tree.d.ts +32 -0
  351. package/dist/wire/tree.d.ts.map +1 -0
  352. package/dist/wire/tree.js +64 -0
  353. package/dist/wire/tree.js.map +1 -0
  354. package/dist/wire/triggers.d.ts +25 -0
  355. package/dist/wire/triggers.d.ts.map +1 -0
  356. package/dist/wire/triggers.js +31 -0
  357. package/dist/wire/triggers.js.map +1 -0
  358. package/package.json +17 -5
  359. package/src/calc/asyncCalc-key-attribution.test.ts +182 -0
  360. package/src/calc/asyncCalc-registry-name.test.ts +82 -0
  361. package/src/calc/asyncCalc.superseded-commit.test.ts +162 -0
  362. package/src/calc/asyncCalc.test.ts +35 -7
  363. package/src/calc/asyncCalc.ts +33 -10
  364. package/src/calc/asyncCalcTypes.test.ts +64 -0
  365. package/src/calc/asyncCalcTypes.ts +8 -10
  366. package/src/calc/calcFamily.ts +81 -34
  367. package/src/calc/family-identity.test.ts +231 -0
  368. package/src/calc/queryState.ts +36 -5
  369. package/src/channel/channel-throttle-frames.test.ts +163 -0
  370. package/src/channel/channel.ts +5 -0
  371. package/src/compose/compose-identity.test.ts +175 -0
  372. package/src/compose/composition.ts +8 -4
  373. package/src/compose/structure.ts +45 -13
  374. package/src/compose/ui.ts +22 -5
  375. package/src/event/event.ts +31 -2
  376. package/src/event/syncTrigger.test.ts +66 -0
  377. package/src/internal/familyKeys.ts +41 -0
  378. package/src/internal/platform.test.ts +55 -0
  379. package/src/internal/platform.ts +72 -0
  380. package/src/internal/queryDriver-defect-attribution.test.ts +107 -0
  381. package/src/internal/queryDriver-persist-key.test.ts +118 -0
  382. package/src/internal/queryDriver.persistence-staleness.test.ts +209 -0
  383. package/src/internal/queryDriver.ts +92 -80
  384. package/src/internal/queryDriverConsume.ts +42 -0
  385. package/src/internal/queryDriverHydrate.ts +9 -3
  386. package/src/internal/queryDriverPersist.ts +42 -0
  387. package/src/internal/queryDriverPersistWarn.ts +61 -0
  388. package/src/internal/queryDriverSettle.ts +85 -0
  389. package/src/internal/queryDriverStore.ts +9 -74
  390. package/src/internal/queryDriverTypes.ts +10 -0
  391. package/src/internal/queryState-and-scheduler-audit.test.ts +170 -0
  392. package/src/internal/scheduler-multi-source-wake.test.ts +111 -0
  393. package/src/internal/scheduler.ts +80 -6
  394. package/src/internal.ts +1 -0
  395. package/src/reducer/reducer.ts +3 -3
  396. package/src/remote/pendingQueue.ts +35 -5
  397. package/src/remote/remoteState.intent-key-stamp.test.ts +207 -0
  398. package/src/remote/remoteState.key-attribution.test.ts +174 -0
  399. package/src/remote/remoteState.ts +27 -15
  400. package/src/remote/remoteStateSend.ts +29 -8
  401. package/src/remote/remoteStateTypes.ts +7 -0
  402. package/src/runtime/bus.ts +6 -1
  403. package/src/runtime/capturedAppRuntime.ts +134 -110
  404. package/src/runtime/eventBudget.ts +2 -1
  405. package/src/runtime/feature-mount-ownership.test.ts +539 -0
  406. package/src/runtime/featureMount.ts +110 -3
  407. package/src/runtime/loop.ts +29 -6
  408. package/src/runtime/mount-inflight-ownership.test.ts +361 -0
  409. package/src/runtime/mount-scope-hardening.test.ts +440 -0
  410. package/src/runtime/runtime.schema-identity.test.ts +188 -0
  411. package/src/state/state.ts +8 -4
  412. package/src/state/stateFamily.ts +86 -36
  413. package/src/state/stateGroup.ts +24 -6
  414. package/src/testkit/flight.testkit.ts +2 -1
  415. package/src/wire/tree-key-presence.test.ts +46 -0
  416. package/src/wire/tree.ts +9 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverConsume.js","sourceRoot":"","sources":["../../src/internal/queryDriverConsume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAc,MAAM,EAAE,MAAM,QAAQ,CAAA;AAYlE,MAAM,gBAAgB,GAAG,CACvB,OAAmC,EACH,EAAE,CAClC,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAA;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IACjE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA;IAC5C,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC,CAAC,CACH,CAAA;AAEH,MAAM,cAAc,GAAG,CACrB,OAAmC,EACJ,EAAE,CACjC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAC3F,MAAM,CAAC,QAAQ,CAChB,CAAA;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAiB,EACjB,OAAmC,EACJ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { Effect, MutableRef } from 'effect';
2
+ import type { QueryState } from '../calc/queryState.js';
3
+ import type { QueryStoreApi } from './queryStore.js';
4
+ import type { QueryCodec } from './queryDriverTypes.js';
5
+ import type { Store } from './store.js';
6
+ interface HydratePersistedOptions<A, E> {
7
+ readonly queryStore: QueryStoreApi;
8
+ readonly cacheKey: string;
9
+ readonly codec: QueryCodec<A>;
10
+ readonly stateStore: Store<QueryState<A, E>>;
11
+ readonly staleAtGeneration: MutableRef.MutableRef<number>;
12
+ readonly capturedGeneration: number;
13
+ readonly isSuperseded: () => boolean;
14
+ }
15
+ export declare const hydratePersistedQuery: <A, E>(options: HydratePersistedOptions<A, E>) => Effect.Effect<void>;
16
+ export {};
17
+ //# sourceMappingURL=queryDriverHydrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverHydrate.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverHydrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,MAAM,QAAQ,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,UAAU,uBAAuB,CAAC,CAAC,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IAEnC,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAA;CACrC;AAmBD,eAAO,MAAM,qBAAqB,GAAI,CAAC,EAAE,CAAC,EACxC,SAAS,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,KACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAclB,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { Effect, MutableRef, Option } from 'effect';
2
+ const paint = (options, decoded) => {
3
+ const state = options.stateStore.get();
4
+ if (options.isSuperseded() || Option.isSome(state.data) || Option.isSome(state.error)) {
5
+ return;
6
+ }
7
+ MutableRef.update(options.staleAtGeneration, (current) => Math.max(current, options.capturedGeneration));
8
+ options.stateStore.set({
9
+ ...state,
10
+ data: Option.some(decoded),
11
+ isStale: true,
12
+ isPreviousKey: false,
13
+ });
14
+ };
15
+ // Epoch, key, and settled-state guards prevent a late cache from replacing newer truth.
16
+ export const hydratePersistedQuery = (options) => options.queryStore.get(options.cacheKey).pipe(Effect.flatMap((cached) => Option.match(cached, {
17
+ onNone: () => Effect.void,
18
+ onSome: (raw) => options.codec
19
+ .decode(raw)
20
+ .pipe(Effect.tap((decoded) => Effect.sync(() => paint(options, decoded)))),
21
+ })),
22
+ // Corrupt/incompatible cache: ignore and fetch fresh. Catches defects too — a
23
+ // store backed by localStorage throws rather than failing typed.
24
+ Effect.catchAllCause(() => Effect.void));
25
+ //# sourceMappingURL=queryDriverHydrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverHydrate.js","sourceRoot":"","sources":["../../src/internal/queryDriverHydrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAiBnD,MAAM,KAAK,GAAG,CAAO,OAAsC,EAAE,OAAU,EAAQ,EAAE;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;IACtC,IAAI,OAAO,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,OAAM;IACR,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CACvD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAC9C,CAAA;IACD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,GAAG,KAAK;QACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,KAAK;KACrB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAsC,EACjB,EAAE,CACvB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;IACzB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CACd,OAAO,CAAC,KAAK;SACV,MAAM,CAAC,GAAG,CAAC;SACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/E,CAAC,CACH;AACD,8EAA8E;AAC9E,iEAAiE;AACjE,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CACxC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { Effect } from 'effect';
2
+ import type { QueryStoreApi } from './queryStore.js';
3
+ import type { QueryCodec } from './queryDriverTypes.js';
4
+ export interface PersistTarget<Args, A> {
5
+ readonly key: string | ((inputs: Args) => string);
6
+ readonly codec: QueryCodec<A>;
7
+ }
8
+ export declare const persistCacheKey: <Args>(key: string | ((inputs: Args) => string), args: Args) => string;
9
+ export interface PersistWriterOptions<Args, A> {
10
+ readonly queryStore: QueryStoreApi;
11
+ readonly persist: PersistTarget<Args, A> | undefined;
12
+ readonly label: string;
13
+ readonly name: string;
14
+ }
15
+ export declare const makePersistWrite: <Args, A>(options: PersistWriterOptions<Args, A>) => ((produced: A, args: Args) => Effect.Effect<void>);
16
+ //# sourceMappingURL=queryDriverPersist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverPersist.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverPersist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,WAAW,aAAa,CAAC,IAAI,EAAE,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAA;IACjD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;CAC9B;AAED,eAAO,MAAM,eAAe,GAAI,IAAI,EAClC,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,EACxC,MAAM,IAAI,KACT,MAAuD,CAAA;AAE1D,MAAM,WAAW,oBAAoB,CAAC,IAAI,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,gBAAgB,GAAI,IAAI,EAAE,CAAC,EACtC,SAAS,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,KACrC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAkBnD,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { Effect } from 'effect';
2
+ export const persistCacheKey = (key, args) => (typeof key === 'function' ? key(args) : key);
3
+ export const makePersistWrite = (options) => {
4
+ const target = options.persist;
5
+ if (target === undefined) {
6
+ return () => Effect.void;
7
+ }
8
+ return (produced, args) => target.codec.encode(produced).pipe(Effect.flatMap((encoded) => options.queryStore.set(persistCacheKey(target.key, args), encoded)),
9
+ // Persistence is best-effort and must not block the visible write. This
10
+ // catches defects, not just typed failures: a store backed by localStorage
11
+ // *throws* when quota is exhausted, and `Effect.ignore` would let that escape
12
+ // and kill the request consumer for the rest of the session.
13
+ Effect.catchAllCause((cause) => Effect.logWarning(`reform: ${options.label} '${options.name}' persist failed`, cause)));
14
+ };
15
+ //# sourceMappingURL=queryDriverPersist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverPersist.js","sourceRoot":"","sources":["../../src/internal/queryDriverPersist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAS/B,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAAwC,EACxC,IAAU,EACF,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAS1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAsC,EACc,EAAE;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAA;IAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IAC1B,CAAC;IACD,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CACxB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CACnE;IACD,wEAAwE;IACxE,2EAA2E;IAC3E,8EAA8E;IAC9E,6DAA6D;IAC7D,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,UAAU,CAAC,WAAW,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,kBAAkB,EAAE,KAAK,CAAC,CACtF,CACF,CAAA;AACL,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { Effect } from 'effect';
2
+ export type PersistOptionExternalApi<Args> = boolean | undefined | {
3
+ readonly key?: string | ((inputs: Args) => string);
4
+ };
5
+ export interface PersistSlotInput<Args> {
6
+ readonly label: string;
7
+ readonly name: string;
8
+ readonly inputs: number;
9
+ readonly option: PersistOptionExternalApi<Args>;
10
+ }
11
+ export declare const resolvePersistSlot: <Args>(input: PersistSlotInput<Args>) => Effect.Effect<string | ((inputs: Args) => string)>;
12
+ //# sourceMappingURL=queryDriverPersistWarn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverPersistWarn.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverPersistWarn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAA;AAG1C,MAAM,MAAM,wBAAwB,CAAC,IAAI,IACrC,OAAO,GACP,SAAS,GACT;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAA;CAAE,CAAA;AAE1D,MAAM,WAAW,gBAAgB,CAAC,IAAI;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAA;CAChD;AAWD,eAAO,MAAM,kBAAkB,GAAI,IAAI,EACrC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAgBnD,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { Effect, Predicate } from 'effect';
2
+ // The cache slot a query persists into, plus the warning if that slot is shared.
3
+ export const resolvePersistSlot = (input) => {
4
+ const option = input.option;
5
+ const key = option === true || option === undefined || option === false
6
+ ? input.name
7
+ : (option.key ?? input.name);
8
+ return Effect.as(warnSharedPersistSlot({
9
+ label: input.label,
10
+ name: input.name,
11
+ inputs: input.inputs,
12
+ key,
13
+ enabled: option !== undefined && option !== false,
14
+ }), key);
15
+ };
16
+ // A constant `persist` key gives every input key ONE cache slot: the last key to
17
+ // settle overwrites the rest, and on the next boot that payload is hydrated as the
18
+ // answer to whichever key is being asked. Sharing a slot on purpose is a legitimate
19
+ // choice — a "last seen" cache — so this warns rather than refuses, but it must not
20
+ // be silent: it is the same misattribution `isPreviousKey` exists to stop, arriving
21
+ // across a reload where no epoch or key guard can see it.
22
+ const warnSharedPersistSlot = (slot) => {
23
+ if (!slot.enabled || slot.inputs === 0 || !Predicate.isString(slot.key)) {
24
+ return Effect.void;
25
+ }
26
+ return Effect.logWarning(`reform: ${slot.label} '${slot.name}' persists ${slot.inputs} input(s) into the single cache slot ` +
27
+ `'${slot.key}'. Every input key overwrites the same entry, and a reload hydrates it as the answer ` +
28
+ `to whichever key is being asked. Pass persist: { key: (inputs) => ... } for a slot per key, or ` +
29
+ `keep the shared slot deliberately.`);
30
+ };
31
+ //# sourceMappingURL=queryDriverPersistWarn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverPersistWarn.js","sourceRoot":"","sources":["../../src/internal/queryDriverPersistWarn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAuB1C,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAA6B,EACuB,EAAE;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC3B,MAAM,GAAG,GACP,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,MAAM,CAAC,EAAE,CACd,qBAAqB,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG;QACH,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;KAClD,CAAC,EACF,GAAG,CACJ,CAAA;AACH,CAAC,CAAA;AAED,iFAAiF;AACjF,mFAAmF;AACnF,oFAAoF;AACpF,oFAAoF;AACpF,oFAAoF;AACpF,0DAA0D;AAC1D,MAAM,qBAAqB,GAAG,CAAC,IAAuB,EAAuB,EAAE;IAC7E,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CACtB,WAAW,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,MAAM,uCAAuC;QACjG,IAAI,IAAI,CAAC,GAAG,uFAAuF;QACnG,iGAAiG;QACjG,oCAAoC,CACvC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { MutableRef } from 'effect';
2
+ import type { QueryState } from '../calc/queryState.js';
3
+ import type { Store } from './store.js';
4
+ export interface SettleRequest {
5
+ readonly sourceKey: ReadonlyArray<unknown>;
6
+ readonly generation: number;
7
+ }
8
+ export interface SettlersOptions<A, E> {
9
+ readonly stateStore: Store<QueryState<A, E>>;
10
+ readonly lastSourceKey: MutableRef.MutableRef<ReadonlyArray<unknown> | undefined>;
11
+ readonly generation: MutableRef.MutableRef<number>;
12
+ readonly staleAtGeneration: MutableRef.MutableRef<number>;
13
+ readonly reuse: boolean;
14
+ }
15
+ export interface Settlers<A, E> {
16
+ readonly supersededKey: (requestSourceKey: ReadonlyArray<unknown>) => boolean;
17
+ readonly markFetching: (superseded?: boolean) => void;
18
+ readonly settleSuccess: (produced: A, request: SettleRequest) => A;
19
+ readonly settleError: (error: E, request: SettleRequest) => void;
20
+ readonly settleDefect: (request: SettleRequest) => void;
21
+ }
22
+ export declare const makeSettlers: <A, E>(options: SettlersOptions<A, E>) => Settlers<A, E>;
23
+ //# sourceMappingURL=queryDriverSettle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverSettle.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverSettle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAU,MAAM,QAAQ,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5C,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAAA;IACjF,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAClD,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAA;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACrD,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,CAAA;IAClE,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAChE,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CACxD;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,CAAC,EAAE,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAqDhF,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { MutableRef, Option } from 'effect';
2
+ import { settleQueryError } from './queryDriverStore.js';
3
+ import { reuse } from './reuse.js';
4
+ import { sameKey } from './sources.js';
5
+ export const makeSettlers = (options) => {
6
+ const { stateStore } = options;
7
+ // A settling request answers the key it was issued for. If the sources have
8
+ // moved on, whatever it writes is about a question nobody is asking any more.
9
+ const supersededKey = (requestSourceKey) => {
10
+ const current = MutableRef.get(options.lastSourceKey);
11
+ return current === undefined || !sameKey(requestSourceKey, current);
12
+ };
13
+ const markFetching = (superseded = false) => {
14
+ const state = stateStore.get();
15
+ const isPreviousKey = state.isPreviousKey || superseded;
16
+ if (!state.isFetching || isPreviousKey !== state.isPreviousKey) {
17
+ stateStore.set({ ...state, isFetching: true, isPreviousKey });
18
+ }
19
+ };
20
+ const settleSuccess = (produced, request) => {
21
+ const prev = stateStore.get();
22
+ const shared = options.reuse && Option.isSome(prev.data) ? reuse(prev.data.value, produced) : produced;
23
+ stateStore.set({
24
+ ...prev,
25
+ data: Option.some(shared),
26
+ error: Option.none(),
27
+ isFetching: false,
28
+ // An answer requested before an invalidation cannot discharge it: the mark
29
+ // clears only for a strictly newer generation, matching `maybeAutoRefetch`.
30
+ isStale: request.generation <= MutableRef.get(options.staleAtGeneration),
31
+ isPreviousKey: supersededKey(request.sourceKey),
32
+ });
33
+ return shared;
34
+ };
35
+ const settleError = (error, request) => {
36
+ // Preserve the stale cause after failure without duplicating a newer request.
37
+ MutableRef.update(options.staleAtGeneration, (current) => Math.max(current, request.generation));
38
+ settleQueryError(stateStore, error, supersededKey(request.sourceKey));
39
+ };
40
+ // A run that dies is over; leaving `isFetching` raised advertises a flight that
41
+ // no longer exists. Only the newest run may retract it — a superseded run's
42
+ // death says nothing about its successor.
43
+ const settleDefect = (request) => {
44
+ if (MutableRef.get(options.generation) !== request.generation) {
45
+ return;
46
+ }
47
+ const state = stateStore.get();
48
+ stateStore.set({ ...state, isFetching: false });
49
+ };
50
+ return { supersededKey, markFetching, settleSuccess, settleError, settleDefect };
51
+ };
52
+ //# sourceMappingURL=queryDriverSettle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverSettle.js","sourceRoot":"","sources":["../../src/internal/queryDriverSettle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { MutableRef } from 'effect';
2
+ import type { AnyAsyncData } from '../calc/asyncData.js';
3
+ import { type QueryState } from '../calc/queryState.js';
4
+ import type { Scheduler } from './scheduler.js';
5
+ import { type Store } from './store.js';
6
+ interface SubscribableSource {
7
+ readonly subscribe: (listener: () => void) => () => void;
8
+ }
9
+ export declare const subscribeQuerySources: (sources: SubscribableSource, extraKey: SubscribableSource | undefined, listener: () => void) => (() => void);
10
+ export declare const settleQueryError: <A, E>(stateStore: Store<QueryState<A, E>>, error: E, isPreviousKey: boolean) => void;
11
+ export declare const incrementGeneration: (generation: MutableRef.MutableRef<number>) => number;
12
+ interface QueryProjectionOptions<A, E> {
13
+ readonly gated: boolean;
14
+ readonly scheduler: Scheduler;
15
+ readonly stateStore: Store<QueryState<A, E>>;
16
+ }
17
+ export declare const makeQueryProjection: <A, E>(options: QueryProjectionOptions<A, E>) => {
18
+ readonly store: Store<AnyAsyncData<A, E>>;
19
+ readonly unsubscribe: () => void;
20
+ };
21
+ interface ReaderStoreOptions<A, E> {
22
+ readonly store: Store<AnyAsyncData<A, E>>;
23
+ readonly readers: MutableRef.MutableRef<number>;
24
+ readonly onFirstReader: () => void;
25
+ }
26
+ export declare const withReaderTracking: <A, E>(options: ReaderStoreOptions<A, E>) => Store<AnyAsyncData<A, E>>;
27
+ export {};
28
+ //# sourceMappingURL=queryDriverStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverStore.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAU,MAAM,QAAQ,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CACzD;AAED,eAAO,MAAM,qBAAqB,GAChC,SAAS,kBAAkB,EAC3B,UAAU,kBAAkB,GAAG,SAAS,EACxC,UAAU,MAAM,IAAI,KACnB,CAAC,MAAM,IAAI,CAOb,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EACnC,YAAY,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,CAAC,EACR,eAAe,OAAO,KACrB,IAGF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,YAAY,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,KAAG,MAG/E,CAAA;AAED,UAAU,sBAAsB,CAAC,CAAC,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,CAAC,EACtC,SAAS,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,KACpC;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAA;CAqB/E,CAAA;AAED,UAAU,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAA;CACnC;AAED,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,EACrC,SAAS,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,KAChC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAczB,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { MutableRef, Option } from 'effect';
2
+ import { toAsyncData } from '../calc/queryState.js';
3
+ import { makeDerivedStore } from './store.js';
4
+ export const subscribeQuerySources = (sources, extraKey, listener) => {
5
+ const offSources = sources.subscribe(listener);
6
+ const offExtra = extraKey?.subscribe(listener);
7
+ return () => {
8
+ offSources();
9
+ offExtra?.();
10
+ };
11
+ };
12
+ export const settleQueryError = (stateStore, error, isPreviousKey) => {
13
+ const previous = stateStore.get();
14
+ stateStore.set({ ...previous, error: Option.some(error), isFetching: false, isPreviousKey });
15
+ };
16
+ export const incrementGeneration = (generation) => {
17
+ MutableRef.update(generation, (current) => current + 1);
18
+ return MutableRef.get(generation);
19
+ };
20
+ export const makeQueryProjection = (options) => {
21
+ const projection = MutableRef.make(undefined);
22
+ const project = () => {
23
+ const state = options.stateStore.get();
24
+ const previous = MutableRef.get(projection);
25
+ if (previous !== undefined &&
26
+ previous.state.data === state.data &&
27
+ previous.state.error === state.error &&
28
+ previous.state.isFetching === state.isFetching &&
29
+ previous.state.isPreviousKey === state.isPreviousKey) {
30
+ return previous.view;
31
+ }
32
+ const view = toAsyncData(state, options.gated);
33
+ MutableRef.set(projection, { state, view });
34
+ return view;
35
+ };
36
+ return makeDerivedStore(project, options.stateStore.subscribe, options.scheduler);
37
+ };
38
+ export const withReaderTracking = (options) => ({
39
+ ...options.store,
40
+ subscribe: (listener) => {
41
+ const before = MutableRef.get(options.readers);
42
+ MutableRef.set(options.readers, before + 1);
43
+ const off = options.store.subscribe(listener);
44
+ if (before === 0) {
45
+ options.onFirstReader();
46
+ }
47
+ return () => {
48
+ off();
49
+ MutableRef.update(options.readers, (count) => Math.max(0, count - 1));
50
+ };
51
+ },
52
+ });
53
+ //# sourceMappingURL=queryDriverStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverStore.js","sourceRoot":"","sources":["../../src/internal/queryDriverStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { Brand, Effect, type ParseResult, Schema } from 'effect';
2
+ import type { AnyAsyncData } from '../calc/asyncData.js';
3
+ import type { InputsObject, InvalidateBy } from './sources.js';
4
+ import type { Store } from './store.js';
5
+ import type { AnySource } from '../state/token.js';
6
+ export type GatedOf<AlwaysOn extends boolean> = AlwaysOn extends true ? false : true;
7
+ export declare const gatedFlag: <AlwaysOn extends boolean>(alwaysOn: AlwaysOn | undefined) => GatedOf<AlwaysOn>;
8
+ export type Revision = number & Brand.Brand<'reform/Revision'>;
9
+ export declare const Revision: Brand.Brand.Constructor<Revision>;
10
+ export declare const RevisionSchema: Schema.Schema<Revision, number>;
11
+ export declare const revisionZero: Revision;
12
+ export declare const bumpRevision: (revision: Revision) => Revision;
13
+ export interface QueryCodec<A> {
14
+ readonly encode: (value: A) => Effect.Effect<unknown, ParseResult.ParseError, never>;
15
+ readonly decode: (input: unknown) => Effect.Effect<A, ParseResult.ParseError, never>;
16
+ }
17
+ export interface QueryDriverOptions<Inputs extends ReadonlyArray<AnySource>, A, E, R> {
18
+ readonly name: string;
19
+ readonly label: string;
20
+ readonly gated: boolean;
21
+ readonly inputs: Inputs;
22
+ readonly query: (inputs: InputsObject<Inputs>) => Effect.Effect<A, E, R>;
23
+ readonly invalidateBy?: InvalidateBy<Inputs> | undefined;
24
+ readonly disabled?: ((inputs: InputsObject<Inputs>) => boolean) | undefined;
25
+ readonly coalesce?: 'switch' | 'trailing' | undefined;
26
+ readonly reuse?: boolean | undefined;
27
+ readonly keepPreviousData?: boolean | undefined;
28
+ readonly extraKey?: {
29
+ readonly read: () => unknown;
30
+ readonly subscribe: (listener: () => void) => () => void;
31
+ } | undefined;
32
+ readonly persist?: {
33
+ readonly key: string | ((inputs: InputsObject<Inputs>) => string);
34
+ readonly codec: QueryCodec<A>;
35
+ } | undefined;
36
+ readonly onSettled?: ((generation: number) => void) | undefined;
37
+ }
38
+ export interface QueryDriver<A, E> {
39
+ readonly store: Store<AnyAsyncData<A, E>>;
40
+ readonly requested: () => number;
41
+ readonly key: () => ReadonlyArray<unknown>;
42
+ readonly subscribeKey: (listener: () => void) => () => void;
43
+ }
44
+ //# sourceMappingURL=queryDriverTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverTypes.d.ts","sourceRoot":"","sources":["../../src/internal/queryDriverTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Brand, Effect, Schema } from 'effect';
2
+ export const gatedFlag = (alwaysOn) =>
3
+ // oxlint-disable-next-line reform-rules/no-type-assertion -- restate the runtime boolean as its conditional `GatedOf` literal; no guard maps a boolean to a conditional type
4
+ (alwaysOn !== true);
5
+ export const Revision = Brand.nominal();
6
+ export const RevisionSchema = Schema.Number.pipe(Schema.brand('reform/Revision'));
7
+ export const revisionZero = Revision(0);
8
+ export const bumpRevision = (revision) => Revision(revision + 1);
9
+ //# sourceMappingURL=queryDriverTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryDriverTypes.js","sourceRoot":"","sources":["../../src/internal/queryDriverTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAoB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAQhE,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,QAA8B,EACX,EAAE;AACrB,6KAA6K;AAC7K,CAAC,QAAQ,KAAK,IAAI,CAAsB,CAAA;AAG1C,MAAM,CAAC,MAAM,QAAQ,GAAsC,KAAK,CAAC,OAAO,EAAY,CAAA;AACpF,MAAM,CAAC,MAAM,cAAc,GAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC/E,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAChC,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAa,QAAQ,CAAC,CAAC,CAAC,CAAA;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAY,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { Context, Effect } from 'effect';
2
+ export interface QueryEventsApi {
3
+ readonly subscribeFocus: (listener: () => void) => () => void;
4
+ readonly subscribeOnline: (listener: () => void) => () => void;
5
+ }
6
+ declare const QueryEventsBase: Context.TagClass<QueryEvents, 'reform/QueryEvents', QueryEventsApi>;
7
+ export declare class QueryEvents extends QueryEventsBase {
8
+ }
9
+ export declare const noopQueryEvents: QueryEventsApi;
10
+ export declare const resolveQueryEvents: Effect.Effect<QueryEventsApi>;
11
+ export {};
12
+ //# sourceMappingURL=queryEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryEvents.d.ts","sourceRoot":"","sources":["../../src/internal/queryEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;IAC7D,QAAQ,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAC/D;AAED,QAAA,MAAM,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,EAAE,cAAc,CACvB,CAAA;AAClE,qBAAa,WAAY,SAAQ,eAAe;CAAG;AAInD,eAAO,MAAM,eAAe,EAAE,cAG7B,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAG5D,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { Context, Effect, Option } from 'effect';
2
+ const QueryEventsBase = Context.Tag('reform/QueryEvents')();
3
+ export class QueryEvents extends QueryEventsBase {
4
+ }
5
+ const noop = () => () => { };
6
+ export const noopQueryEvents = {
7
+ subscribeFocus: noop,
8
+ subscribeOnline: noop,
9
+ };
10
+ export const resolveQueryEvents = Effect.map(Effect.serviceOption(QueryEvents), Option.getOrElse(() => noopQueryEvents));
11
+ //# sourceMappingURL=queryEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryEvents.js","sourceRoot":"","sources":["../../src/internal/queryEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAOhD,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAA+B,CAAA;AAClE,MAAM,OAAO,WAAY,SAAQ,eAAe;CAAG;AAEnD,MAAM,IAAI,GAAG,GAAiB,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAA;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAkC,MAAM,CAAC,GAAG,CACzE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,EACjC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CACxC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { Context, Effect, Option } from 'effect';
2
+ export interface QueryStoreApi {
3
+ readonly get: (key: string) => Effect.Effect<Option.Option<unknown>>;
4
+ readonly set: (key: string, value: unknown) => Effect.Effect<void>;
5
+ readonly remove: (key: string) => Effect.Effect<void>;
6
+ }
7
+ declare const QueryStoreBase: Context.TagClass<QueryStore, 'reform/QueryStore', QueryStoreApi>;
8
+ export declare class QueryStore extends QueryStoreBase {
9
+ }
10
+ export declare const noopQueryStore: QueryStoreApi;
11
+ export declare const resolveQueryStore: Effect.Effect<QueryStoreApi>;
12
+ export {};
13
+ //# sourceMappingURL=queryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryStore.d.ts","sourceRoot":"","sources":["../../src/internal/queryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACpE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACtD;AAED,QAAA,MAAM,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,EAAE,aAAa,CACtB,CAAA;AAC/D,qBAAa,UAAW,SAAQ,cAAc;CAAG;AAEjD,eAAO,MAAM,cAAc,EAAE,aAI5B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAG1D,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { Context, Effect, Option } from 'effect';
2
+ const QueryStoreBase = Context.Tag('reform/QueryStore')();
3
+ export class QueryStore extends QueryStoreBase {
4
+ }
5
+ export const noopQueryStore = {
6
+ get: () => Effect.succeedNone,
7
+ set: () => Effect.void,
8
+ remove: () => Effect.void,
9
+ };
10
+ export const resolveQueryStore = Effect.map(Effect.serviceOption(QueryStore), Option.getOrElse(() => noopQueryStore));
11
+ //# sourceMappingURL=queryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryStore.js","sourceRoot":"","sources":["../../src/internal/queryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAQhD,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAA6B,CAAA;AAC/D,MAAM,OAAO,UAAW,SAAQ,cAAc;CAAG;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW;IAC7B,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;IACtB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAiC,MAAM,CAAC,GAAG,CACvE,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,EAChC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CACvC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const reuse: <A>(previous: A, next: A) => A;
2
+ //# sourceMappingURL=reuse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reuse.d.ts","sourceRoot":"","sources":["../../src/internal/reuse.ts"],"names":[],"mappings":"AAkFA,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,KAAG,CAEY,CAAA"}
@@ -0,0 +1,55 @@
1
+ import { Equal, Record as Rec } from 'effect';
2
+ const MAX_DEPTH = 16;
3
+ const isPlainRecord = (candidate) => typeof candidate === 'object' &&
4
+ candidate !== null &&
5
+ (Object.getPrototypeOf(candidate) === Object.prototype ||
6
+ Object.getPrototypeOf(candidate) === null);
7
+ const ownRecord = (source) => Rec.fromEntries(Reflect.ownKeys(source)
8
+ .filter((key) => typeof key === 'string' && Object.prototype.propertyIsEnumerable.call(source, key))
9
+ .map((key) => [key, Reflect.get(source, key)]));
10
+ const reconcileRecord = (prev, next, depth) => {
11
+ const keys = Rec.keys(next);
12
+ const out = Rec.fromEntries(keys.map((key) => [
13
+ key,
14
+ key in prev ? reconcile({ prev: prev[key], next: next[key], depth: depth - 1 }) : next[key],
15
+ ]));
16
+ const allPrev = keys.length === Rec.keys(prev).length &&
17
+ keys.every((key) => key in prev && Object.is(out[key], prev[key]));
18
+ return { out, allPrev };
19
+ };
20
+ const reconcile = ({ prev, next, depth }) => {
21
+ if (Object.is(prev, next)) {
22
+ return prev;
23
+ }
24
+ if (Equal.equals(prev, next)) {
25
+ return prev;
26
+ }
27
+ if (depth <= 0) {
28
+ return next;
29
+ }
30
+ if (Array.isArray(prev) && Array.isArray(next)) {
31
+ const reconciled = next.map((element, index) => index < prev.length
32
+ ? reconcile({ prev: prev[index], next: element, depth: depth - 1 })
33
+ : element);
34
+ const unchanged = prev.length === next.length &&
35
+ reconciled.every((entry, index) => Object.is(entry, prev[index]));
36
+ return unchanged ? prev : reconciled;
37
+ }
38
+ if (isPlainRecord(prev) && isPlainRecord(next)) {
39
+ const { out, allPrev } = reconcileRecord(prev, next, depth);
40
+ return allPrev ? prev : out;
41
+ }
42
+ if (Equal.isEqual(prev) &&
43
+ Equal.isEqual(next) &&
44
+ Object.getPrototypeOf(prev) === Object.getPrototypeOf(next)) {
45
+ const { out, allPrev } = reconcileRecord(ownRecord(prev), ownRecord(next), depth);
46
+ return allPrev
47
+ ? prev
48
+ : Object.create(Object.getPrototypeOf(next), Object.getOwnPropertyDescriptors(out));
49
+ }
50
+ return next;
51
+ };
52
+ export const reuse = (previous, next) =>
53
+ // oxlint-disable-next-line reform-rules/no-type-assertion -- the walker returns a value-equal reconstruction of `next`, type-preserved by construction (the single seam this cast lives at)
54
+ reconcile({ prev: previous, next, depth: MAX_DEPTH });
55
+ //# sourceMappingURL=reuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reuse.js","sourceRoot":"","sources":["../../src/internal/reuse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Context, Effect, Layer } from 'effect';
2
+ export interface Scheduler {
3
+ readonly schedule: (listeners: Iterable<() => void>) => void;
4
+ }
5
+ export declare const withInlineNotifications: <A>(run: () => A) => A;
6
+ export declare const makeScheduler: () => Scheduler;
7
+ export declare const defaultScheduler: Scheduler;
8
+ declare const NotificationsBase: Context.TagClass<Notifications, 'reform/Notifications', Scheduler>;
9
+ export declare class Notifications extends NotificationsBase {
10
+ }
11
+ export declare const notificationsLayer: Layer.Layer<Notifications>;
12
+ export declare const resolveScheduler: Effect.Effect<Scheduler>;
13
+ export {};
14
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/internal/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAiC,MAAM,QAAQ,CAAA;AAG9E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAA;CAC7D;AAgBD,eAAO,MAAM,uBAAuB,GAAI,CAAC,EAAE,KAAK,MAAM,CAAC,KAAG,CAMzD,CAAA;AAED,eAAO,MAAM,aAAa,QAAO,SA6FhC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,SAA2B,CAAA;AAE1D,QAAA,MAAM,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,EAAE,SAAS,CACzB,CAAA;AACjE,qBAAa,aAAc,SAAQ,iBAAiB;CAAG;AAEvD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAGzD,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAGrD,CAAA"}