@craft-ts/core 0.7.0-beta.13

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 (682) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +58 -0
  3. package/src/index.d.ts +148 -0
  4. package/src/index.d.ts.map +1 -0
  5. package/src/index.js +150 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/after-recomputation.d.ts +327 -0
  8. package/src/lib/after-recomputation.d.ts.map +1 -0
  9. package/src/lib/after-recomputation.js +25 -0
  10. package/src/lib/after-recomputation.js.map +1 -0
  11. package/src/lib/app-checked-di.d.ts +82 -0
  12. package/src/lib/app-checked-di.d.ts.map +1 -0
  13. package/src/lib/app-checked-di.js +1 -0
  14. package/src/lib/app-checked-di.js.map +1 -0
  15. package/src/lib/async-process.d.ts +411 -0
  16. package/src/lib/async-process.d.ts.map +1 -0
  17. package/src/lib/async-process.js +702 -0
  18. package/src/lib/async-process.js.map +1 -0
  19. package/src/lib/branded-component/branded-component.d.ts +129 -0
  20. package/src/lib/branded-component/branded-component.d.ts.map +1 -0
  21. package/src/lib/branded-component/branded-component.js +7 -0
  22. package/src/lib/branded-component/branded-component.js.map +1 -0
  23. package/src/lib/browser-boundaries.d.ts +165 -0
  24. package/src/lib/browser-boundaries.d.ts.map +1 -0
  25. package/src/lib/browser-boundaries.js +550 -0
  26. package/src/lib/browser-boundaries.js.map +1 -0
  27. package/src/lib/client-di-requirement.d.ts +28 -0
  28. package/src/lib/client-di-requirement.d.ts.map +1 -0
  29. package/src/lib/client-di-requirement.js +11 -0
  30. package/src/lib/client-di-requirement.js.map +1 -0
  31. package/src/lib/client-function-middleware.d.ts +130 -0
  32. package/src/lib/client-function-middleware.d.ts.map +1 -0
  33. package/src/lib/client-function-middleware.js +144 -0
  34. package/src/lib/client-function-middleware.js.map +1 -0
  35. package/src/lib/component-monitoring.d.ts +7 -0
  36. package/src/lib/component-monitoring.d.ts.map +1 -0
  37. package/src/lib/component-monitoring.js +28 -0
  38. package/src/lib/component-monitoring.js.map +1 -0
  39. package/src/lib/component-register.d.ts +12 -0
  40. package/src/lib/component-register.d.ts.map +1 -0
  41. package/src/lib/component-register.js +13 -0
  42. package/src/lib/component-register.js.map +1 -0
  43. package/src/lib/computed-source.d.ts +303 -0
  44. package/src/lib/computed-source.d.ts.map +1 -0
  45. package/src/lib/computed-source.js +319 -0
  46. package/src/lib/computed-source.js.map +1 -0
  47. package/src/lib/correlation-id-plugin.d.ts +3 -0
  48. package/src/lib/correlation-id-plugin.d.ts.map +1 -0
  49. package/src/lib/correlation-id-plugin.js +73 -0
  50. package/src/lib/correlation-id-plugin.js.map +1 -0
  51. package/src/lib/correlation-id.d.ts +30 -0
  52. package/src/lib/correlation-id.d.ts.map +1 -0
  53. package/src/lib/correlation-id.js +86 -0
  54. package/src/lib/correlation-id.js.map +1 -0
  55. package/src/lib/craft-a11y.d.ts +22 -0
  56. package/src/lib/craft-a11y.d.ts.map +1 -0
  57. package/src/lib/craft-a11y.js +32 -0
  58. package/src/lib/craft-a11y.js.map +1 -0
  59. package/src/lib/craft-activated-route.d.ts +21 -0
  60. package/src/lib/craft-activated-route.d.ts.map +1 -0
  61. package/src/lib/craft-activated-route.js +20 -0
  62. package/src/lib/craft-activated-route.js.map +1 -0
  63. package/src/lib/craft-app-config.d.ts +91 -0
  64. package/src/lib/craft-app-config.d.ts.map +1 -0
  65. package/src/lib/craft-app-config.js +64 -0
  66. package/src/lib/craft-app-config.js.map +1 -0
  67. package/src/lib/craft-codec.d.ts +16 -0
  68. package/src/lib/craft-codec.d.ts.map +1 -0
  69. package/src/lib/craft-codec.js +1 -0
  70. package/src/lib/craft-codec.js.map +1 -0
  71. package/src/lib/craft-computed.d.ts +31 -0
  72. package/src/lib/craft-computed.d.ts.map +1 -0
  73. package/src/lib/craft-computed.js +81 -0
  74. package/src/lib/craft-computed.js.map +1 -0
  75. package/src/lib/craft-control-flow.d.ts +14 -0
  76. package/src/lib/craft-control-flow.d.ts.map +1 -0
  77. package/src/lib/craft-control-flow.js +18 -0
  78. package/src/lib/craft-control-flow.js.map +1 -0
  79. package/src/lib/craft-effect.d.ts +13 -0
  80. package/src/lib/craft-effect.d.ts.map +1 -0
  81. package/src/lib/craft-effect.js +93 -0
  82. package/src/lib/craft-effect.js.map +1 -0
  83. package/src/lib/craft-exception.d.ts +40 -0
  84. package/src/lib/craft-exception.d.ts.map +1 -0
  85. package/src/lib/craft-exception.js +16 -0
  86. package/src/lib/craft-exception.js.map +1 -0
  87. package/src/lib/craft-gen.d.ts +123 -0
  88. package/src/lib/craft-gen.d.ts.map +1 -0
  89. package/src/lib/craft-gen.js +90 -0
  90. package/src/lib/craft-gen.js.map +1 -0
  91. package/src/lib/craft-generator-runtime.d.ts +110 -0
  92. package/src/lib/craft-generator-runtime.d.ts.map +1 -0
  93. package/src/lib/craft-generator-runtime.js +191 -0
  94. package/src/lib/craft-generator-runtime.js.map +1 -0
  95. package/src/lib/craft-guard-runtime.d.ts +70 -0
  96. package/src/lib/craft-guard-runtime.d.ts.map +1 -0
  97. package/src/lib/craft-guard-runtime.js +195 -0
  98. package/src/lib/craft-guard-runtime.js.map +1 -0
  99. package/src/lib/craft-handshake.d.ts +35 -0
  100. package/src/lib/craft-handshake.d.ts.map +1 -0
  101. package/src/lib/craft-handshake.js +34 -0
  102. package/src/lib/craft-handshake.js.map +1 -0
  103. package/src/lib/craft-http-client.d.ts +236 -0
  104. package/src/lib/craft-http-client.d.ts.map +1 -0
  105. package/src/lib/craft-http-client.js +437 -0
  106. package/src/lib/craft-http-client.js.map +1 -0
  107. package/src/lib/craft-http-trace.d.ts +12 -0
  108. package/src/lib/craft-http-trace.d.ts.map +1 -0
  109. package/src/lib/craft-http-trace.js +28 -0
  110. package/src/lib/craft-http-trace.js.map +1 -0
  111. package/src/lib/craft-lazy.d.ts +42 -0
  112. package/src/lib/craft-lazy.d.ts.map +1 -0
  113. package/src/lib/craft-lazy.js +83 -0
  114. package/src/lib/craft-lazy.js.map +1 -0
  115. package/src/lib/craft-load-retry.d.ts +76 -0
  116. package/src/lib/craft-load-retry.d.ts.map +1 -0
  117. package/src/lib/craft-load-retry.js +160 -0
  118. package/src/lib/craft-load-retry.js.map +1 -0
  119. package/src/lib/craft-machine-history.d.ts +145 -0
  120. package/src/lib/craft-machine-history.d.ts.map +1 -0
  121. package/src/lib/craft-machine-history.js +276 -0
  122. package/src/lib/craft-machine-history.js.map +1 -0
  123. package/src/lib/craft-match.d.ts +49 -0
  124. package/src/lib/craft-match.d.ts.map +1 -0
  125. package/src/lib/craft-match.js +58 -0
  126. package/src/lib/craft-match.js.map +1 -0
  127. package/src/lib/craft-method.d.ts +28 -0
  128. package/src/lib/craft-method.d.ts.map +1 -0
  129. package/src/lib/craft-method.js +45 -0
  130. package/src/lib/craft-method.js.map +1 -0
  131. package/src/lib/craft-node-directive.d.ts +32 -0
  132. package/src/lib/craft-node-directive.d.ts.map +1 -0
  133. package/src/lib/craft-node-directive.js +22 -0
  134. package/src/lib/craft-node-directive.js.map +1 -0
  135. package/src/lib/craft-pending.d.ts +115 -0
  136. package/src/lib/craft-pending.d.ts.map +1 -0
  137. package/src/lib/craft-pending.js +187 -0
  138. package/src/lib/craft-pending.js.map +1 -0
  139. package/src/lib/craft-pipe.d.ts +63 -0
  140. package/src/lib/craft-pipe.d.ts.map +1 -0
  141. package/src/lib/craft-pipe.js +57 -0
  142. package/src/lib/craft-pipe.js.map +1 -0
  143. package/src/lib/craft-platform.d.ts +50 -0
  144. package/src/lib/craft-platform.d.ts.map +1 -0
  145. package/src/lib/craft-platform.js +175 -0
  146. package/src/lib/craft-platform.js.map +1 -0
  147. package/src/lib/craft-primitive-gen.d.ts +137 -0
  148. package/src/lib/craft-primitive-gen.d.ts.map +1 -0
  149. package/src/lib/craft-primitive-gen.js +76 -0
  150. package/src/lib/craft-primitive-gen.js.map +1 -0
  151. package/src/lib/craft-primitive-registry.d.ts +113 -0
  152. package/src/lib/craft-primitive-registry.d.ts.map +1 -0
  153. package/src/lib/craft-primitive-registry.js +159 -0
  154. package/src/lib/craft-primitive-registry.js.map +1 -0
  155. package/src/lib/craft-program-operators.d.ts +101 -0
  156. package/src/lib/craft-program-operators.d.ts.map +1 -0
  157. package/src/lib/craft-program-operators.js +116 -0
  158. package/src/lib/craft-program-operators.js.map +1 -0
  159. package/src/lib/craft-program-runtime.d.ts +80 -0
  160. package/src/lib/craft-program-runtime.d.ts.map +1 -0
  161. package/src/lib/craft-program-runtime.js +166 -0
  162. package/src/lib/craft-program-runtime.js.map +1 -0
  163. package/src/lib/craft-register-for-runtime.d.ts +39 -0
  164. package/src/lib/craft-register-for-runtime.d.ts.map +1 -0
  165. package/src/lib/craft-register-for-runtime.js +96 -0
  166. package/src/lib/craft-register-for-runtime.js.map +1 -0
  167. package/src/lib/craft-register-for.d.ts +57 -0
  168. package/src/lib/craft-register-for.d.ts.map +1 -0
  169. package/src/lib/craft-register-for.js +200 -0
  170. package/src/lib/craft-register-for.js.map +1 -0
  171. package/src/lib/craft-render-identity.d.ts +19 -0
  172. package/src/lib/craft-render-identity.d.ts.map +1 -0
  173. package/src/lib/craft-render-identity.js +23 -0
  174. package/src/lib/craft-render-identity.js.map +1 -0
  175. package/src/lib/craft-replay.d.ts +5 -0
  176. package/src/lib/craft-replay.d.ts.map +1 -0
  177. package/src/lib/craft-replay.js +28 -0
  178. package/src/lib/craft-replay.js.map +1 -0
  179. package/src/lib/craft-resolve.d.ts +39 -0
  180. package/src/lib/craft-resolve.d.ts.map +1 -0
  181. package/src/lib/craft-resolve.js +9 -0
  182. package/src/lib/craft-resolve.js.map +1 -0
  183. package/src/lib/craft-resource.d.ts +11 -0
  184. package/src/lib/craft-resource.d.ts.map +1 -0
  185. package/src/lib/craft-resource.js +264 -0
  186. package/src/lib/craft-resource.js.map +1 -0
  187. package/src/lib/craft-route-exceptions.d.ts +785 -0
  188. package/src/lib/craft-route-exceptions.d.ts.map +1 -0
  189. package/src/lib/craft-route-exceptions.js +86 -0
  190. package/src/lib/craft-route-exceptions.js.map +1 -0
  191. package/src/lib/craft-route-load-error.d.ts +1145 -0
  192. package/src/lib/craft-route-load-error.d.ts.map +1 -0
  193. package/src/lib/craft-route-load-error.js +173 -0
  194. package/src/lib/craft-route-load-error.js.map +1 -0
  195. package/src/lib/craft-route-meta.d.ts +52 -0
  196. package/src/lib/craft-route-meta.d.ts.map +1 -0
  197. package/src/lib/craft-route-meta.js +16 -0
  198. package/src/lib/craft-route-meta.js.map +1 -0
  199. package/src/lib/craft-route-target.d.ts +27 -0
  200. package/src/lib/craft-route-target.d.ts.map +1 -0
  201. package/src/lib/craft-route-target.js +22 -0
  202. package/src/lib/craft-route-target.js.map +1 -0
  203. package/src/lib/craft-router-outlet.d.ts +105 -0
  204. package/src/lib/craft-router-outlet.d.ts.map +1 -0
  205. package/src/lib/craft-router-outlet.js +735 -0
  206. package/src/lib/craft-router-outlet.js.map +1 -0
  207. package/src/lib/craft-router-tokens.d.ts +49 -0
  208. package/src/lib/craft-router-tokens.d.ts.map +1 -0
  209. package/src/lib/craft-router-tokens.js +15 -0
  210. package/src/lib/craft-router-tokens.js.map +1 -0
  211. package/src/lib/craft-router-trace.d.ts +18 -0
  212. package/src/lib/craft-router-trace.d.ts.map +1 -0
  213. package/src/lib/craft-router-trace.js +54 -0
  214. package/src/lib/craft-router-trace.js.map +1 -0
  215. package/src/lib/craft-router.d.ts +248 -0
  216. package/src/lib/craft-router.d.ts.map +1 -0
  217. package/src/lib/craft-router.js +559 -0
  218. package/src/lib/craft-router.js.map +1 -0
  219. package/src/lib/craft-routes.d.ts +755 -0
  220. package/src/lib/craft-routes.d.ts.map +1 -0
  221. package/src/lib/craft-routes.js +510 -0
  222. package/src/lib/craft-routes.js.map +1 -0
  223. package/src/lib/craft-service.d.ts +1034 -0
  224. package/src/lib/craft-service.d.ts.map +1 -0
  225. package/src/lib/craft-service.js +1072 -0
  226. package/src/lib/craft-service.js.map +1 -0
  227. package/src/lib/craft-service.shared.d.ts +35 -0
  228. package/src/lib/craft-service.shared.d.ts.map +1 -0
  229. package/src/lib/craft-service.shared.js +4 -0
  230. package/src/lib/craft-service.shared.js.map +1 -0
  231. package/src/lib/craft-settled.d.ts +171 -0
  232. package/src/lib/craft-settled.d.ts.map +1 -0
  233. package/src/lib/craft-settled.js +130 -0
  234. package/src/lib/craft-settled.js.map +1 -0
  235. package/src/lib/craft-ssr.d.ts +29 -0
  236. package/src/lib/craft-ssr.d.ts.map +1 -0
  237. package/src/lib/craft-ssr.js +27 -0
  238. package/src/lib/craft-ssr.js.map +1 -0
  239. package/src/lib/craft-state-machine-runtime.d.ts +88 -0
  240. package/src/lib/craft-state-machine-runtime.d.ts.map +1 -0
  241. package/src/lib/craft-state-machine-runtime.js +167 -0
  242. package/src/lib/craft-state-machine-runtime.js.map +1 -0
  243. package/src/lib/craft-state-machine.d.ts +233 -0
  244. package/src/lib/craft-state-machine.d.ts.map +1 -0
  245. package/src/lib/craft-state-machine.js +254 -0
  246. package/src/lib/craft-state-machine.js.map +1 -0
  247. package/src/lib/craft-target-runtime.d.ts +20 -0
  248. package/src/lib/craft-target-runtime.d.ts.map +1 -0
  249. package/src/lib/craft-target-runtime.js +42 -0
  250. package/src/lib/craft-target-runtime.js.map +1 -0
  251. package/src/lib/craft-transfer-snapshot.d.ts +19 -0
  252. package/src/lib/craft-transfer-snapshot.d.ts.map +1 -0
  253. package/src/lib/craft-transfer-snapshot.js +90 -0
  254. package/src/lib/craft-transfer-snapshot.js.map +1 -0
  255. package/src/lib/craft-unique.d.ts +7 -0
  256. package/src/lib/craft-unique.d.ts.map +1 -0
  257. package/src/lib/craft-unique.js +16 -0
  258. package/src/lib/craft-unique.js.map +1 -0
  259. package/src/lib/craft-until-settled.d.ts +99 -0
  260. package/src/lib/craft-until-settled.d.ts.map +1 -0
  261. package/src/lib/craft-until-settled.js +81 -0
  262. package/src/lib/craft-until-settled.js.map +1 -0
  263. package/src/lib/craft-use.d.ts +26 -0
  264. package/src/lib/craft-use.d.ts.map +1 -0
  265. package/src/lib/craft-use.js +37 -0
  266. package/src/lib/craft-use.js.map +1 -0
  267. package/src/lib/craft-view-transition.d.ts +102 -0
  268. package/src/lib/craft-view-transition.d.ts.map +1 -0
  269. package/src/lib/craft-view-transition.js +130 -0
  270. package/src/lib/craft-view-transition.js.map +1 -0
  271. package/src/lib/dom-event-hook.d.ts +30 -0
  272. package/src/lib/dom-event-hook.d.ts.map +1 -0
  273. package/src/lib/dom-event-hook.js +16 -0
  274. package/src/lib/dom-event-hook.js.map +1 -0
  275. package/src/lib/fn-wrapper.d.ts +13 -0
  276. package/src/lib/fn-wrapper.d.ts.map +1 -0
  277. package/src/lib/fn-wrapper.js +66 -0
  278. package/src/lib/fn-wrapper.js.map +1 -0
  279. package/src/lib/form/craft-field.d.ts +155 -0
  280. package/src/lib/form/craft-field.d.ts.map +1 -0
  281. package/src/lib/form/craft-field.directive.d.ts +70 -0
  282. package/src/lib/form/craft-field.directive.d.ts.map +1 -0
  283. package/src/lib/form/craft-field.directive.js +549 -0
  284. package/src/lib/form/craft-field.directive.js.map +1 -0
  285. package/src/lib/form/craft-field.js +586 -0
  286. package/src/lib/form/craft-field.js.map +1 -0
  287. package/src/lib/form/field-exception.d.ts +62 -0
  288. package/src/lib/form/field-exception.d.ts.map +1 -0
  289. package/src/lib/form/field-exception.js +37 -0
  290. package/src/lib/form/field-exception.js.map +1 -0
  291. package/src/lib/form/field-lens.d.ts +29 -0
  292. package/src/lib/form/field-lens.d.ts.map +1 -0
  293. package/src/lib/form/field-lens.js +32 -0
  294. package/src/lib/form/field-lens.js.map +1 -0
  295. package/src/lib/form/insert-form-attributes.d.ts +69 -0
  296. package/src/lib/form/insert-form-attributes.d.ts.map +1 -0
  297. package/src/lib/form/insert-form-attributes.js +163 -0
  298. package/src/lib/form/insert-form-attributes.js.map +1 -0
  299. package/src/lib/form/insert-form-internals.d.ts +110 -0
  300. package/src/lib/form/insert-form-internals.d.ts.map +1 -0
  301. package/src/lib/form/insert-form-internals.js +276 -0
  302. package/src/lib/form/insert-form-internals.js.map +1 -0
  303. package/src/lib/form/insert-form-schema.d.ts +10 -0
  304. package/src/lib/form/insert-form-schema.d.ts.map +1 -0
  305. package/src/lib/form/insert-form-schema.js +62 -0
  306. package/src/lib/form/insert-form-schema.js.map +1 -0
  307. package/src/lib/form/insert-form-submit.d.ts +79 -0
  308. package/src/lib/form/insert-form-submit.d.ts.map +1 -0
  309. package/src/lib/form/insert-form-submit.js +126 -0
  310. package/src/lib/form/insert-form-submit.js.map +1 -0
  311. package/src/lib/form/insert-form.d.ts +39 -0
  312. package/src/lib/form/insert-form.d.ts.map +1 -0
  313. package/src/lib/form/insert-form.js +255 -0
  314. package/src/lib/form/insert-form.js.map +1 -0
  315. package/src/lib/form/insert-select-form-tree.d.ts +33 -0
  316. package/src/lib/form/insert-select-form-tree.d.ts.map +1 -0
  317. package/src/lib/form/insert-select-form-tree.js +144 -0
  318. package/src/lib/form/insert-select-form-tree.js.map +1 -0
  319. package/src/lib/form/insert-sub-form-field.d.ts +17 -0
  320. package/src/lib/form/insert-sub-form-field.d.ts.map +1 -0
  321. package/src/lib/form/insert-sub-form-field.js +41 -0
  322. package/src/lib/form/insert-sub-form-field.js.map +1 -0
  323. package/src/lib/form/make-form-tree-insert.d.ts +22 -0
  324. package/src/lib/form/make-form-tree-insert.d.ts.map +1 -0
  325. package/src/lib/form/make-form-tree-insert.js +43 -0
  326. package/src/lib/form/make-form-tree-insert.js.map +1 -0
  327. package/src/lib/form/target-form-field.d.ts +11 -0
  328. package/src/lib/form/target-form-field.d.ts.map +1 -0
  329. package/src/lib/form/target-form-field.js +1 -0
  330. package/src/lib/form/target-form-field.js.map +1 -0
  331. package/src/lib/form/validator.d.ts +174 -0
  332. package/src/lib/form/validator.d.ts.map +1 -0
  333. package/src/lib/form/validator.js +465 -0
  334. package/src/lib/form/validator.js.map +1 -0
  335. package/src/lib/from-event-to-source$.d.ts +210 -0
  336. package/src/lib/from-event-to-source$.d.ts.map +1 -0
  337. package/src/lib/from-event-to-source$.js +29 -0
  338. package/src/lib/from-event-to-source$.js.map +1 -0
  339. package/src/lib/global-persister-handler.service.d.ts +10 -0
  340. package/src/lib/global-persister-handler.service.d.ts.map +1 -0
  341. package/src/lib/global-persister-handler.service.js +40 -0
  342. package/src/lib/global-persister-handler.service.js.map +1 -0
  343. package/src/lib/host/craft-compat.d.ts +242 -0
  344. package/src/lib/host/craft-compat.d.ts.map +1 -0
  345. package/src/lib/host/craft-compat.js +444 -0
  346. package/src/lib/host/craft-compat.js.map +1 -0
  347. package/src/lib/host/craft-dom.d.ts +16 -0
  348. package/src/lib/host/craft-dom.d.ts.map +1 -0
  349. package/src/lib/host/craft-dom.js +24 -0
  350. package/src/lib/host/craft-dom.js.map +1 -0
  351. package/src/lib/host/craft-http.d.ts +22 -0
  352. package/src/lib/host/craft-http.d.ts.map +1 -0
  353. package/src/lib/host/craft-http.js +80 -0
  354. package/src/lib/host/craft-http.js.map +1 -0
  355. package/src/lib/host/craft-injector-host.d.ts +3 -0
  356. package/src/lib/host/craft-injector-host.d.ts.map +1 -0
  357. package/src/lib/host/craft-injector-host.js +2 -0
  358. package/src/lib/host/craft-injector-host.js.map +1 -0
  359. package/src/lib/host/craft-injector.d.ts +40 -0
  360. package/src/lib/host/craft-injector.d.ts.map +1 -0
  361. package/src/lib/host/craft-injector.js +318 -0
  362. package/src/lib/host/craft-injector.js.map +1 -0
  363. package/src/lib/host/craft-linked-signal.d.ts +17 -0
  364. package/src/lib/host/craft-linked-signal.d.ts.map +1 -0
  365. package/src/lib/host/craft-linked-signal.js +86 -0
  366. package/src/lib/host/craft-linked-signal.js.map +1 -0
  367. package/src/lib/host/craft-router-runtime.d.ts +61 -0
  368. package/src/lib/host/craft-router-runtime.d.ts.map +1 -0
  369. package/src/lib/host/craft-router-runtime.js +456 -0
  370. package/src/lib/host/craft-router-runtime.js.map +1 -0
  371. package/src/lib/host/craft-router-types.d.ts +84 -0
  372. package/src/lib/host/craft-router-types.d.ts.map +1 -0
  373. package/src/lib/host/craft-router-types.js +35 -0
  374. package/src/lib/host/craft-router-types.js.map +1 -0
  375. package/src/lib/host/craft-signal.d.ts +45 -0
  376. package/src/lib/host/craft-signal.d.ts.map +1 -0
  377. package/src/lib/host/craft-signal.js +161 -0
  378. package/src/lib/host/craft-signal.js.map +1 -0
  379. package/src/lib/host/craft-test-bed.d.ts +63 -0
  380. package/src/lib/host/craft-test-bed.d.ts.map +1 -0
  381. package/src/lib/host/craft-test-bed.js +114 -0
  382. package/src/lib/host/craft-test-bed.js.map +1 -0
  383. package/src/lib/host-tag.d.ts +2 -0
  384. package/src/lib/host-tag.d.ts.map +1 -0
  385. package/src/lib/host-tag.js +2 -0
  386. package/src/lib/host-tag.js.map +1 -0
  387. package/src/lib/insert-entities.d.ts +131 -0
  388. package/src/lib/insert-entities.d.ts.map +1 -0
  389. package/src/lib/insert-entities.js +159 -0
  390. package/src/lib/insert-entities.js.map +1 -0
  391. package/src/lib/insert-noop-typing-anchor.d.ts +15 -0
  392. package/src/lib/insert-noop-typing-anchor.d.ts.map +1 -0
  393. package/src/lib/insert-noop-typing-anchor.js +16 -0
  394. package/src/lib/insert-noop-typing-anchor.js.map +1 -0
  395. package/src/lib/insert-pagination-placeholder-data.d.ts +122 -0
  396. package/src/lib/insert-pagination-placeholder-data.d.ts.map +1 -0
  397. package/src/lib/insert-pagination-placeholder-data.js +244 -0
  398. package/src/lib/insert-pagination-placeholder-data.js.map +1 -0
  399. package/src/lib/insert-react-on-mutation.d.ts +261 -0
  400. package/src/lib/insert-react-on-mutation.d.ts.map +1 -0
  401. package/src/lib/insert-react-on-mutation.js +227 -0
  402. package/src/lib/insert-react-on-mutation.js.map +1 -0
  403. package/src/lib/insert-select-resource.d.ts +31 -0
  404. package/src/lib/insert-select-resource.d.ts.map +1 -0
  405. package/src/lib/insert-select-resource.js +27 -0
  406. package/src/lib/insert-select-resource.js.map +1 -0
  407. package/src/lib/insert-select.d.ts +126 -0
  408. package/src/lib/insert-select.d.ts.map +1 -0
  409. package/src/lib/insert-select.js +535 -0
  410. package/src/lib/insert-select.js.map +1 -0
  411. package/src/lib/insert-storage-persister.d.ts +27 -0
  412. package/src/lib/insert-storage-persister.d.ts.map +1 -0
  413. package/src/lib/insert-storage-persister.js +65 -0
  414. package/src/lib/insert-storage-persister.js.map +1 -0
  415. package/src/lib/insert-typed-pipes.d.ts +64 -0
  416. package/src/lib/insert-typed-pipes.d.ts.map +1 -0
  417. package/src/lib/insert-typed-pipes.js +32 -0
  418. package/src/lib/insert-typed-pipes.js.map +1 -0
  419. package/src/lib/linked-source.d.ts +8 -0
  420. package/src/lib/linked-source.d.ts.map +1 -0
  421. package/src/lib/linked-source.js +24 -0
  422. package/src/lib/linked-source.js.map +1 -0
  423. package/src/lib/local-storage-persister.d.ts +4 -0
  424. package/src/lib/local-storage-persister.d.ts.map +1 -0
  425. package/src/lib/local-storage-persister.js +342 -0
  426. package/src/lib/local-storage-persister.js.map +1 -0
  427. package/src/lib/middleware-schema-shared.d.ts +67 -0
  428. package/src/lib/middleware-schema-shared.d.ts.map +1 -0
  429. package/src/lib/middleware-schema-shared.js +34 -0
  430. package/src/lib/middleware-schema-shared.js.map +1 -0
  431. package/src/lib/mock-http-request-for-route.d.ts +173 -0
  432. package/src/lib/mock-http-request-for-route.d.ts.map +1 -0
  433. package/src/lib/mock-http-request-for-route.js +127 -0
  434. package/src/lib/mock-http-request-for-route.js.map +1 -0
  435. package/src/lib/mutation.d.ts +332 -0
  436. package/src/lib/mutation.d.ts.map +1 -0
  437. package/src/lib/mutation.js +923 -0
  438. package/src/lib/mutation.js.map +1 -0
  439. package/src/lib/on$.d.ts +26 -0
  440. package/src/lib/on$.d.ts.map +1 -0
  441. package/src/lib/on$.js +19 -0
  442. package/src/lib/on$.js.map +1 -0
  443. package/src/lib/portable-server-function.d.ts +68 -0
  444. package/src/lib/portable-server-function.d.ts.map +1 -0
  445. package/src/lib/portable-server-function.js +97 -0
  446. package/src/lib/portable-server-function.js.map +1 -0
  447. package/src/lib/preserved-resource.d.ts +4 -0
  448. package/src/lib/preserved-resource.d.ts.map +1 -0
  449. package/src/lib/preserved-resource.js +60 -0
  450. package/src/lib/preserved-resource.js.map +1 -0
  451. package/src/lib/primitive-method-runtime-context.d.ts +28 -0
  452. package/src/lib/primitive-method-runtime-context.d.ts.map +1 -0
  453. package/src/lib/primitive-method-runtime-context.js +38 -0
  454. package/src/lib/primitive-method-runtime-context.js.map +1 -0
  455. package/src/lib/primitive-resource-runtime-context.d.ts +46 -0
  456. package/src/lib/primitive-resource-runtime-context.d.ts.map +1 -0
  457. package/src/lib/primitive-resource-runtime-context.js +102 -0
  458. package/src/lib/primitive-resource-runtime-context.js.map +1 -0
  459. package/src/lib/query-params.d.ts +216 -0
  460. package/src/lib/query-params.d.ts.map +1 -0
  461. package/src/lib/query-params.js +324 -0
  462. package/src/lib/query-params.js.map +1 -0
  463. package/src/lib/query.core.d.ts +214 -0
  464. package/src/lib/query.core.d.ts.map +1 -0
  465. package/src/lib/query.core.js +210 -0
  466. package/src/lib/query.core.js.map +1 -0
  467. package/src/lib/query.d.ts +324 -0
  468. package/src/lib/query.d.ts.map +1 -0
  469. package/src/lib/query.js +971 -0
  470. package/src/lib/query.js.map +1 -0
  471. package/src/lib/reactive-read.d.ts +162 -0
  472. package/src/lib/reactive-read.d.ts.map +1 -0
  473. package/src/lib/reactive-read.js +389 -0
  474. package/src/lib/reactive-read.js.map +1 -0
  475. package/src/lib/resource-by-id.d.ts +71 -0
  476. package/src/lib/resource-by-id.d.ts.map +1 -0
  477. package/src/lib/resource-by-id.js +294 -0
  478. package/src/lib/resource-by-id.js.map +1 -0
  479. package/src/lib/resource-exception.d.ts +30 -0
  480. package/src/lib/resource-exception.d.ts.map +1 -0
  481. package/src/lib/resource-exception.js +86 -0
  482. package/src/lib/resource-exception.js.map +1 -0
  483. package/src/lib/route-checked-di.d.ts +229 -0
  484. package/src/lib/route-checked-di.d.ts.map +1 -0
  485. package/src/lib/route-checked-di.js +1 -0
  486. package/src/lib/route-checked-di.js.map +1 -0
  487. package/src/lib/schema-validation.d.ts +89 -0
  488. package/src/lib/schema-validation.d.ts.map +1 -0
  489. package/src/lib/schema-validation.js +110 -0
  490. package/src/lib/schema-validation.js.map +1 -0
  491. package/src/lib/send-context-to-ai.d.ts +20 -0
  492. package/src/lib/send-context-to-ai.d.ts.map +1 -0
  493. package/src/lib/send-context-to-ai.js +18 -0
  494. package/src/lib/send-context-to-ai.js.map +1 -0
  495. package/src/lib/send-context-to-ai.tokens.d.ts +12 -0
  496. package/src/lib/send-context-to-ai.tokens.d.ts.map +1 -0
  497. package/src/lib/send-context-to-ai.tokens.js +1 -0
  498. package/src/lib/send-context-to-ai.tokens.js.map +1 -0
  499. package/src/lib/server-function-client.d.ts +102 -0
  500. package/src/lib/server-function-client.d.ts.map +1 -0
  501. package/src/lib/server-function-client.js +106 -0
  502. package/src/lib/server-function-client.js.map +1 -0
  503. package/src/lib/server-function-contract.d.ts +42 -0
  504. package/src/lib/server-function-contract.d.ts.map +1 -0
  505. package/src/lib/server-function-contract.js +23 -0
  506. package/src/lib/server-function-contract.js.map +1 -0
  507. package/src/lib/server-function-middleware.d.ts +222 -0
  508. package/src/lib/server-function-middleware.d.ts.map +1 -0
  509. package/src/lib/server-function-middleware.js +189 -0
  510. package/src/lib/server-function-middleware.js.map +1 -0
  511. package/src/lib/server-function.d.ts +114 -0
  512. package/src/lib/server-function.d.ts.map +1 -0
  513. package/src/lib/server-function.js +80 -0
  514. package/src/lib/server-function.js.map +1 -0
  515. package/src/lib/server-layer.d.ts +185 -0
  516. package/src/lib/server-layer.d.ts.map +1 -0
  517. package/src/lib/server-layer.js +121 -0
  518. package/src/lib/server-layer.js.map +1 -0
  519. package/src/lib/server.d.ts +83 -0
  520. package/src/lib/server.d.ts.map +1 -0
  521. package/src/lib/server.js +266 -0
  522. package/src/lib/server.js.map +1 -0
  523. package/src/lib/setup-craft-service-test.d.ts +90 -0
  524. package/src/lib/setup-craft-service-test.d.ts.map +1 -0
  525. package/src/lib/setup-craft-service-test.js +193 -0
  526. package/src/lib/setup-craft-service-test.js.map +1 -0
  527. package/src/lib/setup-craft-service-testing-by-register.d.ts +245 -0
  528. package/src/lib/setup-craft-service-testing-by-register.d.ts.map +1 -0
  529. package/src/lib/setup-craft-service-testing-by-register.js +316 -0
  530. package/src/lib/setup-craft-service-testing-by-register.js.map +1 -0
  531. package/src/lib/signal-proxy.d.ts +21 -0
  532. package/src/lib/signal-proxy.d.ts.map +1 -0
  533. package/src/lib/signal-proxy.js +79 -0
  534. package/src/lib/signal-proxy.js.map +1 -0
  535. package/src/lib/signal-source.d.ts +392 -0
  536. package/src/lib/signal-source.d.ts.map +1 -0
  537. package/src/lib/signal-source.js +433 -0
  538. package/src/lib/signal-source.js.map +1 -0
  539. package/src/lib/source$.d.ts +121 -0
  540. package/src/lib/source$.d.ts.map +1 -0
  541. package/src/lib/source$.js +171 -0
  542. package/src/lib/source$.js.map +1 -0
  543. package/src/lib/source-from-event.d.ts +350 -0
  544. package/src/lib/source-from-event.d.ts.map +1 -0
  545. package/src/lib/source-from-event.js +26 -0
  546. package/src/lib/source-from-event.js.map +1 -0
  547. package/src/lib/stacked-source.d.ts +6 -0
  548. package/src/lib/stacked-source.d.ts.map +1 -0
  549. package/src/lib/stacked-source.js +29 -0
  550. package/src/lib/stacked-source.js.map +1 -0
  551. package/src/lib/standard-schema.d.ts +43 -0
  552. package/src/lib/standard-schema.d.ts.map +1 -0
  553. package/src/lib/standard-schema.js +1 -0
  554. package/src/lib/standard-schema.js.map +1 -0
  555. package/src/lib/state-method-runtime-context.d.ts +13 -0
  556. package/src/lib/state-method-runtime-context.d.ts.map +1 -0
  557. package/src/lib/state-method-runtime-context.js +11 -0
  558. package/src/lib/state-method-runtime-context.js.map +1 -0
  559. package/src/lib/state.d.ts +158 -0
  560. package/src/lib/state.d.ts.map +1 -0
  561. package/src/lib/state.js +388 -0
  562. package/src/lib/state.js.map +1 -0
  563. package/src/lib/storage-persister.service.d.ts +25 -0
  564. package/src/lib/storage-persister.service.d.ts.map +1 -0
  565. package/src/lib/storage-persister.service.js +27 -0
  566. package/src/lib/storage-persister.service.js.map +1 -0
  567. package/src/lib/take-app-snapshot.d.ts +31 -0
  568. package/src/lib/take-app-snapshot.d.ts.map +1 -0
  569. package/src/lib/take-app-snapshot.js +93 -0
  570. package/src/lib/take-app-snapshot.js.map +1 -0
  571. package/src/lib/template-trace.d.ts +37 -0
  572. package/src/lib/template-trace.d.ts.map +1 -0
  573. package/src/lib/template-trace.js +37 -0
  574. package/src/lib/template-trace.js.map +1 -0
  575. package/src/lib/temporal-runtime.d.ts +146 -0
  576. package/src/lib/temporal-runtime.d.ts.map +1 -0
  577. package/src/lib/temporal-runtime.js +375 -0
  578. package/src/lib/temporal-runtime.js.map +1 -0
  579. package/src/lib/to-source.d.ts +335 -0
  580. package/src/lib/to-source.d.ts.map +1 -0
  581. package/src/lib/to-source.js +359 -0
  582. package/src/lib/to-source.js.map +1 -0
  583. package/src/lib/util/craft-resource-ref.d.ts +29 -0
  584. package/src/lib/util/craft-resource-ref.d.ts.map +1 -0
  585. package/src/lib/util/craft-resource-ref.js +1 -0
  586. package/src/lib/util/craft-resource-ref.js.map +1 -0
  587. package/src/lib/util/craft-resource-status.d.ts +17 -0
  588. package/src/lib/util/craft-resource-status.d.ts.map +1 -0
  589. package/src/lib/util/craft-resource-status.js +14 -0
  590. package/src/lib/util/craft-resource-status.js.map +1 -0
  591. package/src/lib/util/entities-util.d.ts +340 -0
  592. package/src/lib/util/entities-util.d.ts.map +1 -0
  593. package/src/lib/util/entities-util.js +136 -0
  594. package/src/lib/util/entities-util.js.map +1 -0
  595. package/src/lib/util/explicit-effect.d.ts +42 -0
  596. package/src/lib/util/explicit-effect.d.ts.map +1 -0
  597. package/src/lib/util/explicit-effect.js +37 -0
  598. package/src/lib/util/explicit-effect.js.map +1 -0
  599. package/src/lib/util/extract-signal-props-and-methods.d.ts +20 -0
  600. package/src/lib/util/extract-signal-props-and-methods.d.ts.map +1 -0
  601. package/src/lib/util/extract-signal-props-and-methods.js +1 -0
  602. package/src/lib/util/extract-signal-props-and-methods.js.map +1 -0
  603. package/src/lib/util/method-trigger-nonce.d.ts +45 -0
  604. package/src/lib/util/method-trigger-nonce.d.ts.map +1 -0
  605. package/src/lib/util/method-trigger-nonce.js +58 -0
  606. package/src/lib/util/method-trigger-nonce.js.map +1 -0
  607. package/src/lib/util/persister.type.d.ts +37 -0
  608. package/src/lib/util/persister.type.d.ts.map +1 -0
  609. package/src/lib/util/persister.type.js +1 -0
  610. package/src/lib/util/persister.type.js.map +1 -0
  611. package/src/lib/util/persister.util.d.ts +8 -0
  612. package/src/lib/util/persister.util.d.ts.map +1 -0
  613. package/src/lib/util/persister.util.js +71 -0
  614. package/src/lib/util/persister.util.js.map +1 -0
  615. package/src/lib/util/react-on-mutation-effect.d.ts +16 -0
  616. package/src/lib/util/react-on-mutation-effect.d.ts.map +1 -0
  617. package/src/lib/util/react-on-mutation-effect.js +148 -0
  618. package/src/lib/util/react-on-mutation-effect.js.map +1 -0
  619. package/src/lib/util/resource-by-id-changes-tracker.util.d.ts +27 -0
  620. package/src/lib/util/resource-by-id-changes-tracker.util.d.ts.map +1 -0
  621. package/src/lib/util/resource-by-id-changes-tracker.util.js +97 -0
  622. package/src/lib/util/resource-by-id-changes-tracker.util.js.map +1 -0
  623. package/src/lib/util/source.type.d.ts +6 -0
  624. package/src/lib/util/source.type.d.ts.map +1 -0
  625. package/src/lib/util/source.type.js +1 -0
  626. package/src/lib/util/source.type.js.map +1 -0
  627. package/src/lib/util/types/access-type-object-property-by-dotted-path.type.d.ts +4 -0
  628. package/src/lib/util/types/access-type-object-property-by-dotted-path.type.d.ts.map +1 -0
  629. package/src/lib/util/types/access-type-object-property-by-dotted-path.type.js +1 -0
  630. package/src/lib/util/types/access-type-object-property-by-dotted-path.type.js.map +1 -0
  631. package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.d.ts +27 -0
  632. package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.d.ts.map +1 -0
  633. package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.js +1 -0
  634. package/src/lib/util/types/boolean-or-mapper-fn-by-path-by-id.type.js.map +1 -0
  635. package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.d.ts +24 -0
  636. package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.d.ts.map +1 -0
  637. package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.js +1 -0
  638. package/src/lib/util/types/boolean-or-mapper-fn-by-path.type.js.map +1 -0
  639. package/src/lib/util/types/brand.d.ts +7 -0
  640. package/src/lib/util/types/brand.d.ts.map +1 -0
  641. package/src/lib/util/types/brand.js +9 -0
  642. package/src/lib/util/types/brand.js.map +1 -0
  643. package/src/lib/util/types/object-deep-path-mapper.type.d.ts +13 -0
  644. package/src/lib/util/types/object-deep-path-mapper.type.d.ts.map +1 -0
  645. package/src/lib/util/types/object-deep-path-mapper.type.js +1 -0
  646. package/src/lib/util/types/object-deep-path-mapper.type.js.map +1 -0
  647. package/src/lib/util/types/resource-by-id-config.type.d.ts +115 -0
  648. package/src/lib/util/types/resource-by-id-config.type.d.ts.map +1 -0
  649. package/src/lib/util/types/resource-by-id-config.type.js +1 -0
  650. package/src/lib/util/types/resource-by-id-config.type.js.map +1 -0
  651. package/src/lib/util/types/resource-with-params-or-params-fn.type.d.ts +52 -0
  652. package/src/lib/util/types/resource-with-params-or-params-fn.type.d.ts.map +1 -0
  653. package/src/lib/util/types/resource-with-params-or-params-fn.type.js +1 -0
  654. package/src/lib/util/types/resource-with-params-or-params-fn.type.js.map +1 -0
  655. package/src/lib/util/types/shared.type.d.ts +66 -0
  656. package/src/lib/util/types/shared.type.d.ts.map +1 -0
  657. package/src/lib/util/types/shared.type.js +1 -0
  658. package/src/lib/util/types/shared.type.js.map +1 -0
  659. package/src/lib/util/types/util.d.ts +16 -0
  660. package/src/lib/util/types/util.d.ts.map +1 -0
  661. package/src/lib/util/types/util.js +60 -0
  662. package/src/lib/util/types/util.js.map +1 -0
  663. package/src/lib/util/types/util.type.d.ts +67 -0
  664. package/src/lib/util/types/util.type.d.ts.map +1 -0
  665. package/src/lib/util/types/util.type.js +5 -0
  666. package/src/lib/util/types/util.type.js.map +1 -0
  667. package/src/lib/util/update-state.util.d.ts +10 -0
  668. package/src/lib/util/update-state.util.d.ts.map +1 -0
  669. package/src/lib/util/update-state.util.js +31 -0
  670. package/src/lib/util/update-state.util.js.map +1 -0
  671. package/src/lib/util/util.d.ts +19 -0
  672. package/src/lib/util/util.d.ts.map +1 -0
  673. package/src/lib/util/util.js +50 -0
  674. package/src/lib/util/util.js.map +1 -0
  675. package/src/lib/util/util.type.d.ts +107 -0
  676. package/src/lib/util/util.type.d.ts.map +1 -0
  677. package/src/lib/util/util.type.js +9 -0
  678. package/src/lib/util/util.type.js.map +1 -0
  679. package/src/lib/yieldable.d.ts +94 -0
  680. package/src/lib/yieldable.d.ts.map +1 -0
  681. package/src/lib/yieldable.js +109 -0
  682. package/src/lib/yieldable.js.map +1 -0
@@ -0,0 +1,276 @@
1
+ import { inject } from './host/craft-compat';
2
+ import { craftComputed as createCraftComputed, craftSignal } from './host/craft-signal';
3
+ import { StorageService } from './browser-boundaries';
4
+ import { CRAFT_PRIMITIVE_REGISTRY, } from './craft-primitive-registry';
5
+ import { ɵwithCraftReplay } from './craft-replay';
6
+ import { createYieldableReactiveValue, isYieldableReactiveValue, rawReactiveValue, } from './reactive-read';
7
+ /** Reserved prefix for the primitives named through `include`. */
8
+ const EXTERNAL_KEY_PREFIX = '#include/';
9
+ const DEFAULT_LIMIT = 50;
10
+ export function withStateMachineHistory(optionsOrFeature, ...rest) {
11
+ const options = typeof optionsOrFeature === 'function' || optionsOrFeature === undefined
12
+ ? {}
13
+ : optionsOrFeature;
14
+ const features = typeof optionsOrFeature === 'function'
15
+ ? [optionsOrFeature, ...rest]
16
+ : rest;
17
+ const limit = options.limit ?? DEFAULT_LIMIT;
18
+ return function* ({ currentStep, machine }) {
19
+ const storage = yield* StorageService();
20
+ const registry = inject(CRAFT_PRIMITIVE_REGISTRY);
21
+ const persistence = options.persist;
22
+ const storageKey = persistence
23
+ ? `craft-ts-${persistence.storeName}-history-${typeof persistence.key === 'function'
24
+ ? persistence.key()
25
+ : persistence.key}`
26
+ : undefined;
27
+ const restored = readPersisted(storage, storageKey);
28
+ const entries = craftSignal(restored?.entries ?? []);
29
+ const cursor = craftSignal(restored?.cursor ?? 0);
30
+ const includedRefs = options.include ?? [];
31
+ const machinePrefix = machine.hostTags.join(' / ');
32
+ /**
33
+ * Keys an entry relative to the machine, re-indexing occurrences within
34
+ * the current set rather than reusing the registry's global counter. That
35
+ * counter only ever grows, so it would drift the moment a machine is
36
+ * destroyed and rebuilt inside the same host — and a persisted key must not
37
+ * depend on how many times the page has already built this primitive.
38
+ */
39
+ const relativeKeys = () => {
40
+ const seen = new Map();
41
+ return registry.under(machine.hostTags).map((entry) => {
42
+ const base = stripOccurrence(entry.address).slice(machinePrefix.length === 0 ? 0 : machinePrefix.length + 3);
43
+ const occurrence = (seen.get(base) ?? 0) + 1;
44
+ seen.set(base, occurrence);
45
+ return { entry, key: `${base}#${occurrence}` };
46
+ });
47
+ };
48
+ const capture = () => {
49
+ const snapshot = {};
50
+ for (const { entry, key } of relativeKeys()) {
51
+ const captured = registry.capture([entry]);
52
+ if (entry.address in captured && isRecordable(entry, captured[entry.address])) {
53
+ snapshot[key] = captured[entry.address];
54
+ }
55
+ }
56
+ // Primitives declared outside the machine are keyed by their position in
57
+ // the declared `include` list, which is stable by construction.
58
+ includedRefs.forEach((ref, index) => {
59
+ const address = registry.addressOf(ref);
60
+ const entry = address ? registry.get(address) : undefined;
61
+ if (!entry)
62
+ return;
63
+ const captured = registry.capture([entry]);
64
+ if (entry.address in captured && isRecordable(entry, captured[entry.address])) {
65
+ snapshot[`${EXTERNAL_KEY_PREFIX}${index}`] = captured[entry.address];
66
+ }
67
+ });
68
+ return snapshot;
69
+ };
70
+ /** Resolves relative keys back onto the primitives present right now. */
71
+ const restore = (snapshot) => {
72
+ const current = new Map(relativeKeys().map(({ entry, key }) => [key, entry]));
73
+ const writes = [];
74
+ for (const [key, value] of Object.entries(snapshot)) {
75
+ const entry = key.startsWith(EXTERNAL_KEY_PREFIX)
76
+ ? externalEntry(Number(key.slice(EXTERNAL_KEY_PREFIX.length)))
77
+ : current.get(key);
78
+ if (entry)
79
+ writes.push({ entry, value });
80
+ }
81
+ // The whole restore runs under the replay flag, so a resource claims its
82
+ // restored parameter without reloading over the value being restored
83
+ // with it — and so tooling can tell a rewind from user activity.
84
+ ɵwithCraftReplay(() => {
85
+ for (const { entry, value } of writes) {
86
+ entry.write(value);
87
+ }
88
+ });
89
+ // A resource the snapshot does not cover was still loading when the
90
+ // moment was recorded, so there is no value to put back. Left frozen it
91
+ // would keep showing what belongs to another parameter; reloading it is
92
+ // the honest answer.
93
+ const restored = new Set(writes.map(({ entry }) => entry.address));
94
+ for (const entry of registry.under(machine.hostTags)) {
95
+ if (entry.kind === 'state' || restored.has(entry.address))
96
+ continue;
97
+ entry.reload?.();
98
+ }
99
+ };
100
+ const externalEntry = (index) => {
101
+ const address = registry.addressOf(includedRefs[index]);
102
+ return address ? registry.get(address) : undefined;
103
+ };
104
+ const append = (entry) => {
105
+ // A moment identical to the one the machine already sits on is not a
106
+ // moment. Remounting a component — or reloading a page onto a machine
107
+ // that starts where it left off — would otherwise stack the same state
108
+ // over and over, and `back()` would walk through duplicates.
109
+ if (isSameMoment(entries()[cursor()], entry))
110
+ return;
111
+ entries.update((current) => {
112
+ // Recording after a rewind drops the forward entries: the machine took
113
+ // a different branch, and keeping the old one would let `forward()`
114
+ // walk into a future that no longer happened.
115
+ const kept = current.slice(0, cursor() + 1);
116
+ const next = [...kept, entry];
117
+ return next.length > limit ? next.slice(next.length - limit) : next;
118
+ });
119
+ cursor.set(entries().length - 1);
120
+ writePersisted(storage, storageKey, entries(), cursor());
121
+ };
122
+ // The machine has already taken its initial step by the time an insertion
123
+ // runs, so the first entry records where it started.
124
+ const initialStep = readRaw(currentStep);
125
+ if (initialStep === undefined) {
126
+ throw new Error('Cannot create history for an uninitialised state machine.');
127
+ }
128
+ append({
129
+ step: initialStep,
130
+ from: undefined,
131
+ event: undefined,
132
+ at: Date.now(),
133
+ snapshot: capture(),
134
+ });
135
+ machine.onTransition((transition) => {
136
+ if (!transition.accepted)
137
+ return;
138
+ append({
139
+ step: transition.to,
140
+ from: transition.from,
141
+ event: transition.event,
142
+ at: Date.now(),
143
+ snapshot: capture(),
144
+ });
145
+ });
146
+ const goTo = (index) => {
147
+ const recorded = entries();
148
+ const entry = recorded[index];
149
+ if (!entry)
150
+ return false;
151
+ machine.suspended(() => {
152
+ restore(entry.snapshot);
153
+ ɵwithCraftReplay(() => machine.restoreStep(entry.step));
154
+ });
155
+ cursor.set(index);
156
+ writePersisted(storage, storageKey, entries(), cursor());
157
+ return true;
158
+ };
159
+ const entriesReader = createYieldableReactiveValue(entries.asReadonly(), 'entries');
160
+ const cursorReader = createYieldableReactiveValue(cursor.asReadonly(), 'cursor');
161
+ const featureContext = {
162
+ entries: entriesReader,
163
+ cursor: cursorReader,
164
+ goTo,
165
+ controls: machine,
166
+ };
167
+ return Object.assign({
168
+ history: createYieldableReactiveValue(entries.asReadonly(), 'history'),
169
+ historyCursor: createYieldableReactiveValue(cursor.asReadonly(), 'historyCursor'),
170
+ }, ...features.map((feature) => feature(featureContext)));
171
+ };
172
+ }
173
+ /**
174
+ * Step-by-step navigation through a machine's history. Composes into
175
+ * {@link withStateMachineHistory}, which owns the entries it walks:
176
+ *
177
+ * ```ts
178
+ * withStateMachineHistory(withBackNavigation())
179
+ * ```
180
+ *
181
+ * `back()` and `forward()` restore a recorded moment without asking the
182
+ * guards: that state was accepted once already.
183
+ */
184
+ export function withBackNavigation() {
185
+ return ({ entries, cursor, goTo }) => {
186
+ const rawEntries = () => readRaw(entries) ?? [];
187
+ const rawCursor = () => readRaw(cursor) ?? 0;
188
+ return {
189
+ canGoBack: createYieldableReactiveValue(createCraftComputed(() => rawCursor() > 0), 'canGoBack'),
190
+ canGoForward: createYieldableReactiveValue(createCraftComputed(() => rawCursor() < rawEntries().length - 1), 'canGoForward'),
191
+ back: () => goTo(rawCursor() - 1),
192
+ forward: () => goTo(rawCursor() + 1),
193
+ };
194
+ };
195
+ }
196
+ /**
197
+ * Reads a craft reactive value as a plain signal. A yieldable reader IS its own
198
+ * generator factory, so calling it hands back a generator rather than a value —
199
+ * the raw source is the way through.
200
+ */
201
+ function readRaw(reader) {
202
+ return isYieldableReactiveValue(reader)
203
+ ? rawReactiveValue(reader)()
204
+ : undefined;
205
+ }
206
+ /**
207
+ * Whether two recorded moments describe the same state. Compared by value:
208
+ * a snapshot is already required to survive JSON to be persisted.
209
+ */
210
+ function isSameMoment(previous, next) {
211
+ if (!previous || previous.step !== next.step)
212
+ return false;
213
+ try {
214
+ return JSON.stringify(previous.snapshot) === JSON.stringify(next.snapshot);
215
+ }
216
+ catch {
217
+ return false;
218
+ }
219
+ }
220
+ /**
221
+ * Whether a captured value is worth recording.
222
+ *
223
+ * A resource read before its loader has settled holds `undefined`, and writing
224
+ * `undefined` back into it does not restore anything — it pins the resource to
225
+ * a local value and detaches it from its loader for good. An unsettled
226
+ * resource records nothing instead, and a restore leaves the live one alone.
227
+ */
228
+ function isRecordable(entry, value) {
229
+ return entry.kind === 'state' || value !== undefined;
230
+ }
231
+ /** Drops the registry's global occurrence suffix from an address. */
232
+ function stripOccurrence(address) {
233
+ return address.replace(/#\d+$/, '');
234
+ }
235
+ function readPersisted(storage, storageKey) {
236
+ if (!storage || !storageKey)
237
+ return undefined;
238
+ try {
239
+ const raw = storage.getItem(storageKey);
240
+ if (!raw)
241
+ return undefined;
242
+ const parsed = JSON.parse(raw);
243
+ if (!Array.isArray(parsed?.entries))
244
+ return undefined;
245
+ if (parsed.entries.some((entry) => !entry || typeof entry !== 'object' || typeof entry.step !== 'string')) {
246
+ return undefined;
247
+ }
248
+ return parsed;
249
+ }
250
+ catch {
251
+ // A history that cannot be read back is a history that never existed.
252
+ return undefined;
253
+ }
254
+ }
255
+ function writePersisted(storage, storageKey, entries, cursor) {
256
+ if (!storage || !storageKey)
257
+ return;
258
+ try {
259
+ storage.setItem(storageKey, JSON.stringify({ entries, cursor }));
260
+ }
261
+ catch {
262
+ // An event can carry anything, a DOM event included. A moment that cannot
263
+ // be serialised is dropped from the persisted copy rather than taking the
264
+ // whole history down with it; the in-memory history keeps it.
265
+ try {
266
+ storage.setItem(storageKey, JSON.stringify({
267
+ entries: entries.map((entry) => ({ ...entry, event: undefined })),
268
+ cursor,
269
+ }));
270
+ }
271
+ catch {
272
+ storage.removeItem(storageKey);
273
+ }
274
+ }
275
+ }
276
+ //# sourceMappingURL=craft-machine-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-machine-history.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-machine-history.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject } from './host/craft-compat';\nimport { craftComputed as createCraftComputed, craftSignal } from './host/craft-signal';\nimport { StorageService } from './browser-boundaries';\nimport type { CraftUnique } from './craft-unique';\nimport type { GetServiceYields } from './craft-service';\nimport {\n CRAFT_PRIMITIVE_REGISTRY,\n type CraftPrimitiveEntry,\n type CraftPrimitiveSnapshot,\n} from './craft-primitive-registry';\nimport { ɵwithCraftReplay } from './craft-replay';\nimport {\n createYieldableReactiveValue,\n isYieldableReactiveValue,\n rawReactiveValue,\n type YieldableReactiveValue,\n} from './reactive-read';\nimport type {\n CraftMachineControls,\n CraftMachineInsertionContext,\n} from './craft-state-machine';\n\n/**\n * One recorded moment of a machine: the transition that produced it, and the\n * value of every primitive the machine owns at that point.\n *\n * The step and the values are captured AFTER the transition was applied, so\n * restoring an entry restores the state the machine was in once it had moved.\n *\n * Snapshot keys are RELATIVE to the machine, not absolute registry addresses.\n * An absolute address starts with the host chain of the component that happens\n * to hold the machine, and that prefix carries a creation ordinal which means\n * nothing after a reload. Below the machine everything is deterministic — the\n * same code creates the same primitives in the same order — so a relative key\n * survives, and re-anchors onto whichever instance is restoring it.\n */\nexport type CraftHistoryEntry<Steps extends string = string> = Readonly<{\n step: Steps;\n from: Steps | undefined;\n event: unknown;\n at: number;\n snapshot: CraftPrimitiveSnapshot;\n}>;\n\n/**\n * What a history feature composed into {@link withStateMachineHistory} receives. It is\n * deliberately narrow: a feature navigates the recorded entries, it does not\n * decide what gets recorded.\n */\nexport type CraftHistoryFeatureContext<Steps extends string = string> =\n Readonly<{\n entries: YieldableReactiveValue<\n readonly CraftHistoryEntry<Steps>[],\n 'entries'\n >;\n /** Index of the entry the machine currently sits on. */\n cursor: YieldableReactiveValue<number, 'cursor'>;\n /**\n * Restores the recorded entry at `index`. Returns `false` when the index\n * is out of range. Guards are NOT consulted: a recorded state was already\n * accepted once, and replaying it must not depend on today's permissions.\n */\n goTo(index: number): boolean;\n controls: CraftMachineControls<Steps>;\n }>;\n\nexport type CraftHistoryFeature<Output extends object> = (\n context: CraftHistoryFeatureContext<any>,\n) => Output;\n\ntype HistoryOptions = Readonly<{\n /**\n * How many entries to keep. The oldest are dropped first. `Infinity` keeps\n * everything, which is fine for a debug session and not for production.\n */\n limit?: number;\n /**\n * Primitives declared OUTSIDE the machine that belong to the story being\n * recorded. A machine captures what it owns by itself; anything else has to\n * be named, so a replay stays reproducible instead of depending on whatever\n * happened to be in the injector.\n *\n * ```ts\n * withStateMachineHistory({ include: [sharedFilters] }, withBackNavigation())\n * ```\n */\n include?: readonly unknown[];\n /**\n * Keeps the history across a reload, under an anchor the application names.\n *\n * Only the ANCHOR needs a stable identity: everything the machine owns is\n * addressed relative to it, and those keys are deterministic. `key` may be a\n * function when the anchor comes from data — a row of a list anchors on the\n * entity it edits, not on the order it happened to be created in.\n *\n * ```ts\n * withStateMachineHistory(\n * { persist: craftUnique({ storeName: 'app', key: 'book-editor' }) },\n * withBackNavigation(),\n * )\n * ```\n */\n persist?:\n | CraftUnique<CraftHistoryPersistenceStatic>\n | CraftHistoryPersistenceDynamic;\n}>;\n\n/** The slice of the injected storage service a persisted history needs. */\ntype CraftHistoryStorage = Readonly<{\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}>;\n\nexport type CraftHistoryPersistenceStatic = Readonly<{\n storeName: string;\n key: string;\n}>;\n\n/** A data-dependent anchor cannot be verified as a static unique identity. */\nexport type CraftHistoryPersistenceDynamic = Readonly<{\n storeName: string;\n /** Resolved once, when the machine is built. */\n key: () => string;\n}>;\n\nexport type CraftHistoryPersistence =\n | CraftHistoryPersistenceStatic\n | CraftHistoryPersistenceDynamic;\n\n/** Reserved prefix for the primitives named through `include`. */\nconst EXTERNAL_KEY_PREFIX = '#include/';\n\ntype HistoryOutput<Steps extends string> = {\n readonly history: YieldableReactiveValue<\n readonly CraftHistoryEntry<Steps>[],\n 'history'\n >;\n readonly historyCursor: YieldableReactiveValue<number, 'historyCursor'>;\n};\n\nconst DEFAULT_LIMIT = 50;\n\n/** What `withStateMachineHistory(...)` resolves to: an insertion for `craftStateMachine`. */\ntype HistoryInsertion<Steps extends string, Features> = (\n context: CraftMachineInsertionContext<any, Steps, any>,\n) => Generator<\n GetServiceYields<typeof StorageService>,\n HistoryOutput<Steps> & Features,\n unknown\n>;\n\n/**\n * Records the machine's history, and composes features on top of it.\n *\n * History is not part of the machine core — it is an insertion, exactly like\n * the derived values and step flags beside it:\n *\n * ```ts\n * craftStateMachine(\n * contextFactory,\n * transitions,\n * stepContexts,\n * withStateMachineHistory(withBackNavigation()),\n * );\n * ```\n *\n * Every accepted transition appends an entry holding the new step and a\n * snapshot of every primitive the machine owns, read through\n * `CRAFT_PRIMITIVE_REGISTRY` and scoped to the machine's host chain. A\n * primitive declared OUTSIDE the machine is not captured: pass it explicitly\n * through `include` when it belongs to the story being replayed.\n */\nexport function withStateMachineHistory<Steps extends string = string>(): HistoryInsertion<\n Steps,\n object\n>;\nexport function withStateMachineHistory<Feature1 extends object, Steps extends string = string>(\n feature1: CraftHistoryFeature<Feature1>,\n): HistoryInsertion<Steps, Feature1>;\nexport function withStateMachineHistory<\n Feature1 extends object,\n Feature2 extends object,\n Steps extends string = string,\n>(\n feature1: CraftHistoryFeature<Feature1>,\n feature2: CraftHistoryFeature<Feature2>,\n): HistoryInsertion<Steps, Feature1 & Feature2>;\nexport function withStateMachineHistory<\n Feature1 extends object,\n Feature2 extends object,\n Feature3 extends object,\n Steps extends string = string,\n>(\n feature1: CraftHistoryFeature<Feature1>,\n feature2: CraftHistoryFeature<Feature2>,\n feature3: CraftHistoryFeature<Feature3>,\n): HistoryInsertion<Steps, Feature1 & Feature2 & Feature3>;\nexport function withStateMachineHistory<Steps extends string = string>(\n options: HistoryOptions,\n): HistoryInsertion<Steps, object>;\nexport function withStateMachineHistory<Feature1 extends object, Steps extends string = string>(\n options: HistoryOptions,\n feature1: CraftHistoryFeature<Feature1>,\n): HistoryInsertion<Steps, Feature1>;\nexport function withStateMachineHistory<\n Feature1 extends object,\n Feature2 extends object,\n Steps extends string = string,\n>(\n options: HistoryOptions,\n feature1: CraftHistoryFeature<Feature1>,\n feature2: CraftHistoryFeature<Feature2>,\n): HistoryInsertion<Steps, Feature1 & Feature2>;\nexport function withStateMachineHistory<\n Feature1 extends object,\n Feature2 extends object,\n Feature3 extends object,\n Steps extends string = string,\n>(\n options: HistoryOptions,\n feature1: CraftHistoryFeature<Feature1>,\n feature2: CraftHistoryFeature<Feature2>,\n feature3: CraftHistoryFeature<Feature3>,\n): HistoryInsertion<Steps, Feature1 & Feature2 & Feature3>;\nexport function withStateMachineHistory(\n optionsOrFeature?: HistoryOptions | CraftHistoryFeature<object>,\n ...rest: CraftHistoryFeature<object>[]\n): (\n context: CraftMachineInsertionContext<any, string, any>,\n) => Generator<unknown, unknown, unknown> {\n const options =\n typeof optionsOrFeature === 'function' || optionsOrFeature === undefined\n ? {}\n : optionsOrFeature;\n const features =\n typeof optionsOrFeature === 'function'\n ? [optionsOrFeature, ...rest]\n : rest;\n const limit = options.limit ?? DEFAULT_LIMIT;\n\n return function* ({ currentStep, machine }) {\n const storage = yield* StorageService();\n const registry = inject(CRAFT_PRIMITIVE_REGISTRY);\n const persistence = options.persist;\n const storageKey = persistence\n ? `craft-ts-${persistence.storeName}-history-${\n typeof persistence.key === 'function'\n ? persistence.key()\n : persistence.key\n }`\n : undefined;\n\n const restored = readPersisted(storage, storageKey);\n const entries = craftSignal<readonly CraftHistoryEntry[]>(\n restored?.entries ?? [],\n );\n const cursor = craftSignal(restored?.cursor ?? 0);\n\n const includedRefs = options.include ?? [];\n const machinePrefix = machine.hostTags.join(' / ');\n\n /**\n * Keys an entry relative to the machine, re-indexing occurrences within\n * the current set rather than reusing the registry's global counter. That\n * counter only ever grows, so it would drift the moment a machine is\n * destroyed and rebuilt inside the same host — and a persisted key must not\n * depend on how many times the page has already built this primitive.\n */\n const relativeKeys = () => {\n const seen = new Map<string, number>();\n\n return registry.under(machine.hostTags).map((entry) => {\n const base = stripOccurrence(entry.address).slice(\n machinePrefix.length === 0 ? 0 : machinePrefix.length + 3,\n );\n const occurrence = (seen.get(base) ?? 0) + 1;\n seen.set(base, occurrence);\n return { entry, key: `${base}#${occurrence}` };\n });\n };\n\n const capture = (): CraftPrimitiveSnapshot => {\n const snapshot: Record<string, unknown> = {};\n\n for (const { entry, key } of relativeKeys()) {\n const captured = registry.capture([entry]);\n if (entry.address in captured && isRecordable(entry, captured[entry.address])) {\n snapshot[key] = captured[entry.address];\n }\n }\n\n // Primitives declared outside the machine are keyed by their position in\n // the declared `include` list, which is stable by construction.\n includedRefs.forEach((ref, index) => {\n const address = registry.addressOf(ref);\n const entry = address ? registry.get(address) : undefined;\n if (!entry) return;\n const captured = registry.capture([entry]);\n if (entry.address in captured && isRecordable(entry, captured[entry.address])) {\n snapshot[`${EXTERNAL_KEY_PREFIX}${index}`] = captured[entry.address];\n }\n });\n\n return snapshot;\n };\n\n /** Resolves relative keys back onto the primitives present right now. */\n const restore = (snapshot: CraftPrimitiveSnapshot): void => {\n const current = new Map(\n relativeKeys().map(({ entry, key }) => [key, entry]),\n );\n\n const writes: { entry: CraftPrimitiveEntry; value: unknown }[] = [];\n\n for (const [key, value] of Object.entries(snapshot)) {\n const entry = key.startsWith(EXTERNAL_KEY_PREFIX)\n ? externalEntry(Number(key.slice(EXTERNAL_KEY_PREFIX.length)))\n : current.get(key);\n if (entry) writes.push({ entry, value });\n }\n\n // The whole restore runs under the replay flag, so a resource claims its\n // restored parameter without reloading over the value being restored\n // with it — and so tooling can tell a rewind from user activity.\n ɵwithCraftReplay(() => {\n for (const { entry, value } of writes) {\n entry.write(value);\n }\n });\n\n // A resource the snapshot does not cover was still loading when the\n // moment was recorded, so there is no value to put back. Left frozen it\n // would keep showing what belongs to another parameter; reloading it is\n // the honest answer.\n const restored = new Set(writes.map(({ entry }) => entry.address));\n for (const entry of registry.under(machine.hostTags)) {\n if (entry.kind === 'state' || restored.has(entry.address)) continue;\n entry.reload?.();\n }\n };\n\n const externalEntry = (index: number): CraftPrimitiveEntry | undefined => {\n const address = registry.addressOf(includedRefs[index]);\n return address ? registry.get(address) : undefined;\n };\n\n const append = (entry: CraftHistoryEntry) => {\n // A moment identical to the one the machine already sits on is not a\n // moment. Remounting a component — or reloading a page onto a machine\n // that starts where it left off — would otherwise stack the same state\n // over and over, and `back()` would walk through duplicates.\n if (isSameMoment(entries()[cursor()], entry)) return;\n\n entries.update((current) => {\n // Recording after a rewind drops the forward entries: the machine took\n // a different branch, and keeping the old one would let `forward()`\n // walk into a future that no longer happened.\n const kept = current.slice(0, cursor() + 1);\n const next = [...kept, entry];\n return next.length > limit ? next.slice(next.length - limit) : next;\n });\n cursor.set(entries().length - 1);\n writePersisted(storage, storageKey, entries(), cursor());\n };\n\n // The machine has already taken its initial step by the time an insertion\n // runs, so the first entry records where it started.\n const initialStep = readRaw<string>(currentStep);\n if (initialStep === undefined) {\n throw new Error('Cannot create history for an uninitialised state machine.');\n }\n\n append({\n step: initialStep,\n from: undefined,\n event: undefined,\n at: Date.now(),\n snapshot: capture(),\n });\n\n machine.onTransition((transition) => {\n if (!transition.accepted) return;\n append({\n step: transition.to,\n from: transition.from,\n event: transition.event,\n at: Date.now(),\n snapshot: capture(),\n });\n });\n\n const goTo = (index: number): boolean => {\n const recorded = entries();\n const entry = recorded[index];\n if (!entry) return false;\n\n machine.suspended(() => {\n restore(entry.snapshot);\n ɵwithCraftReplay(() => machine.restoreStep(entry.step));\n });\n cursor.set(index);\n writePersisted(storage, storageKey, entries(), cursor());\n return true;\n };\n\n const entriesReader = createYieldableReactiveValue(\n entries.asReadonly(),\n 'entries',\n );\n const cursorReader = createYieldableReactiveValue(\n cursor.asReadonly(),\n 'cursor',\n );\n\n const featureContext: CraftHistoryFeatureContext = {\n entries: entriesReader,\n cursor: cursorReader,\n goTo,\n controls: machine,\n };\n\n return Object.assign(\n {\n history: createYieldableReactiveValue(entries.asReadonly(), 'history'),\n historyCursor: createYieldableReactiveValue(\n cursor.asReadonly(),\n 'historyCursor',\n ),\n },\n ...features.map((feature) => feature(featureContext)),\n ) as object;\n };\n}\n\ntype BackNavigationOutput = {\n readonly canGoBack: YieldableReactiveValue<boolean, 'canGoBack'>;\n readonly canGoForward: YieldableReactiveValue<boolean, 'canGoForward'>;\n readonly back: () => boolean;\n readonly forward: () => boolean;\n};\n\n/**\n * Step-by-step navigation through a machine's history. Composes into\n * {@link withStateMachineHistory}, which owns the entries it walks:\n *\n * ```ts\n * withStateMachineHistory(withBackNavigation())\n * ```\n *\n * `back()` and `forward()` restore a recorded moment without asking the\n * guards: that state was accepted once already.\n */\nexport function withBackNavigation(): CraftHistoryFeature<BackNavigationOutput> {\n return ({ entries, cursor, goTo }) => {\n const rawEntries = () =>\n readRaw<readonly CraftHistoryEntry[]>(entries) ?? [];\n const rawCursor = () => readRaw<number>(cursor) ?? 0;\n\n return {\n canGoBack: createYieldableReactiveValue(\n createCraftComputed(() => rawCursor() > 0),\n 'canGoBack',\n ),\n canGoForward: createYieldableReactiveValue(\n createCraftComputed(() => rawCursor() < rawEntries().length - 1),\n 'canGoForward',\n ),\n back: () => goTo(rawCursor() - 1),\n forward: () => goTo(rawCursor() + 1),\n };\n };\n}\n\n/**\n * Reads a craft reactive value as a plain signal. A yieldable reader IS its own\n * generator factory, so calling it hands back a generator rather than a value —\n * the raw source is the way through.\n */\nfunction readRaw<Value>(reader: unknown): Value | undefined {\n return isYieldableReactiveValue(reader)\n ? (rawReactiveValue(reader)() as Value)\n : undefined;\n}\n\n\n/**\n * Whether two recorded moments describe the same state. Compared by value:\n * a snapshot is already required to survive JSON to be persisted.\n */\nfunction isSameMoment(\n previous: CraftHistoryEntry | undefined,\n next: CraftHistoryEntry,\n): boolean {\n if (!previous || previous.step !== next.step) return false;\n try {\n return JSON.stringify(previous.snapshot) === JSON.stringify(next.snapshot);\n } catch {\n return false;\n }\n}\n\n/**\n * Whether a captured value is worth recording.\n *\n * A resource read before its loader has settled holds `undefined`, and writing\n * `undefined` back into it does not restore anything — it pins the resource to\n * a local value and detaches it from its loader for good. An unsettled\n * resource records nothing instead, and a restore leaves the live one alone.\n */\nfunction isRecordable(entry: CraftPrimitiveEntry, value: unknown): boolean {\n return entry.kind === 'state' || value !== undefined;\n}\n\n/** Drops the registry's global occurrence suffix from an address. */\nfunction stripOccurrence(address: string): string {\n return address.replace(/#\\d+$/, '');\n}\n\ntype PersistedHistory = Readonly<{\n entries: readonly CraftHistoryEntry[];\n cursor: number;\n}>;\n\nfunction readPersisted(\n storage: CraftHistoryStorage | undefined,\n storageKey: string | undefined,\n): PersistedHistory | undefined {\n if (!storage || !storageKey) return undefined;\n try {\n const raw = storage.getItem(storageKey);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as PersistedHistory;\n if (!Array.isArray(parsed?.entries)) return undefined;\n if (\n parsed.entries.some(\n (entry) =>\n !entry || typeof entry !== 'object' || typeof entry.step !== 'string',\n )\n ) {\n return undefined;\n }\n return parsed;\n } catch {\n // A history that cannot be read back is a history that never existed.\n return undefined;\n }\n}\n\nfunction writePersisted(\n storage: CraftHistoryStorage | undefined,\n storageKey: string | undefined,\n entries: readonly CraftHistoryEntry[],\n cursor: number,\n): void {\n if (!storage || !storageKey) return;\n try {\n storage.setItem(storageKey, JSON.stringify({ entries, cursor }));\n } catch {\n // An event can carry anything, a DOM event included. A moment that cannot\n // be serialised is dropped from the persisted copy rather than taking the\n // whole history down with it; the in-memory history keeps it.\n try {\n storage.setItem(\n storageKey,\n JSON.stringify({\n entries: entries.map((entry) => ({ ...entry, event: undefined })),\n cursor,\n }),\n );\n } catch {\n storage.removeItem(storageKey);\n }\n }\n}\n"]}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * A handler map over a literal union: exactly one handler per member, each
3
+ * receiving its own narrowed literal.
4
+ */
5
+ export type CraftMatchHandlers<Value extends string | number, R> = {
6
+ [K in Value]: (value: K) => R;
7
+ };
8
+ interface CraftMatch {
9
+ /**
10
+ * Matches a single case of a literal union. When `value` equals `matchCase`
11
+ * the handler runs (with `value` narrowed to `matchCase`) and its result is
12
+ * returned; otherwise the result is `undefined`.
13
+ */
14
+ <Value extends string | number, Case extends Value, R>(value: Value, matchCase: Case, handler: (value: Case) => R): R | undefined;
15
+ /**
16
+ * Matches **every** member of a literal union through a handler map covering
17
+ * exactly that union — a missing member or a key outside the union is a
18
+ * compile error, and each handler receives its own narrowed literal. The
19
+ * result is the union of the handlers' return types.
20
+ */
21
+ exhaustive<Value extends string | number, Handlers extends {
22
+ [K in Value]: (value: K) => unknown;
23
+ }>(value: Value, handlers: Handlers): ReturnType<Handlers[Value]>;
24
+ /**
25
+ * Exhaustively matches a discriminated object union. The callback receives
26
+ * the member narrowed by `key`, including its exact payload.
27
+ */
28
+ exhaustive<Value extends object, Key extends {
29
+ [K in keyof Value]-?: Value[K] extends string | number ? K : never;
30
+ }[keyof Value], Handlers extends {
31
+ [Code in Value[Key] & (string | number)]: (value: Extract<Value, Record<Key, Code>>) => unknown;
32
+ }>(value: Value | undefined, key: Key, handlers: Handlers): ReturnType<Handlers[Value[Key] & (string | number)]> | undefined;
33
+ exhaustive<Value extends object, Key extends {
34
+ [K in keyof Value]-?: Value[K] extends string | number ? K : never;
35
+ }[keyof Value], Handlers extends {
36
+ [Code in Value[Key] & (string | number)]: (value: Extract<Value, Record<Key, Code>>) => unknown;
37
+ }>(value: () => Value | undefined, key: Key, handlers: Handlers): ReturnType<Handlers[Value[Key] & (string | number)]> | undefined;
38
+ }
39
+ /**
40
+ * Type-safe pattern matching over a bare literal union. Call it with a single
41
+ * case (`craftMatch(value, 'a', handler)`) for an optional match, or use
42
+ * {@link CraftMatch.exhaustive | `craftMatch.exhaustive`} with a handler map
43
+ * for a compile-time-exhaustive match.
44
+ */
45
+ export declare const craftMatch: CraftMatch;
46
+ /** Preferred short name for value and discriminated-union matching. */
47
+ export declare const match: CraftMatch;
48
+ export {};
49
+ //# sourceMappingURL=craft-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-match.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-match.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI;KAChE,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;CAC9B,CAAC;AAEF,UAAU,UAAU;IAClB;;;;OAIG;IACH,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,SAAS,KAAK,EAAE,CAAC,EACnD,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,GAC1B,CAAC,GAAG,SAAS,CAAC;IAEjB;;;;;OAKG;IACH,UAAU,CACR,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,QAAQ,SAAS;SACd,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO;KACpC,EAED,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,GACjB,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/B;;;OAGG;IACH,UAAU,CACR,KAAK,SAAS,MAAM,EACpB,GAAG,SAAS;SACT,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK;KACnE,CAAC,MAAM,KAAK,CAAC,EACd,QAAQ,SAAS;SACd,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CACxC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KACrC,OAAO;KACb,EAED,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,GACjB,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAEpE,UAAU,CACR,KAAK,SAAS,MAAM,EACpB,GAAG,SAAS;SACT,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK;KACnE,CAAC,MAAM,KAAK,CAAC,EACd,QAAQ,SAAS;SACd,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CACxC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KACrC,OAAO;KACb,EAED,KAAK,EAAE,MAAM,KAAK,GAAG,SAAS,EAC9B,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,GACjB,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACrE;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,UAyBxB,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,KAAK,YAAa,CAAC"}
@@ -0,0 +1,58 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Value-level pattern matching over a bare literal union (string/number/enum),
3
+ // the value counterpart to the exception-level `catchTag` / `catchTag.exhaustive`
4
+ // pair in `craft-program-operators`.
5
+ //
6
+ // ```ts
7
+ // type Status = 'active' | 'idle' | 'error';
8
+ //
9
+ // // Single case — runs the handler only when `status === 'active'`,
10
+ // // otherwise `undefined`.
11
+ // const label = craftMatch(status, 'active', () => 'Running');
12
+ //
13
+ // // Exhaustive — every member of the union needs a handler; a missing key
14
+ // // (or a key outside the union) is a compile error, and each handler
15
+ // // receives its own narrowed literal.
16
+ // const label = craftMatch.exhaustive(status, {
17
+ // active: () => 'Running',
18
+ // idle: () => 'Waiting',
19
+ // error: () => 'Failed',
20
+ // });
21
+ // ```
22
+ //
23
+ // Exhaustiveness is enforced natively by the mapped handler type
24
+ // `{ [K in Value]: (value: K) => R }` — no `Exclude` gymnastics are needed
25
+ // because the union members *are* the required keys.
26
+ // ---------------------------------------------------------------------------
27
+ function craftMatchImpl(value, matchCase, handler) {
28
+ return value === matchCase ? handler(value) : undefined;
29
+ }
30
+ function craftMatchExhaustiveImpl(value, handlers) {
31
+ const handler = handlers[value];
32
+ return handler(value);
33
+ }
34
+ function craftMatchObjectExhaustiveImpl(value, key, handlers) {
35
+ const current = typeof value === 'function' ? value() : value;
36
+ if (current === undefined)
37
+ return undefined;
38
+ const code = Reflect.get(current, key);
39
+ const handler = handlers[code];
40
+ if (!handler) {
41
+ throw new Error(`match.exhaustive(...) has no handler for discriminant "${String(code)}".`);
42
+ }
43
+ return handler(current);
44
+ }
45
+ /**
46
+ * Type-safe pattern matching over a bare literal union. Call it with a single
47
+ * case (`craftMatch(value, 'a', handler)`) for an optional match, or use
48
+ * {@link CraftMatch.exhaustive | `craftMatch.exhaustive`} with a handler map
49
+ * for a compile-time-exhaustive match.
50
+ */
51
+ export const craftMatch = Object.assign(craftMatchImpl, {
52
+ exhaustive: ((value, keyOrHandlers, maybeHandlers) => maybeHandlers === undefined
53
+ ? craftMatchExhaustiveImpl(value, keyOrHandlers)
54
+ : craftMatchObjectExhaustiveImpl(value, keyOrHandlers, maybeHandlers)),
55
+ });
56
+ /** Preferred short name for value and discriminated-union matching. */
57
+ export const match = craftMatch;
58
+ //# sourceMappingURL=craft-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-match.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-match.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,kFAAkF;AAClF,qCAAqC;AACrC,EAAE;AACF,QAAQ;AACR,6CAA6C;AAC7C,EAAE;AACF,qEAAqE;AACrE,4BAA4B;AAC5B,+DAA+D;AAC/D,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,wCAAwC;AACxC,gDAAgD;AAChD,6BAA6B;AAC7B,2BAA2B;AAC3B,2BAA2B;AAC3B,MAAM;AACN,MAAM;AACN,EAAE;AACF,iEAAiE;AACjE,2EAA2E;AAC3E,qDAAqD;AACrD,8EAA8E;AA2E9E,SAAS,cAAc,CACrB,KAAY,EACZ,SAAe,EACf,OAA2B;IAE3B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,SAAS,wBAAwB,CAG/B,KAAY,EAAE,QAAkB;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAEE,CAAC;IACjC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,8BAA8B,CACrC,KAAsD,EACtD,GAAgB,EAChB,QAA6D;IAE7D,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAoB,CAAC;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,0DAA0D,MAAM,CAAC,IAAI,CAAC,IAAI,CAC3E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAe,MAAM,CAAC,MAAM,CACjD,cAA4B,EAC5B;IACE,UAAU,EAAE,CAAC,CACX,KAAc,EACd,aAAsB,EACtB,aAAuB,EACvB,EAAE,CACF,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,wBAAwB,CACtB,KAAwB,EACxB,aAGC,CACF;QACH,CAAC,CAAC,8BAA8B,CAC5B,KAA2B,EAC3B,aAA4B,EAC5B,aAGC,CACF,CAA6B;CACrC,CACF,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC","sourcesContent":["// ---------------------------------------------------------------------------\n// Value-level pattern matching over a bare literal union (string/number/enum),\n// the value counterpart to the exception-level `catchTag` / `catchTag.exhaustive`\n// pair in `craft-program-operators`.\n//\n// ```ts\n// type Status = 'active' | 'idle' | 'error';\n//\n// // Single case — runs the handler only when `status === 'active'`,\n// // otherwise `undefined`.\n// const label = craftMatch(status, 'active', () => 'Running');\n//\n// // Exhaustive — every member of the union needs a handler; a missing key\n// // (or a key outside the union) is a compile error, and each handler\n// // receives its own narrowed literal.\n// const label = craftMatch.exhaustive(status, {\n// active: () => 'Running',\n// idle: () => 'Waiting',\n// error: () => 'Failed',\n// });\n// ```\n//\n// Exhaustiveness is enforced natively by the mapped handler type\n// `{ [K in Value]: (value: K) => R }` — no `Exclude` gymnastics are needed\n// because the union members *are* the required keys.\n// ---------------------------------------------------------------------------\n\n/**\n * A handler map over a literal union: exactly one handler per member, each\n * receiving its own narrowed literal.\n */\nexport type CraftMatchHandlers<Value extends string | number, R> = {\n [K in Value]: (value: K) => R;\n};\n\ninterface CraftMatch {\n /**\n * Matches a single case of a literal union. When `value` equals `matchCase`\n * the handler runs (with `value` narrowed to `matchCase`) and its result is\n * returned; otherwise the result is `undefined`.\n */\n <Value extends string | number, Case extends Value, R>(\n value: Value,\n matchCase: Case,\n handler: (value: Case) => R,\n ): R | undefined;\n\n /**\n * Matches **every** member of a literal union through a handler map covering\n * exactly that union — a missing member or a key outside the union is a\n * compile error, and each handler receives its own narrowed literal. The\n * result is the union of the handlers' return types.\n */\n exhaustive<\n Value extends string | number,\n Handlers extends {\n [K in Value]: (value: K) => unknown;\n },\n >(\n value: Value,\n handlers: Handlers,\n ): ReturnType<Handlers[Value]>;\n\n /**\n * Exhaustively matches a discriminated object union. The callback receives\n * the member narrowed by `key`, including its exact payload.\n */\n exhaustive<\n Value extends object,\n Key extends {\n [K in keyof Value]-?: Value[K] extends string | number ? K : never;\n }[keyof Value],\n Handlers extends {\n [Code in Value[Key] & (string | number)]: (\n value: Extract<Value, Record<Key, Code>>,\n ) => unknown;\n },\n >(\n value: Value | undefined,\n key: Key,\n handlers: Handlers,\n ): ReturnType<Handlers[Value[Key] & (string | number)]> | undefined;\n\n exhaustive<\n Value extends object,\n Key extends {\n [K in keyof Value]-?: Value[K] extends string | number ? K : never;\n }[keyof Value],\n Handlers extends {\n [Code in Value[Key] & (string | number)]: (\n value: Extract<Value, Record<Key, Code>>,\n ) => unknown;\n },\n >(\n value: () => Value | undefined,\n key: Key,\n handlers: Handlers,\n ): ReturnType<Handlers[Value[Key] & (string | number)]> | undefined;\n}\n\nfunction craftMatchImpl<Value extends string | number, Case extends Value, R>(\n value: Value,\n matchCase: Case,\n handler: (value: Case) => R,\n): R | undefined {\n return value === matchCase ? handler(value as Case) : undefined;\n}\n\nfunction craftMatchExhaustiveImpl<\n Value extends string | number,\n Handlers extends CraftMatchHandlers<Value, any>,\n>(value: Value, handlers: Handlers): ReturnType<Handlers[Value]> {\n const handler = handlers[value] as (\n value: Value,\n ) => ReturnType<Handlers[Value]>;\n return handler(value);\n}\n\nfunction craftMatchObjectExhaustiveImpl(\n value: object | (() => object | undefined) | undefined,\n key: PropertyKey,\n handlers: Record<string | number, (value: object) => unknown>,\n): unknown {\n const current = typeof value === 'function' ? value() : value;\n if (current === undefined) return undefined;\n const code = Reflect.get(current, key) as string | number;\n const handler = handlers[code];\n if (!handler) {\n throw new Error(\n `match.exhaustive(...) has no handler for discriminant \"${String(code)}\".`,\n );\n }\n return handler(current);\n}\n\n/**\n * Type-safe pattern matching over a bare literal union. Call it with a single\n * case (`craftMatch(value, 'a', handler)`) for an optional match, or use\n * {@link CraftMatch.exhaustive | `craftMatch.exhaustive`} with a handler map\n * for a compile-time-exhaustive match.\n */\nexport const craftMatch: CraftMatch = Object.assign(\n craftMatchImpl as CraftMatch,\n {\n exhaustive: ((\n value: unknown,\n keyOrHandlers: unknown,\n maybeHandlers?: unknown,\n ) =>\n maybeHandlers === undefined\n ? craftMatchExhaustiveImpl(\n value as string | number,\n keyOrHandlers as Record<\n string | number,\n (value: string | number) => unknown\n >,\n )\n : craftMatchObjectExhaustiveImpl(\n value as object | undefined,\n keyOrHandlers as PropertyKey,\n maybeHandlers as Record<\n string | number,\n (value: object) => unknown\n >,\n )) as CraftMatch['exhaustive'],\n },\n);\n\n/** Preferred short name for value and discriminated-union matching. */\nexport const match = craftMatch;\n"]}
@@ -0,0 +1,28 @@
1
+ import { Provider } from './host/craft-compat';
2
+ import type { BrandedServiceProvider, SERVICE_HELPER_DEPENDENCIES, ServiceDependencyMapFromYielded } from './craft-service';
3
+ import { YIELDABLE_METHOD } from './yieldable';
4
+ type CraftMethodGenerator<This, Args extends unknown[], Yielded, Result> = (this: This, ...args: Args) => Generator<Yielded, Result, unknown>;
5
+ type CraftMethodWithReceiver<This, Args extends unknown[], Result> = (this: This, ...args: Args) => Result;
6
+ type CraftMethodWithoutReceiver<Args extends unknown[], Result> = (...args: Args) => Result;
7
+ type CraftMethodNameConfig<Name extends string> = Name | {
8
+ name: Name;
9
+ providers?: readonly Provider[];
10
+ };
11
+ type CraftMethodConfigProviderNames<Config> = Config extends {
12
+ providers: readonly (infer P)[];
13
+ } ? P extends BrandedServiceProvider<infer N, any, any> ? N : never : never;
14
+ type SatisfyDependencies<Deps, SatisfiedNames extends string> = {
15
+ [K in keyof Deps as K extends SatisfiedNames ? never : K]: Deps[K];
16
+ };
17
+ type TrackedCraftMethod<Callable, Yielded, Config = never> = Callable & {
18
+ readonly [YIELDABLE_METHOD]: {
19
+ readonly yielded?: Yielded;
20
+ };
21
+ readonly [SERVICE_HELPER_DEPENDENCIES]?: [
22
+ CraftMethodConfigProviderNames<Config>
23
+ ] extends [never] ? ServiceDependencyMapFromYielded<Yielded> : SatisfyDependencies<ServiceDependencyMapFromYielded<Yielded>, CraftMethodConfigProviderNames<Config>>;
24
+ };
25
+ export declare function craftMethod<Name extends string, This, Args extends unknown[], Yielded, Result, Config extends CraftMethodNameConfig<Name> = Name>(name: Config, factory: CraftMethodGenerator<This, Args, Yielded, Result>): TrackedCraftMethod<CraftMethodWithReceiver<This, Args, Result>, Yielded, Config>;
26
+ export declare function craftMethod<Name extends string, This, Args extends unknown[], Yielded, Result, Config extends CraftMethodNameConfig<Name> = Name>(name: Config, self: This, factory: CraftMethodGenerator<This, Args, Yielded, Result>): TrackedCraftMethod<CraftMethodWithoutReceiver<Args, Result>, Yielded, Config>;
27
+ export {};
28
+ //# sourceMappingURL=craft-method.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-method.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-method.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { assertInInjectionContext, inject, Injector, runInInjectionContext, } from './host/craft-compat';
2
+ import { ɵcreateHostTaggedInjector } from './craft-service';
3
+ import { isGenerator, runCraftGenerator } from './craft-generator-runtime';
4
+ import { injectFnWrapper } from './fn-wrapper';
5
+ import { markYieldableMethod, YIELDABLE_METHOD } from './yieldable';
6
+ function resolveCraftMethodName(nameOrConfig) {
7
+ return typeof nameOrConfig === 'string' ? nameOrConfig : nameOrConfig.name;
8
+ }
9
+ function resolveCraftMethodProviders(nameOrConfig) {
10
+ return typeof nameOrConfig === 'string' ? [] : (nameOrConfig.providers ?? []);
11
+ }
12
+ export function craftMethod(nameOrConfig, selfOrFactory, maybeFactory) {
13
+ assertInInjectionContext(craftMethod);
14
+ const injector = inject(Injector);
15
+ const resolvedName = resolveCraftMethodName(nameOrConfig);
16
+ const extraProviders = resolveCraftMethodProviders(nameOrConfig);
17
+ const methodInjector = ɵcreateHostTaggedInjector(injector, `method:${resolvedName}`, extraProviders);
18
+ const wrapFn = runInInjectionContext(methodInjector, () => injectFnWrapper());
19
+ if (maybeFactory) {
20
+ const self = selfOrFactory;
21
+ const factory = wrapFn(maybeFactory);
22
+ return markYieldableMethod(((...args) => executeCraftMethod(factory, methodInjector, self, args)));
23
+ }
24
+ const factory = wrapFn(selfOrFactory);
25
+ return markYieldableMethod(function (...args) {
26
+ return executeCraftMethod(factory, methodInjector, this, args);
27
+ });
28
+ }
29
+ function executeCraftMethod(factory, injector, self, args) {
30
+ return runInInjectionContext(injector, () => {
31
+ const result = factory.apply(self, args);
32
+ if (!isGenerator(result)) {
33
+ return result;
34
+ }
35
+ return runCraftGenerator({
36
+ iterator: result,
37
+ injector,
38
+ hostScope: 'function',
39
+ invalidYieldErrorMessage: 'craftMethod generators can only yield craftService dependencies or exposed dependency helpers.',
40
+ multipleAppStartErrorMessage: 'craftMethod generators cannot declare onAppStart(...) more than once.',
41
+ onAppStartNotSupportedErrorMessage: 'craftMethod(...) does not support onAppStart(...). Use onAppStart(...) only inside craftService({ appStart: true }, ...) generators.',
42
+ }).value;
43
+ });
44
+ }
45
+ //# sourceMappingURL=craft-method.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-method.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-method.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,MAAM,EACN,QAAQ,EAER,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA8CpE,SAAS,sBAAsB,CAC7B,YAAyC;IAEzC,OAAO,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,SAAS,2BAA2B,CAClC,YAA2C;IAE3C,OAAO,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAiCD,MAAM,UAAU,WAAW,CACzB,YAA2C,EAC3C,aAAuE,EACvE,YAAgE;IAOhE,wBAAwB,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,yBAAyB,CAC9C,QAAQ,EACR,UAAU,YAAY,EAAE,EACxB,cAAc,CACf,CAAC;IACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAE9E,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,aAAqB,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAErC,OAAO,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAU,EAAE,EAAE,CAC5C,kBAAkB,CAChB,OAAO,EACP,cAAc,EACd,IAAI,EACJ,IAAI,CACL,CAA0E,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CACpB,aAAkE,CACnE,CAAC;IAEF,OAAO,mBAAmB,CAAC,UAAsB,GAAG,IAAU;QAC5D,OAAO,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjE,CAA6E,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA0D,EAC1D,QAAkB,EAClB,IAAU,EACV,IAAU;IAEV,OAAO,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,iBAAiB,CAAC;YACvB,QAAQ,EAAE,MAAM;YAChB,QAAQ;YACR,SAAS,EAAE,UAAU;YACrB,wBAAwB,EACtB,gGAAgG;YAClG,4BAA4B,EAC1B,uEAAuE;YACzE,kCAAkC,EAChC,sIAAsI;SACzI,CAAC,CAAC,KAAe,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n assertInInjectionContext,\n inject,\n Injector,\n Provider,\n runInInjectionContext,\n} from './host/craft-compat';\nimport type {\n BrandedServiceProvider,\n SERVICE_HELPER_DEPENDENCIES,\n ServiceDependencyMapFromYielded,\n} from './craft-service';\nimport { ɵcreateHostTaggedInjector } from './craft-service';\nimport { isGenerator, runCraftGenerator } from './craft-generator-runtime';\nimport { injectFnWrapper } from './fn-wrapper';\nimport { markYieldableMethod, YIELDABLE_METHOD } from './yieldable';\n\ntype CraftMethodGenerator<This, Args extends unknown[], Yielded, Result> = (\n this: This,\n ...args: Args\n) => Generator<Yielded, Result, unknown>;\n\ntype CraftMethodWithReceiver<This, Args extends unknown[], Result> = (\n this: This,\n ...args: Args\n) => Result;\n\ntype CraftMethodWithoutReceiver<Args extends unknown[], Result> = (\n ...args: Args\n) => Result;\n\ntype CraftMethodNameConfig<Name extends string> =\n | Name\n | { name: Name; providers?: readonly Provider[] };\n\ntype CraftMethodConfigProviderNames<Config> = Config extends {\n providers: readonly (infer P)[];\n}\n ? P extends BrandedServiceProvider<infer N, any, any>\n ? N\n : never\n : never;\n\ntype SatisfyDependencies<Deps, SatisfiedNames extends string> = {\n [K in keyof Deps as K extends SatisfiedNames ? never : K]: Deps[K];\n};\n\ntype TrackedCraftMethod<Callable, Yielded, Config = never> = Callable & {\n readonly [YIELDABLE_METHOD]: {\n readonly yielded?: Yielded;\n };\n readonly [SERVICE_HELPER_DEPENDENCIES]?: [\n CraftMethodConfigProviderNames<Config>,\n ] extends [never]\n ? ServiceDependencyMapFromYielded<Yielded>\n : SatisfyDependencies<\n ServiceDependencyMapFromYielded<Yielded>,\n CraftMethodConfigProviderNames<Config>\n >;\n};\n\nfunction resolveCraftMethodName<Name extends string>(\n nameOrConfig: CraftMethodNameConfig<Name>,\n): Name {\n return typeof nameOrConfig === 'string' ? nameOrConfig : nameOrConfig.name;\n}\n\nfunction resolveCraftMethodProviders(\n nameOrConfig: CraftMethodNameConfig<string>,\n): readonly Provider[] {\n return typeof nameOrConfig === 'string' ? [] : (nameOrConfig.providers ?? []);\n}\n\nexport function craftMethod<\n Name extends string,\n This,\n Args extends unknown[],\n Yielded,\n Result,\n Config extends CraftMethodNameConfig<Name> = Name,\n>(\n name: Config,\n factory: CraftMethodGenerator<This, Args, Yielded, Result>,\n): TrackedCraftMethod<\n CraftMethodWithReceiver<This, Args, Result>,\n Yielded,\n Config\n>;\nexport function craftMethod<\n Name extends string,\n This,\n Args extends unknown[],\n Yielded,\n Result,\n Config extends CraftMethodNameConfig<Name> = Name,\n>(\n name: Config,\n self: This,\n factory: CraftMethodGenerator<This, Args, Yielded, Result>,\n): TrackedCraftMethod<\n CraftMethodWithoutReceiver<Args, Result>,\n Yielded,\n Config\n>;\nexport function craftMethod<This, Args extends unknown[], Yielded, Result>(\n nameOrConfig: CraftMethodNameConfig<string>,\n selfOrFactory: This | CraftMethodGenerator<This, Args, Yielded, Result>,\n maybeFactory?: CraftMethodGenerator<This, Args, Yielded, Result>,\n):\n | TrackedCraftMethod<\n CraftMethodWithReceiver<This, Args, Result>,\n Yielded\n >\n | TrackedCraftMethod<CraftMethodWithoutReceiver<Args, Result>, Yielded> {\n assertInInjectionContext(craftMethod);\n const injector = inject(Injector);\n const resolvedName = resolveCraftMethodName(nameOrConfig);\n const extraProviders = resolveCraftMethodProviders(nameOrConfig);\n const methodInjector = ɵcreateHostTaggedInjector(\n injector,\n `method:${resolvedName}`,\n extraProviders,\n );\n const wrapFn = runInInjectionContext(methodInjector, () => injectFnWrapper());\n\n if (maybeFactory) {\n const self = selfOrFactory as This;\n const factory = wrapFn(maybeFactory);\n\n return markYieldableMethod(((...args: Args) =>\n executeCraftMethod(\n factory,\n methodInjector,\n self,\n args,\n )) as TrackedCraftMethod<CraftMethodWithoutReceiver<Args, Result>, Yielded>);\n }\n\n const factory = wrapFn(\n selfOrFactory as CraftMethodGenerator<This, Args, Yielded, Result>,\n );\n\n return markYieldableMethod(function (this: This, ...args: Args) {\n return executeCraftMethod(factory, methodInjector, this, args);\n } as TrackedCraftMethod<CraftMethodWithReceiver<This, Args, Result>, Yielded>);\n}\n\nfunction executeCraftMethod<This, Args extends unknown[], Yielded, Result>(\n factory: CraftMethodGenerator<This, Args, Yielded, Result>,\n injector: Injector,\n self: This,\n args: Args,\n): Result {\n return runInInjectionContext(injector, () => {\n const result = factory.apply(self, args);\n\n if (!isGenerator(result)) {\n return result;\n }\n\n return runCraftGenerator({\n iterator: result,\n injector,\n hostScope: 'function',\n invalidYieldErrorMessage:\n 'craftMethod generators can only yield craftService dependencies or exposed dependency helpers.',\n multipleAppStartErrorMessage:\n 'craftMethod generators cannot declare onAppStart(...) more than once.',\n onAppStartNotSupportedErrorMessage:\n 'craftMethod(...) does not support onAppStart(...). Use onAppStart(...) only inside craftService({ appStart: true }, ...) generators.',\n }).value as Result;\n });\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { InjectionToken, type EffectRef, type Injector } from './host/craft-compat';
2
+ import { type CraftRegistrationTarget } from './craft-register-for-runtime';
3
+ import type { CraftDomAdapter } from './host/craft-dom';
4
+ /** Runtime marker shared by core-authored DOM directives and the Craft renderer. */
5
+ export declare const CRAFT_NODE_DIRECTIVE: unique symbol;
6
+ /** Creates a reactive effect owned by the current node-directive mount. */
7
+ export type CraftNodeEffectFactory = (name: string, effectFn: () => void) => EffectRef;
8
+ export declare const CRAFT_NODE_EFFECT_FACTORY: InjectionToken<CraftNodeEffectFactory>;
9
+ /** The element-scoped services and reactive inputs available to a DOM directive. */
10
+ export interface CraftNodeDirectiveContext<Props extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {
11
+ readonly element: Element;
12
+ readonly injector: Injector;
13
+ readonly renderer: CraftDomAdapter;
14
+ /**
15
+ * The current directive inputs. Reading this property inside an effect tracks
16
+ * input updates without remounting the directive.
17
+ */
18
+ readonly props: Props;
19
+ }
20
+ export type CraftNodeDirectiveMount<Props extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> = (context: CraftNodeDirectiveContext<Props>) => void | (() => void);
21
+ export interface CraftNodeDirectiveDefinition<Props extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {
22
+ readonly name: string;
23
+ readonly inputs: readonly (keyof Props & string)[];
24
+ readonly mount: CraftNodeDirectiveMount<Props>;
25
+ }
26
+ export interface CraftNodeDirective<Props extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> extends CraftRegistrationTarget<string, 'directive', CraftNodeDirectiveContext<Props>> {
27
+ readonly [CRAFT_NODE_DIRECTIVE]: CraftNodeDirectiveDefinition<Props>;
28
+ }
29
+ /** Creates a functional directive mounted directly on a rendered DOM node. */
30
+ export declare function craftNodeDirective<const Props extends Readonly<Record<string, unknown>>>(name: string, inputs: readonly (keyof Props & string)[], mount: CraftNodeDirectiveMount<Props>): CraftNodeDirective<Props>;
31
+ export declare function isCraftNodeDirective(value: unknown): value is CraftNodeDirective<any>;
32
+ //# sourceMappingURL=craft-node-directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craft-node-directive.d.ts","sourceRoot":"","sources":["../../../../../libs/core/src/lib/craft-node-directive.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,eAEhC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,sBAAsB,GAAG,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,IAAI,KACjB,SAAS,CAAC;AAEf,eAAO,MAAM,yBAAyB,wCACmC,CAAC;AAE1E,oFAAoF;AACpF,MAAM,WAAW,yBAAyB,CACxC,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IAED,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,CACjC,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB,IACC,CAAC,OAAO,EAAE,yBAAyB,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEvE,MAAM,WAAW,4BAA4B,CAC3C,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB,CACjC,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CACxD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB,CACD,SAAQ,uBAAuB,CAC7B,MAAM,EACN,WAAW,EACX,yBAAyB,CAAC,KAAK,CAAC,CACjC;IACD,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,4BAA4B,CAAC,KAAK,CAAC,CAAC;CACtE;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAErD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,EACzC,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,GACpC,kBAAkB,CAAC,KAAK,CAAC,CAa3B;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAElC"}