@askrjs/askr 0.0.48 → 0.0.49

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 (394) hide show
  1. package/dist/benchmark.js +6 -6
  2. package/dist/benchmark.js.map +1 -1
  3. package/dist/boot/hydration.js +140 -0
  4. package/dist/boot/hydration.js.map +1 -0
  5. package/dist/boot/index.d.ts +3 -56
  6. package/dist/boot/index.d.ts.map +1 -1
  7. package/dist/boot/index.js +62 -410
  8. package/dist/boot/index.js.map +1 -1
  9. package/dist/boot/root-lifecycle.d.ts +15 -0
  10. package/dist/boot/root-lifecycle.d.ts.map +1 -0
  11. package/dist/boot/root-lifecycle.js +205 -0
  12. package/dist/boot/root-lifecycle.js.map +1 -0
  13. package/dist/boot/route-startup.js +45 -0
  14. package/dist/boot/route-startup.js.map +1 -0
  15. package/dist/boot/types.d.ts +62 -0
  16. package/dist/boot/types.d.ts.map +1 -0
  17. package/dist/common/component.d.ts +3 -1
  18. package/dist/common/component.d.ts.map +1 -1
  19. package/dist/common/jsx.d.ts +1 -1
  20. package/dist/common/jsx.d.ts.map +1 -1
  21. package/dist/common/jsx.js.map +1 -1
  22. package/dist/common/props.d.ts +1 -1
  23. package/dist/common/render-context.js +55 -0
  24. package/dist/common/render-context.js.map +1 -0
  25. package/dist/common/router.d.ts +5 -1
  26. package/dist/common/router.d.ts.map +1 -1
  27. package/dist/common/ssr.d.ts +1 -1
  28. package/dist/common/ssr.js.map +1 -1
  29. package/dist/common/vnode.d.ts +5 -4
  30. package/dist/common/vnode.d.ts.map +1 -1
  31. package/dist/common/vnode.js.map +1 -1
  32. package/dist/components/error-boundary.d.ts +1 -1
  33. package/dist/components/error-boundary.js +2 -1
  34. package/dist/components/error-boundary.js.map +1 -1
  35. package/dist/components/link.js.map +1 -1
  36. package/dist/control/for.js +2 -1
  37. package/dist/control/for.js.map +1 -1
  38. package/dist/data/data-runtime.d.ts +28 -0
  39. package/dist/data/data-runtime.d.ts.map +1 -0
  40. package/dist/data/data-runtime.js +114 -0
  41. package/dist/data/data-runtime.js.map +1 -0
  42. package/dist/data/index.d.ts +6 -142
  43. package/dist/data/index.js +5 -539
  44. package/dist/data/invalidation.d.ts +9 -0
  45. package/dist/data/invalidation.d.ts.map +1 -0
  46. package/dist/data/invalidation.js +27 -0
  47. package/dist/data/invalidation.js.map +1 -0
  48. package/dist/data/mutation-cell.d.ts +28 -0
  49. package/dist/data/mutation-cell.d.ts.map +1 -0
  50. package/dist/data/mutation-cell.js +132 -0
  51. package/dist/data/mutation-cell.js.map +1 -0
  52. package/dist/data/query-cell.d.ts +46 -0
  53. package/dist/data/query-cell.d.ts.map +1 -0
  54. package/dist/data/query-cell.js +290 -0
  55. package/dist/data/query-cell.js.map +1 -0
  56. package/dist/data/query-key.js +42 -0
  57. package/dist/data/query-key.js.map +1 -0
  58. package/dist/data/shared.js +20 -0
  59. package/dist/data/shared.js.map +1 -0
  60. package/dist/data/types.d.ts +161 -0
  61. package/dist/data/types.d.ts.map +1 -0
  62. package/dist/foundations/icon/icon.d.ts.map +1 -1
  63. package/dist/foundations/icon/icon.js.map +1 -1
  64. package/dist/foundations/structures/portal.d.ts +1 -1
  65. package/dist/foundations/structures/portal.d.ts.map +1 -1
  66. package/dist/foundations/structures/portal.js +2 -1
  67. package/dist/foundations/structures/portal.js.map +1 -1
  68. package/dist/fx/fx.d.ts +1 -1
  69. package/dist/fx/fx.js +5 -4
  70. package/dist/fx/fx.js.map +1 -1
  71. package/dist/fx/timing.d.ts.map +1 -1
  72. package/dist/fx/timing.js +10 -6
  73. package/dist/fx/timing.js.map +1 -1
  74. package/dist/index.d.ts +3 -2
  75. package/dist/index.js +4 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx/index.d.ts +2 -1
  78. package/dist/jsx/index.js +3 -2
  79. package/dist/jsx/types.d.ts +2 -0
  80. package/dist/jsx/types.js +2 -1
  81. package/dist/jsx-runtime2.d.ts +2 -1
  82. package/dist/jsx-runtime2.js +3 -2
  83. package/dist/renderer/attributes.js +231 -0
  84. package/dist/renderer/attributes.js.map +1 -0
  85. package/dist/renderer/boundaries.js +266 -0
  86. package/dist/renderer/boundaries.js.map +1 -0
  87. package/dist/renderer/child-shape.js +85 -0
  88. package/dist/renderer/child-shape.js.map +1 -0
  89. package/dist/renderer/children.js +3 -2
  90. package/dist/renderer/children.js.map +1 -1
  91. package/dist/renderer/cleanup.js +2 -1
  92. package/dist/renderer/cleanup.js.map +1 -1
  93. package/dist/renderer/component-host-cleanup.js +68 -0
  94. package/dist/renderer/component-host-cleanup.js.map +1 -0
  95. package/dist/renderer/component-host-instances.js +65 -0
  96. package/dist/renderer/component-host-instances.js.map +1 -0
  97. package/dist/renderer/component-host.js +247 -0
  98. package/dist/renderer/component-host.js.map +1 -0
  99. package/dist/renderer/dom-host.js +13 -0
  100. package/dist/renderer/dom-host.js.map +1 -0
  101. package/dist/renderer/dom-internal.js +185 -0
  102. package/dist/renderer/dom-internal.js.map +1 -0
  103. package/dist/renderer/dom.js +9 -2356
  104. package/dist/renderer/element-children.js +279 -0
  105. package/dist/renderer/element-children.js.map +1 -0
  106. package/dist/renderer/env.js +2 -1
  107. package/dist/renderer/error-boundary-dom.js +29 -0
  108. package/dist/renderer/error-boundary-dom.js.map +1 -0
  109. package/dist/renderer/evaluate-dom-range.js +85 -0
  110. package/dist/renderer/evaluate-dom-range.js.map +1 -0
  111. package/dist/renderer/evaluate-reconcile.js +281 -0
  112. package/dist/renderer/evaluate-reconcile.js.map +1 -0
  113. package/dist/renderer/evaluate.js +13 -399
  114. package/dist/renderer/evaluate.js.map +1 -1
  115. package/dist/renderer/fastpath.js +6 -5
  116. package/dist/renderer/fastpath.js.map +1 -1
  117. package/dist/renderer/for-commit-dom-map.js +83 -0
  118. package/dist/renderer/for-commit-dom-map.js.map +1 -0
  119. package/dist/renderer/for-commit-removal.js +36 -0
  120. package/dist/renderer/for-commit-removal.js.map +1 -0
  121. package/dist/renderer/for-commit-reorder.js +89 -0
  122. package/dist/renderer/for-commit-reorder.js.map +1 -0
  123. package/dist/renderer/for-commit.js +6 -188
  124. package/dist/renderer/for-commit.js.map +1 -1
  125. package/dist/renderer/index.js +28 -16
  126. package/dist/renderer/index.js.map +1 -1
  127. package/dist/renderer/keyed-children.js +32 -0
  128. package/dist/renderer/keyed-children.js.map +1 -0
  129. package/dist/renderer/keyed.js +2 -15
  130. package/dist/renderer/keyed.js.map +1 -1
  131. package/dist/renderer/namespaces.js +23 -0
  132. package/dist/renderer/namespaces.js.map +1 -0
  133. package/dist/renderer/prop-bindings.js +280 -0
  134. package/dist/renderer/prop-bindings.js.map +1 -0
  135. package/dist/renderer/reactive-child-dom.js +133 -0
  136. package/dist/renderer/reactive-child-dom.js.map +1 -0
  137. package/dist/renderer/reactive-child-sources.js +184 -0
  138. package/dist/renderer/reactive-child-sources.js.map +1 -0
  139. package/dist/renderer/reactive-children.js +294 -0
  140. package/dist/renderer/reactive-children.js.map +1 -0
  141. package/dist/renderer/reconcile-commit.js +38 -0
  142. package/dist/renderer/reconcile-commit.js.map +1 -0
  143. package/dist/renderer/reconcile-fastpaths.js +106 -0
  144. package/dist/renderer/reconcile-fastpaths.js.map +1 -0
  145. package/dist/renderer/reconcile-resolution.js +187 -0
  146. package/dist/renderer/reconcile-resolution.js.map +1 -0
  147. package/dist/renderer/reconcile.js +9 -371
  148. package/dist/renderer/reconcile.js.map +1 -1
  149. package/dist/renderer/retained-element-rollback.js +276 -0
  150. package/dist/renderer/retained-element-rollback.js.map +1 -0
  151. package/dist/renderer/stable-patch.js +82 -0
  152. package/dist/renderer/stable-patch.js.map +1 -0
  153. package/dist/renderer/static-reuse.js +96 -0
  154. package/dist/renderer/static-reuse.js.map +1 -0
  155. package/dist/renderer/types.js +2 -1
  156. package/dist/renderer/utils.js +4 -4
  157. package/dist/renderer/utils.js.map +1 -1
  158. package/dist/resources/index.d.ts +3 -2
  159. package/dist/resources/index.js +5 -2
  160. package/dist/router/access.js +36 -0
  161. package/dist/router/access.js.map +1 -0
  162. package/dist/router/activity.d.ts +10 -0
  163. package/dist/router/activity.d.ts.map +1 -0
  164. package/dist/router/activity.js +89 -0
  165. package/dist/router/activity.js.map +1 -0
  166. package/dist/router/authoring.d.ts +22 -0
  167. package/dist/router/authoring.d.ts.map +1 -0
  168. package/dist/router/authoring.js +198 -0
  169. package/dist/router/authoring.js.map +1 -0
  170. package/dist/router/index.d.ts +12 -4
  171. package/dist/router/index.js +10 -3
  172. package/dist/router/internal-types.d.ts +31 -0
  173. package/dist/router/internal-types.d.ts.map +1 -0
  174. package/dist/router/lazy.d.ts +19 -0
  175. package/dist/router/lazy.d.ts.map +1 -0
  176. package/dist/router/lazy.js +52 -0
  177. package/dist/router/lazy.js.map +1 -0
  178. package/dist/router/manifest.d.ts +10 -0
  179. package/dist/router/manifest.d.ts.map +1 -0
  180. package/dist/router/manifest.js +49 -0
  181. package/dist/router/manifest.js.map +1 -0
  182. package/dist/router/navigate.d.ts +4 -51
  183. package/dist/router/navigate.d.ts.map +1 -1
  184. package/dist/router/navigate.js +16 -459
  185. package/dist/router/navigate.js.map +1 -1
  186. package/dist/router/navigation-registry.d.ts +32 -0
  187. package/dist/router/navigation-registry.d.ts.map +1 -0
  188. package/dist/router/navigation-registry.js +105 -0
  189. package/dist/router/navigation-registry.js.map +1 -0
  190. package/dist/router/navigation-scroll.d.ts +14 -0
  191. package/dist/router/navigation-scroll.d.ts.map +1 -0
  192. package/dist/router/navigation-scroll.js +93 -0
  193. package/dist/router/navigation-scroll.js.map +1 -0
  194. package/dist/router/navigation-targets.d.ts +31 -0
  195. package/dist/router/navigation-targets.d.ts.map +1 -0
  196. package/dist/router/navigation-targets.js +253 -0
  197. package/dist/router/navigation-targets.js.map +1 -0
  198. package/dist/router/policy.d.ts +7 -1
  199. package/dist/router/policy.d.ts.map +1 -1
  200. package/dist/router/policy.js +27 -9
  201. package/dist/router/policy.js.map +1 -1
  202. package/dist/router/rendering.d.ts +10 -0
  203. package/dist/router/rendering.d.ts.map +1 -0
  204. package/dist/router/rendering.js +45 -0
  205. package/dist/router/rendering.js.map +1 -0
  206. package/dist/router/resolution.d.ts +17 -0
  207. package/dist/router/resolution.d.ts.map +1 -0
  208. package/dist/router/resolution.js +253 -0
  209. package/dist/router/resolution.js.map +1 -0
  210. package/dist/router/route-query.d.ts +17 -0
  211. package/dist/router/route-query.d.ts.map +1 -0
  212. package/dist/router/route-query.js +47 -0
  213. package/dist/router/route-query.js.map +1 -0
  214. package/dist/router/route.d.ts +8 -149
  215. package/dist/router/route.js +8 -854
  216. package/dist/router/store.d.ts +50 -0
  217. package/dist/router/store.d.ts.map +1 -0
  218. package/dist/router/store.js +171 -0
  219. package/dist/router/store.js.map +1 -0
  220. package/dist/runtime/access.js +45 -0
  221. package/dist/runtime/access.js.map +1 -0
  222. package/dist/runtime/child-scope.d.ts +1 -1
  223. package/dist/runtime/child-scope.js +4 -1
  224. package/dist/runtime/child-scope.js.map +1 -1
  225. package/dist/runtime/component-cleanup.d.ts +16 -0
  226. package/dist/runtime/component-cleanup.d.ts.map +1 -0
  227. package/dist/runtime/component-cleanup.js +70 -0
  228. package/dist/runtime/component-cleanup.js.map +1 -0
  229. package/dist/runtime/component-commit.js +165 -0
  230. package/dist/runtime/component-commit.js.map +1 -0
  231. package/dist/runtime/component-contracts.js +5 -0
  232. package/dist/runtime/component-facade.d.ts +5 -0
  233. package/dist/runtime/component-facade.js +4 -0
  234. package/dist/runtime/component-internal.d.ts +100 -0
  235. package/dist/runtime/component-internal.d.ts.map +1 -0
  236. package/dist/runtime/component-internal.js +219 -0
  237. package/dist/runtime/component-internal.js.map +1 -0
  238. package/dist/runtime/component-lifecycle.d.ts +49 -0
  239. package/dist/runtime/component-lifecycle.d.ts.map +1 -0
  240. package/dist/runtime/component-lifecycle.js +176 -0
  241. package/dist/runtime/component-lifecycle.js.map +1 -0
  242. package/dist/runtime/component-scope.d.ts +55 -0
  243. package/dist/runtime/component-scope.d.ts.map +1 -0
  244. package/dist/runtime/component-scope.js +154 -0
  245. package/dist/runtime/component-scope.js.map +1 -0
  246. package/dist/runtime/component.d.ts +4 -152
  247. package/dist/runtime/component.js +4 -692
  248. package/dist/runtime/context.d.ts +1 -1
  249. package/dist/runtime/context.js +6 -4
  250. package/dist/runtime/context.js.map +1 -1
  251. package/dist/runtime/control.d.ts +3 -3
  252. package/dist/runtime/control.js +2 -1
  253. package/dist/runtime/control.js.map +1 -1
  254. package/dist/runtime/derive.d.ts.map +1 -1
  255. package/dist/runtime/derive.js +6 -5
  256. package/dist/runtime/derive.js.map +1 -1
  257. package/dist/runtime/effect.d.ts +1 -1
  258. package/dist/runtime/effect.d.ts.map +1 -1
  259. package/dist/runtime/effect.js +2 -2
  260. package/dist/runtime/effect.js.map +1 -1
  261. package/dist/runtime/events.js +3 -3
  262. package/dist/runtime/events.js.map +1 -1
  263. package/dist/runtime/fastlane.js +13 -27
  264. package/dist/runtime/fastlane.js.map +1 -1
  265. package/dist/runtime/for-bench.d.ts +1 -1
  266. package/dist/runtime/for-bench.js +1 -4
  267. package/dist/runtime/for-bench.js.map +1 -1
  268. package/dist/runtime/for-internal.d.ts +43 -0
  269. package/dist/runtime/for-internal.d.ts.map +1 -0
  270. package/dist/runtime/for-internal.js +98 -0
  271. package/dist/runtime/for-internal.js.map +1 -0
  272. package/dist/runtime/for-reconcile.d.ts +8 -0
  273. package/dist/runtime/for-reconcile.d.ts.map +1 -0
  274. package/dist/runtime/for-reconcile.js +389 -0
  275. package/dist/runtime/for-reconcile.js.map +1 -0
  276. package/dist/runtime/for-scopes.d.ts +26 -0
  277. package/dist/runtime/for-scopes.d.ts.map +1 -0
  278. package/dist/runtime/for-scopes.js +160 -0
  279. package/dist/runtime/for-scopes.js.map +1 -0
  280. package/dist/runtime/for-signals.d.ts +30 -0
  281. package/dist/runtime/for-signals.d.ts.map +1 -0
  282. package/dist/runtime/for-signals.js +139 -0
  283. package/dist/runtime/for-signals.js.map +1 -0
  284. package/dist/runtime/for.d.ts +4 -66
  285. package/dist/runtime/for.js +5 -773
  286. package/dist/runtime/lifecycle-operations.d.ts +31 -0
  287. package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
  288. package/dist/runtime/lifecycle-operations.js +195 -0
  289. package/dist/runtime/lifecycle-operations.js.map +1 -0
  290. package/dist/runtime/operations.d.ts +3 -40
  291. package/dist/runtime/operations.js +2 -357
  292. package/dist/runtime/readable.d.ts +2 -3
  293. package/dist/runtime/readable.d.ts.map +1 -1
  294. package/dist/runtime/readable.js +6 -5
  295. package/dist/runtime/readable.js.map +1 -1
  296. package/dist/runtime/resource-cell.js +2 -2
  297. package/dist/runtime/resource-cell.js.map +1 -1
  298. package/dist/runtime/resource-operation.d.ts +13 -0
  299. package/dist/runtime/resource-operation.d.ts.map +1 -0
  300. package/dist/runtime/resource-operation.js +170 -0
  301. package/dist/runtime/resource-operation.js.map +1 -0
  302. package/dist/runtime/runtime.d.ts +42 -0
  303. package/dist/runtime/runtime.d.ts.map +1 -0
  304. package/dist/runtime/runtime.js +59 -0
  305. package/dist/runtime/runtime.js.map +1 -0
  306. package/dist/runtime/scheduler.d.ts +5 -1
  307. package/dist/runtime/scheduler.d.ts.map +1 -1
  308. package/dist/runtime/scheduler.js +17 -17
  309. package/dist/runtime/scheduler.js.map +1 -1
  310. package/dist/runtime/selector.js +4 -3
  311. package/dist/runtime/selector.js.map +1 -1
  312. package/dist/runtime/snapshot-source.d.ts +1 -1
  313. package/dist/runtime/snapshot-source.js +1 -1
  314. package/dist/runtime/state.js +2 -1
  315. package/dist/runtime/state.js.map +1 -1
  316. package/dist/ssg/batch-render.js +2 -1
  317. package/dist/ssg/batch-render.js.map +1 -1
  318. package/dist/ssg/create-static-gen.d.ts +9 -3
  319. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  320. package/dist/ssg/create-static-gen.js +12 -99
  321. package/dist/ssg/create-static-gen.js.map +1 -1
  322. package/dist/ssg/generation-plan.js +70 -0
  323. package/dist/ssg/generation-plan.js.map +1 -0
  324. package/dist/ssg/incremental-manifest.js +1 -1
  325. package/dist/ssg/static-routes.js +101 -0
  326. package/dist/ssg/static-routes.js.map +1 -0
  327. package/dist/ssg/types.d.ts +15 -7
  328. package/dist/ssg/types.d.ts.map +1 -1
  329. package/dist/ssr/boundaries.js +113 -0
  330. package/dist/ssr/boundaries.js.map +1 -0
  331. package/dist/ssr/component-runtime.js +111 -0
  332. package/dist/ssr/component-runtime.js.map +1 -0
  333. package/dist/ssr/context.d.ts +3 -1
  334. package/dist/ssr/context.d.ts.map +1 -1
  335. package/dist/ssr/context.js +9 -2
  336. package/dist/ssr/context.js.map +1 -1
  337. package/dist/ssr/errors.d.ts +2 -0
  338. package/dist/ssr/errors.js +11 -1
  339. package/dist/ssr/errors.js.map +1 -1
  340. package/dist/ssr/escape.js +3 -3
  341. package/dist/ssr/escape.js.map +1 -1
  342. package/dist/ssr/hydration-data.js +10 -0
  343. package/dist/ssr/hydration-data.js.map +1 -0
  344. package/dist/ssr/hydration-verify.d.ts +12 -0
  345. package/dist/ssr/hydration-verify.d.ts.map +1 -0
  346. package/dist/ssr/hydration-verify.js +144 -0
  347. package/dist/ssr/hydration-verify.js.map +1 -0
  348. package/dist/ssr/index-internal.d.ts +15 -0
  349. package/dist/ssr/index-internal.d.ts.map +1 -0
  350. package/dist/ssr/index-internal.js +19 -0
  351. package/dist/ssr/index-internal.js.map +1 -0
  352. package/dist/ssr/index.d.ts +5 -57
  353. package/dist/ssr/index.js +3 -738
  354. package/dist/ssr/render-keys.js +9 -32
  355. package/dist/ssr/render-keys.js.map +1 -1
  356. package/dist/ssr/render-resolved.d.ts +1 -1
  357. package/dist/ssr/render-resolved.d.ts.map +1 -1
  358. package/dist/ssr/render-resolved.js +4 -2
  359. package/dist/ssr/render-resolved.js.map +1 -1
  360. package/dist/ssr/render-sync.d.ts +21 -0
  361. package/dist/ssr/render-sync.d.ts.map +1 -0
  362. package/dist/ssr/render-sync.js +275 -0
  363. package/dist/ssr/render-sync.js.map +1 -0
  364. package/dist/ssr/route-policy-resolution.js +77 -0
  365. package/dist/ssr/route-policy-resolution.js.map +1 -0
  366. package/dist/ssr/route-render.d.ts +77 -0
  367. package/dist/ssr/route-render.d.ts.map +1 -0
  368. package/dist/ssr/route-render.js +119 -0
  369. package/dist/ssr/route-render.js.map +1 -0
  370. package/dist/ssr/sink.d.ts +26 -0
  371. package/dist/ssr/sink.d.ts.map +1 -0
  372. package/dist/ssr/types.d.ts +1 -0
  373. package/dist/ssr/types.d.ts.map +1 -1
  374. package/dist/ssr/verify-hydration.js.map +1 -1
  375. package/dist/testing/index.d.ts +1 -2
  376. package/dist/testing/index.d.ts.map +1 -1
  377. package/dist/testing/index.js +2 -1
  378. package/dist/testing/index.js.map +1 -1
  379. package/package.json +4 -3
  380. package/dist/data/index.d.ts.map +0 -1
  381. package/dist/data/index.js.map +0 -1
  382. package/dist/renderer/dom.js.map +0 -1
  383. package/dist/router/route.d.ts.map +0 -1
  384. package/dist/router/route.js.map +0 -1
  385. package/dist/runtime/component.d.ts.map +0 -1
  386. package/dist/runtime/component.js.map +0 -1
  387. package/dist/runtime/for.d.ts.map +0 -1
  388. package/dist/runtime/for.js.map +0 -1
  389. package/dist/runtime/operations.d.ts.map +0 -1
  390. package/dist/runtime/operations.js.map +0 -1
  391. package/dist/runtime/ssr-bridge.js +0 -24
  392. package/dist/runtime/ssr-bridge.js.map +0 -1
  393. package/dist/ssr/index.d.ts.map +0 -1
  394. package/dist/ssr/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-context.js","names":[],"sources":["../../src/common/render-context.ts"],"sourcesContent":["import type { SSRData } from './ssr';\nimport type { Route, RouteAuthOptions } from './router';\nimport { SSRDataMissingError } from './ssr-errors';\n\nexport interface ActiveRenderContext {\n url: string;\n data?: SSRData;\n params?: Record<string, string>;\n routes?: readonly Route[];\n routeAuth?: RouteAuthOptions;\n signal?: AbortSignal;\n dataRuntime?: unknown;\n queryCache?: Map<string, unknown>;\n keyCounter: number;\n renderData: Record<string, unknown> | null;\n}\n\nexport interface RenderContextProvider {\n getRenderContext(): ActiveRenderContext | null;\n}\n\nlet provider: RenderContextProvider = {\n getRenderContext() {\n return null;\n },\n};\nlet hydrationRenderData: Record<string, unknown> | null = null;\nlet hydrationKeyCounter = 0;\n\nexport function configureRenderContextProvider(\n nextProvider: RenderContextProvider\n): void {\n provider = nextProvider;\n}\n\nexport function getActiveRenderContext(): ActiveRenderContext | null {\n return provider.getRenderContext();\n}\n\nexport function getCurrentRenderData(): Record<string, unknown> | null {\n const ctx = getActiveRenderContext();\n return ctx?.renderData ?? hydrationRenderData;\n}\n\nexport function resetRenderKeyCounter(): void {\n const ctx = getActiveRenderContext();\n if (ctx) {\n ctx.keyCounter = 0;\n }\n}\n\nexport function getNextRenderKey(): string {\n const ctx = getActiveRenderContext();\n if (ctx) {\n return `r:${ctx.keyCounter++}`;\n }\n\n if (hydrationRenderData) {\n return `r:${hydrationKeyCounter++}`;\n }\n\n return 'r:0';\n}\n\nexport function startHydrationRenderPhase(data: Record<string, unknown>): void {\n hydrationRenderData = data;\n hydrationKeyCounter = 0;\n}\n\nexport function stopHydrationRenderPhase(): void {\n hydrationRenderData = null;\n hydrationKeyCounter = 0;\n}\n\nexport function startRenderPhase(data: Record<string, unknown> | null): void {\n const ctx = getActiveRenderContext();\n if (ctx) {\n ctx.renderData = data ?? null;\n ctx.keyCounter = 0;\n }\n}\n\nexport function stopRenderPhase(): void {\n const ctx = getActiveRenderContext();\n if (ctx) {\n ctx.renderData = null;\n ctx.keyCounter = 0;\n }\n}\n\nexport function throwSSRDataMissing(): never {\n throw new SSRDataMissingError();\n}\n"],"mappings":";;AAqBA,IAAI,WAAkC,EACpC,mBAAmB;CACjB,OAAO;AACT,EACF;AACA,IAAI,sBAAsD;AAC1D,IAAI,sBAAsB;AAE1B,SAAgB,+BACd,cACM;CACN,WAAW;AACb;AAEA,SAAgB,yBAAqD;CACnE,OAAO,SAAS,iBAAiB;AACnC;AAEA,SAAgB,uBAAuD;CAErE,OADY,uBACL,CAAA,EAAK,cAAc;AAC5B;AAEA,SAAgB,wBAA8B;CAC5C,MAAM,MAAM,uBAAuB;CACnC,IAAI,KACF,IAAI,aAAa;AAErB;AAEA,SAAgB,mBAA2B;CACzC,MAAM,MAAM,uBAAuB;CACnC,IAAI,KACF,OAAO,KAAK,IAAI;CAGlB,IAAI,qBACF,OAAO,KAAK;CAGd,OAAO;AACT;AAEA,SAAgB,0BAA0B,MAAqC;CAC7E,sBAAsB;CACtB,sBAAsB;AACxB;AAEA,SAAgB,2BAAiC;CAC/C,sBAAsB;CACtB,sBAAsB;AACxB;AAEA,SAAgB,iBAAiB,MAA4C;CAC3E,MAAM,MAAM,uBAAuB;CACnC,IAAI,KAAK;EACP,IAAI,aAAa,QAAQ;EACzB,IAAI,aAAa;CACnB;AACF;AAEA,SAAgB,kBAAwB;CACtC,MAAM,MAAM,uBAAuB;CACnC,IAAI,KAAK;EACP,IAAI,aAAa;EACjB,IAAI,aAAa;CACnB;AACF;AAEA,SAAgB,sBAA6B;CAC3C,MAAM,IAAI,oBAAoB;AAChC"}
@@ -185,6 +185,10 @@ interface Route<TParams extends RouteParams = RouteParams> {
185
185
  handler: RouteHandler<TParams>;
186
186
  namespace?: string;
187
187
  }
188
+ interface RouteRegistry {
189
+ manifest: RouteManifest;
190
+ routes: readonly Route[];
191
+ }
188
192
  interface ResolvedRoute<TParams extends RouteParams = RouteParams> {
189
193
  handler: RouteHandler<TParams>;
190
194
  params: TParams;
@@ -211,5 +215,5 @@ interface RouteSnapshot<TParams extends RouteParams = RouteParams> {
211
215
  matches: readonly RouteMatch<TParams>[];
212
216
  }
213
217
  //#endregion
214
- export { AccessAllowDecision, AccessDecision, AccessDenyDecision, AccessDenyStatus, AccessRedirectDecision, AccessRedirectStatus, GroupHelperOptions, LayoutScopeRecord, PageHelperOptions, PageScopeRecord, ParsedSegment, RegisterRoutesOptions, ResolvedRoute, Route, RouteAuthMode, RouteAuthOptions, RouteAuthResolver, RouteAuthState, RouteComponent, RouteContext, RouteDefinition, RouteHandler, RouteManifest, RouteMatch, RouteMode, RouteOptions, RouteParams, RoutePathParams, RoutePolicy, RouteQuery, RouteRecord, RouteRenderResult, RouteRequestOptions, RouteRequestResult, RouteSnapshot };
218
+ export { AccessAllowDecision, AccessDecision, AccessDenyDecision, AccessDenyStatus, AccessRedirectDecision, AccessRedirectStatus, CommonAccessOptions, GroupHelperOptions, LayoutScopeRecord, PageHelperOptions, PageScopeRecord, ParsedSegment, RegisterRoutesOptions, ResolvedRoute, Route, RouteAuthMode, RouteAuthOptions, RouteAuthResolver, RouteAuthState, RouteComponent, RouteContext, RouteDefinition, RouteHandler, RouteManifest, RouteMatch, RouteMode, RouteOptions, RouteParams, RoutePathParams, RoutePolicy, RouteQuery, RouteRecord, RouteRegistry, RouteRenderResult, RouteRequestOptions, RouteRequestResult, RouteSnapshot };
215
219
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/common/router.ts"],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/common/router.ts"],"mappings":"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"}
@@ -38,5 +38,5 @@ type RenderContext = {
38
38
  seed: number;
39
39
  };
40
40
  //#endregion
41
- export { DocumentRenderArgs, DocumentRenderContext, DocumentRenderer, SSRData };
41
+ export { DocumentRenderArgs, DocumentRenderContext, DocumentRenderRoute, DocumentRenderer, SSRContext, SSRData };
42
42
  //# sourceMappingURL=ssr.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.js","names":[],"sources":["../../src/common/ssr.ts"],"sourcesContent":["/**\n * Common call contracts: SSR types\n */\n\nexport type SSRData = Record<string, unknown>;\n\nexport interface DocumentRenderRoute {\n path: string;\n namespace?: string;\n}\n\nexport interface DocumentRenderContext {\n mode: 'ssr' | 'ssg';\n url: string;\n pathname: string;\n search: string;\n hash: string;\n params: Record<string, string>;\n data?: SSRData;\n seed: number;\n route: DocumentRenderRoute;\n}\n\nexport interface DocumentRenderArgs {\n appHtml: string;\n context: DocumentRenderContext;\n}\n\nexport type DocumentRenderer = (args: DocumentRenderArgs) => string;\n\nexport function renderDocument(\n document: DocumentRenderer,\n args: DocumentRenderArgs,\n apiName: string\n): string {\n const html = document(args);\n\n if (typeof html !== 'string') {\n const isPromiseLike =\n typeof html === 'object' &&\n html !== null &&\n 'then' in html &&\n typeof html.then === 'function';\n const received = isPromiseLike\n ? 'a Promise-like value'\n : html === null\n ? 'null'\n : Array.isArray(html)\n ? 'an array'\n : typeof html;\n\n throw new Error(\n `${apiName} document() must synchronously return a string; received ${received}.`\n );\n }\n\n return html;\n}\n\nexport const SSR_RENDER_DATA_ATTR = 'data-askr-render-data';\n\n/** Full context for sink-based streaming SSR */\nexport type SSRContext = {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n signal?: AbortSignal;\n};\n\n/** Lightweight context for synchronous render passes */\nexport type RenderContext = {\n seed: number;\n};\n"],"mappings":";AA8BA,SAAgB,eACd,UACA,MACA,SACQ;CACR,MAAM,OAAO,SAAS,IAAI;CAE1B,IAAI,OAAO,SAAS,UAAU;EAM5B,MAAM,WAJJ,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAO,KAAK,SAAS,aAEnB,yBACA,SAAS,OACP,SACA,MAAM,QAAQ,IAAI,IAChB,aACA,OAAO;EAEf,MAAM,IAAI,MACR,GAAG,QAAQ,2DAA2D,SAAS,EACjF;CACF;CAEA,OAAO;AACT;AAEA,MAAa,uBAAuB"}
1
+ {"version":3,"file":"ssr.js","names":[],"sources":["../../src/common/ssr.ts"],"sourcesContent":["/**\n * Common call contracts: SSR types\n */\n\nexport type SSRData = Record<string, unknown>;\n\nexport interface DocumentRenderRoute {\n path: string;\n namespace?: string;\n}\n\nexport interface DocumentRenderContext {\n mode: 'ssr' | 'ssg';\n url: string;\n pathname: string;\n search: string;\n hash: string;\n params: Record<string, string>;\n data?: SSRData;\n seed: number;\n route: DocumentRenderRoute;\n}\n\nexport interface DocumentRenderArgs {\n appHtml: string;\n context: DocumentRenderContext;\n}\n\nexport type DocumentRenderer = (args: DocumentRenderArgs) => string;\n\nexport function renderDocument(\n document: DocumentRenderer,\n args: DocumentRenderArgs,\n apiName: string\n): string {\n const html: unknown = document(args);\n\n if (typeof html !== 'string') {\n const isPromiseLike =\n typeof html === 'object' &&\n html !== null &&\n 'then' in html &&\n typeof html.then === 'function';\n const received = isPromiseLike\n ? 'a Promise-like value'\n : html === null\n ? 'null'\n : Array.isArray(html)\n ? 'an array'\n : typeof html;\n\n throw new Error(\n `${apiName} document() must synchronously return a string; received ${received}.`\n );\n }\n\n return html;\n}\n\nexport const SSR_RENDER_DATA_ATTR = 'data-askr-render-data';\n\n/** Full context for sink-based streaming SSR */\nexport type SSRContext = {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n signal?: AbortSignal;\n};\n\n/** Lightweight context for synchronous render passes */\nexport type RenderContext = {\n seed: number;\n};\n"],"mappings":";AA8BA,SAAgB,eACd,UACA,MACA,SACQ;CACR,MAAM,OAAgB,SAAS,IAAI;CAEnC,IAAI,OAAO,SAAS,UAAU;EAM5B,MAAM,WAJJ,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAO,KAAK,SAAS,aAEnB,yBACA,SAAS,OACP,SACA,MAAM,QAAQ,IAAI,IAChB,aACA,OAAO;EAEf,MAAM,IAAI,MACR,GAAG,QAAQ,2DAA2D,SAAS,EACjF;CACF;CAEA,OAAO;AACT;AAEA,MAAa,uBAAuB"}
@@ -1,10 +1,11 @@
1
1
  import { Props } from "./props.js";
2
- import { ForState } from "../runtime/for.js";
2
+ import { JSXElement } from "./jsx.js";
3
+ import { ForState } from "../runtime/for-internal.js";
3
4
  import { ControlBoundaryState } from "../runtime/control.js";
4
5
  //#region src/common/vnode.d.ts
5
6
  declare const __ERROR_BOUNDARY__: unique symbol;
6
7
  interface DOMElement {
7
- type: string | ((props: Props) => any) | symbol;
8
+ type: string | ((props: never) => unknown) | symbol;
8
9
  props?: Props;
9
10
  children?: VNode[];
10
11
  key?: string | number | null;
@@ -13,9 +14,9 @@ interface DOMElement {
13
14
  _forState?: ForState<unknown>;
14
15
  }
15
16
  type VNode = DOMElement | string | number | boolean | null | undefined;
16
- type RenderableChild = VNode | readonly VNode[];
17
+ type RenderableChild = VNode | JSXElement | readonly RenderableChild[];
17
18
  declare const __FOR_BOUNDARY__: symbol;
18
19
  declare function _isDOMElement(node: unknown): node is DOMElement;
19
20
  //#endregion
20
- export { RenderableChild, VNode };
21
+ export { DOMElement, RenderableChild, VNode };
21
22
  //# sourceMappingURL=vnode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vnode.d.ts","names":[],"sources":["../../src/common/vnode.ts"],"mappings":";;;;cAUa,kBAAA;AAAA,UAEI,UAAA;EAKf,IAAA,aAAiB,KAAA,EAAO,KAAA;EACxB,KAAA,GAAQ,KAAA;EACR,QAAA,GAAW,KAAA;EACX,GAAA;EAAA,CACC,MAAA,CAAO,QAAA;EACR,aAAA,GAAgB,oBAAA;EAChB,SAAA,GAAY,QAAA;AAAA;AAAA,KAIF,KAAA,GAAQ,UAAU;AAAA,KAClB,eAAA,GAAkB,KAAA,YAAiB,KAAK;AAAA,cAIvC,gBAAA;AAAA,iBAEG,aAAA,CAAc,IAAA,YAAgB,IAAA,IAAQ,UAAU"}
1
+ {"version":3,"file":"vnode.d.ts","names":[],"sources":["../../src/common/vnode.ts"],"mappings":";;;;;cAWa,kBAAA;AAAA,UAEI,UAAA;EAIf,IAAA,aAAiB,KAAA;EACjB,KAAA,GAAQ,KAAA;EACR,QAAA,GAAW,KAAA;EACX,GAAA;EAAA,CACC,MAAA,CAAO,QAAA;EACR,aAAA,GAAgB,oBAAA;EAChB,SAAA,GAAY,QAAA;AAAA;AAAA,KAIF,KAAA,GAAQ,UAAU;AAAA,KAClB,eAAA,GAAkB,KAAA,GAAQ,UAAA,YAAsB,eAAA;AAAA,cAI/C,gBAAA;AAAA,iBAEG,aAAA,CAAc,IAAA,YAAgB,IAAA,IAAQ,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"vnode.js","names":[],"sources":["../../src/common/vnode.ts"],"sourcesContent":["/**\n * Common call contracts: VNode / virtual DOM shapes\n */\n\nimport type { Props } from './props';\nimport type { ControlBoundaryState } from '../runtime/control';\nimport type { ForState } from '../runtime/for';\nexport { __CONTROL_BOUNDARY__ } from './control';\nimport { __CONTROL_BOUNDARY__ } from './control';\n\nexport const __ERROR_BOUNDARY__ = Symbol.for('askr.error-boundary');\n\nexport interface DOMElement {\n // Element `type` can be an intrinsic tag name, a component function, or\n // a special symbol (e.g. `Fragment`). Include `symbol` in the type union\n // so runtime comparisons against `Fragment` are type-safe.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: string | ((props: Props) => any) | symbol;\n props?: Props;\n children?: VNode[];\n key?: string | number | null;\n [Symbol.iterator]?: never;\n _controlState?: ControlBoundaryState; // Internal: control boundary state\n _forState?: ForState<unknown>; // Deprecated internal alias during migration\n}\n\n// Type for virtual DOM nodes\nexport type VNode = DOMElement | string | number | boolean | null | undefined;\nexport type RenderableChild = VNode | readonly VNode[];\n\n// Backward-compatible internal alias while renderer/runtime migrates away from\n// the old For-only boundary naming.\nexport const __FOR_BOUNDARY__ = __CONTROL_BOUNDARY__;\n\nexport function _isDOMElement(node: unknown): node is DOMElement {\n return typeof node === 'object' && node !== null && 'type' in node;\n}\n"],"mappings":";;AAUA,MAAa,qBAAqB,OAAO,IAAI,qBAAqB;AAsBlE,MAAa,mBAAmB;AAEhC,SAAgB,cAAc,MAAmC;CAC/D,OAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU;AAChE"}
1
+ {"version":3,"file":"vnode.js","names":[],"sources":["../../src/common/vnode.ts"],"sourcesContent":["/**\n * Common call contracts: VNode / virtual DOM shapes\n */\n\nimport type { Props } from './props';\nimport type { JSXElement } from './jsx';\nimport type { ControlBoundaryState } from '../runtime/control';\nimport type { ForState } from '../runtime/for';\nexport { __CONTROL_BOUNDARY__ } from './control';\nimport { __CONTROL_BOUNDARY__ } from './control';\n\nexport const __ERROR_BOUNDARY__ = Symbol.for('askr.error-boundary');\n\nexport interface DOMElement {\n // Element `type` can be an intrinsic tag name, a component function, or\n // a special symbol (e.g. `Fragment`). Include `symbol` in the type union\n // so runtime comparisons against `Fragment` are type-safe.\n type: string | ((props: never) => unknown) | symbol;\n props?: Props;\n children?: VNode[];\n key?: string | number | null;\n [Symbol.iterator]?: never;\n _controlState?: ControlBoundaryState; // Internal: control boundary state\n _forState?: ForState<unknown>; // Deprecated internal alias during migration\n}\n\n// Type for virtual DOM nodes\nexport type VNode = DOMElement | string | number | boolean | null | undefined;\nexport type RenderableChild = VNode | JSXElement | readonly RenderableChild[];\n\n// Backward-compatible internal alias while renderer/runtime migrates away from\n// the old For-only boundary naming.\nexport const __FOR_BOUNDARY__ = __CONTROL_BOUNDARY__;\n\nexport function _isDOMElement(node: unknown): node is DOMElement {\n return typeof node === 'object' && node !== null && 'type' in node;\n}\n"],"mappings":";;AAWA,MAAa,qBAAqB,OAAO,IAAI,qBAAqB;AAqBlE,MAAa,mBAAmB;AAEhC,SAAgB,cAAc,MAAmC;CAC/D,OAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU;AAChE"}
@@ -1,6 +1,6 @@
1
1
  import { Props } from "../common/props.js";
2
2
  import { JSXElement } from "../common/jsx.js";
3
- import { ComponentInstance } from "../runtime/component.js";
3
+ import { ComponentInstance } from "../runtime/component-internal.js";
4
4
  import { VNode } from "../common/vnode.js";
5
5
 
6
6
  //#region src/components/error-boundary.d.ts
@@ -2,7 +2,8 @@ import { __ERROR_BOUNDARY__ } from "../common/vnode.js";
2
2
  import { isDevelopmentEnvironment } from "../common/env.js";
3
3
  import { logger } from "../dev/logger.js";
4
4
  import { ELEMENT_TYPE } from "../common/jsx.js";
5
- import { getCurrentComponentInstance } from "../runtime/component.js";
5
+ import { getCurrentComponentInstance } from "../runtime/component-scope.js";
6
+ import "../runtime/component.js";
6
7
  //#region src/components/error-boundary.tsx
7
8
  function getBoundaryMessage(error) {
8
9
  if (error instanceof Error) return error.message || error.name || "Unknown error";
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary.js","names":[],"sources":["../../src/components/error-boundary.tsx"],"sourcesContent":["import type { Props } from '../common/props';\nimport { ELEMENT_TYPE, type JSXElement } from '../common/jsx';\nimport type { VNode } from '../common/vnode';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport {\n getCurrentComponentInstance,\n type ComponentInstance,\n} from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { isDevelopmentEnvironment } from '../common/env';\n\ntype ErrorBoundaryContent = VNode | readonly VNode[];\ntype ErrorBoundaryFallbackValue = ErrorBoundaryContent | Node;\n\nexport type ErrorBoundaryFallbackRender = (\n error: unknown,\n reset: () => void\n) => ErrorBoundaryFallbackValue;\n\nexport interface ErrorBoundaryProps extends Props {\n children?: ErrorBoundaryContent;\n fallback?: ErrorBoundaryFallbackValue | ErrorBoundaryFallbackRender;\n onError?: (error: unknown) => void;\n resetKey?: unknown;\n}\n\ntype ErrorBoundaryState = NonNullable<ComponentInstance['errorBoundaryState']>;\n\ntype ErrorBoundaryVNode = JSXElement & {\n __instance?: ComponentInstance;\n};\n\nfunction getBoundaryMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message || error.name || 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction ensureBoundaryState(\n instance: ComponentInstance,\n resetKey: unknown\n): ErrorBoundaryState {\n const boundaryState =\n instance.errorBoundaryState ??\n (instance.errorBoundaryState = {\n error: null,\n resetKey,\n notified: false,\n });\n\n if (!Object.is(boundaryState.resetKey, resetKey)) {\n boundaryState.error = null;\n boundaryState.resetKey = resetKey;\n boundaryState.notified = false;\n }\n\n return boundaryState;\n}\n\nfunction createBoundaryVNode(\n instance: ComponentInstance,\n props: ErrorBoundaryProps\n): ErrorBoundaryVNode {\n const key =\n typeof props.key === 'symbol'\n ? null\n : ((props.key ?? null) as string | number | null);\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: __ERROR_BOUNDARY__,\n props: {\n children: props.children,\n fallback: props.fallback,\n onError: props.onError,\n resetKey: props.resetKey,\n },\n key,\n __instance: instance,\n };\n}\n\nexport function ErrorBoundary(props: ErrorBoundaryProps): JSXElement {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n '[Askr] ErrorBoundary() can only be used during component render execution.'\n );\n }\n\n ensureBoundaryState(instance, props.resetKey);\n return createBoundaryVNode(instance, props);\n}\n\nexport function isErrorBoundaryVNode(\n value: unknown\n): value is ErrorBoundaryVNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ErrorBoundaryVNode).type === __ERROR_BOUNDARY__\n );\n}\n\nexport function resolveErrorBoundaryState(\n vnode: ErrorBoundaryVNode\n): ErrorBoundaryState | null {\n return vnode.__instance?.errorBoundaryState ?? null;\n}\n\nexport function resolveErrorBoundaryFallback(\n fallback: ErrorBoundaryProps['fallback'],\n error: unknown,\n reset: () => void\n): ErrorBoundaryFallbackValue {\n if (typeof fallback === 'function') {\n return fallback(error, reset);\n }\n\n if (fallback !== undefined) {\n return fallback;\n }\n\n const message = getBoundaryMessage(error);\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'alert');\n wrapper.setAttribute('data-askr-error-boundary', 'true');\n wrapper.style.boxSizing = 'border-box';\n wrapper.style.padding = '1rem';\n wrapper.style.border = '1px solid currentColor';\n wrapper.style.borderRadius = '0.75rem';\n wrapper.style.display = 'grid';\n wrapper.style.gap = '0.75rem';\n wrapper.style.maxWidth = '100%';\n\n const title = document.createElement('strong');\n title.textContent = 'Something went wrong while rendering this view.';\n\n const summary = document.createElement('p');\n summary.textContent =\n 'The app recovered into a visible fallback so the error is not hidden in the console.';\n summary.style.margin = '0';\n\n const details = document.createElement('details');\n details.open = isDevelopmentEnvironment();\n\n const detailsSummary = document.createElement('summary');\n detailsSummary.textContent = 'Error details';\n\n const pre = document.createElement('pre');\n pre.textContent = message;\n pre.style.margin = '0';\n pre.style.whiteSpace = 'pre-wrap';\n pre.style.wordBreak = 'break-word';\n\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = 'Try again';\n button.addEventListener('click', () => reset());\n\n details.append(detailsSummary, pre);\n wrapper.append(title, summary, details, button);\n return wrapper;\n}\n\nexport function createBoundaryReset(instance: ComponentInstance): () => void {\n return () => {\n const boundaryState = instance.errorBoundaryState;\n if (!boundaryState) {\n return;\n }\n boundaryState.error = null;\n boundaryState.notified = false;\n queueMicrotask(() => {\n instance._enqueueRun?.();\n });\n };\n}\n\nexport function reportBoundaryError(\n instance: ComponentInstance,\n error: unknown,\n onError?: (error: unknown) => void\n): void {\n const boundaryState = instance.errorBoundaryState;\n if (\n boundaryState &&\n Object.is(boundaryState.error, error) &&\n boundaryState.notified\n ) {\n return;\n }\n\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n\n try {\n onError?.(error);\n } catch (hookError) {\n logger.error('[Askr] ErrorBoundary onError handler threw:', hookError);\n }\n\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"error-boundary.js","names":[],"sources":["../../src/components/error-boundary.tsx"],"sourcesContent":["import type { Props } from '../common/props';\nimport { ELEMENT_TYPE, type JSXElement } from '../common/jsx';\nimport type { VNode } from '../common/vnode';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport {\n getCurrentComponentInstance,\n type ComponentInstance,\n} from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { isDevelopmentEnvironment } from '../common/env';\n\ntype ErrorBoundaryContent = VNode | readonly VNode[];\ntype ErrorBoundaryFallbackValue = ErrorBoundaryContent | Node;\n\nexport type ErrorBoundaryFallbackRender = (\n error: unknown,\n reset: () => void\n) => ErrorBoundaryFallbackValue;\n\nexport interface ErrorBoundaryProps extends Props {\n children?: ErrorBoundaryContent;\n fallback?: ErrorBoundaryFallbackValue | ErrorBoundaryFallbackRender;\n onError?: (error: unknown) => void;\n resetKey?: unknown;\n}\n\ntype ErrorBoundaryState = NonNullable<ComponentInstance['errorBoundaryState']>;\n\ntype ErrorBoundaryVNode = JSXElement & {\n __instance?: ComponentInstance;\n};\n\nfunction getBoundaryMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message || error.name || 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction ensureBoundaryState(\n instance: ComponentInstance,\n resetKey: unknown\n): ErrorBoundaryState {\n const boundaryState =\n instance.errorBoundaryState ??\n (instance.errorBoundaryState = {\n error: null,\n resetKey,\n notified: false,\n });\n\n if (!Object.is(boundaryState.resetKey, resetKey)) {\n boundaryState.error = null;\n boundaryState.resetKey = resetKey;\n boundaryState.notified = false;\n }\n\n return boundaryState;\n}\n\nfunction createBoundaryVNode(\n instance: ComponentInstance,\n props: ErrorBoundaryProps\n): ErrorBoundaryVNode {\n const key =\n typeof props.key === 'symbol'\n ? null\n : ((props.key ?? null) as string | number | null);\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: __ERROR_BOUNDARY__,\n props: {\n children: props.children,\n fallback: props.fallback,\n onError: props.onError,\n resetKey: props.resetKey,\n },\n key,\n __instance: instance,\n };\n}\n\nexport function ErrorBoundary(props: ErrorBoundaryProps): JSXElement {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n '[Askr] ErrorBoundary() can only be used during component render execution.'\n );\n }\n\n ensureBoundaryState(instance, props.resetKey);\n return createBoundaryVNode(instance, props);\n}\n\nexport function isErrorBoundaryVNode(\n value: unknown\n): value is ErrorBoundaryVNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ErrorBoundaryVNode).type === __ERROR_BOUNDARY__\n );\n}\n\nexport function resolveErrorBoundaryState(\n vnode: ErrorBoundaryVNode\n): ErrorBoundaryState | null {\n return vnode.__instance?.errorBoundaryState ?? null;\n}\n\nexport function resolveErrorBoundaryFallback(\n fallback: ErrorBoundaryProps['fallback'],\n error: unknown,\n reset: () => void\n): ErrorBoundaryFallbackValue {\n if (typeof fallback === 'function') {\n return fallback(error, reset);\n }\n\n if (fallback !== undefined) {\n return fallback;\n }\n\n const message = getBoundaryMessage(error);\n const wrapper = document.createElement('div');\n wrapper.setAttribute('role', 'alert');\n wrapper.setAttribute('data-askr-error-boundary', 'true');\n wrapper.style.boxSizing = 'border-box';\n wrapper.style.padding = '1rem';\n wrapper.style.border = '1px solid currentColor';\n wrapper.style.borderRadius = '0.75rem';\n wrapper.style.display = 'grid';\n wrapper.style.gap = '0.75rem';\n wrapper.style.maxWidth = '100%';\n\n const title = document.createElement('strong');\n title.textContent = 'Something went wrong while rendering this view.';\n\n const summary = document.createElement('p');\n summary.textContent =\n 'The app recovered into a visible fallback so the error is not hidden in the console.';\n summary.style.margin = '0';\n\n const details = document.createElement('details');\n details.open = isDevelopmentEnvironment();\n\n const detailsSummary = document.createElement('summary');\n detailsSummary.textContent = 'Error details';\n\n const pre = document.createElement('pre');\n pre.textContent = message;\n pre.style.margin = '0';\n pre.style.whiteSpace = 'pre-wrap';\n pre.style.wordBreak = 'break-word';\n\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = 'Try again';\n button.addEventListener('click', () => reset());\n\n details.append(detailsSummary, pre);\n wrapper.append(title, summary, details, button);\n return wrapper;\n}\n\nexport function createBoundaryReset(instance: ComponentInstance): () => void {\n return () => {\n const boundaryState = instance.errorBoundaryState;\n if (!boundaryState) {\n return;\n }\n boundaryState.error = null;\n boundaryState.notified = false;\n queueMicrotask(() => {\n instance._enqueueRun?.();\n });\n };\n}\n\nexport function reportBoundaryError(\n instance: ComponentInstance,\n error: unknown,\n onError?: (error: unknown) => void\n): void {\n const boundaryState = instance.errorBoundaryState;\n if (\n boundaryState &&\n Object.is(boundaryState.error, error) &&\n boundaryState.notified\n ) {\n return;\n }\n\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n\n try {\n onError?.(error);\n } catch (hookError) {\n logger.error('[Askr] ErrorBoundary onError handler threw:', hookError);\n }\n\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","names":[],"sources":["../../src/components/link.tsx"],"sourcesContent":["/**\n * Link component for client-side navigation\n */\n\nimport '../jsx/types';\nimport type { JSXElement } from '../common/jsx';\nimport type { Props } from '../common/props';\nimport type { RenderableChild } from '../common/vnode';\nimport { navigate } from '../router/navigate';\nimport { applyInteractionPolicy } from '../foundations/interactions/interaction-policy';\nimport { mergeProps } from '../foundations/utilities/merge-props';\n\nexport type LinkProps = Omit<\n Props,\n | 'children'\n | 'href'\n | 'class'\n | 'rel'\n | 'target'\n | 'aria-current'\n | 'aria-label'\n> & {\n href: string;\n class?: string;\n children?: RenderableChild;\n /**\n * Optional rel attribute for link relationships.\n * Common values: \"noopener\", \"noreferrer\", \"nofollow\"\n */\n rel?: string;\n /**\n * Optional target attribute.\n * Use \"_blank\" for new tab/window.\n */\n target?: string;\n /**\n * Optional aria-current attribute for indicating current page/location.\n * Use \"page\" for the current page in navigation.\n */\n 'aria-current'?:\n | 'page'\n | 'step'\n | 'location'\n | 'date'\n | 'time'\n | 'true'\n | 'false';\n /**\n * Optional aria-label for accessibility when link text isn't descriptive enough.\n */\n 'aria-label'?: string;\n};\n\nfunction isSameOriginNavigableHref(href: string): boolean {\n if (typeof window === 'undefined') {\n return true;\n }\n\n try {\n const target = new URL(href, window.location.href);\n return (\n target.origin === window.location.origin &&\n (target.protocol === 'http:' || target.protocol === 'https:')\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Link component that prevents default navigation and uses navigate()\n * Provides declarative way to navigate between routes\n *\n * Accessibility features:\n * - Proper semantic <a> element (not a button)\n * - Supports aria-current for indicating active page\n * - Supports aria-label for descriptive labels\n * - Keyboard accessible (Enter key handled by native <a> element)\n *\n * Respects native browser behaviors:\n * - Middle-click (opens in new tab)\n * - Ctrl/Cmd+click (opens in new tab)\n * - Shift+click (opens in new window)\n * - Alt+click (downloads link)\n * - Right-click context menu\n *\n * Best practices:\n * - Use target=\"_blank\" with rel=\"noopener noreferrer\" for external links\n * - Use aria-current=\"page\" for the current page in navigation\n * - Provide descriptive link text or aria-label\n *\n * Uses applyInteractionPolicy to enforce pit-of-success principles:\n * - Interaction behavior centralized in foundations\n * - Keyboard handling automatic\n * - Composable via mergeProps\n */\nexport function Link({\n href,\n class: className,\n children,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n ...rest\n}: LinkProps): JSXElement {\n const interaction = applyInteractionPolicy({\n isNative: true,\n disabled: false,\n onPress: (e: Event) => {\n const event = e as MouseEvent;\n\n // Only intercept left-click without modifiers\n // Default button to 0 if undefined (for mock events in tests)\n const button = event.button ?? 0;\n if (\n button !== 0 || // not left-click\n event.ctrlKey || // Ctrl/Cmd+click\n event.metaKey || // Cmd on Mac\n event.shiftKey || // Shift+click\n event.altKey // Alt+click\n ) {\n return; // Let browser handle it (new tab, etc.)\n }\n\n // Don't intercept external links or explicit target.\n if (target || !isSameOriginNavigableHref(href)) {\n return; // Let browser handle it\n }\n\n event.preventDefault();\n navigate(href);\n },\n });\n\n const props = mergeProps(rest, {\n ...interaction,\n href,\n class: className,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n });\n\n return <a {...props}>{children}</a>;\n}\n"],"mappings":";;;;;;;;;;AAqDA,SAAS,0BAA0B,MAAuB;CACxD,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,IAAI;EACF,MAAM,SAAS,IAAI,IAAI,MAAM,OAAO,SAAS,IAAI;EACjD,OACE,OAAO,WAAW,OAAO,SAAS,WACjC,OAAO,aAAa,WAAW,OAAO,aAAa;CAExD,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,KAAK,EACnB,MACA,OAAO,WACP,UACA,KACA,QACA,gBAAgB,aAChB,cAAc,WACd,GAAG,QACqB;CAwCxB,OAAO,oBAAC,KAAD;EAAG,GAVI,WAAW,MAAM;GAC7B,GA9BkB,uBAAuB;IACzC,UAAU;IACV,UAAU;IACV,UAAU,MAAa;KACrB,MAAM,QAAQ;KAKd,KADe,MAAM,UAAU,OAElB,KACX,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,QAEN;KAIF,IAAI,UAAU,CAAC,0BAA0B,IAAI,GAC3C;KAGF,MAAM,eAAe;KACrB,SAAS,IAAI;IACf;GACF,CAGK;GACH;GACA,OAAO;GACP;GACA;GACA,gBAAgB;GAChB,cAAc;EAChB,CAEc;EAAQ;CAAY,CAAA;AACpC"}
1
+ {"version":3,"file":"link.js","names":[],"sources":["../../src/components/link.tsx"],"sourcesContent":["/**\n * Link component for client-side navigation\n */\n\nimport '../jsx/types';\nimport type { JSXElement } from '../common/jsx';\nimport type { AnchorIntrinsicProps, Props } from '../common/props';\nimport type { RenderableChild } from '../common/vnode';\nimport { navigate } from '../router/navigate';\nimport { applyInteractionPolicy } from '../foundations/interactions/interaction-policy';\nimport { mergeProps } from '../foundations/utilities/merge-props';\n\nexport type LinkProps = Omit<\n Props,\n | 'children'\n | 'href'\n | 'class'\n | 'rel'\n | 'target'\n | 'aria-current'\n | 'aria-label'\n> & {\n href: string;\n class?: string;\n children?: RenderableChild;\n /**\n * Optional rel attribute for link relationships.\n * Common values: \"noopener\", \"noreferrer\", \"nofollow\"\n */\n rel?: string;\n /**\n * Optional target attribute.\n * Use \"_blank\" for new tab/window.\n */\n target?: string;\n /**\n * Optional aria-current attribute for indicating current page/location.\n * Use \"page\" for the current page in navigation.\n */\n 'aria-current'?:\n | 'page'\n | 'step'\n | 'location'\n | 'date'\n | 'time'\n | 'true'\n | 'false';\n /**\n * Optional aria-label for accessibility when link text isn't descriptive enough.\n */\n 'aria-label'?: string;\n};\n\nfunction isSameOriginNavigableHref(href: string): boolean {\n if (typeof window === 'undefined') {\n return true;\n }\n\n try {\n const target = new URL(href, window.location.href);\n return (\n target.origin === window.location.origin &&\n (target.protocol === 'http:' || target.protocol === 'https:')\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Link component that prevents default navigation and uses navigate()\n * Provides declarative way to navigate between routes\n *\n * Accessibility features:\n * - Proper semantic <a> element (not a button)\n * - Supports aria-current for indicating active page\n * - Supports aria-label for descriptive labels\n * - Keyboard accessible (Enter key handled by native <a> element)\n *\n * Respects native browser behaviors:\n * - Middle-click (opens in new tab)\n * - Ctrl/Cmd+click (opens in new tab)\n * - Shift+click (opens in new window)\n * - Alt+click (downloads link)\n * - Right-click context menu\n *\n * Best practices:\n * - Use target=\"_blank\" with rel=\"noopener noreferrer\" for external links\n * - Use aria-current=\"page\" for the current page in navigation\n * - Provide descriptive link text or aria-label\n *\n * Uses applyInteractionPolicy to enforce pit-of-success principles:\n * - Interaction behavior centralized in foundations\n * - Keyboard handling automatic\n * - Composable via mergeProps\n */\nexport function Link({\n href,\n class: className,\n children,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n ...rest\n}: LinkProps): JSXElement {\n const interaction = applyInteractionPolicy({\n isNative: true,\n disabled: false,\n onPress: (e: Event) => {\n const event = e as MouseEvent;\n\n // Only intercept left-click without modifiers\n // Default button to 0 if undefined (for mock events in tests)\n const button = event.button ?? 0;\n if (\n button !== 0 || // not left-click\n event.ctrlKey || // Ctrl/Cmd+click\n event.metaKey || // Cmd on Mac\n event.shiftKey || // Shift+click\n event.altKey // Alt+click\n ) {\n return; // Let browser handle it (new tab, etc.)\n }\n\n // Don't intercept external links or explicit target.\n if (target || !isSameOriginNavigableHref(href)) {\n return; // Let browser handle it\n }\n\n event.preventDefault();\n navigate(href);\n },\n });\n\n const props = mergeProps(rest, {\n ...interaction,\n href,\n class: className,\n rel,\n target,\n 'aria-current': ariaCurrent,\n 'aria-label': ariaLabel,\n });\n\n return <a {...(props as AnchorIntrinsicProps)}>{children}</a>;\n}\n"],"mappings":";;;;;;;;;;AAqDA,SAAS,0BAA0B,MAAuB;CACxD,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,IAAI;EACF,MAAM,SAAS,IAAI,IAAI,MAAM,OAAO,SAAS,IAAI;EACjD,OACE,OAAO,WAAW,OAAO,SAAS,WACjC,OAAO,aAAa,WAAW,OAAO,aAAa;CAExD,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,KAAK,EACnB,MACA,OAAO,WACP,UACA,KACA,QACA,gBAAgB,aAChB,cAAc,WACd,GAAG,QACqB;CAwCxB,OAAO,oBAAC,KAAD;EAAG,GAVI,WAAW,MAAM;GAC7B,GA9BkB,uBAAuB;IACzC,UAAU;IACV,UAAU;IACV,UAAU,MAAa;KACrB,MAAM,QAAQ;KAKd,KADe,MAAM,UAAU,OAElB,KACX,MAAM,WACN,MAAM,WACN,MAAM,YACN,MAAM,QAEN;KAIF,IAAI,UAAU,CAAC,0BAA0B,IAAI,GAC3C;KAGF,MAAM,eAAe;KACrB,SAAS,IAAI;IACf;GACF,CAGK;GACH;GACA,OAAO;GACP;GACA;GACA,gBAAgB;GAChB,cAAc;EAChB,CAEe;EAAiC;CAAY,CAAA;AAC9D"}
@@ -1,5 +1,6 @@
1
1
  import { __CONTROL_BOUNDARY__, markEagerControlPrimitive } from "../common/control.js";
2
- import { useForState } from "../runtime/for.js";
2
+ import { useForState } from "../runtime/for-internal.js";
3
+ import "../runtime/for.js";
3
4
  import { createFineGrainedEffect } from "../runtime/effect.js";
4
5
  import { normalizeBoundaryChild } from "./shared.js";
5
6
  //#region src/control/for.ts
@@ -1 +1 @@
1
- {"version":3,"file":"for.js","names":[],"sources":["../../src/control/for.ts"],"sourcesContent":["/**\n * For JSX primitive\n *\n * Creates a keyed child-scope boundary for efficient list rendering.\n */\n\nimport {\n __CONTROL_BOUNDARY__,\n markEagerControlPrimitive,\n} from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { DOMElement, VNode } from '../common/vnode';\nimport { createFineGrainedEffect } from '../runtime/effect';\nimport { type ForState, useForState } from '../runtime/for';\nimport { type BoundaryChild, normalizeBoundaryChild } from './shared';\n\nexport type ForEachSource<T> = T[] | (() => T[]);\n\ntype ForBaseProps<T> = {\n each: ForEachSource<T>;\n fallback?: BoundaryChild;\n children: (item: T, index: () => number) => VNode;\n};\n\ntype KeyedForProps<T, K extends string | number> = ForBaseProps<T> & {\n by: (item: T, index: number) => K;\n byIndex?: never;\n};\n\ntype IndexedForProps<T> = ForBaseProps<T> & {\n by?: never;\n byIndex: true;\n};\n\nexport type ForProps<T, K extends string | number = string | number> =\n | KeyedForProps<T, K>\n | IndexedForProps<T>;\n\nfunction resolveEach<T>(each: ForEachSource<T>): T[] {\n const resolved = typeof each === 'function' ? each() : each;\n if (!Array.isArray(resolved)) {\n throw new Error('For each must resolve to an array.');\n }\n return resolved;\n}\n\nfunction resolveKeyFn<T>(\n props: ForProps<T>\n): (item: T, index: number) => string | number {\n if ('by' in props && typeof props.by === 'function') {\n return props.by;\n }\n if ('byIndex' in props && props.byIndex === true) {\n return (_item, index) => index;\n }\n throw new Error(\n '[askr] <For> requires a stable `by` key function. Use `byIndex` only as an explicit positional escape hatch.'\n );\n}\n\nfunction createForBoundary<T>(props: ForProps<T>): DOMElement {\n if ('by' in props && typeof props.by === 'function' && 'byIndex' in props) {\n throw new Error('[askr] <For> accepts either `by` or `byIndex`, not both.');\n }\n\n const byFn = resolveKeyFn(props);\n const fallback = normalizeBoundaryChild(props.fallback);\n const forState = useForState(props.each, byFn, props.children, fallback);\n\n const computeItems = () => resolveEach(forState.eachSource);\n if (!forState._sourceEffect) {\n forState._suspendSourceCommit = true;\n forState._sourceEffect = createFineGrainedEffect({\n lane: 'reactive',\n compute: computeItems,\n commit: (items) => {\n forState.currentItems = items;\n\n if (forState._suspendSourceCommit) {\n return;\n }\n\n forState._needsSourceReconcile = true;\n\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n },\n });\n forState._suspendSourceCommit = false;\n } else {\n forState._suspendSourceCommit = true;\n forState._sourceEffect.updateCompute(computeItems);\n forState._suspendSourceCommit = false;\n }\n\n return {\n type: __CONTROL_BOUNDARY__,\n _controlState: forState as unknown as ForState<unknown>,\n _forState: forState as unknown as ForState<unknown>,\n };\n}\n\nfunction ForPrimitive<T>(props: ForProps<T>): JSXElement {\n return createForBoundary(props) as unknown as JSXElement;\n}\n\nexport const For = markEagerControlPrimitive(\n ForPrimitive as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n ) => JSXElement\n) as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n) => JSXElement;\n"],"mappings":";;;;;;;;;;AAsCA,SAAS,YAAe,MAA6B;CACnD,MAAM,WAAW,OAAO,SAAS,aAAa,KAAK,IAAI;CACvD,IAAI,CAAC,MAAM,QAAQ,QAAQ,GACzB,MAAM,IAAI,MAAM,oCAAoC;CAEtD,OAAO;AACT;AAEA,SAAS,aACP,OAC6C;CAC7C,IAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,YACvC,OAAO,MAAM;CAEf,IAAI,aAAa,SAAS,MAAM,YAAY,MAC1C,QAAQ,OAAO,UAAU;CAE3B,MAAM,IAAI,MACR,8GACF;AACF;AAEA,SAAS,kBAAqB,OAAgC;CAC5D,IAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,cAAc,aAAa,OAClE,MAAM,IAAI,MAAM,0DAA0D;CAG5E,MAAM,OAAO,aAAa,KAAK;CAC/B,MAAM,WAAW,uBAAuB,MAAM,QAAQ;CACtD,MAAM,WAAW,YAAY,MAAM,MAAM,MAAM,MAAM,UAAU,QAAQ;CAEvE,MAAM,qBAAqB,YAAY,SAAS,UAAU;CAC1D,IAAI,CAAC,SAAS,eAAe;EAC3B,SAAS,uBAAuB;EAChC,SAAS,gBAAgB,wBAAwB;GAC/C,MAAM;GACN,SAAS;GACT,SAAS,UAAU;IACjB,SAAS,eAAe;IAExB,IAAI,SAAS,sBACX;IAGF,SAAS,wBAAwB;IAEjC,IAAI,SAAS,wBAAwB;KACnC,SAAS,uBAAuB;KAChC;IACF;IAEA,SAAS,gBAAgB,cAAc;GACzC;EACF,CAAC;EACD,SAAS,uBAAuB;CAClC,OAAO;EACL,SAAS,uBAAuB;EAChC,SAAS,cAAc,cAAc,YAAY;EACjD,SAAS,uBAAuB;CAClC;CAEA,OAAO;EACL,MAAM;EACN,eAAe;EACf,WAAW;CACb;AACF;AAEA,SAAS,aAAgB,OAAgC;CACvD,OAAO,kBAAkB,KAAK;AAChC;AAEA,MAAa,MAAM,0BACjB,YAGF"}
1
+ {"version":3,"file":"for.js","names":[],"sources":["../../src/control/for.ts"],"sourcesContent":["/**\n * For JSX primitive\n *\n * Creates a keyed child-scope boundary for efficient list rendering.\n */\n\nimport {\n __CONTROL_BOUNDARY__,\n markEagerControlPrimitive,\n} from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { DOMElement, VNode } from '../common/vnode';\nimport { createFineGrainedEffect } from '../runtime/effect';\nimport { type ForState, useForState } from '../runtime/for';\nimport { type BoundaryChild, normalizeBoundaryChild } from './shared';\n\nexport type ForEachSource<T> = T[] | (() => T[]);\n\ntype ForBaseProps<T> = {\n each: ForEachSource<T>;\n fallback?: BoundaryChild;\n children: (item: T, index: () => number) => VNode;\n};\n\ntype KeyedForProps<T, K extends string | number> = ForBaseProps<T> & {\n by: (item: T, index: number) => K;\n byIndex?: never;\n};\n\ntype IndexedForProps<T> = ForBaseProps<T> & {\n by?: never;\n byIndex: true;\n};\n\nexport type ForProps<T, K extends string | number = string | number> =\n | KeyedForProps<T, K>\n | IndexedForProps<T>;\n\nfunction resolveEach<T>(each: ForEachSource<T>): T[] {\n const resolved = typeof each === 'function' ? each() : each;\n if (!Array.isArray(resolved)) {\n throw new Error('For each must resolve to an array.');\n }\n return resolved;\n}\n\nfunction resolveKeyFn<T>(\n props: ForProps<T>\n): (item: T, index: number) => string | number {\n if ('by' in props && typeof props.by === 'function') {\n return props.by;\n }\n if ('byIndex' in props && props.byIndex === true) {\n return (_item, index) => index;\n }\n throw new Error(\n '[askr] <For> requires a stable `by` key function. Use `byIndex` only as an explicit positional escape hatch.'\n );\n}\n\nfunction createForBoundary<T>(props: ForProps<T>): DOMElement {\n if ('by' in props && typeof props.by === 'function' && 'byIndex' in props) {\n throw new Error('[askr] <For> accepts either `by` or `byIndex`, not both.');\n }\n\n const byFn = resolveKeyFn(props);\n const fallback = normalizeBoundaryChild(props.fallback);\n const forState = useForState(props.each, byFn, props.children, fallback);\n\n const computeItems = () => resolveEach(forState.eachSource);\n if (!forState._sourceEffect) {\n forState._suspendSourceCommit = true;\n forState._sourceEffect = createFineGrainedEffect({\n lane: 'reactive',\n compute: computeItems,\n commit: (items) => {\n forState.currentItems = items;\n\n if (forState._suspendSourceCommit) {\n return;\n }\n\n forState._needsSourceReconcile = true;\n\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n },\n });\n forState._suspendSourceCommit = false;\n } else {\n forState._suspendSourceCommit = true;\n forState._sourceEffect.updateCompute(computeItems);\n forState._suspendSourceCommit = false;\n }\n\n return {\n type: __CONTROL_BOUNDARY__,\n _controlState: forState as unknown as ForState<unknown>,\n _forState: forState as unknown as ForState<unknown>,\n };\n}\n\nfunction ForPrimitive<T>(props: ForProps<T>): JSXElement {\n return createForBoundary(props) as unknown as JSXElement;\n}\n\nexport const For = markEagerControlPrimitive(\n ForPrimitive as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n ) => JSXElement\n) as <T, K extends string | number = string | number>(\n props: ForProps<T, K>\n) => JSXElement;\n"],"mappings":";;;;;;;;;;;AAsCA,SAAS,YAAe,MAA6B;CACnD,MAAM,WAAW,OAAO,SAAS,aAAa,KAAK,IAAI;CACvD,IAAI,CAAC,MAAM,QAAQ,QAAQ,GACzB,MAAM,IAAI,MAAM,oCAAoC;CAEtD,OAAO;AACT;AAEA,SAAS,aACP,OAC6C;CAC7C,IAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,YACvC,OAAO,MAAM;CAEf,IAAI,aAAa,SAAS,MAAM,YAAY,MAC1C,QAAQ,OAAO,UAAU;CAE3B,MAAM,IAAI,MACR,8GACF;AACF;AAEA,SAAS,kBAAqB,OAAgC;CAC5D,IAAI,QAAQ,SAAS,OAAO,MAAM,OAAO,cAAc,aAAa,OAClE,MAAM,IAAI,MAAM,0DAA0D;CAG5E,MAAM,OAAO,aAAa,KAAK;CAC/B,MAAM,WAAW,uBAAuB,MAAM,QAAQ;CACtD,MAAM,WAAW,YAAY,MAAM,MAAM,MAAM,MAAM,UAAU,QAAQ;CAEvE,MAAM,qBAAqB,YAAY,SAAS,UAAU;CAC1D,IAAI,CAAC,SAAS,eAAe;EAC3B,SAAS,uBAAuB;EAChC,SAAS,gBAAgB,wBAAwB;GAC/C,MAAM;GACN,SAAS;GACT,SAAS,UAAU;IACjB,SAAS,eAAe;IAExB,IAAI,SAAS,sBACX;IAGF,SAAS,wBAAwB;IAEjC,IAAI,SAAS,wBAAwB;KACnC,SAAS,uBAAuB;KAChC;IACF;IAEA,SAAS,gBAAgB,cAAc;GACzC;EACF,CAAC;EACD,SAAS,uBAAuB;CAClC,OAAO;EACL,SAAS,uBAAuB;EAChC,SAAS,cAAc,cAAc,YAAY;EACjD,SAAS,uBAAuB;CAClC;CAEA,OAAO;EACL,MAAM;EACN,eAAe;EACf,WAAW;CACb;AACF;AAEA,SAAS,aAAgB,OAAgC;CACvD,OAAO,kBAAkB,KAAK;AAChC;AAEA,MAAa,MAAM,0BACjB,YAGF"}
@@ -0,0 +1,28 @@
1
+ import { ComponentInstance } from "../runtime/component-internal.js";
2
+ import { DataRuntime, DataRuntimeOptions } from "./types.js";
3
+ import { MutationCell } from "./mutation-cell.js";
4
+ import { QueryCell } from "./query-cell.js";
5
+
6
+ //#region src/data/data-runtime.d.ts
7
+ type QuerySlot = {
8
+ key: string;
9
+ cell: QueryCell<unknown>;
10
+ };
11
+ type DataRuntimeState = {
12
+ queryCache: Map<string, QueryCell<unknown>>;
13
+ querySlotsByInstance: WeakMap<ComponentInstance, Map<number, QuerySlot>>;
14
+ mutationSlotsByInstance: WeakMap<ComponentInstance, Map<number, MutationCell<unknown, unknown>>>;
15
+ queryCleanupRegistered: WeakSet<ComponentInstance>;
16
+ mutationCleanupRegistered: WeakSet<ComponentInstance>;
17
+ };
18
+ declare function createDataRuntime(options?: DataRuntimeOptions): DataRuntime;
19
+ declare function getDefaultDataRuntime(): DataRuntime;
20
+ declare function resolveDataRuntimeState(runtime?: DataRuntime): DataRuntimeState;
21
+ declare function getQuerySlotStore(runtimeState: DataRuntimeState, instance: ComponentInstance): Map<number, QuerySlot>;
22
+ declare function getMutationSlotStore(runtimeState: DataRuntimeState, instance: ComponentInstance): Map<number, MutationCell<unknown, unknown>>;
23
+ declare function ensureQueryCleanup(runtimeState: DataRuntimeState, instance: ComponentInstance): void;
24
+ declare function ensureMutationCleanup(runtimeState: DataRuntimeState, instance: ComponentInstance): void;
25
+ declare function invalidateQueriesForRuntime(runtimeState: DataRuntimeState, prefix: string, markPendingWrite: boolean): void;
26
+ //#endregion
27
+ export { DataRuntimeState, QuerySlot, createDataRuntime, getDefaultDataRuntime };
28
+ //# sourceMappingURL=data-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-runtime.d.ts","names":[],"sources":["../../src/data/data-runtime.ts"],"mappings":";;;;;;KAOY,SAAA;EACV,GAAA;EACA,IAAA,EAAM,SAAS;AAAA;AAAA,KAGL,gBAAA;EACV,UAAA,EAAY,GAAA,SAAY,SAAA;EACxB,oBAAA,EAAsB,OAAA,CAAQ,iBAAA,EAAmB,GAAA,SAAY,SAAA;EAC7D,uBAAA,EAAyB,OAAA,CACvB,iBAAA,EACA,GAAA,SAAY,YAAA;EAEd,sBAAA,EAAwB,OAAA,CAAQ,iBAAA;EAChC,yBAAA,EAA2B,OAAA,CAAQ,iBAAA;AAAA;AAAA,iBAqBrB,iBAAA,CACd,OAAA,GAAS,kBAAA,GACR,WAAW;AAAA,iBAWE,qBAAA,IAAyB,WAAW;AAAA,iBAkDpC,uBAAA,CACd,OAAA,GAAU,WAAA,GACT,gBAAgB;AAAA,iBAIH,iBAAA,CACd,YAAA,EAAc,gBAAA,EACd,QAAA,EAAU,iBAAA,GACT,GAAA,SAAY,SAAA;AAAA,iBASC,oBAAA,CACd,YAAA,EAAc,gBAAA,EACd,QAAA,EAAU,iBAAA,GACT,GAAA,SAAY,YAAA;AAAA,iBASC,kBAAA,CACd,YAAA,EAAc,gBAAA,EACd,QAAA,EAAU,iBAAiB;AAAA,iBAwBb,qBAAA,CACd,YAAA,EAAc,gBAAA,EACd,QAAA,EAAU,iBAAiB;AAAA,iBAwBb,2BAAA,CACd,YAAA,EAAc,gBAAgB,EAC9B,MAAA,UACA,gBAAA"}
@@ -0,0 +1,114 @@
1
+ import { getActiveRenderContext } from "../common/render-context.js";
2
+ import { emitInvalidation } from "./invalidation-listeners.js";
3
+ //#region src/data/data-runtime.ts
4
+ const dataRuntimeStates = /* @__PURE__ */ new WeakMap();
5
+ const dataRuntimeByQueryCache = /* @__PURE__ */ new WeakMap();
6
+ function createDataRuntimeState(queryCache) {
7
+ return {
8
+ queryCache,
9
+ querySlotsByInstance: /* @__PURE__ */ new WeakMap(),
10
+ mutationSlotsByInstance: /* @__PURE__ */ new WeakMap(),
11
+ queryCleanupRegistered: /* @__PURE__ */ new WeakSet(),
12
+ mutationCleanupRegistered: /* @__PURE__ */ new WeakSet()
13
+ };
14
+ }
15
+ function createDataRuntime(options = {}) {
16
+ const runtime = Object.freeze({ queryCache: options.queryCache ?? /* @__PURE__ */ new Map() });
17
+ dataRuntimeStates.set(runtime, createDataRuntimeState(runtime.queryCache));
18
+ dataRuntimeByQueryCache.set(runtime.queryCache, runtime);
19
+ return runtime;
20
+ }
21
+ const defaultDataRuntime = createDataRuntime();
22
+ function getDefaultDataRuntime() {
23
+ return defaultDataRuntime;
24
+ }
25
+ function getDataRuntimeState(runtime) {
26
+ const state = dataRuntimeStates.get(runtime);
27
+ if (!state) throw new Error("[Askr] data runtime was not created by createDataRuntime().");
28
+ return state;
29
+ }
30
+ function isDataRuntime(value) {
31
+ return typeof value === "object" && value !== null && dataRuntimeStates.has(value);
32
+ }
33
+ function getDataRuntimeForQueryCache(queryCache) {
34
+ let runtime = dataRuntimeByQueryCache.get(queryCache);
35
+ if (!runtime) {
36
+ runtime = createDataRuntime({ queryCache });
37
+ dataRuntimeByQueryCache.set(queryCache, runtime);
38
+ }
39
+ return runtime;
40
+ }
41
+ function getActiveDataRuntime() {
42
+ const ctx = getActiveRenderContext();
43
+ if (isDataRuntime(ctx?.dataRuntime)) return ctx.dataRuntime;
44
+ if (ctx?.queryCache) return getDataRuntimeForQueryCache(ctx.queryCache);
45
+ return defaultDataRuntime;
46
+ }
47
+ function getActiveDataRuntimeState() {
48
+ return getDataRuntimeState(getActiveDataRuntime());
49
+ }
50
+ function resolveDataRuntimeState(runtime) {
51
+ return runtime ? getDataRuntimeState(runtime) : getActiveDataRuntimeState();
52
+ }
53
+ function getQuerySlotStore(runtimeState, instance) {
54
+ let store = runtimeState.querySlotsByInstance.get(instance);
55
+ if (!store) {
56
+ store = /* @__PURE__ */ new Map();
57
+ runtimeState.querySlotsByInstance.set(instance, store);
58
+ }
59
+ return store;
60
+ }
61
+ function getMutationSlotStore(runtimeState, instance) {
62
+ let store = runtimeState.mutationSlotsByInstance.get(instance);
63
+ if (!store) {
64
+ store = /* @__PURE__ */ new Map();
65
+ runtimeState.mutationSlotsByInstance.set(instance, store);
66
+ }
67
+ return store;
68
+ }
69
+ function ensureQueryCleanup(runtimeState, instance) {
70
+ if (runtimeState.queryCleanupRegistered.has(instance)) return;
71
+ runtimeState.queryCleanupRegistered.add(instance);
72
+ instance.cleanupFns.push(() => {
73
+ const slots = runtimeState.querySlotsByInstance.get(instance);
74
+ if (!slots) {
75
+ runtimeState.queryCleanupRegistered.delete(instance);
76
+ return;
77
+ }
78
+ for (const [hookIndex, slot] of slots) slot.cell.detach(instance, hookIndex);
79
+ slots.clear();
80
+ runtimeState.querySlotsByInstance.delete(instance);
81
+ runtimeState.queryCleanupRegistered.delete(instance);
82
+ });
83
+ }
84
+ function ensureMutationCleanup(runtimeState, instance) {
85
+ if (runtimeState.mutationCleanupRegistered.has(instance)) return;
86
+ runtimeState.mutationCleanupRegistered.add(instance);
87
+ instance.cleanupFns.push(() => {
88
+ const slots = runtimeState.mutationSlotsByInstance.get(instance);
89
+ if (!slots) {
90
+ runtimeState.mutationCleanupRegistered.delete(instance);
91
+ return;
92
+ }
93
+ for (const cell of slots.values()) cell.abort();
94
+ slots.clear();
95
+ runtimeState.mutationSlotsByInstance.delete(instance);
96
+ runtimeState.mutationCleanupRegistered.delete(instance);
97
+ });
98
+ }
99
+ function invalidateQueriesForRuntime(runtimeState, prefix, markPendingWrite) {
100
+ emitInvalidation({
101
+ prefix,
102
+ markPendingWrite
103
+ });
104
+ const cache = runtimeState.queryCache;
105
+ for (const [key, query] of cache) {
106
+ if (!key.startsWith(prefix)) continue;
107
+ if (markPendingWrite) query.markPendingWrite();
108
+ query.refresh();
109
+ }
110
+ }
111
+ //#endregion
112
+ export { createDataRuntime, ensureMutationCleanup, ensureQueryCleanup, getDefaultDataRuntime, getMutationSlotStore, getQuerySlotStore, invalidateQueriesForRuntime, resolveDataRuntimeState };
113
+
114
+ //# sourceMappingURL=data-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-runtime.js","names":[],"sources":["../../src/data/data-runtime.ts"],"sourcesContent":["import { getActiveRenderContext } from '../common/render-context';\nimport type { ComponentInstance } from '../runtime/component';\nimport { emitInvalidation } from './invalidation-listeners';\nimport type { MutationCell } from './mutation-cell';\nimport type { QueryCell } from './query-cell';\nimport type { DataRuntime, DataRuntimeOptions } from './types';\n\nexport type QuerySlot = {\n key: string;\n cell: QueryCell<unknown>;\n};\n\nexport type DataRuntimeState = {\n queryCache: Map<string, QueryCell<unknown>>;\n querySlotsByInstance: WeakMap<ComponentInstance, Map<number, QuerySlot>>;\n mutationSlotsByInstance: WeakMap<\n ComponentInstance,\n Map<number, MutationCell<unknown, unknown>>\n >;\n queryCleanupRegistered: WeakSet<ComponentInstance>;\n mutationCleanupRegistered: WeakSet<ComponentInstance>;\n};\n\nconst dataRuntimeStates = new WeakMap<DataRuntime, DataRuntimeState>();\nconst dataRuntimeByQueryCache = new WeakMap<\n Map<string, unknown>,\n DataRuntime\n>();\n\nfunction createDataRuntimeState(\n queryCache: Map<string, unknown>\n): DataRuntimeState {\n return {\n queryCache: queryCache as Map<string, QueryCell<unknown>>,\n querySlotsByInstance: new WeakMap(),\n mutationSlotsByInstance: new WeakMap(),\n queryCleanupRegistered: new WeakSet(),\n mutationCleanupRegistered: new WeakSet(),\n };\n}\n\nexport function createDataRuntime(\n options: DataRuntimeOptions = {}\n): DataRuntime {\n const runtime: DataRuntime = Object.freeze({\n queryCache: options.queryCache ?? new Map<string, unknown>(),\n });\n dataRuntimeStates.set(runtime, createDataRuntimeState(runtime.queryCache));\n dataRuntimeByQueryCache.set(runtime.queryCache, runtime);\n return runtime;\n}\n\nconst defaultDataRuntime = createDataRuntime();\n\nexport function getDefaultDataRuntime(): DataRuntime {\n return defaultDataRuntime;\n}\n\nfunction getDataRuntimeState(runtime: DataRuntime): DataRuntimeState {\n const state = dataRuntimeStates.get(runtime);\n if (!state) {\n throw new Error(\n '[Askr] data runtime was not created by createDataRuntime().'\n );\n }\n return state;\n}\n\nfunction isDataRuntime(value: unknown): value is DataRuntime {\n return (\n typeof value === 'object' &&\n value !== null &&\n dataRuntimeStates.has(value as DataRuntime)\n );\n}\n\nfunction getDataRuntimeForQueryCache(\n queryCache: Map<string, unknown>\n): DataRuntime {\n let runtime = dataRuntimeByQueryCache.get(queryCache);\n if (!runtime) {\n runtime = createDataRuntime({ queryCache });\n dataRuntimeByQueryCache.set(queryCache, runtime);\n }\n return runtime;\n}\n\nfunction getActiveDataRuntime(): DataRuntime {\n const ctx = getActiveRenderContext();\n if (isDataRuntime(ctx?.dataRuntime)) {\n return ctx.dataRuntime;\n }\n\n if (ctx?.queryCache) {\n return getDataRuntimeForQueryCache(ctx.queryCache);\n }\n\n return defaultDataRuntime;\n}\n\nfunction getActiveDataRuntimeState(): DataRuntimeState {\n return getDataRuntimeState(getActiveDataRuntime());\n}\n\nexport function resolveDataRuntimeState(\n runtime?: DataRuntime\n): DataRuntimeState {\n return runtime ? getDataRuntimeState(runtime) : getActiveDataRuntimeState();\n}\n\nexport function getQuerySlotStore(\n runtimeState: DataRuntimeState,\n instance: ComponentInstance\n): Map<number, QuerySlot> {\n let store = runtimeState.querySlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n runtimeState.querySlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nexport function getMutationSlotStore(\n runtimeState: DataRuntimeState,\n instance: ComponentInstance\n): Map<number, MutationCell<unknown, unknown>> {\n let store = runtimeState.mutationSlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n runtimeState.mutationSlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nexport function ensureQueryCleanup(\n runtimeState: DataRuntimeState,\n instance: ComponentInstance\n): void {\n if (runtimeState.queryCleanupRegistered.has(instance)) {\n return;\n }\n\n runtimeState.queryCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = runtimeState.querySlotsByInstance.get(instance);\n if (!slots) {\n runtimeState.queryCleanupRegistered.delete(instance);\n return;\n }\n\n for (const [hookIndex, slot] of slots) {\n slot.cell.detach(instance, hookIndex);\n }\n\n slots.clear();\n runtimeState.querySlotsByInstance.delete(instance);\n runtimeState.queryCleanupRegistered.delete(instance);\n });\n}\n\nexport function ensureMutationCleanup(\n runtimeState: DataRuntimeState,\n instance: ComponentInstance\n): void {\n if (runtimeState.mutationCleanupRegistered.has(instance)) {\n return;\n }\n\n runtimeState.mutationCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = runtimeState.mutationSlotsByInstance.get(instance);\n if (!slots) {\n runtimeState.mutationCleanupRegistered.delete(instance);\n return;\n }\n\n for (const cell of slots.values()) {\n cell.abort();\n }\n\n slots.clear();\n runtimeState.mutationSlotsByInstance.delete(instance);\n runtimeState.mutationCleanupRegistered.delete(instance);\n });\n}\n\nexport function invalidateQueriesForRuntime(\n runtimeState: DataRuntimeState,\n prefix: string,\n markPendingWrite: boolean\n): void {\n emitInvalidation({ prefix, markPendingWrite });\n\n const cache = runtimeState.queryCache;\n\n for (const [key, query] of cache) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n if (markPendingWrite) {\n query.markPendingWrite();\n }\n\n void query.refresh();\n }\n}\n"],"mappings":"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"}
@@ -1,142 +1,6 @@
1
- //#region src/data/index.d.ts
2
- type QueryConsistency = 'fresh' | 'stale' | 'refreshing' | 'pending-write';
3
- type QueryStaleReason = 'aborted' | 'error' | 'inconsistent';
4
- interface InvalidateOptions {
5
- markPendingWrite?: boolean;
6
- }
7
- interface InvalidateOnIntervalOptions extends InvalidateOptions {
8
- intervalMs: number;
9
- activeOn?: string | readonly string[];
10
- visibleOnly?: boolean;
11
- focusedOnly?: boolean;
12
- }
13
- type QueryKeyPart = string | number | boolean | null | undefined | readonly QueryKeyPart[] | {
14
- readonly [key: string]: QueryKeyPart;
15
- };
16
- interface QueryScope {
17
- key(...parts: QueryKeyPart[]): string;
18
- prefix(...parts: QueryKeyPart[]): string;
19
- invalidate(parts: readonly QueryKeyPart[], options?: InvalidateOptions): void;
20
- }
21
- type QueryControls = {
22
- refresh(): Promise<void>;
23
- };
24
- type QueryLoading = {
25
- data: null;
26
- error: null;
27
- loading: true;
28
- refreshing: false;
29
- stale: false;
30
- consistency: 'fresh';
31
- staleReason: null;
32
- };
33
- type QueryFresh<T> = {
34
- data: T;
35
- error: null;
36
- loading: false;
37
- refreshing: false;
38
- stale: false;
39
- consistency: 'fresh';
40
- staleReason: null;
41
- };
42
- type QueryRefreshing<T> = {
43
- data: T;
44
- error: null;
45
- loading: false;
46
- refreshing: true;
47
- stale: true;
48
- consistency: 'refreshing';
49
- staleReason: null;
50
- };
51
- type QueryPendingWrite<T> = {
52
- data: T;
53
- error: null;
54
- loading: false;
55
- refreshing: true;
56
- stale: true;
57
- consistency: 'pending-write';
58
- staleReason: null;
59
- };
60
- type QueryStaleValue<T> = {
61
- data: T;
62
- error: null;
63
- loading: false;
64
- refreshing: false;
65
- stale: true;
66
- consistency: 'stale';
67
- staleReason: 'aborted' | 'inconsistent';
68
- };
69
- type QueryStaleErrorWithValue<T> = {
70
- data: T;
71
- error: {};
72
- loading: false;
73
- refreshing: false;
74
- stale: true;
75
- consistency: 'stale';
76
- staleReason: 'error';
77
- };
78
- type QueryStaleError = {
79
- data: null;
80
- error: {};
81
- loading: false;
82
- refreshing: false;
83
- stale: true;
84
- consistency: 'stale';
85
- staleReason: 'error';
86
- };
87
- type Query<T extends {}> = QueryControls & (QueryLoading | QueryFresh<T> | QueryRefreshing<T> | QueryPendingWrite<T> | QueryStaleValue<T> | QueryStaleErrorWithValue<T> | QueryStaleError);
88
- type MutationControls<TInput, TResult> = {
89
- execute(input: TInput): Promise<TResult>;
90
- abort(): void;
91
- reset(): void;
92
- };
93
- type MutationIdle = {
94
- status: 'idle';
95
- pending: false;
96
- error: null;
97
- result: null;
98
- };
99
- type MutationPending = {
100
- status: 'pending';
101
- pending: true;
102
- error: null;
103
- result: null;
104
- };
105
- type MutationSuccess<TResult> = {
106
- status: 'success';
107
- pending: false;
108
- error: null;
109
- result: TResult;
110
- };
111
- type MutationError = {
112
- status: 'error';
113
- pending: false;
114
- error: {};
115
- result: null;
116
- };
117
- type Mutation<TInput, TResult> = MutationControls<TInput, TResult> & (MutationIdle | MutationPending | MutationSuccess<TResult> | MutationError);
118
- type QueryOptions<T> = {
119
- key: string;
120
- fetch: (ctx: {
121
- signal: AbortSignal;
122
- }) => Promise<T>;
123
- isConsistent?: (data: T) => boolean;
124
- reconcile?: (data: T, ctx: {
125
- key: string;
126
- }) => Promise<boolean> | boolean;
127
- };
128
- type MutationOptions<TInput, TResult> = {
129
- action: (input: TInput, ctx: {
130
- signal: AbortSignal;
131
- }) => Promise<TResult>;
132
- affects?: (input: TInput, result: TResult) => string[];
133
- afterSuccess?: 'invalidate';
134
- };
135
- declare function createQuery<T extends {}>(options: QueryOptions<T>): Query<T>;
136
- declare function invalidate(prefix: string, options?: InvalidateOptions): void;
137
- declare function queryScope(namespace: string): QueryScope;
138
- declare function invalidateOnInterval(prefix: string, options: InvalidateOnIntervalOptions): void;
139
- declare function createMutation<TInput, TResult>(options: MutationOptions<TInput, TResult>): Mutation<TInput, TResult>;
140
- //#endregion
141
- export { InvalidateOnIntervalOptions, InvalidateOptions, Mutation, Query, QueryConsistency, QueryKeyPart, QueryScope, QueryStaleReason, createMutation, createQuery, invalidate, invalidateOnInterval, queryScope };
142
- //# sourceMappingURL=index.d.ts.map
1
+ import { DataRuntime, DataRuntimeOptions, InvalidateOnIntervalOptions, InvalidateOptions, Mutation, Query, QueryConsistency, QueryKeyPart, QueryScope, QueryStaleReason } from "./types.js";
2
+ import { createMutation } from "./mutation-cell.js";
3
+ import { createQuery } from "./query-cell.js";
4
+ import { createDataRuntime, getDefaultDataRuntime } from "./data-runtime.js";
5
+ import { invalidate, invalidateOnInterval, queryScope } from "./invalidation.js";
6
+ export { type DataRuntime, type DataRuntimeOptions, type InvalidateOnIntervalOptions, type InvalidateOptions, type Mutation, type Query, type QueryConsistency, type QueryKeyPart, type QueryScope, type QueryStaleReason, createDataRuntime, createMutation, createQuery, getDefaultDataRuntime, invalidate, invalidateOnInterval, queryScope };