@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,51 @@
1
+ import type { SlotProps } from './slot.js';
2
+ import type { EventsOf, UiContract } from './ui.js';
3
+ export interface EachFill<P> {
4
+ readonly _tag: 'Each';
5
+ readonly items: ReadonlyArray<{
6
+ readonly key: string;
7
+ readonly props: P;
8
+ }>;
9
+ }
10
+ export interface OneFill<P> {
11
+ readonly _tag: 'One';
12
+ readonly props: P;
13
+ }
14
+ export interface AbsentFill {
15
+ readonly _tag: 'Absent';
16
+ }
17
+ export type SlotFill<P> = EachFill<P> | OneFill<P> | AbsentFill;
18
+ export type StructureSlots<C extends UiContract> = C extends {
19
+ slots: infer S;
20
+ } ? {
21
+ readonly [K in keyof S]: SlotFill<SlotProps<S[K]>>;
22
+ } : Readonly<Record<PropertyKey, never>>;
23
+ interface SerializableFrame<C extends UiContract> {
24
+ readonly props: C['props'];
25
+ readonly slots: StructureSlots<C>;
26
+ }
27
+ interface TriggeredFrame<C extends UiContract> extends SerializableFrame<C> {
28
+ readonly events: EventsOf<C>;
29
+ }
30
+ type MountFrame<C extends UiContract> = SerializableFrame<C> | TriggeredFrame<C>;
31
+ export declare const StructureTypeId: unique symbol;
32
+ export type StructureTypeId = typeof StructureTypeId;
33
+ export interface Structure<C extends UiContract> {
34
+ readonly [StructureTypeId]: StructureTypeId;
35
+ readonly props: C['props'];
36
+ readonly slots: StructureSlots<C>;
37
+ readonly events: EventsOf<C> | undefined;
38
+ }
39
+ export declare const mount: <C extends UiContract>(frame: MountFrame<C>) => Structure<C>;
40
+ export interface EachOptions<T, P> {
41
+ readonly key: (item: T) => string;
42
+ readonly props: (item: T) => P;
43
+ }
44
+ export declare const each: <T, P>(collection: Iterable<T>, options: EachOptions<T, P>) => EachFill<P>;
45
+ export declare const one: <P>(props: P) => OneFill<P>;
46
+ export declare const absent: AbsentFill;
47
+ export declare const when: <F extends SlotFill<unknown>>(cond: boolean, fill: F) => F | AbsentFill;
48
+ export declare const isStructure: (frame: unknown) => frame is Structure<UiContract>;
49
+ export declare const structureEquals: (left: Structure<UiContract>, right: Structure<UiContract>) => boolean;
50
+ export {};
51
+ //# sourceMappingURL=structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/compose/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { Equal, Option, Struct } from 'effect';
2
+ import { reuse } from '../internal/reuse.js';
3
+ export const StructureTypeId = Symbol.for('reform/Structure');
4
+ const frameEvents = (frame) => 'events' in frame ? Option.some(frame.events) : Option.none();
5
+ export const mount = (frame) => ({
6
+ events: Option.getOrUndefined(frameEvents(frame)),
7
+ props: frame.props,
8
+ slots: frame.slots,
9
+ [StructureTypeId]: StructureTypeId,
10
+ });
11
+ // Stable collection and callback identities retain unchanged fills by reference.
12
+ const eachRetentions = new WeakMap();
13
+ const latestEachRetentions = new WeakMap();
14
+ const hasIdentity = (candidate) => (typeof candidate === 'object' && candidate !== null) || typeof candidate === 'function';
15
+ const collectionRetentionsFor = (collection) => {
16
+ if (!hasIdentity(collection)) {
17
+ return undefined;
18
+ }
19
+ return (eachRetentions.get(collection) ?? {
20
+ byProps: new WeakMap(),
21
+ });
22
+ };
23
+ const sameElements = (previous, next) => previous.length === next.length &&
24
+ previous.every((element, index) => Object.is(element, next[index]));
25
+ const isEachFill = (candidate) => isRecord(candidate) &&
26
+ candidate['_tag'] === 'Each' &&
27
+ Array.isArray(candidate['items']) &&
28
+ candidate['items'].every((entry) => isRecord(entry) && typeof entry['key'] === 'string' && 'props' in entry);
29
+ const materializeEach = (elements, options) => ({
30
+ _tag: 'Each',
31
+ items: elements.map((element) => ({
32
+ key: options.key(element),
33
+ props: options.props(element),
34
+ })),
35
+ });
36
+ const retainEach = (previous, next) => {
37
+ if (!isEachFill(previous)) {
38
+ return next;
39
+ }
40
+ if (deepEquals({ left: previous, right: next })) {
41
+ return previous;
42
+ }
43
+ return reuse(previous, next);
44
+ };
45
+ export const each = (collection, options) => {
46
+ const elements = Array.from(collection);
47
+ const collectionRetentions = collectionRetentionsFor(collection);
48
+ const retained = collectionRetentions?.byProps.get(options.props)?.get(options.key);
49
+ const latest = hasIdentity(collection) ? latestEachRetentions.get(collection) : undefined;
50
+ if (retained !== undefined &&
51
+ sameElements(retained.elements, elements) &&
52
+ isEachFill(retained.fill)) {
53
+ return retained.fill;
54
+ }
55
+ const fill = retainEach(retained?.fill ?? latest?.fill, materializeEach(elements, options));
56
+ if (hasIdentity(collection) && collectionRetentions !== undefined) {
57
+ const byKey = collectionRetentions.byProps.get(options.props) ?? new WeakMap();
58
+ const retention = { elements, fill };
59
+ byKey.set(options.key, retention);
60
+ collectionRetentions.byProps.set(options.props, byKey);
61
+ eachRetentions.set(collection, collectionRetentions);
62
+ latestEachRetentions.set(collection, retention);
63
+ }
64
+ return fill;
65
+ };
66
+ export const one = (props) => ({ _tag: 'One', props });
67
+ export const absent = { _tag: 'Absent' };
68
+ export const when = (cond, fill) => cond ? fill : absent;
69
+ export const isStructure = (frame) => typeof frame === 'object' && frame !== null && StructureTypeId in frame;
70
+ const isRecord = (candidate) => typeof candidate === 'object' && candidate !== null && !Array.isArray(candidate);
71
+ // A structural comparison is only meaningful over own enumerable keys when those
72
+ // keys are the whole value — true of JSON-shaped records, false of everything
73
+ // carrying its state anywhere else.
74
+ const isPlainRecord = (candidate) => {
75
+ if (!isRecord(candidate)) {
76
+ return false;
77
+ }
78
+ const prototype = Object.getPrototypeOf(candidate);
79
+ return prototype === Object.prototype || prototype === null;
80
+ };
81
+ const recordEntriesEqual = (left, right, leftKeys) => leftKeys.length === Struct.keys(right).length &&
82
+ leftKeys.every((key) => Object.prototype.hasOwnProperty.call(right, key) &&
83
+ deepEquals({ left: left[key], right: right[key] }));
84
+ const deepEquals = ({ left, right }) => {
85
+ if (Object.is(left, right)) {
86
+ return true;
87
+ }
88
+ if (Array.isArray(left) && Array.isArray(right)) {
89
+ return (left.length === right.length &&
90
+ left.every((element, index) => deepEquals({ left: element, right: right[index] })));
91
+ }
92
+ if (isPlainRecord(left) && isPlainRecord(right)) {
93
+ return recordEntriesEqual(left, right, Struct.keys(left));
94
+ }
95
+ // Not a plain record. Own enumerable keys describe nothing about a `Date`, `Map` or
96
+ // `Set` — comparing by them calls every one of them empty, and so equal — so ask
97
+ // the value itself first.
98
+ if (Equal.equals(left, right)) {
99
+ return true;
100
+ }
101
+ // Effect containers say no whenever they wrap a freshly allocated record, because
102
+ // their own equality bottoms out in reference identity. They do carry their payload
103
+ // in own properties, so descend: two structurally equal `Option.some({…})` are the
104
+ // same frame. A value with no own keys (a `Date`, a `Map`) has already answered.
105
+ if (!isRecord(left) || !isRecord(right)) {
106
+ return false;
107
+ }
108
+ const leftKeys = Struct.keys(left);
109
+ return (leftKeys.length > 0 &&
110
+ Object.getPrototypeOf(left) === Object.getPrototypeOf(right) &&
111
+ recordEntriesEqual(left, right, leftKeys));
112
+ };
113
+ export const structureEquals = (left, right) =>
114
+ // Events are fresh trigger functions, so equality covers serializable frame data only.
115
+ deepEquals({ left: left.props, right: right.props }) &&
116
+ deepEquals({ left: left.slots, right: right.slots });
117
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/compose/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import type { FunctionComponent } from 'react';
2
+ import { Context, type Schema } from 'effect';
3
+ import type { AST } from 'effect/SchemaAST';
4
+ import { type Manifest } from '../definition/definition.js';
5
+ import type { Trigger } from '../ui/trigger.js';
6
+ import { type AnySlot, type AnySlotInstance, type Node, type SlotProps } from './slot.js';
7
+ interface UiContractOptionalFields {
8
+ slots: Record<string, AnySlotInstance>;
9
+ events: Record<string, Trigger<never>>;
10
+ }
11
+ export interface UiContract extends Partial<UiContractOptionalFields> {
12
+ props: unknown;
13
+ }
14
+ type PropsOf<C extends UiContract> = C['props'];
15
+ export type EventsOf<C extends UiContract> = C extends {
16
+ events: infer E;
17
+ } ? E : Readonly<Record<PropertyKey, never>>;
18
+ type SlotsOf<C extends UiContract> = C extends {
19
+ slots: infer S;
20
+ } ? {
21
+ readonly [K in keyof S]: FunctionComponent<Partial<SlotProps<S[K]> & {
22
+ readonly slotKey: string;
23
+ }>> & {
24
+ readonly props: ReadonlyArray<SlotProps<S[K]>>;
25
+ };
26
+ } : Readonly<Record<PropertyKey, never>>;
27
+ export type ViewImpl<C extends UiContract> = (props: PropsOf<C>, slots: SlotsOf<C>, events: EventsOf<C>) => Node;
28
+ export declare const UiTypeId: unique symbol;
29
+ export type UiTypeId = typeof UiTypeId;
30
+ export declare const UiServiceTypeId: unique symbol;
31
+ export type UiServiceTypeId = typeof UiServiceTypeId;
32
+ export interface UiService<N extends string> {
33
+ readonly [UiServiceTypeId]: N;
34
+ }
35
+ export type CallableView = (...args: ReadonlyArray<never>) => unknown;
36
+ export interface UiSchemaReflection {
37
+ readonly ast: AST;
38
+ }
39
+ interface UiManifestOptionalFields {
40
+ readonly props: UiSchemaReflection;
41
+ readonly events: Readonly<Record<string, UiSchemaReflection>>;
42
+ }
43
+ export interface UiManifest extends Manifest, Partial<UiManifestOptionalFields> {
44
+ readonly kind: 'Ui';
45
+ }
46
+ export interface WiredUiManifest extends UiManifest {
47
+ readonly props: UiSchemaReflection;
48
+ }
49
+ export type UiCapture<Result> = <C extends UiContract, N extends string>(contract: UiClass<C, N>) => Result;
50
+ export interface UiReflection<out C extends UiContract = UiContract, out N extends string = string> {
51
+ new (): {};
52
+ readonly [UiTypeId]: UiTypeId;
53
+ readonly manifest: UiManifest & {
54
+ readonly name: N;
55
+ };
56
+ readonly Contract: C;
57
+ }
58
+ export interface AnyUi {
59
+ new (): {};
60
+ readonly [UiTypeId]: UiTypeId;
61
+ readonly manifest: UiManifest;
62
+ readonly capture: <Result>(visit: UiCapture<Result>) => Result;
63
+ }
64
+ export interface UiClass<C extends UiContract, N extends string> extends UiReflection<C, N> {
65
+ readonly capture: <Result>(visit: UiCapture<Result>) => Result;
66
+ readonly impl: Context.Tag<UiService<N>, ViewImpl<C>>;
67
+ readonly provider: Context.Tag<UiService<N>, CallableView>;
68
+ }
69
+ export type Contract<U> = U extends UiReflection<infer C, infer _N> ? C : never;
70
+ export type UiName<U> = U extends UiReflection<infer _C, infer N> ? N : never;
71
+ export type WiredUi<C extends UiContract, N extends string> = UiClass<C, N> & {
72
+ readonly manifest: WiredUiManifest;
73
+ };
74
+ interface WireSchemasOptionalFields {
75
+ readonly events: Readonly<Record<string, Schema.Schema.AnyNoContext>>;
76
+ readonly slots: Readonly<Record<string, AnySlot>>;
77
+ }
78
+ export interface WireSchemas extends Partial<WireSchemasOptionalFields> {
79
+ readonly props: Schema.Schema.AnyNoContext;
80
+ }
81
+ type DerivedEvents<Sch extends WireSchemas> = Sch extends {
82
+ readonly events: infer E extends Record<string, Schema.Schema.AnyNoContext>;
83
+ } ? {
84
+ readonly [K in keyof E]: Trigger<Schema.Schema.Type<E[K]>>;
85
+ } : Readonly<Record<PropertyKey, never>>;
86
+ type DerivedSlots<Sch extends WireSchemas> = Sch extends {
87
+ readonly slots: infer S extends Record<string, AnySlot>;
88
+ } ? {
89
+ readonly [K in keyof S]: InstanceType<S[K]>;
90
+ } : Readonly<Record<PropertyKey, never>>;
91
+ export type DerivedContract<Sch extends WireSchemas> = {
92
+ readonly props: Schema.Schema.Type<Sch['props']>;
93
+ readonly slots: DerivedSlots<Sch>;
94
+ readonly events: DerivedEvents<Sch>;
95
+ };
96
+ export declare const isUi: (candidate: unknown) => candidate is AnyUi;
97
+ export declare function ui<const N extends string>(name: N): <C extends UiContract>() => UiClass<C, N>;
98
+ export declare function ui<const N extends string, const Sch extends WireSchemas>(name: N, schemas: Sch): WiredUi<DerivedContract<Sch>, N>;
99
+ export declare const UiViewContract: unique symbol;
100
+ export type UiViewContract = typeof UiViewContract;
101
+ export type MadeViewCapture<Result> = <C extends UiContract, N extends string, U extends AnyUi>(view: MadeView<C, N, U>) => Result;
102
+ export type MadeView<C extends UiContract, N extends string, U extends AnyUi = UiClass<C, N>> = ViewImpl<C> & {
103
+ readonly [UiViewContract]: U;
104
+ readonly capture: <Result>(visit: MadeViewCapture<Result>) => Result;
105
+ };
106
+ export type AnyMadeView = CallableView & {
107
+ readonly [UiViewContract]: AnyUi;
108
+ readonly capture: <Result>(visit: MadeViewCapture<Result>) => Result;
109
+ };
110
+ export declare const make: <U extends AnyUi>(contract: U, view: ViewImpl<Contract<U>>) => MadeView<Contract<U>, UiName<U>, U>;
111
+ export {};
112
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/compose/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { Context, GlobalValue, MutableRef } from 'effect';
2
+ import { definitionClass } from '../definition/definition.js';
3
+ import {} from './slot.js';
4
+ export const UiTypeId = Symbol.for('reform/Ui');
5
+ export const UiServiceTypeId = Symbol.for('reform/UiService');
6
+ export const isUi = (candidate) => (typeof candidate === 'function' || typeof candidate === 'object') &&
7
+ candidate !== null &&
8
+ UiTypeId in candidate;
9
+ // Same rationale as `slot()` and `Composition.make`: two independently authored
10
+ // definitions that happen to share a name are two contracts, not one. Keying the
11
+ // runtime tag by name alone collapses them, and the last `provide` wins silently.
12
+ // The wire still identifies a view by `manifest.name`, which is untouched.
13
+ const uiDefinitionSequence = GlobalValue.globalValue(Symbol.for('reform/UiDefinitionSequence'), () => MutableRef.make(0));
14
+ const nextUiTagKey = (name) => `reform/ui/${name}/${MutableRef.incrementAndGet(uiDefinitionSequence)}`;
15
+ const buildUi = (name, manifest) => {
16
+ const key = nextUiTagKey(name);
17
+ const impl = Context.GenericTag(key);
18
+ const provider = Context.GenericTag(key);
19
+ const contract = definitionClass({
20
+ [UiTypeId]: UiTypeId,
21
+ manifest,
22
+ impl,
23
+ provider,
24
+ capture: (visit) => visit(contract),
25
+ });
26
+ return contract;
27
+ };
28
+ // oxlint-disable-next-line reform-rules/min-var-name -- `ui` is the public framework contract-authoring API; renaming would break every caller across the monorepo
29
+ export function ui(name, schemas) {
30
+ if (schemas === undefined) {
31
+ return () => buildUi(name, {
32
+ kind: 'Ui',
33
+ name,
34
+ });
35
+ }
36
+ const eventFields = schemas.events === undefined ? {} : { events: schemas.events };
37
+ const manifest = {
38
+ kind: 'Ui',
39
+ name,
40
+ props: schemas.props,
41
+ ...eventFields,
42
+ };
43
+ return buildUi(name, manifest);
44
+ }
45
+ export const UiViewContract = Symbol.for('reform/ui/view-contract');
46
+ export const make = (contract, view) => {
47
+ // Branded on a fresh wrapper rather than on `view` itself: the caller's function is
48
+ // theirs, and attaching in place lets a second `Ui.make` over the same view rebrand
49
+ // the first contract's binding out from under it.
50
+ const wrapped = (props, slots, events) => view(props, slots, events);
51
+ // oxlint-disable-next-line reform-rules/no-object-assign -- `wrapped` is callable; spread would drop callability, so its reflection statics are attached in place
52
+ const made = Object.assign(wrapped, {
53
+ [UiViewContract]: contract,
54
+ capture: (visit) => visit(made),
55
+ });
56
+ return made;
57
+ };
58
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/compose/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Effect } from 'effect';
2
+ export type Kind = 'State' | 'StateGroup' | 'StateFamily' | 'Event' | 'EventGroup' | 'Reducer' | 'Calc' | 'CalcFamily' | 'AsyncCalc' | 'Resource' | 'RemoteState' | 'SyncedStore' | 'Boundary' | 'Procedure' | 'Channel' | 'Composition' | 'Ui' | 'Slot' | 'Feature';
3
+ export interface Manifest {
4
+ readonly kind: Kind;
5
+ readonly name: string;
6
+ }
7
+ export declare function yieldableClass<A, E, R, Statics extends object>(read: Effect.Effect<A, E, R>, statics: Statics): {
8
+ new (): {};
9
+ } & Effect.Effect<A, E, R> & Statics;
10
+ export declare function definitionClass<Class>(statics: object): Class;
11
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/definition/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAM/B,MAAM,MAAM,IAAI,GACZ,OAAO,GACP,YAAY,GACZ,aAAa,GACb,OAAO,GACP,YAAY,GACZ,SAAS,GACT,MAAM,GACN,YAAY,GACZ,WAAW,GACX,UAAU,GACV,aAAa,GACb,aAAa,GACb,UAAU,GACV,WAAW,GACX,SAAS,GACT,aAAa,GACb,IAAI,GACJ,MAAM,GACN,SAAS,CAAA;AAEb,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,SAAS,MAAM,EAC5D,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5B,OAAO,EAAE,OAAO,GACf;IAAE,QAAQ,EAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAA;AAoBpD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { Effect } from 'effect';
2
+ import { attachInspectable } from '../internal/inspect.js';
3
+ const describe = (statics) => ('manifest' in statics ? Reflect.get(statics, 'manifest') : undefined) ?? statics;
4
+ export function yieldableClass(read, statics) {
5
+ class Base {
6
+ }
7
+ Object.setPrototypeOf(Base, read);
8
+ Reflect.ownKeys(statics).forEach((key) => {
9
+ const staticValue = Reflect.get(statics, key);
10
+ Object.defineProperty(Base, key, {
11
+ value: staticValue,
12
+ writable: true,
13
+ enumerable: true,
14
+ configurable: true,
15
+ });
16
+ });
17
+ attachInspectable(Base, () => describe(statics));
18
+ return Base;
19
+ }
20
+ export function definitionClass(statics) {
21
+ const Base = class {
22
+ };
23
+ Reflect.ownKeys(statics).forEach((key) => {
24
+ const staticValue = Reflect.get(statics, key);
25
+ Object.defineProperty(Base, key, {
26
+ value: staticValue,
27
+ writable: true,
28
+ enumerable: true,
29
+ configurable: true,
30
+ });
31
+ });
32
+ attachInspectable(Base, () => describe(statics));
33
+ return Base;
34
+ }
35
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/definition/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAW,EAAE,CAC5C,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,OAAO,CAAA;AAgCnF,MAAM,UAAU,cAAc,CAC5B,IAA8C,EAC9C,OAAe;IAEf,MAAM,IAAI;KAAG;IACb,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACjC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE;YAC/B,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAChD,OAAO,IAAI,CAAA;AACb,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG;KAAQ,CAAA;IACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE;YAC/B,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAChD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Effect, Layer, Option, Schema } from 'effect';
2
+ import { type Manifest } from '../definition/definition.js';
3
+ import { Bus, type Tagged } from '../runtime/bus.js';
4
+ import type { Source } from '../state/token.js';
5
+ import type { Trigger } from '../ui/trigger.js';
6
+ export type EventOf<N extends string, P> = Tagged & {
7
+ readonly _tag: N;
8
+ } & P;
9
+ export interface EventSchemaReflection {
10
+ readonly ast: Schema.Schema<unknown, unknown, unknown>['ast'];
11
+ }
12
+ export interface EventManifest<N extends string> extends Manifest {
13
+ readonly kind: 'Event';
14
+ readonly name: N;
15
+ readonly schema: EventSchemaReflection;
16
+ }
17
+ export interface EventReflection<out N extends string = string, out P = unknown> {
18
+ new (): {};
19
+ readonly manifest: EventManifest<N>;
20
+ readonly tag: N;
21
+ readonly Payload: P;
22
+ }
23
+ export type EventCapture<Result> = <N extends string, P>(event: EventClass<N, P>) => Result;
24
+ export interface AnyEvent extends EventReflection {
25
+ readonly buildUnknown: (payload: unknown) => Tagged;
26
+ readonly capture: <Result>(visit: EventCapture<Result>) => Result;
27
+ }
28
+ export interface EventClass<out N extends string, in out P> extends EventReflection<N, P> {
29
+ readonly build: (payload: P) => EventOf<N, P>;
30
+ readonly trigger: Effect.Effect<Trigger<P>, never, Bus>;
31
+ readonly buildUnknown: (payload: unknown) => Tagged;
32
+ readonly capture: <Result>(visit: EventCapture<Result>) => Result;
33
+ }
34
+ export type EventName<E> = E extends EventReflection<infer N, infer _P> ? N : never;
35
+ export type EventPayload<E> = E extends EventReflection<string, infer P> ? P : never;
36
+ export type EventType<E> = E extends EventReflection<infer N, infer P> ? EventOf<N, P> : never;
37
+ export declare const make: <const N extends string, P, Encoded>(name: N, schema: Schema.Schema<P, Encoded, never>) => EventClass<N, P>;
38
+ export declare function construct<N extends string, P>(event: EventClass<N, P>, payload: P): EventOf<N, P>;
39
+ export declare function construct<E extends AnyEvent>(event: E, payload: EventPayload<E>): EventType<E>;
40
+ export declare const dispatch: <E extends AnyEvent>(event: E, payload: EventPayload<E>) => Effect.Effect<void, never, Bus>;
41
+ export declare const trigger: <N extends string, P>(event: EventClass<N, P>) => Effect.Effect<Trigger<P>, never, Bus>;
42
+ export interface SourceChange<A> {
43
+ readonly previous: Option.Option<A>;
44
+ readonly current: A;
45
+ }
46
+ export interface SourceEventConfigExternalApi<A, P> {
47
+ readonly emitInitial?: boolean;
48
+ readonly payload: (change: SourceChange<A>) => Option.Option<P>;
49
+ }
50
+ export type SourceEventConfig<A, P> = SourceEventConfigExternalApi<A, P>;
51
+ export declare const liveFromSource: <N extends string, P, SourceName extends string, A, Identifier>(event: EventClass<N, P>, source: Source<SourceName, A, Identifier>, config: SourceEventConfigExternalApi<A, P>) => Layer.Layer<never, never, Identifier | Bus>;
52
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { Effect, Layer, MutableRef, Option, PubSub, Runtime, Schema } from 'effect';
2
+ import { definitionClass } from '../definition/definition.js';
3
+ import { resolveScheduler, withInlineNotifications } from '../internal/scheduler.js';
4
+ import { Bus, publish } from '../runtime/bus.js';
5
+ import { applyReducers, Reducers } from '../runtime/loop.js';
6
+ export const make = (name, schema) => {
7
+ const build = (payload) => ({ ...payload, _tag: name });
8
+ // Payloads at existential boundaries are already-decoded domain values, so
9
+ // check the Type side — decodeUnknownSync would reject transforming schemas
10
+ // (e.g. a real Option, whose _tag lives on the prototype).
11
+ const validatePayload = Schema.validateSync(schema);
12
+ const buildUnknown = (payload) => build(validatePayload(payload));
13
+ // A trigger is the UI's edge of the loop: it runs inside a discrete DOM event, and
14
+ // React decides what the DOM should look like before that event finishes. Deferring
15
+ // the reducer to the drain fiber means the props React reads back are one turn stale,
16
+ // which is what rewrites a controlled input's value and drops the caret to the end.
17
+ // So reducers for this one event run here, before the trigger returns, and the
18
+ // envelope goes out marked `reduced` for the channel/procedure half. Every batched
19
+ // path — `Event.dispatch`, procedure fan-out, streams — is untouched and still
20
+ // coalesces on the drain loop.
21
+ const trigger = Effect.gen(function* () {
22
+ const bus = yield* Bus;
23
+ // Optional: a bus can be provided without a reducer registry (bare harnesses,
24
+ // some test layers), and those keep the original deferred behaviour.
25
+ const reducers = yield* Effect.serviceOption(Reducers);
26
+ const runtime = yield* Effect.runtime();
27
+ return (payload) => {
28
+ const built = build(payload);
29
+ const reduced = Option.match(reducers, {
30
+ onNone: () => false,
31
+ onSome: (registry) => withInlineNotifications(() => {
32
+ const failures = applyReducers({ registry, event: built });
33
+ failures.forEach((failure) => Effect.runSync(Effect.logError(`reform: reducer threw handling '${failure.event._tag}'`, failure.error)));
34
+ return true;
35
+ }),
36
+ });
37
+ Runtime.runSync(runtime)(PubSub.publish(bus, { priority: 'High', event: built, reduced }));
38
+ };
39
+ });
40
+ const event = definitionClass({
41
+ manifest: { kind: 'Event', name, schema },
42
+ tag: name,
43
+ build,
44
+ buildUnknown,
45
+ trigger,
46
+ capture: (visit) => visit(event),
47
+ });
48
+ return event;
49
+ };
50
+ export function construct(event, payload) {
51
+ return event.buildUnknown(payload);
52
+ }
53
+ export const dispatch = (event, payload) => publish('Normal', event.buildUnknown(payload));
54
+ export const trigger = (event) => event.trigger;
55
+ export const liveFromSource = (event, source, config) => Layer.scopedDiscard(Effect.gen(function* () {
56
+ const store = yield* source.store;
57
+ const scheduler = yield* resolveScheduler;
58
+ const runtime = yield* Effect.runtime();
59
+ const initial = store.getSnapshot();
60
+ // The scheduler coalesces bursts, so track the last value this adapter observed.
61
+ const seen = MutableRef.make(initial);
62
+ // A queued notification may outlive unsubscribe within the same tick.
63
+ const active = MutableRef.make(true);
64
+ const emit = (change) => {
65
+ if (!MutableRef.get(active)) {
66
+ return;
67
+ }
68
+ const payload = config.payload(change);
69
+ if (Option.isSome(payload)) {
70
+ Runtime.runSync(runtime)(publish('Normal', event.build(payload.value)));
71
+ }
72
+ };
73
+ const unsubscribe = store.subscribe(() => {
74
+ const current = store.getSnapshot();
75
+ const previous = MutableRef.get(seen);
76
+ MutableRef.set(seen, current);
77
+ emit({ previous: Option.some(previous), current });
78
+ });
79
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
80
+ MutableRef.set(active, false);
81
+ unsubscribe();
82
+ }));
83
+ if (config.emitInitial === true) {
84
+ // Defer until reducers and procedures from the same layer build have registered.
85
+ scheduler.schedule([() => emit({ previous: Option.none(), current: initial })]);
86
+ }
87
+ }));
88
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/event/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AnyEvent } from './event.js';
2
+ export interface EventGroupClass<Members extends ReadonlyArray<AnyEvent>> {
3
+ new (): {};
4
+ readonly kind: 'EventGroup';
5
+ readonly members: Members;
6
+ }
7
+ export declare const make: <const Members extends ReadonlyArray<AnyEvent>>(...members: Members) => EventGroupClass<Members>;
8
+ //# sourceMappingURL=eventGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventGroup.d.ts","sourceRoot":"","sources":["../../src/event/eventGroup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,aAAa,CAAC,QAAQ,CAAC;IACtE,QAAQ,EAAE,CAAA;IACV,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,OAAO,SAAS,aAAa,CAAC,QAAQ,CAAC,EAChE,GAAG,SAAS,OAAO,KAClB,eAAe,CAAC,OAAO,CAC2D,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { definitionClass } from '../definition/definition.js';
2
+ export const make = (...members) => definitionClass({ kind: 'EventGroup', members });
3
+ //# sourceMappingURL=eventGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventGroup.js","sourceRoot":"","sources":["../../src/event/eventGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAS1D,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,GAAG,OAAgB,EACO,EAAE,CAC5B,eAAe,CAA2B,EAAE,IAAI,EAAE,YAAqB,EAAE,OAAO,EAAE,CAAC,CAAA"}