@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"route.js","names":[],"sources":["../../src/router/route.ts"],"sourcesContent":["/**\n * Route definition, registration, and matching.\n *\n * Primary public authoring:\n * - `registerRoutes(() => { ... }, options?)`\n * - `group(options, () => { ... })`\n * - `page(path, Component, () => { ... })`\n * - `index(Component, options?)`\n * - `route(path, Component, options?)`\n * - `fallback(Component)`\n * - `Outlet()` for page child rendering\n * - `currentRoute()` for render-time access\n *\n */\n\nimport {\n matchSegments,\n normalizeRouteSegmentName,\n parseSegments,\n computeRank,\n splitPathSegments,\n} from './match';\nimport {\n buildRouteContext,\n buildRouteContextBase,\n deepFreeze,\n makeQuery,\n parseLocation,\n} from './route-context';\nimport { defineContext, readContext } from '../runtime/context';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { getExecutionModel } from '../runtime/execution-model';\nimport {\n markReadableDerivedSubscribersDirty,\n markReactivePropsDirtySource,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from '../runtime/readable';\nimport { getRenderContext } from '../ssr/context';\nimport {\n requireAuth,\n requireGuest,\n requirePermission,\n requireRole,\n} from './policy';\nimport { isPromiseLike } from '../common/promise';\nimport { ELEMENT_TYPE, Fragment, type JSXElement } from '../common/jsx';\nimport type { RenderableChild } from '../common/vnode';\n\nexport type {\n AccessDecision,\n AccessDenyDecision,\n AccessRedirectDecision,\n GroupHelperOptions,\n PageHelperOptions,\n RegisterRoutesOptions,\n RouteDefinition,\n RouteAuthOptions,\n RouteHandler,\n Route,\n RouteContext,\n RoutePolicy,\n RouteRenderResult,\n RouteRequestOptions,\n RouteRequestResult,\n ResolvedRoute,\n RouteMatch,\n RouteQuery,\n RouteSnapshot,\n RouteParams,\n RoutePathParams,\n RouteComponent,\n RouteOptions,\n ParsedSegment,\n LayoutScopeRecord,\n PageScopeRecord,\n RouteRecord,\n RouteManifest,\n} from '../common/router';\n\nimport type {\n GroupHelperOptions,\n PageHelperOptions,\n RegisterRoutesOptions,\n RouteDefinition,\n RouteAuthOptions,\n RouteHandler,\n Route,\n RouteContext,\n RoutePolicy,\n RouteRenderResult,\n RouteRequestOptions,\n RouteRequestResult,\n ResolvedRoute,\n RouteMatch,\n RouteSnapshot,\n RouteParams,\n RoutePathParams,\n RouteComponent,\n RouteOptions,\n LayoutScopeRecord,\n PageScopeRecord,\n RouteRecord,\n RouteManifest,\n} from '../common/router';\nimport { ROUTE_ROOT_COMPONENT } from '../common/router-internal';\nimport { syncRouteActivitySnapshot } from '../common/route-activity';\n\ntype AnyRouteComponent = (...args: any[]) => RenderableChild;\n\ntype RouteComponentParam<TComponent extends AnyRouteComponent> =\n Parameters<TComponent> extends [] ? unknown : Parameters<TComponent>[0];\n\ntype CompatibleAbsoluteRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? TComponent\n : RoutePathParams<Path> extends RouteComponentParam<TComponent>\n ? TComponent\n : never;\n\ntype CompatibleRelativeRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? TComponent\n : RouteComponentParam<TComponent> extends Record<\n keyof RoutePathParams<Path>,\n string\n >\n ? TComponent\n : never;\n\ntype CompatibleRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> = Path extends `/${string}`\n ? CompatibleAbsoluteRouteComponent<Path, TComponent>\n : CompatibleRelativeRouteComponent<Path, TComponent>;\n\ntype RouteOptionsForComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? RouteOptions<RoutePathParams<Path>>\n : RouteComponentParam<TComponent> extends RouteParams\n ? RouteOptions<RouteComponentParam<TComponent>>\n : RouteOptions<RoutePathParams<Path>>;\n\n// ---------------------------------------------------------------------------\n// Module-level stores\n// ---------------------------------------------------------------------------\n\n/** Legacy flat route array — kept for resolver and route() accessor backward compat. */\ntype InternalRoute = Route & {\n fallbackPrefix?: string;\n};\n\ntype InternalRouteRecord = RouteRecord & {\n fallbackPrefix?: string;\n renderHandler?: RouteHandler;\n};\n\nconst routes: InternalRoute[] = [];\n\n/** Normalized route records built by the declarative registration API. */\nconst records: InternalRouteRecord[] = [];\n\ntype RegistrationScope = {\n kind: 'group' | 'page';\n pathPrefix: string;\n layout?: LayoutScopeRecord['component'];\n page?: PageScopeRecord['component'];\n hasIndex?: boolean;\n policies: readonly RoutePolicy[];\n state: AccessScopeState;\n};\n\ntype RegistrationSession = {\n authConfigured: boolean;\n};\n\n/** Active registration scope stack during module-load-time registration. */\nconst registrationScopeStack: RegistrationScope[] = [];\nconst registrationSessionStack: RegistrationSession[] = [];\n\nconst namespaces = new Set<string>();\nlet registrationLocked = false;\n\ntype AccessScopeState = {\n guestOnly: boolean;\n authenticated: boolean;\n};\n\nlet defaultRouteAuthOptions: RouteAuthOptions | undefined;\nlet activeClientRouteAuthOptions: RouteAuthOptions | undefined;\n\nconst HAS_ROUTES_KEY = Symbol.for('__ASKR_HAS_ROUTES__');\n\nfunction setHasRoutes(value: boolean): void {\n try {\n const g = globalThis as unknown as Record<string | symbol, unknown>;\n g[HAS_ROUTES_KEY] = value;\n } catch {\n // ignore\n }\n}\n\n// Initialize to false at module load.\nsetHasRoutes(false);\n\n// Route index by depth - maintains insertion order\nconst routesByDepth = new Map<number, Route[]>();\n\n/**\n * Parse route path depth\n */\nfunction getDepth(path: string): number {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n return normalized === '/' ? 0 : normalized.split('/').filter(Boolean).length;\n}\n\n// ---------------------------------------------------------------------------\n// WeakMap caches for external Route[] objects (e.g. SSR per-request tables)\n// Amortises parseSegments / computeRank across repeated resolveRouteFromRoutes\n// calls on the same route list (same object reference).\n// ---------------------------------------------------------------------------\n\n/** Pre-parsed segments for an externally supplied Route object. */\nconst routeSegsCache = new WeakMap<Route, ReturnType<typeof parseSegments>>();\n/** Pre-computed rank for an externally supplied Route object. */\nconst routeRankCache = new WeakMap<Route, number>();\n/** A rank-descending sorted copy of an external readonly Route array. */\nconst sortedListCache = new WeakMap<\n ReadonlyArray<Route>,\n ReadonlyArray<Route>\n>();\n\nfunction cachedSegs(r: Route): ReturnType<typeof parseSegments> {\n let s = routeSegsCache.get(r);\n if (!s) {\n s = parseSegments(r.path);\n routeSegsCache.set(r, s);\n }\n return s;\n}\n\nfunction cachedRank(r: Route): number {\n let n = routeRankCache.get(r);\n if (n === undefined) {\n n = computeRank(cachedSegs(r));\n routeRankCache.set(r, n);\n }\n return n;\n}\n\nfunction cachedSortedList(\n routeList: ReadonlyArray<Route>\n): ReadonlyArray<Route> {\n let sorted = sortedListCache.get(routeList);\n if (!sorted) {\n sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));\n sortedListCache.set(routeList, sorted);\n }\n return sorted;\n}\n\nlet currentRouteSnapshot = buildRouteSnapshot('/', '', '');\n\nconst currentRouteSource = (() =>\n currentRouteSnapshot) as ReadableSource<RouteSnapshot> &\n (() => RouteSnapshot);\n\ncurrentRouteSource._readers = new Map();\n\n// SSR helper: when rendering on the server, callers may set a location so that\n// render-time route() returns deterministic server values that match client\n// hydration. This is deliberately an opt-in escape for SSR and tests.\nlet serverLocation: string | null = null;\n\nexport function setServerLocation(url: string | null): void {\n serverLocation = url;\n if (url) {\n const parsed = parseLocation(url);\n syncRouteActivitySnapshot(\n parsed.pathname,\n computeMatchesFromRoutes(parsed.pathname, getActiveRoutes())\n );\n return;\n }\n\n syncRouteActivitySnapshot(\n currentRouteSnapshot.path,\n currentRouteSnapshot.matches\n );\n}\n\nfunction buildRouteSnapshot(\n pathname: string,\n search: string,\n hash: string\n): RouteSnapshot {\n const query = makeQuery(search);\n const matches = computeMatchesFromRoutes(pathname, getActiveRoutes());\n\n return Object.freeze({\n path: pathname,\n params: deepFreeze({ ...matches[0]?.params }),\n query,\n hash: hash || null,\n matches: Object.freeze(matches),\n });\n}\n\nfunction setCurrentRouteSnapshot(\n pathname: string,\n search: string,\n hash: string,\n activityMatches?: readonly RouteMatch[]\n): void {\n currentRouteSnapshot = buildRouteSnapshot(pathname, search, hash);\n syncRouteActivitySnapshot(\n pathname,\n activityMatches ?? currentRouteSnapshot.matches\n );\n\n const instance = getCurrentComponentInstance();\n markReadableDerivedSubscribersDirty(currentRouteSource);\n markReactivePropsDirtySource(currentRouteSource);\n notifyReadableReaders(currentRouteSource, instance);\n}\n\nfunction normalizeRouteActivityPath(path: string): string {\n const parsed = parseLocation(path);\n const pathname = parsed.pathname || '/';\n const absolutePathname = pathname.startsWith('/') ? pathname : `/${pathname}`;\n return absolutePathname.endsWith('/') && absolutePathname !== '/'\n ? absolutePathname.slice(0, -1)\n : absolutePathname;\n}\n\nexport function isRoutePathActive(\n pathOrPaths: string | readonly string[]\n): boolean {\n const candidates = new Set(\n (Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]).map(\n normalizeRouteActivityPath\n )\n );\n\n let pathname = currentRouteSnapshot.path;\n if (typeof window !== 'undefined' && window.location) {\n pathname = window.location.pathname || '/';\n } else if (serverLocation) {\n pathname = parseLocation(serverLocation).pathname;\n }\n\n const activePath = normalizeRouteActivityPath(pathname);\n if (candidates.has(activePath)) {\n return true;\n }\n\n const matches = computeMatchesFromRoutes(activePath, getActiveRoutes());\n return matches.some((match) =>\n candidates.has(normalizeRouteActivityPath(match.path))\n );\n}\n\n// Compute matches for a specific route list.\nfunction matchFallbackPrefix(\n pathname: string,\n fallbackPrefix: string\n): Record<string, string> | null {\n const normalizedPath =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const normalizedPrefix =\n fallbackPrefix.endsWith('/') && fallbackPrefix !== '/'\n ? fallbackPrefix.slice(0, -1)\n : fallbackPrefix;\n\n if (normalizedPrefix === '/') {\n const urlParts = splitPathSegments(normalizedPath);\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n if (\n normalizedPath !== normalizedPrefix &&\n !normalizedPath.startsWith(`${normalizedPrefix}/`)\n ) {\n return null;\n }\n\n const remainder =\n normalizedPath === normalizedPrefix\n ? '/'\n : normalizedPath.slice(normalizedPrefix.length);\n const remainderParts = splitPathSegments(remainder);\n\n return {\n '*':\n remainderParts.length === 0\n ? '/'\n : remainderParts.length === 1\n ? remainderParts[0]\n : '/' + remainderParts.join('/'),\n };\n}\n\nfunction computeMatchesFromRoutes(\n pathname: string,\n routesList: readonly Route[]\n): RouteMatch[] {\n const bestMatch =\n routesList === routes\n ? getMatchingRecord(pathname, records)\n : findBestResolvedRouteFromRoutes(pathname, routesList);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: 'route' in bestMatch ? bestMatch.route.path : bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n name:\n 'route' in bestMatch\n ? (bestMatch.route as { name?: string }).name\n : undefined,\n namespace:\n 'route' in bestMatch\n ? bestMatch.route.namespace\n : bestMatch.record.options.namespace,\n },\n ];\n}\n\nfunction computeMatchesFromRouteRecords(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): RouteMatch[] {\n const bestMatch = getMatchingRecord(pathname, routeRecords);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n namespace: bestMatch.record.options.namespace,\n },\n ];\n}\n\nexport function computeRouteActivityMatches(\n pathname: string,\n options: {\n manifest?: RouteManifest;\n routes?: readonly Route[];\n } = {}\n): RouteMatch[] {\n if (options.routes) {\n return computeMatchesFromRoutes(pathname, options.routes);\n }\n\n if (options.manifest) {\n return computeMatchesFromRouteRecords(pathname, options.manifest.records);\n }\n\n return computeMatchesFromRoutes(pathname, getActiveRoutes());\n}\n\nfunction findBestResolvedRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n\n const sorted = cachedSortedList(routeList);\n let bestRoute: Route | null = null;\n let bestParams: Record<string, string> = {};\n let bestRank = -Infinity;\n\n for (const route of sorted) {\n const internalRoute = route as InternalRoute;\n if (internalRoute.fallbackPrefix) {\n continue;\n }\n\n const rank = cachedRank(route);\n if (rank < bestRank) break;\n if (bestRoute !== null && rank === bestRank) continue;\n\n const params = matchSegments(urlParts, cachedSegs(route));\n if (params !== null) {\n bestRoute = route;\n bestParams = params;\n bestRank = rank;\n }\n }\n\n if (bestRoute !== null) {\n return { route: bestRoute, params: bestParams };\n }\n\n let bestFallback: InternalRoute | null = null;\n let bestFallbackParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const route of routeList) {\n const internalRoute = route as InternalRoute;\n if (!internalRoute.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(\n normalized,\n internalRoute.fallbackPrefix\n );\n if (params === null) {\n continue;\n }\n\n if (internalRoute.fallbackPrefix.length > bestPrefixLength) {\n bestFallback = internalRoute;\n bestFallbackParams = params;\n bestPrefixLength = internalRoute.fallbackPrefix.length;\n }\n }\n\n return bestFallback && bestFallbackParams\n ? { route: bestFallback, params: bestFallbackParams }\n : null;\n}\n\nfunction getActiveRoutes(): readonly Route[] {\n const renderContext = getRenderContext();\n return renderContext?.routes ?? routes;\n}\n\nfunction getActiveRouteAuthOptions(\n override?: RouteAuthOptions\n): RouteAuthOptions | undefined {\n if (override) {\n return override;\n }\n\n const renderContext = getRenderContext();\n return (\n renderContext?.routeAuth ??\n activeClientRouteAuthOptions ??\n defaultRouteAuthOptions\n );\n}\n\nexport function _setActiveRouteAuthOptions(\n auth: RouteAuthOptions | undefined\n): void {\n activeClientRouteAuthOptions = auth;\n}\n\nfunction getCurrentRegistrationSession(): RegistrationSession {\n return (\n registrationSessionStack[registrationSessionStack.length - 1] ?? {\n authConfigured: !!defaultRouteAuthOptions?.resolve,\n }\n );\n}\n\nfunction getCurrentAccessScopeState(): AccessScopeState {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.state ?? {\n guestOnly: false,\n authenticated: false,\n }\n );\n}\n\nfunction getCurrentLayoutChain(): LayoutScopeRecord[] {\n const layoutChain: LayoutScopeRecord[] = [];\n\n for (const scope of registrationScopeStack) {\n if (scope.layout) {\n layoutChain.push({ component: scope.layout });\n }\n }\n\n return layoutChain;\n}\n\nfunction getCurrentPageChain(): PageScopeRecord[] {\n const pageChain: PageScopeRecord[] = [];\n\n for (const scope of registrationScopeStack) {\n if (scope.page) {\n pageChain.push({ component: scope.page });\n }\n }\n\n return pageChain;\n}\n\nfunction hasActivePageScope(): boolean {\n return registrationScopeStack.some((scope) => !!scope.page);\n}\n\nfunction getCurrentPageScope(): RegistrationScope | null {\n for (let index = registrationScopeStack.length - 1; index >= 0; index -= 1) {\n const scope = registrationScopeStack[index];\n if (scope.kind === 'page') {\n return scope;\n }\n }\n\n return null;\n}\n\nfunction getCurrentScopeKind(): RegistrationScope['kind'] | null {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.kind ?? null\n );\n}\n\nfunction getCurrentPathPrefix(): string {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.pathPrefix ?? ''\n );\n}\n\nfunction getCurrentInheritedPolicies(): RoutePolicy[] {\n const policies: RoutePolicy[] = [];\n\n for (const scope of registrationScopeStack) {\n if (scope.policies.length > 0) {\n policies.push(...scope.policies);\n }\n }\n\n return policies;\n}\n\n// ---------------------------------------------------------------------------\n// Registration lock\n// ---------------------------------------------------------------------------\n\n/**\n * Prevent route registrations after the app has started.\n * Enforced in production; tests may unlock explicitly.\n */\n\nexport function lockRouteRegistration(): void {\n registrationLocked = true;\n}\n\nexport function _lockRouteRegistrationForTests(): void {\n registrationLocked = true;\n}\n\nexport function _unlockRouteRegistrationForTests(): void {\n registrationLocked = false;\n}\n\n// ---------------------------------------------------------------------------\n// Path validation\n// ---------------------------------------------------------------------------\n\nfunction validateRoutePath(path: string): void {\n if (!path.startsWith('/')) {\n throw new Error(`Route path must begin with \"/\". Got: \"${path}\"`);\n }\n if (/\\/{2,}/.test(path)) {\n throw new Error('Route path cannot contain consecutive slashes.');\n }\n // Reject Express-style :param syntax — Askr uses {param} interpolation\n if (/:([^/{}]+)/.test(path)) {\n const suggested = path.replace(/:([^/{}]+)/g, '{$1}');\n throw new Error(\n `Route parameter syntax uses {name} interpolation, not :name. ` +\n `Use \"${suggested}\" instead of \"${path}\".`\n );\n }\n\n const segments = path.split('/').filter(Boolean);\n const seenParamNames = new Set<string>();\n\n for (let index = 0; index < segments.length; index++) {\n const segment = segments[index];\n if (segment === '*') {\n continue;\n }\n\n const hasOpenBrace = segment.includes('{');\n const hasCloseBrace = segment.includes('}');\n\n if (!hasOpenBrace && !hasCloseBrace) {\n continue;\n }\n\n if (!(segment.startsWith('{') && segment.endsWith('}'))) {\n throw new Error(\n 'Route parameter segments must use complete {name} interpolation.'\n );\n }\n\n const rawParamName = normalizeRouteSegmentName(segment.slice(1, -1));\n const isSplat = rawParamName.startsWith('*');\n const paramName = isSplat\n ? normalizeRouteSegmentName(rawParamName.slice(1))\n : rawParamName;\n\n if (!paramName) {\n throw new Error(\n isSplat\n ? 'Route splat parameter name cannot be empty.'\n : 'Route parameter name cannot be empty.'\n );\n }\n\n if (isSplat && paramName === '*') {\n throw new Error('Route named splat parameter name cannot be \"*\".');\n }\n\n if (isSplat && index !== segments.length - 1) {\n throw new Error(\n 'Route named splat parameters must be the final segment.'\n );\n }\n\n if (seenParamNames.has(paramName)) {\n throw new Error(\n `Route path cannot reuse duplicate parameter name \"${paramName}\".`\n );\n }\n\n seenParamNames.add(paramName);\n }\n}\n\nfunction normalizeAbsoluteRoutePath(path: string): string {\n if (!path || path === '/') {\n return '/';\n }\n\n const normalized = path.endsWith('/') ? path.slice(0, -1) : path;\n return normalized || '/';\n}\n\nfunction joinRoutePaths(prefix: string, path: string): string {\n const normalizedPrefix = normalizeAbsoluteRoutePath(prefix || '/');\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n\n if (!normalizedPath) {\n return normalizedPrefix;\n }\n\n return normalizedPrefix === '/'\n ? `/${normalizedPath}`\n : `${normalizedPrefix}/${normalizedPath}`;\n}\n\nfunction resolvePageScopePath(path: string): string {\n if (!path) {\n throw new Error('page(path, Component, fn) requires a non-empty path.');\n }\n\n if (path.startsWith('/')) {\n validateRoutePath(path);\n return normalizeAbsoluteRoutePath(path);\n }\n\n return joinRoutePaths(getCurrentPathPrefix(), path);\n}\n\nfunction resolveIndexPath(): string {\n return normalizeAbsoluteRoutePath(getCurrentPathPrefix() || '/');\n}\n\nfunction resolveRouteRegistrationPath(path: string): string {\n if (path.startsWith('/')) {\n if (hasActivePageScope()) {\n throw new Error(\n 'Child route paths inside page() must be relative. ' +\n `Use \"${path.slice(1)}\" instead of \"${path}\".`\n );\n }\n\n validateRoutePath(path);\n return normalizeAbsoluteRoutePath(path);\n }\n\n const prefix = getCurrentPathPrefix();\n\n if (!prefix) {\n throw new Error(`Route path must begin with \"/\". Got: \"${path}\"`);\n }\n\n return joinRoutePaths(prefix, path);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper: insert a RouteRecord in rank-descending order\n// so that resolveRoute can use first-match-wins without sorting.\n// Ties preserve declaration order (stable binary-search insertion).\n// ---------------------------------------------------------------------------\n\nfunction insertRecordSorted(record: RouteRecord): void {\n let lo = 0;\n let hi = records.length;\n // Find the insertion point: after all existing records with rank >= this one\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (records[mid].rank >= record.rank) lo = mid + 1;\n else hi = mid;\n }\n records.splice(lo, 0, record);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper: add a single pre-built Route object to the runtime stores\n// ---------------------------------------------------------------------------\n\nfunction addRouteToStores(routeObj: Route): void {\n routes.push(routeObj);\n setHasRoutes(true);\n\n const depth = getDepth(routeObj.path);\n let depthRoutes = routesByDepth.get(depth);\n if (!depthRoutes) {\n depthRoutes = [];\n routesByDepth.set(depth, depthRoutes);\n }\n depthRoutes.push(routeObj);\n\n if (routeObj.namespace) {\n namespaces.add(routeObj.namespace);\n }\n}\n\n// ---------------------------------------------------------------------------\n// lazy() — eager-prefetch code-split component wrapper\n// ---------------------------------------------------------------------------\n\n/** Promises from in-flight lazy() imports, drained by createSPA / hydrateSPA. */\nconst pendingLazy = new Set<Promise<unknown>>();\n\nconst outletContext = defineContext<RenderableChild>(null);\n\nexport function Outlet(): JSXElement {\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: { children: readContext(outletContext) },\n key: null,\n };\n}\n\n/**\n * Snapshot the current in-flight lazy() imports.\n * Boot uses this before clearing route state so manifest-based startup can\n * still await chunks that were kicked off during route module evaluation.\n */\nexport function _snapshotLazy(): Promise<unknown>[] {\n return [...pendingLazy];\n}\n\n/**\n * Declare a code-split route component. The `import()` fires immediately at\n * module evaluation time (creating a bundler split point), and the resolved\n * chunk is guaranteed to be available before the app mounts — so the renderer\n * always receives a plain synchronous function.\n *\n * ```ts\n * registerRoutes(() => {\n * group({ layout: AppLayout }, () => {\n * route('/', lazy(() => import('./pages/landing')));\n * route('/dashboard', lazy(() => import('./pages/dashboard')));\n * });\n * });\n * ```\n *\n * The module must export the component as its **default** export:\n * ```ts\n * // pages/dashboard.tsx\n * export default function DashboardPage() { … }\n * ```\n */\nexport function lazy<TComponent extends AnyRouteComponent>(\n factory: () => Promise<{ default: TComponent } | TComponent>\n): TComponent {\n let resolved: TComponent | null = null;\n let loadError: unknown = null;\n\n const promise = factory().then(\n (mod) => {\n resolved =\n typeof mod === 'function'\n ? mod\n : (mod as { default: TComponent }).default;\n pendingLazy.delete(promise);\n },\n (err: unknown) => {\n loadError = err;\n pendingLazy.delete(promise);\n }\n );\n pendingLazy.add(promise);\n\n return ((params: RouteParams) => {\n if (loadError) throw loadError as Error;\n if (!resolved) {\n throw new Error(\n 'lazy() component used before it was resolved. ' +\n 'Await createSPA() / hydrateSPA() to ensure all chunks load first.'\n );\n }\n return (resolved as RouteComponent<RouteParams>)(params);\n }) as TComponent;\n}\n\n/**\n * Wait for all pending `lazy()` imports to settle.\n * Called automatically by `createSPA` / `hydrateSPA` before mounting.\n */\nexport function _drainLazy(\n additionalPending: Iterable<Promise<unknown>> = []\n): Promise<void> {\n const combined = new Set<Promise<unknown>>([\n ...additionalPending,\n ...pendingLazy,\n ]);\n if (combined.size === 0) return Promise.resolve();\n return Promise.allSettled(combined).then(() => undefined);\n}\n\nexport function group(options: GroupHelperOptions, fn: RouteDefinition): void;\nexport function group(options: GroupHelperOptions, fn: RouteDefinition): void {\n pushGroupScope(options, fn);\n}\n\nexport function page<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n fn: RouteDefinition\n): void;\nexport function page<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n fn: RouteDefinition\n): void;\nexport function page<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void;\nexport function page<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void;\nexport function page(\n path: string,\n Component: RouteComponent,\n optionsOrFn: PageHelperOptions | RouteDefinition,\n maybeFn?: RouteDefinition\n): void {\n const options =\n typeof optionsOrFn === 'function' ? ({} as PageHelperOptions) : optionsOrFn;\n const fn = typeof optionsOrFn === 'function' ? optionsOrFn : maybeFn;\n\n if (typeof Component !== 'function') {\n throw new Error(\n 'page(path, Component, fn) requires a component function as the second argument.'\n );\n }\n\n if (typeof fn !== 'function') {\n throw new Error(\n 'page(path, Component, fn) requires a route definition callback as the final argument.'\n );\n }\n\n pushPageScope(path, Component, options, fn);\n}\n\nexport function index(Component: RouteComponent, options?: RouteOptions): void {\n const pageScope = getCurrentPageScope();\n if (pageScope?.hasIndex) {\n throw new Error('page() cannot declare multiple index routes.');\n }\n\n if (pageScope) {\n pageScope.hasIndex = true;\n }\n\n registerRouteAtResolvedPath(resolveIndexPath(), Component, options);\n}\n\nexport function fallback(Component: RouteComponent): void {\n if (hasActivePageScope()) {\n if (getCurrentScopeKind() !== 'page') {\n throw new Error(\n 'fallback() inside page() must be declared directly in the page scope, not inside nested group().'\n );\n }\n\n registerRouteAtResolvedPath(\n `${getCurrentPathPrefix()}/*`,\n Component,\n undefined,\n { isFallback: true, fallbackPrefix: getCurrentPathPrefix() }\n );\n return;\n }\n\n const allowsRootFallback = registrationScopeStack.every(\n (scope) =>\n scope.policies.length === 0 &&\n !scope.state.guestOnly &&\n !scope.state.authenticated\n );\n\n if (!allowsRootFallback) {\n throw new Error(\n 'fallback() can only be registered at the root scope. ' +\n 'Use route(\"/*\", Component) if you need compatibility behavior.'\n );\n }\n\n registerRouteAtResolvedPath('/*', Component, undefined, {\n isFallback: true,\n fallbackPrefix: '/',\n });\n}\n\nfunction pushRegistrationScope(\n scope: RegistrationScope,\n fn: RouteDefinition\n): void {\n registrationScopeStack.push(scope);\n try {\n fn();\n } finally {\n registrationScopeStack.pop();\n }\n}\n\nfunction pushGroupScope(\n options: GroupHelperOptions,\n fn: RouteDefinition\n): void {\n const session = getCurrentRegistrationSession();\n validateAccessMetadata(options, {\n authConfigured: session.authConfigured,\n state: getCurrentAccessScopeState(),\n });\n const policies = compileNodePolicies(options);\n\n pushRegistrationScope(\n {\n kind: 'group',\n pathPrefix: getCurrentPathPrefix(),\n layout: options.layout,\n policies,\n state: nextAccessScopeState(options, getCurrentAccessScopeState()),\n },\n fn\n );\n}\n\nfunction pushPageScope(\n path: string,\n Component: RouteComponent,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void {\n if (hasActivePageScope()) {\n throw new Error(\n 'page() cannot be nested inside another page(). ' +\n 'Use route() for child leaves or group() for inherited behavior inside the existing page scope.'\n );\n }\n\n const session = getCurrentRegistrationSession();\n validateAccessMetadata(options, {\n authConfigured: session.authConfigured,\n state: getCurrentAccessScopeState(),\n });\n\n const policies = compileNodePolicies(options);\n\n pushRegistrationScope(\n {\n kind: 'page',\n pathPrefix: resolvePageScopePath(path),\n page: Component,\n hasIndex: false,\n policies,\n state: nextAccessScopeState(options, getCurrentAccessScopeState()),\n },\n fn\n );\n}\n\nfunction hasBuiltInAuthMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>\n): boolean {\n return node.auth !== undefined || !!node.role || !!node.permission;\n}\n\nfunction validateSameNodeAccessMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>\n): void {\n if (node.auth === 'guest' && (!!node.role || !!node.permission)) {\n throw new Error(\n 'Guest-only routes cannot be combined with role or permission requirements.'\n );\n }\n}\n\nfunction validateAccessMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>,\n context: {\n authConfigured: boolean;\n state: AccessScopeState;\n }\n): void {\n validateSameNodeAccessMetadata(node);\n\n const requiresAuthenticated =\n node.auth === true || !!node.role || !!node.permission;\n\n if (\n node.auth === 'guest' &&\n (context.state.authenticated || !!node.role || !!node.permission)\n ) {\n throw new Error(\n 'Guest-only routes cannot be combined with authenticated access requirements.'\n );\n }\n\n if (context.state.guestOnly && requiresAuthenticated) {\n throw new Error(\n 'Child routes cannot weaken a guest-only access scope with authenticated requirements.'\n );\n }\n\n if (hasBuiltInAuthMetadata(node) && !context.authConfigured) {\n throw new Error(\n 'Routes using `auth`, `role`, or `permission` require `auth.resolve` in registerRoutes(...).'\n );\n }\n}\n\nfunction nextAccessScopeState(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>,\n state: AccessScopeState\n): AccessScopeState {\n const requiresAuthenticated =\n node.auth === true || !!node.role || !!node.permission;\n\n return {\n guestOnly: state.guestOnly || node.auth === 'guest',\n authenticated: state.authenticated || requiresAuthenticated,\n };\n}\n\nfunction compileNodePolicies(\n node: Pick<\n RouteOptions | GroupHelperOptions,\n 'auth' | 'role' | 'permission' | 'policies'\n >\n): RoutePolicy[] {\n validateSameNodeAccessMetadata(node);\n\n const compiled: RoutePolicy[] = [];\n\n if (node.auth === true) {\n compiled.push(requireAuth());\n } else if (node.auth === 'guest') {\n compiled.push(requireGuest());\n }\n\n if (node.role) {\n compiled.push(requireRole(node.role));\n }\n\n if (node.permission) {\n compiled.push(requirePermission(node.permission));\n }\n\n if (node.policies?.length) {\n compiled.push(...node.policies);\n }\n\n return compiled;\n}\n\nfunction normalizeRouteOptions(\n options: RouteOptions | undefined\n): RouteOptions | undefined {\n if (!options) {\n return undefined;\n }\n\n const loader = options.loader;\n const policies = compileNodePolicies(options);\n\n if (\n !loader &&\n !options.entries &&\n policies.length === 0 &&\n !options.title &&\n !options.namespace &&\n options.auth === undefined &&\n !options.role &&\n !options.permission\n ) {\n return undefined;\n }\n\n return {\n ...(loader ? { loader } : {}),\n ...(options.entries ? { entries: options.entries } : {}),\n ...(options.auth !== undefined ? { auth: options.auth } : {}),\n ...(options.role ? { role: options.role } : {}),\n ...(options.permission ? { permission: options.permission } : {}),\n ...(policies.length > 0 ? { policies } : {}),\n ...(options.title ? { title: options.title } : {}),\n ...(options.namespace ? { namespace: options.namespace } : {}),\n };\n}\n\nfunction applyPageChain(\n pageChain: readonly PageScopeRecord[],\n params: Record<string, string>,\n content: RenderableChild,\n deferComponents = false\n): RenderableChild {\n let nextContent = content;\n\n for (let i = pageChain.length - 1; i >= 0; i--) {\n nextContent = outletContext.Scope({\n value: nextContent,\n children: deferComponents\n ? createRouteComponentVNode(pageChain[i].component, params)\n : pageChain[i].component(params),\n });\n }\n\n return nextContent;\n}\n\nfunction createRouteComponentVNode(\n component: RouteComponent,\n params: Record<string, string>,\n routeRoot = false\n): RenderableChild {\n return {\n $$typeof: ELEMENT_TYPE,\n type: component,\n props: params,\n key: null,\n ...(routeRoot ? { [ROUTE_ROOT_COMPONENT]: true } : {}),\n };\n}\n\nfunction createRouteHandler(\n component: RouteComponent,\n pageChain: readonly PageScopeRecord[],\n layoutChain: readonly LayoutScopeRecord[],\n deferComponents = false\n): RouteHandler {\n return (params) => {\n let content = deferComponents\n ? createRouteComponentVNode(component, params, true)\n : component(params);\n\n content = applyPageChain(pageChain, params, content, deferComponents);\n\n for (let i = layoutChain.length - 1; i >= 0; i--) {\n content = layoutChain[i].component({ children: content });\n }\n\n return content;\n };\n}\n\nfunction getRenderHandler(record: RouteRecord): RouteHandler {\n const internalRecord = record as InternalRouteRecord;\n return (\n internalRecord.renderHandler ??\n createRouteHandler(\n record.component,\n record.pageChain,\n record.layoutChain,\n true\n )\n );\n}\n\nfunction registerRouteAtResolvedPath(\n path: string,\n Component: RouteComponent,\n options?: RouteOptions,\n metadata?: {\n isFallback?: boolean;\n fallbackPrefix?: string;\n }\n): void {\n validateRoutePath(path);\n\n validateAccessMetadata(options ?? {}, {\n authConfigured: getCurrentRegistrationSession().authConfigured,\n state: getCurrentAccessScopeState(),\n });\n\n const chain = getCurrentLayoutChain();\n const pageChain = getCurrentPageChain();\n const segments = parseSegments(path);\n const rank = computeRank(segments);\n const isFallback = metadata?.isFallback ?? path === '/*';\n const comp = Component;\n const normalizedOptions = normalizeRouteOptions(options);\n const policies = [\n ...getCurrentInheritedPolicies(),\n ...(normalizedOptions?.policies ?? []),\n ];\n\n const handler = createRouteHandler(comp, pageChain, chain);\n const renderHandler = createRouteHandler(comp, pageChain, chain, true);\n\n const record: InternalRouteRecord = {\n path,\n component: comp,\n segments,\n rank,\n layoutChain: chain,\n pageChain,\n options: normalizedOptions\n ? {\n ...normalizedOptions,\n ...(policies.length > 0 ? { policies } : {}),\n }\n : policies.length > 0\n ? { policies }\n : {},\n isFallback,\n handler,\n renderHandler,\n ...(metadata?.fallbackPrefix\n ? { fallbackPrefix: metadata.fallbackPrefix }\n : {}),\n };\n\n insertRecordSorted(record);\n addRouteToStores({\n path,\n handler,\n namespace: normalizedOptions?.namespace ?? options?.namespace,\n ...(metadata?.fallbackPrefix\n ? { fallbackPrefix: metadata.fallbackPrefix }\n : {}),\n });\n}\n\nexport function registerRoutes(\n definition: RouteDefinition,\n options: RegisterRoutesOptions = {}\n): void {\n defaultRouteAuthOptions = options.auth;\n\n registrationSessionStack.push({\n authConfigured: !!options.auth?.resolve,\n });\n try {\n definition();\n } finally {\n registrationSessionStack.pop();\n }\n}\n\n// ---------------------------------------------------------------------------\n// route() — dual-purpose: registration (module load) + accessor (render time)\n// ---------------------------------------------------------------------------\n\nfunction readCurrentRouteSnapshot<\n TParams extends RouteParams = RouteParams,\n>(): RouteSnapshot<TParams> {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n 'currentRoute() can only be called during component render execution. ' +\n 'Call currentRoute() from inside your component function.'\n );\n }\n\n let pathname = '/';\n let search = '';\n let hash = '';\n const renderContext = getRenderContext();\n\n if (instance.ssr && renderContext?.url) {\n const parsed = parseLocation(renderContext.url);\n pathname = parsed.pathname;\n search = parsed.search;\n hash = parsed.hash;\n } else if (typeof window !== 'undefined' && window.location) {\n pathname = window.location.pathname || '/';\n search = window.location.search || '';\n hash = window.location.hash || '';\n } else if (serverLocation) {\n const parsed = parseLocation(serverLocation);\n pathname = parsed.pathname;\n search = parsed.search;\n hash = parsed.hash;\n }\n\n const query = makeQuery(search);\n const matches = computeMatchesFromRoutes(pathname, getActiveRoutes());\n const instanceParams = instance.props as Record<string, string>;\n const routeParams =\n Object.keys(instanceParams).length > 0\n ? instanceParams\n : (matches[0]?.params ?? {});\n const params = deepFreeze({\n ...routeParams,\n });\n\n return Object.freeze({\n path: pathname,\n params,\n query,\n hash: hash || null,\n matches: Object.freeze(matches),\n }) as RouteSnapshot<TParams>;\n}\n\nexport function currentRoute<\n TParams extends RouteParams = RouteParams,\n>(): RouteSnapshot<TParams> {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n 'currentRoute() can only be called during component render execution. ' +\n 'Call currentRoute() from inside your component function.'\n );\n }\n\n if (typeof window === 'undefined' || instance.ssr) {\n return readCurrentRouteSnapshot<TParams>();\n }\n\n recordReadableRead(currentRouteSource);\n return readCurrentRouteSnapshot<TParams>();\n}\n\nexport function syncCurrentRouteSnapshot(\n pathname: string,\n search: string,\n hash: string,\n activityMatches?: readonly RouteMatch[]\n): void {\n setCurrentRouteSnapshot(pathname, search, hash, activityMatches);\n}\n\n/**\n * Register a route.\n *\n * ```ts\n * route('/posts/{slug}', PostPage, {\n * loader: ({ params }) => getPost(params.slug),\n * entries: async () => getPosts().map(p => ({ slug: p.slug })),\n * title: 'Post',\n * policies:[requireAuth()],\n * });\n * ```\n */\nexport function route<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n options?: RouteOptions<RoutePathParams<TPath>>\n): void;\nexport function route<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n options?: RouteOptionsForComponent<TPath, TComponent>\n): void;\nexport function route(\n path: string,\n Component: RouteComponent,\n options?: RouteOptions\n): void {\n if (typeof path === 'undefined') {\n throw new Error(\n 'route() is only for route registration. Use currentRoute() inside components.'\n );\n }\n\n if (getExecutionModel() === 'islands') {\n throw new Error(\n 'Routes are not supported with islands. Use createSPA (client) or createSSR (server) instead.'\n );\n }\n\n // ── Registration mode ────────────────────────────────────────────────────\n\n // Disallow registration during SSR render\n const currentInst = getCurrentComponentInstance();\n if (currentInst && currentInst.ssr) {\n throw new Error(\n 'route() cannot be called during SSR rendering. Register routes at module load time instead.'\n );\n }\n\n if (registrationLocked) {\n throw new Error(\n 'Route registration is locked after app startup. ' +\n 'Register routes at module load time before calling createSPA or createSSR.'\n );\n }\n\n if (typeof Component !== 'function') {\n throw new Error(\n 'route(path, Component) requires a component function as the second argument. ' +\n 'Passing JSX elements or VNodes directly is not supported.'\n );\n }\n\n registerRouteAtResolvedPath(\n resolveRouteRegistrationPath(path),\n Component,\n options\n );\n}\n\n// ---------------------------------------------------------------------------\n// Manifest access\n// ---------------------------------------------------------------------------\n\n/**\n * Return the normalized route manifest built from registered route definitions.\n *\n * Pass this to `createSPA`, `hydrateSPA`, or `renderToString` as the\n * authoritative routing input:\n *\n * ```ts\n * import { getManifest } from '@askrjs/askr/router';\n * await createSPA({ root: '#app', manifest: getManifest() });\n * ```\n */\nexport function getManifest(): RouteManifest {\n return {\n records: [...records],\n ...(defaultRouteAuthOptions ? { auth: defaultRouteAuthOptions } : {}),\n };\n}\n\n/**\n * Internal: apply a pre-built manifest to the runtime stores without running\n * route() again. Called by createSPA / hydrateSPA when a manifest is passed.\n */\nexport function _applyManifest(manifest: RouteManifest): void {\n defaultRouteAuthOptions = manifest.auth;\n for (const record of manifest.records) {\n insertRecordSorted(record as InternalRouteRecord);\n addRouteToStores({\n path: record.path,\n handler: record.handler,\n namespace: record.options.namespace,\n ...('fallbackPrefix' in record &&\n typeof (record as InternalRouteRecord).fallbackPrefix === 'string'\n ? {\n fallbackPrefix: (record as InternalRouteRecord).fallbackPrefix,\n }\n : {}),\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Route collection helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get all registered routes (flat list, insertion order).\n * Prefer `getManifest()` when metadata (loader, policies, entries) is needed.\n */\nexport function getRoutes(): Route[] {\n return [...routes];\n}\n\n/** Get routes for a specific namespace. */\nexport function getNamespaceRoutes(namespace: string): Route[] {\n return routes.filter((r) => r.namespace === namespace);\n}\n\n/** Unload all routes from a namespace (for MFE unmounting). */\nexport function unloadNamespace(namespace: string): number {\n const before = routes.length;\n\n for (let i = routes.length - 1; i >= 0; i--) {\n if (routes[i].namespace === namespace) {\n const removed = routes[i];\n routes.splice(i, 1);\n\n const depth = getDepth(removed.path);\n const depthRoutes = routesByDepth.get(depth);\n if (depthRoutes) {\n const idx = depthRoutes.indexOf(removed);\n if (idx >= 0) depthRoutes.splice(idx, 1);\n }\n }\n }\n\n // Remove matching records too\n for (let i = records.length - 1; i >= 0; i--) {\n if (records[i].options.namespace === namespace) {\n records.splice(i, 1);\n }\n }\n\n namespaces.delete(namespace);\n return before - routes.length;\n}\n\n/** Clear all registered routes and records (testing / boot reset). */\nexport function clearRoutes(): void {\n routes.length = 0;\n records.length = 0;\n namespaces.clear();\n routesByDepth.clear();\n registrationScopeStack.length = 0;\n registrationSessionStack.length = 0;\n registrationLocked = false;\n defaultRouteAuthOptions = undefined;\n activeClientRouteAuthOptions = undefined;\n setHasRoutes(false);\n pendingLazy.clear();\n}\n\n/**\n * Get all loaded namespaces (MFE identifiers)\n */\nexport function getLoadedNamespaces(): string[] {\n return Array.from(namespaces);\n}\n\nfunction findBestScopedFallbackRecord(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): { record: InternalRouteRecord; params: Record<string, string> } | null {\n let bestRecord: InternalRouteRecord | null = null;\n let bestParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const routeRecord of routeRecords) {\n const record = routeRecord as InternalRouteRecord;\n if (!record.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(pathname, record.fallbackPrefix);\n if (params === null) {\n continue;\n }\n\n if (record.fallbackPrefix.length > bestPrefixLength) {\n bestRecord = record;\n bestParams = params;\n bestPrefixLength = record.fallbackPrefix.length;\n }\n }\n\n return bestRecord && bestParams\n ? { record: bestRecord, params: bestParams }\n : null;\n}\n\n/**\n * Resolve a path to a route handler.\n *\n * Hot path: walks the module-level `records[]` array which is kept sorted by\n * rank descending at registration time — so the first `matchSegments` hit is\n * always the most specific match. No per-call allocations for the common\n * case of purely-static routes.\n */\nexport function resolveRoute(pathname: string): ResolvedRoute | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n\n for (const record of records) {\n if (record.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { handler: record.handler, params };\n }\n }\n\n const fallbackMatch = findBestScopedFallbackRecord(normalized, records);\n return fallbackMatch\n ? { handler: fallbackMatch.record.handler, params: fallbackMatch.params }\n : null;\n}\n\nfunction getMatchingRecord(\n target: string,\n routeRecords: readonly RouteRecord[]\n): { record: RouteRecord; params: Record<string, string> } | null {\n const location = parseLocation(target);\n const normalized =\n location.pathname.endsWith('/') && location.pathname !== '/'\n ? location.pathname.slice(0, -1)\n : location.pathname;\n const urlParts = splitPathSegments(normalized);\n\n for (const record of routeRecords) {\n const internalRecord = record as InternalRouteRecord;\n if (internalRecord.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { record, params };\n }\n }\n\n return findBestScopedFallbackRecord(normalized, routeRecords);\n}\n\nfunction getRoutePolicies(\n options: RouteOptions | undefined\n): readonly RoutePolicy[] {\n if (!options) {\n return [];\n }\n\n if (options.policies?.length) {\n return options.policies;\n }\n\n return compileNodePolicies(options);\n}\n\nfunction getDefaultRouteMode(): RouteContext['mode'] {\n if (typeof window !== 'undefined') {\n return 'spa';\n }\n\n return 'ssr';\n}\n\nfunction createRenderDataAwareHandler(\n handler: RouteHandler,\n data: unknown\n): RouteHandler {\n return (params, context) => {\n const renderContext = getRenderContext();\n if (renderContext) {\n renderContext.renderData = (data ?? null) as Record<\n string,\n unknown\n > | null;\n }\n\n return handler(params, context);\n };\n}\n\nfunction buildRenderResult(\n record: RouteRecord,\n params: Record<string, string>,\n mode: RouteContext['mode']\n): RouteRequestResult | Promise<RouteRequestResult> {\n const renderHandler = getRenderHandler(record);\n const loader = mode === 'ssr' ? record.options?.loader : undefined;\n if (loader) {\n const loaded = loader({ params });\n const finalize = (data: unknown): RouteRenderResult => ({\n kind: 'render',\n handler: createRenderDataAwareHandler(renderHandler, data),\n params,\n });\n\n if (isPromiseLike(loaded)) {\n return Promise.resolve(loaded).then((data) => finalize(data));\n }\n\n return finalize(loaded);\n }\n\n return {\n kind: 'render',\n handler: renderHandler,\n params,\n };\n}\n\nfunction continueRoutePolicies(\n policies: readonly RoutePolicy[],\n context: RouteContext,\n record: RouteRecord,\n params: Record<string, string>,\n startIndex = 0\n): RouteRequestResult | Promise<RouteRequestResult> {\n for (let index = startIndex; index < policies.length; index += 1) {\n const policyResult = policies[index](context);\n\n if (isPromiseLike(policyResult)) {\n return Promise.resolve(policyResult).then((next) => {\n if (next.kind !== 'allow') {\n return next;\n }\n\n return continueRoutePolicies(\n policies,\n context,\n record,\n params,\n index + 1\n );\n });\n }\n\n if (policyResult.kind !== 'allow') {\n return policyResult;\n }\n }\n\n return buildRenderResult(record, params, context.mode);\n}\n\nexport function resolveRouteRequest(\n target: string,\n options: RouteRequestOptions = {}\n): RouteRequestResult | Promise<RouteRequestResult> {\n const routeRecords = options.manifest?.records ?? records;\n const match = getMatchingRecord(target, routeRecords);\n\n if (!match) {\n return null;\n }\n\n const { record, params } = match;\n const policies = getRoutePolicies(record.options);\n const mode = options.mode ?? getDefaultRouteMode();\n\n if (policies.length === 0) {\n return buildRenderResult(record, params, mode);\n }\n\n const signal =\n options.signal ??\n getRenderContext()?.signal ??\n new AbortController().signal;\n const auth = getActiveRouteAuthOptions(\n options.auth ?? options.manifest?.auth\n );\n const baseContext = buildRouteContextBase(target, params, {\n mode,\n signal,\n });\n\n const finalize = (authState: { session: unknown; user: unknown }) =>\n continueRoutePolicies(\n policies,\n buildRouteContext(target, params, {\n mode,\n signal,\n auth,\n session: authState.session,\n user: authState.user,\n }),\n record,\n params\n );\n\n if (!auth?.resolve) {\n return finalize({ session: null, user: null });\n }\n\n const authState = auth.resolve(baseContext);\n if (isPromiseLike(authState)) {\n return Promise.resolve(authState).then((next) => finalize(next));\n }\n\n return finalize(authState);\n}\n\n/**\n * Resolve a path against an explicit route list (e.g. an SSR per-render\n * context). When called with the global `routes` array this delegates to\n * the faster `resolveRoute` which uses pre-sorted `records[]`.\n *\n * For externally supplied lists the function:\n * 1. Builds a rank-sorted copy of the list on first call and caches it\n * in a WeakMap so subsequent resolutions against the same list pay\n * zero sort cost.\n * 2. Uses pre-parsed `ParsedSegment[]` from a WeakMap cache so no string\n * splitting or segment parsing occurs on the hot path.\n * 3. Uses a running-best with an early-exit once the sorted list reaches\n * a rank that cannot beat the current best match.\n */\nexport function resolveRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): ResolvedRoute | null {\n if (routeList === routes) return resolveRoute(pathname);\n\n const match = findBestResolvedRouteFromRoutes(pathname, routeList);\n return match ? { handler: match.route.handler, params: match.params } : null;\n}\n\nexport function _resolveRouteMatchFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n return findBestResolvedRouteFromRoutes(pathname, routeList);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.d.ts","names":[],"sources":["../../src/runtime/component.ts"],"mappings":";;;;;;;UA8BiB,iBAAA;EACf,EAAA;EACA,EAAA,EAAI,iBAAA;EACJ,KAAA,EAAO,KAAA;EACP,MAAA,EAAQ,OAAA;EACR,cAAA,EAAgB,iBAAA;EAChB,WAAA;EACA,OAAA;EACA,eAAA,EAAiB,eAAA;EACjB,GAAA;EAEA,aAAA;EACA,WAAA,EAAa,KAAA;EACb,oBAAA;EACA,YAAA;EAEA,iBAAA;EACA,eAAA;EACA,WAAA;EACA,eAAA;EACA,oBAAA;EACA,mBAAA;EACA,eAAA,EAAiB,KAAA,6BACa,WAAA;EAE9B,gBAAA,EAAkB,KAAA,6BACY,WAAA;EAE9B,UAAA,EAAY,KAAA;EACZ,cAAA;EACA,mBAAA;EACA,gBAAA;EACA,UAAA,EAAY,YAAA;EACZ,MAAA;EAGA,mBAAA;EACA,eAAA;EACA,mBAAA,GAAsB,GAAA,CAAI,cAAA;EAC1B,0BAAA,GAA6B,GAAA,CAAI,cAAA;EACjC,gBAAA,GAAmB,GAAA,CAAI,cAAA;EACvB,kBAAA,GAAqB,GAAA;EAIrB,YAAA,GAAe,OAAA;EACf,iBAAA,GAAoB,GAAA;IAClB,GAAA;IACA,OAAA;EAAA;EAEF,kBAAA;IACE,KAAA;IACA,QAAA;IACA,QAAA;EAAA;AAAA;AAAA,iBAIY,uBAAA,CACd,EAAA,UACA,EAAA,EAAI,iBAAA,EACJ,KAAA,EAAO,KAAA,EACP,MAAA,EAAQ,OAAA,UACP,iBAAA;AAAA,KAsEE,eAAA;EACH,GAAA;EACA,OAAO;AAAA;AAAA,iBAaO,2BAAA,IAA+B,iBAAiB;AAAA,iBAKhD,2BAAA,CACd,QAAkC,EAAxB,iBAAiB;AAAA,iBAMb,qBAAA;AAAA,KAWX,kBAAA,+BAGD,WAAW;AAAA,iBAsHC,2BAAA,CAA4B,QAA2B,EAAjB,iBAAiB;AAAA,iBAoGvD,sBAAA,CAAuB,SAA6B,EAAlB,kBAAkB;AAAA,iBAkBpD,uBAAA,CAAwB,SAA6B,EAAlB,kBAAkB;AAAA,iBAiHrD,uBAAA,CAAwB,QAA2B,EAAjB,iBAAiB;AAAA,iBAMnD,mBAAA,CACd,QAAA,EAAU,iBAAA,EACV,MAAA,EAAQ,OAAO;AAAA,iBAyDD,qBAAA,IACd,QAAA,EAAU,iBAAA,EACV,eAAA,UACA,MAAA,QAAc,CAAA,GACb,CAAA;;;;;;iBA4Ra,qBAAA,CACd,QAAA,EAAU,iBAAA,aACC,OAAO;AAAA,iBAgDJ,oBAAA,CAAqB,QAA2B,EAAjB,iBAAiB;;;;;;iBAuGhD,gBAAA,CAAiB,QAA2B,EAAjB,iBAAiB;AAAA,iBAW5C,kBAAA,IAAsB,iBAAiB;;;;;;;;;;;;;AA19B3C;AAIZ;;;;;;;;;;;;;;;;;;AAKoB;AAgEnB;;;;AAQQ;AAaT;;;;iBAy6BgB,SAAA,IAAa,WAAW;AAp6BxC;;;;AACoC;AAMpC;;;AAPA,iBAs7BgB,yBAAA,CAA0B,QAA2B,EAAjB,iBAAiB;AAAA,iBAIrD,iBAAA;AAAA,iBAIA,cAAA,CACd,QAAA,EAAU,iBAAiB,EAC3B,QAAA;AAAA,iBAgCc,oBAAA;AAAA,iBAIA,eAAA;AAAA,iBAIA,aAAA,CAAc,KAAa;AAn9B5B;AAsHf;;;;AAtHe,iBA49BC,cAAA,CAAe,QAA2B,EAAjB,iBAAiB;AAlwB1D;;;;AAAA,iBA0wBgB,gBAAA,CAAiB,QAA2B,EAAjB,iBAAiB;AAAA,iBAuF5C,uBAAA,CACd,QAAA,EAAU,iBAAA,EACV,KAAA,EAAO,eAAe;AAAA,iBAMR,yBAAA,CACd,QAAA,EAAU,iBAAA,EACV,KAAA,EAAO,eAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.js","names":[],"sources":["../../src/runtime/component.ts"],"sourcesContent":["/**\n * Component instance lifecycle management\n * Internal only — users never see this\n */\n\nimport { type State } from './state';\nimport { globalScheduler } from './scheduler';\nimport type { Props } from '../common/props';\nimport type { ComponentFunction } from '../common/component';\nimport {\n // withContext is the sole primitive for context restoration\n withContext,\n type ContextFrame,\n} from './context';\nimport {\n type ReadableSource,\n finalizeReadableSubscriptions,\n finalizeReadableSubscriptionsFromSnapshot,\n cleanupReadableSubscriptions,\n} from './readable';\nimport {\n isDevelopmentEnvironment,\n isProductionEnvironment,\n} from '../common/env';\nimport { logger } from '../dev/logger';\nimport { incDevCounter, setDevValue } from './dev-namespace';\nimport { isPromiseLike } from '../common/promise';\n\nexport type { ComponentFunction } from '../common/component';\n\nexport interface ComponentInstance {\n id: string;\n fn: ComponentFunction;\n props: Props;\n target: Element | null;\n parentInstance: ComponentInstance | null;\n portalScope: object | null;\n mounted: boolean;\n abortController: AbortController | null; // Lazily created per-component abort lifecycle\n ssr?: boolean; // Set to true for SSR temporary instances\n // Opt-in strict cleanup mode: when true cleanup errors are aggregated and re-thrown\n cleanupStrict?: boolean;\n stateValues: State<unknown>[]; // Persistent state storage across renders\n evaluationGeneration: number; // Prevents stale async evaluation completions\n notifyUpdate: (() => void) | null; // Callback for state updates (persisted on instance)\n // Internal: prebound helpers to avoid per-update closures (allocation hot-path)\n _pendingFlushTask?: () => void; // Clears hasPendingUpdate and triggers notifyUpdate\n _pendingRunTask?: () => void; // Clears hasPendingUpdate and runs component\n _enqueueRun?: () => void; // Batches run requests and enqueues _pendingRunTask\n stateIndexCheck: number; // Track state indices to catch conditional calls\n expectedStateIndices: number[]; // Expected sequence of render-scoped hook indices (frozen after first render)\n firstRenderComplete: boolean; // Flag to detect transition from first to subsequent renders\n mountOperations: Array<\n () => void | (() => void) | PromiseLike<void | (() => void)>\n >; // Operations to run when component mounts\n commitOperations: Array<\n () => void | (() => void) | PromiseLike<void | (() => void)>\n >; // Operations to run after a successful committed render\n cleanupFns: Array<() => void>; // Cleanup functions to run on unmount\n lifecycleSlots: unknown[]; // Render-scoped lifecycle primitive storage\n lifecycleGeneration: number; // Invalidates async mount-operation settlement after disposal\n hasPendingUpdate: boolean; // Flag to batch state updates (coalescing)\n ownerFrame: ContextFrame | null; // Provider chain for this component (set by Scope, never overwritten)\n isRoot?: boolean;\n\n // Render-tracking for precise subscriptions (internal)\n _currentRenderToken?: number; // Token for the in-progress render (set before render)\n lastRenderToken?: number; // Token of the last *committed* render\n _pendingReadSources?: Set<ReadableSource<unknown>>; // Readables read during the in-progress render\n _pendingReadSourceVersions?: Map<ReadableSource<unknown>, number>; // Source versions captured during the in-progress render\n _lastReadSources?: Set<ReadableSource<unknown>>; // Readables read during the last committed render\n devWarningsEmitted?: Set<string>; // Dev-only warning dedupe for this instance\n\n // Placeholder for null-returning components. When a component initially returns\n // null, we create a comment placeholder so updates can replace it with content.\n _placeholder?: Comment;\n _ownedChildScopes?: Set<{\n key: string | number;\n dispose(): void;\n }>;\n errorBoundaryState?: {\n error: unknown | null;\n resetKey: unknown;\n notified: boolean;\n };\n}\n\nexport function createComponentInstance(\n id: string,\n fn: ComponentFunction,\n props: Props,\n target: Element | null\n): ComponentInstance {\n const instance: ComponentInstance = {\n id,\n fn,\n props,\n target,\n parentInstance: currentInstance,\n portalScope: currentInstance?.portalScope ?? currentPortalScope ?? null,\n mounted: false,\n abortController: null,\n stateValues: [],\n evaluationGeneration: 0,\n notifyUpdate: null,\n // Prebound helpers (initialized below) to avoid per-update allocations\n _pendingFlushTask: undefined,\n _pendingRunTask: undefined,\n _enqueueRun: undefined,\n stateIndexCheck: -1,\n expectedStateIndices: [],\n firstRenderComplete: false,\n mountOperations: [],\n commitOperations: [],\n cleanupFns: [],\n lifecycleSlots: [],\n lifecycleGeneration: 0,\n hasPendingUpdate: false,\n ownerFrame: null, // Will be set by renderer when vnode is marked\n ssr: false,\n cleanupStrict: false,\n isRoot: false,\n\n // Render-tracking (for precise state subscriptions)\n _currentRenderToken: undefined,\n lastRenderToken: 0,\n _pendingReadSources: undefined,\n _pendingReadSourceVersions: undefined,\n _lastReadSources: undefined,\n devWarningsEmitted: undefined,\n };\n\n // Initialize prebound helper tasks once per instance to avoid allocations\n instance._pendingRunTask = () => {\n // Clear pending flag when the run task executes\n instance.hasPendingUpdate = false;\n if (instance.notifyUpdate === null) {\n return;\n }\n // Execute component run (will set up notifyUpdate before render)\n runComponent(instance);\n };\n\n instance._enqueueRun = () => {\n if (!instance.hasPendingUpdate) {\n instance.hasPendingUpdate = true;\n // Enqueue single run task (coalesces multiple writes)\n globalScheduler.enqueue(instance._pendingRunTask!);\n }\n };\n\n // Default state-driven updates enqueue the run task directly. Specialized\n // runtimes (for example `For` item instances) can still override this hook.\n instance._pendingFlushTask = instance._pendingRunTask;\n\n return instance;\n}\n\nlet currentInstance: ComponentInstance | null = null;\nlet currentPortalScope: object | null = null;\nlet stateIndex = 0;\n\ntype OwnedChildScope = {\n key: string | number;\n dispose(): void;\n};\n\nfunction ensureAbortController(instance: ComponentInstance): AbortController {\n let controller = instance.abortController;\n if (!controller || controller.signal.aborted) {\n controller = new AbortController();\n instance.abortController = controller;\n }\n return controller;\n}\n\n// Export for state.ts to access\nexport function getCurrentComponentInstance(): ComponentInstance | null {\n return currentInstance;\n}\n\n// Export for SSR to set temporary instance\nexport function setCurrentComponentInstance(\n instance: ComponentInstance | null\n): void {\n currentInstance = instance;\n currentPortalScope = instance?.portalScope ?? null;\n}\n\nexport function getCurrentPortalScope(): object | null {\n return currentInstance?.portalScope ?? currentPortalScope;\n}\n\n/**\n * Register a mount operation that will run after the component is mounted\n * Used by operations (task, on, timer, etc) to execute after render completes\n */\nimport { isBulkCommitActive } from './fastlane';\nimport { evaluate, cleanupInstancesUnder } from '../renderer';\n\ntype LifecycleOperation = () =>\n | void\n | (() => void)\n | PromiseLike<void | (() => void)>;\n\ntype LifecycleCommitBatchEntry = {\n instance: ComponentInstance;\n wasFirstMount: boolean;\n};\n\ntype ReadSubscriptionCommit = {\n instance: ComponentInstance;\n token: number;\n pendingReadSources: Set<ReadableSource<unknown>> | undefined;\n pendingReadSourceVersions: Map<ReadableSource<unknown>, number> | undefined;\n};\n\ntype InlineRenderSnapshot = {\n instance: ComponentInstance;\n props: Props;\n ownerFrame: ContextFrame | null;\n portalScope: object | null;\n parentInstance: ComponentInstance | null;\n isRoot: boolean | undefined;\n};\n\ntype LifecycleCommitBatch = {\n parent: LifecycleCommitBatch | null;\n entries: LifecycleCommitBatchEntry[];\n entriesByInstance: Map<ComponentInstance, LifecycleCommitBatchEntry>;\n readCommits: ReadSubscriptionCommit[];\n readCommitsByInstance: Map<ComponentInstance, ReadSubscriptionCommit>;\n renderSnapshots: InlineRenderSnapshot[];\n renderSnapshotsByInstance: Map<ComponentInstance, InlineRenderSnapshot>;\n active: boolean;\n};\n\nlet currentLifecycleCommitBatch: LifecycleCommitBatch | null = null;\n\nfunction beginLifecycleCommitBatch(): LifecycleCommitBatch {\n const batch: LifecycleCommitBatch = {\n parent: currentLifecycleCommitBatch,\n entries: [],\n entriesByInstance: new Map(),\n readCommits: [],\n readCommitsByInstance: new Map(),\n renderSnapshots: [],\n renderSnapshotsByInstance: new Map(),\n active: true,\n };\n currentLifecycleCommitBatch = batch;\n return batch;\n}\n\nfunction closeLifecycleCommitBatch(batch: LifecycleCommitBatch): boolean {\n if (!batch.active) {\n return false;\n }\n\n batch.active = false;\n currentLifecycleCommitBatch = batch.parent;\n return true;\n}\n\nfunction enqueueLifecycleCommit(\n batch: LifecycleCommitBatch,\n instance: ComponentInstance,\n wasFirstMount: boolean\n): void {\n const existing = batch.entriesByInstance.get(instance);\n if (existing) {\n existing.wasFirstMount = existing.wasFirstMount || wasFirstMount;\n return;\n }\n\n const entry = { instance, wasFirstMount };\n batch.entriesByInstance.set(instance, entry);\n batch.entries.push(entry);\n}\n\nfunction enqueueReadSubscriptionCommit(\n batch: LifecycleCommitBatch,\n instance: ComponentInstance,\n token: number,\n pendingReadSources: Set<ReadableSource<unknown>> | undefined,\n pendingReadSourceVersions: Map<ReadableSource<unknown>, number> | undefined\n): void {\n const existing = batch.readCommitsByInstance.get(instance);\n const commit = existing ?? {\n instance,\n token,\n pendingReadSources,\n pendingReadSourceVersions,\n };\n\n commit.token = token;\n commit.pendingReadSources = pendingReadSources\n ? new Set(pendingReadSources)\n : undefined;\n commit.pendingReadSourceVersions = pendingReadSourceVersions\n ? new Map(pendingReadSourceVersions)\n : undefined;\n\n if (!existing) {\n batch.readCommitsByInstance.set(instance, commit);\n batch.readCommits.push(commit);\n }\n}\n\nfunction enqueueInlineRenderSnapshot(\n batch: LifecycleCommitBatch,\n snapshot: InlineRenderSnapshot\n): void {\n if (batch.renderSnapshotsByInstance.has(snapshot.instance)) {\n return;\n }\n\n batch.renderSnapshotsByInstance.set(snapshot.instance, snapshot);\n batch.renderSnapshots.push(snapshot);\n}\n\nexport function captureInlineRenderSnapshot(instance: ComponentInstance): void {\n if (!currentLifecycleCommitBatch?.active) {\n return;\n }\n\n enqueueInlineRenderSnapshot(currentLifecycleCommitBatch, {\n instance,\n props: instance.props,\n ownerFrame: instance.ownerFrame,\n portalScope: instance.portalScope,\n parentInstance: instance.parentInstance,\n isRoot: instance.isRoot,\n });\n}\n\nfunction finalizeInlineReadSubscriptions(\n instance: ComponentInstance,\n token: number,\n pendingReadSources: Set<ReadableSource<unknown>> | undefined,\n pendingReadSourceVersions: Map<ReadableSource<unknown>, number> | undefined\n): void {\n if (currentLifecycleCommitBatch?.active) {\n enqueueReadSubscriptionCommit(\n currentLifecycleCommitBatch,\n instance,\n token,\n pendingReadSources,\n pendingReadSourceVersions\n );\n return;\n }\n\n finalizeReadableSubscriptionsFromSnapshot(\n instance,\n token,\n pendingReadSources,\n pendingReadSourceVersions\n );\n}\n\nfunction flushLifecycleCommitBatch(batch: LifecycleCommitBatch): void {\n if (!closeLifecycleCommitBatch(batch)) {\n return;\n }\n\n if (batch.parent?.active) {\n for (const snapshot of batch.renderSnapshots) {\n enqueueInlineRenderSnapshot(batch.parent, snapshot);\n }\n for (const commit of batch.readCommits) {\n enqueueReadSubscriptionCommit(\n batch.parent,\n commit.instance,\n commit.token,\n commit.pendingReadSources,\n commit.pendingReadSourceVersions\n );\n }\n for (const entry of batch.entries) {\n enqueueLifecycleCommit(batch.parent, entry.instance, entry.wasFirstMount);\n }\n return;\n }\n\n for (const commit of batch.readCommits) {\n finalizeReadableSubscriptionsFromSnapshot(\n commit.instance,\n commit.token,\n commit.pendingReadSources,\n commit.pendingReadSourceVersions\n );\n }\n\n for (const entry of batch.entries) {\n executeCommittedLifecycleOperations(entry.instance, entry.wasFirstMount);\n }\n}\n\nfunction discardLifecycleCommitBatch(batch: LifecycleCommitBatch): void {\n if (!closeLifecycleCommitBatch(batch)) {\n return;\n }\n\n for (let index = batch.renderSnapshots.length - 1; index >= 0; index -= 1) {\n const snapshot = batch.renderSnapshots[index]!;\n snapshot.instance.props = snapshot.props;\n snapshot.instance.ownerFrame = snapshot.ownerFrame;\n snapshot.instance.portalScope = snapshot.portalScope;\n snapshot.instance.parentInstance = snapshot.parentInstance;\n snapshot.instance.isRoot = snapshot.isRoot;\n }\n\n for (const entry of batch.entries) {\n if (entry.wasFirstMount) {\n entry.instance.mountOperations = [];\n }\n discardCommitOperations(entry.instance);\n }\n}\n\nexport function registerMountOperation(operation: LifecycleOperation): void {\n const instance = getCurrentComponentInstance();\n if (instance) {\n // If we're in bulk-commit fast lane, registering mount operations is a\n // violation of the fast-lane preconditions. Throw in dev, otherwise ignore\n // silently in production (we must avoid scheduling work during bulk commit).\n if (isBulkCommitActive()) {\n if (isDevelopmentEnvironment()) {\n throw new Error(\n 'registerMountOperation called during bulk commit fast-lane'\n );\n }\n return;\n }\n instance.mountOperations.push(operation);\n }\n}\n\nexport function registerCommitOperation(operation: LifecycleOperation): void {\n const instance = getCurrentComponentInstance();\n if (instance) {\n if (isBulkCommitActive()) {\n if (isDevelopmentEnvironment()) {\n throw new Error(\n 'registerCommitOperation called during bulk commit fast-lane'\n );\n }\n return;\n }\n instance.commitOperations.push(operation);\n }\n}\n\nfunction settleLifecycleOperationResult(\n instance: ComponentInstance,\n lifecycleGeneration: number,\n result: void | (() => void) | PromiseLike<void | (() => void)>\n): void {\n if (isPromiseLike(result)) {\n Promise.resolve(result).then(\n (cleanup) => {\n if (typeof cleanup === 'function') {\n if (\n instance.lifecycleGeneration === lifecycleGeneration &&\n instance.mounted\n ) {\n instance.cleanupFns.push(cleanup);\n return;\n }\n\n try {\n cleanup();\n } catch (err) {\n logger.error('[Askr] async mount cleanup failed:', err);\n }\n }\n },\n (err) => {\n logger.error('[Askr] async mount operation failed:', err);\n }\n );\n } else if (typeof result === 'function') {\n instance.cleanupFns.push(result);\n }\n}\n\n/**\n * Execute all mount operations for a component\n * These run after the component is rendered and mounted to the DOM\n */\nfunction executeMountOperations(instance: ComponentInstance): void {\n const mountOperations = instance.mountOperations;\n if (mountOperations.length === 0) {\n return;\n }\n\n const lifecycleGeneration = instance.lifecycleGeneration;\n\n for (const operation of mountOperations) {\n settleLifecycleOperationResult(instance, lifecycleGeneration, operation());\n }\n // Clear the operations array so they don't run again on subsequent renders\n instance.mountOperations = [];\n}\n\nfunction executeCommitOperations(instance: ComponentInstance): void {\n const commitOperations = instance.commitOperations;\n if (commitOperations.length === 0) {\n return;\n }\n\n instance.commitOperations = [];\n const lifecycleGeneration = instance.lifecycleGeneration;\n\n for (const operation of commitOperations) {\n settleLifecycleOperationResult(instance, lifecycleGeneration, operation());\n }\n}\n\nfunction discardCommitOperations(instance: ComponentInstance): void {\n instance.commitOperations = [];\n}\n\nfunction executeCommittedLifecycleOperations(\n instance: ComponentInstance,\n wasFirstMount: boolean\n): void {\n if (wasFirstMount && instance.mountOperations.length > 0) {\n executeMountOperations(instance);\n }\n if (instance.commitOperations.length > 0) {\n executeCommitOperations(instance);\n }\n}\n\nfunction commitLifecycleForInstance(\n instance: ComponentInstance,\n wasFirstMount: boolean\n): void {\n if (currentLifecycleCommitBatch) {\n enqueueLifecycleCommit(\n currentLifecycleCommitBatch,\n instance,\n wasFirstMount\n );\n return;\n }\n\n executeCommittedLifecycleOperations(instance, wasFirstMount);\n}\n\nexport function commitRenderedComponent(instance: ComponentInstance): void {\n if (instance.mounted && instance.commitOperations.length > 0) {\n commitLifecycleForInstance(instance, false);\n }\n}\n\nexport function mountInstanceInline(\n instance: ComponentInstance,\n target: Element | null\n): void {\n instance.target = target;\n // Record backref on host element so renderer can clean up when the\n // node is removed. Avoids leaks if the node is detached or replaced.\n try {\n if (target instanceof Element) {\n const host = target as Element & {\n __ASKR_INSTANCE?: ComponentInstance;\n __ASKR_INSTANCES?: ComponentInstance[];\n };\n const instances = host.__ASKR_INSTANCES ?? [];\n const nextInstances = instances.filter((entry) => entry !== instance);\n nextInstances.push(instance);\n host.__ASKR_INSTANCES = nextInstances;\n host.__ASKR_INSTANCE = nextInstances[0] ?? instance;\n }\n } catch (err) {\n void err;\n }\n\n // Ensure notifyUpdate is available for async resource completions that may\n // try to trigger re-render. This mirrors the setup in executeComponent().\n // Use prebound enqueue helper to avoid allocating a new closure\n instance.notifyUpdate = instance._enqueueRun!;\n\n const wasFirstMount = !instance.mounted;\n instance.mounted = true;\n commitLifecycleForInstance(instance, wasFirstMount);\n}\n\n/**\n * Run a component synchronously: execute function, handle result\n * This is the internal workhorse that manages async continuations and generation tracking.\n * Must always be called through the scheduler.\n *\n * ACTOR INVARIANT: This function is enqueued as a task, never called directly.\n */\nlet _globalRenderCounter = 0;\n\nfunction resetRenderState(instance: ComponentInstance): void {\n instance.stateIndexCheck = -1;\n\n for (const state of instance.stateValues) {\n if (state) {\n state._hasBeenRead = false;\n }\n }\n\n instance._pendingReadSources = undefined;\n instance._pendingReadSourceVersions = undefined;\n}\n\nfunction nextRenderToken(): number {\n return ++_globalRenderCounter;\n}\n\nexport function renderScopedComponent<T>(\n instance: ComponentInstance,\n startStateIndex: number,\n render: () => T\n): T {\n const savedInstance = currentInstance;\n const savedPortalScope = currentPortalScope;\n const savedStateIndex = stateIndex;\n\n instance.notifyUpdate = instance._enqueueRun!;\n resetRenderState(instance);\n instance._currentRenderToken = nextRenderToken();\n\n currentInstance = instance;\n currentPortalScope = instance.portalScope ?? savedPortalScope;\n stateIndex = startStateIndex;\n\n let didComplete = false;\n\n try {\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n const result = withContext(executionFrame, render);\n didComplete = true;\n return result;\n } finally {\n if (!didComplete) {\n instance._pendingReadSources = undefined;\n instance._pendingReadSourceVersions = undefined;\n instance._currentRenderToken = undefined;\n }\n currentInstance = savedInstance;\n currentPortalScope = savedPortalScope;\n stateIndex = savedStateIndex;\n }\n}\n\nfunction runComponent(instance: ComponentInstance): void {\n // CRITICAL: Ensure notifyUpdate is available for state.set() calls during this render.\n // This must be set before executeComponentSync() runs, not after.\n // Use prebound enqueue helper to avoid allocating per-render closures\n instance.notifyUpdate = instance._enqueueRun!;\n\n // Assign a token for this in-progress render and start a fresh pending-read set\n instance._currentRenderToken = nextRenderToken();\n instance._pendingReadSources = undefined;\n const domSnapshot = instance.target ? instance.target.innerHTML : '';\n\n let result: unknown | Promise<unknown>;\n try {\n result = executeComponentSync(instance);\n } catch (err) {\n discardCommitOperations(instance);\n throw err;\n }\n if (isPromiseLike(result)) {\n // Async components are not supported. Components must be synchronous and\n // must not return a Promise from their render function.\n throw new Error(\n 'Async components are not supported. Components must be synchronous.'\n );\n } else {\n // Try runtime fast-lane synchronously; if it activates we do not enqueue\n // follow-up work and the commit happens atomically in this task.\n // (Runtime fast-lane has conservative preconditions.)\n const fastlaneBridge = (\n globalThis as {\n __ASKR_FASTLANE?: {\n tryRuntimeFastLaneSync?: (\n instance: unknown,\n result: unknown\n ) => boolean;\n };\n }\n ).__ASKR_FASTLANE;\n try {\n const used = fastlaneBridge?.tryRuntimeFastLaneSync?.(instance, result);\n if (used) {\n warnUnusedStateReads(instance);\n return;\n }\n } catch (err) {\n // If invariant check failed in dev, surface the error; otherwise fall back\n if (isDevelopmentEnvironment()) throw err;\n }\n\n // Fallback: enqueue the render/commit normally\n globalScheduler.enqueue(() => {\n // Handle placeholder-based updates: when a component initially returned null,\n // we created a comment placeholder. If it now has content, we need to create\n // a host element and replace the placeholder.\n if (!instance.target && instance._placeholder) {\n // Component previously returned null (has placeholder), check if now has content\n if (result === null || result === undefined) {\n // Still null - nothing to do, keep placeholder\n finalizeReadSubscriptions(instance);\n warnUnusedStateReads(instance);\n commitRenderedComponent(instance);\n return;\n }\n\n // Has content now - need to create DOM and replace placeholder\n const placeholder = instance._placeholder;\n const parent = placeholder.parentNode;\n if (!parent) {\n // Placeholder was removed from DOM - can't render\n logger.warn(\n '[Askr] placeholder no longer in DOM, cannot render component'\n );\n return;\n }\n\n // Create a new host element for the content\n const host = document.createElement('div');\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n\n // Set up instance for normal updates\n const oldInstance = currentInstance;\n currentInstance = instance;\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n evaluate(result, host);\n });\n\n // Replace placeholder with host\n parent.replaceChild(host, placeholder);\n } catch (err) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw err;\n }\n\n // Set up instance for future updates\n instance.target = host;\n instance._placeholder = undefined;\n (\n host as Element & { __ASKR_INSTANCE?: ComponentInstance }\n ).__ASKR_INSTANCE = instance;\n\n flushLifecycleCommitBatch(lifecycleBatch);\n finalizeReadSubscriptions(instance);\n warnUnusedStateReads(instance);\n commitRenderedComponent(instance);\n } finally {\n currentInstance = oldInstance;\n }\n return;\n }\n\n if (instance.target) {\n let oldChildren: Node[] = [];\n let restoredOldChildren = false;\n try {\n const wasFirstMount = !instance.mounted;\n // Ensure nested component executions during evaluation have access to\n // the current component instance. This allows nested components to\n // call `state()`, `resource()`, and other runtime helpers which\n // rely on `getCurrentComponentInstance()` being available.\n const oldInstance = currentInstance;\n currentInstance = instance;\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n // Capture snapshot of current children (by reference) so we can\n // restore them on render failure without losing event listeners or\n // instance attachments.\n oldChildren = Array.from(instance.target.childNodes);\n\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n evaluate(result, instance.target, undefined, instance);\n });\n } catch (e) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw e;\n }\n } catch (e) {\n // If evaluation failed, attempt to cleanup any partially-added nodes\n // and restore the old children to preserve listeners and instances.\n try {\n const newChildren = Array.from(instance.target.childNodes);\n const preservedChildren = new Set(oldChildren);\n for (const n of newChildren) {\n if (preservedChildren.has(n)) {\n continue;\n }\n try {\n cleanupInstancesUnder(n);\n } catch (err) {\n logger.warn(\n '[Askr] error cleaning up failed commit children:',\n err\n );\n }\n }\n } catch (_err) {\n void _err;\n }\n\n // Restore original children by re-inserting the old node references\n // this preserves attached listeners and instance backrefs.\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_RESTORE',\n new Error().stack\n );\n } catch (e) {\n void e;\n }\n instance.target.replaceChildren(...oldChildren);\n restoredOldChildren = true;\n throw e;\n } finally {\n currentInstance = oldInstance;\n }\n\n flushLifecycleCommitBatch(lifecycleBatch);\n\n // Commit succeeded — finalize recorded state reads so subscriptions reflect\n // the last *committed* render. This updates per-state reader maps\n // deterministically and synchronously with the commit.\n finalizeReadSubscriptions(instance);\n warnUnusedStateReads(instance);\n\n instance.mounted = true;\n // Execute mount operations after first mount (do NOT run these with\n // currentInstance set - they may perform state mutations/registrations)\n executeCommittedLifecycleOperations(instance, wasFirstMount);\n } catch (renderError) {\n discardCommitOperations(instance);\n // Atomic rendering: rollback on render error. Attempt non-lossy restore of\n // original child node references to preserve listeners/instances.\n try {\n const currentChildren = Array.from(instance.target.childNodes);\n const preservedChildren = restoredOldChildren\n ? new Set(oldChildren)\n : null;\n for (const n of currentChildren) {\n if (preservedChildren?.has(n)) {\n continue;\n }\n try {\n cleanupInstancesUnder(n);\n } catch (err) {\n logger.warn(\n '[Askr] error cleaning up partial children during rollback:',\n err\n );\n }\n }\n } catch (_err) {\n void _err;\n }\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_ROLLBACK',\n new Error().stack\n );\n instance.target.replaceChildren(...oldChildren);\n } catch {\n // Fallback to innerHTML restore if replaceChildren fails for some reason.\n instance.target.innerHTML = domSnapshot;\n }\n\n throw renderError;\n }\n }\n });\n }\n}\n\n/**\n * Execute a component's render function synchronously.\n * Returns either a vnode/promise immediately (does NOT render).\n * Rendering happens separately through runComponent.\n */\nexport function renderComponentInline(\n instance: ComponentInstance\n): unknown | Promise<unknown> {\n // Reused inline instances can cross renderer cleanup boundaries while their\n // host node is retained. Make sure state writes still enqueue this instance.\n instance.notifyUpdate = instance._enqueueRun!;\n\n // Ensure inline executions (rendered during parent's evaluate) still\n // receive a render token and have their state reads finalized so\n // subscriptions are correctly recorded. If this function is called\n // as part of a scheduled run, the token will already be set by\n // runComponent and we should not overwrite it.\n const hadToken = instance._currentRenderToken !== undefined;\n const prevToken = instance._currentRenderToken;\n const prevPendingReads = instance._pendingReadSources;\n const prevPendingReadVersions = instance._pendingReadSourceVersions;\n const savedInstance = currentInstance;\n const savedPortalScope = currentPortalScope;\n\n if (!hadToken) {\n instance._currentRenderToken = nextRenderToken();\n instance._pendingReadSources = undefined;\n instance._pendingReadSourceVersions = undefined;\n }\n\n try {\n const result = executeComponentSync(instance);\n // If we set the token for inline execution, finalize subscriptions now\n // unless the parent DOM commit is still provisional. Renderer commit\n // batches flush these reads only after DOM evaluation succeeds.\n if (!hadToken) {\n finalizeInlineReadSubscriptions(\n instance,\n instance._currentRenderToken!,\n instance._pendingReadSources,\n instance._pendingReadSourceVersions\n );\n }\n commitRenderedComponent(instance);\n return result;\n } finally {\n // Restore previous token/read states for nested inline render scenarios\n instance._currentRenderToken = prevToken;\n instance._pendingReadSources = prevPendingReads;\n instance._pendingReadSourceVersions = prevPendingReadVersions;\n currentInstance = savedInstance;\n currentPortalScope = savedPortalScope;\n }\n}\n\nexport function warnUnusedStateReads(instance: ComponentInstance): void {\n for (let i = 0; i < instance.stateValues.length; i++) {\n const state = instance.stateValues[i];\n const hasCommittedUsage =\n (state?._readers?.size ?? 0) > 0 ||\n ((state as { _derivedSubscribers?: Set<unknown> } | undefined)\n ?._derivedSubscribers?.size ?? 0) > 0;\n\n if (\n state &&\n !state._hasBeenRead &&\n !state._hasEverBeenRead &&\n !hasCommittedUsage\n ) {\n try {\n const name = instance.fn?.name || '<anonymous>';\n warnInstanceOnce(\n instance,\n `unused-state:${i}`,\n `[askr] Unused state variable detected in ${name} at index ${i}. State should be read during render or removed.`\n );\n } catch {\n warnInstanceOnce(\n instance,\n `unused-state:${i}`,\n `[askr] Unused state variable detected. State should be read during render or removed.`\n );\n }\n }\n }\n}\n\nfunction executeComponentSync(\n instance: ComponentInstance\n): unknown | Promise<unknown> {\n resetRenderState(instance);\n incDevCounter('componentRuns');\n incDevCounter('componentReruns');\n\n const savedPortalScope = currentPortalScope;\n currentInstance = instance;\n currentPortalScope = instance.portalScope ?? savedPortalScope;\n stateIndex = 0;\n\n let didComplete = false;\n\n try {\n // Track render time in dev mode\n const renderStartTime = isDevelopmentEnvironment() ? Date.now() : 0;\n\n // Create context object with abort signal\n const context = {\n get signal(): AbortSignal {\n return ensureAbortController(instance).signal;\n },\n };\n\n // Execute component within its owner frame (provider chain).\n // This ensures all context reads see the correct provider values.\n // We create a new execution frame whose parent is the ownerFrame. The\n // `values` map is lazily allocated to avoid per-render Map allocations\n // for components that do not use context.\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n const result = withContext(executionFrame, () =>\n instance.fn(instance.props, context)\n );\n\n // Check render time\n const renderTime = Date.now() - renderStartTime;\n if (renderTime > 5) {\n warnInstanceOnce(\n instance,\n 'slow-render',\n `[askr] Slow render detected: ${renderTime}ms. Consider optimizing component performance.`\n );\n }\n\n // Mark first render complete after successful execution\n // This enables hook order validation on subsequent renders\n if (!instance.firstRenderComplete) {\n instance.firstRenderComplete = true;\n }\n\n didComplete = true;\n return result;\n } finally {\n if (!didComplete) {\n discardCommitOperations(instance);\n }\n // Synchronous path: we did not push a fresh frame, so nothing to pop here.\n currentInstance = null;\n currentPortalScope = savedPortalScope;\n }\n}\n\n/**\n * Public entry point: Execute component with full lifecycle (execute + render)\n * Handles both initial mount and re-execution. Always enqueues through scheduler.\n * Single entry point to avoid lifecycle divergence.\n */\nexport function executeComponent(instance: ComponentInstance): void {\n // Lazily recreate abort controller only when signal is actually requested.\n instance.abortController = null;\n\n // Setup notifyUpdate callback using prebound helper to avoid per-call closures\n instance.notifyUpdate = instance._enqueueRun!;\n\n // Enqueue the initial component run\n globalScheduler.enqueue(instance._pendingRunTask!);\n}\n\nexport function getCurrentInstance(): ComponentInstance | null {\n return currentInstance;\n}\n\n/**\n * Get the abort signal for the current component\n * Used to cancel async operations on unmount/navigation\n *\n * The signal is guaranteed to be aborted when:\n * - Component unmounts\n * - Navigation occurs (different route)\n * - Parent is destroyed\n *\n * IMPORTANT: getSignal() must be called during component render execution.\n * It captures the current component instance from context.\n *\n * @returns AbortSignal that will be aborted when component unmounts\n * @throws Error if called outside component execution\n *\n * @example\n * ```ts\n * // ✅ Correct: called during render, used in async operation\n * export async function UserPage({ id }: { id: string }) {\n * const signal = getSignal();\n * const user = await fetch(`/api/users/${id}`, { signal });\n * return <div>{user.name}</div>;\n * }\n *\n * // ✅ Correct: passed to event handler\n * export function Button() {\n * const signal = getSignal();\n * return {\n * type: 'button',\n * props: {\n * onClick: async () => {\n * const data = await fetch(url, { signal });\n * }\n * }\n * };\n * }\n *\n * // ❌ Wrong: called outside component context\n * const signal = getSignal(); // Error: not in component\n * ```\n */\nexport function getSignal(): AbortSignal {\n if (!currentInstance) {\n throw new Error(\n 'getSignal() can only be called during component render execution. ' +\n 'Ensure you are calling this from inside your component function.'\n );\n }\n return ensureAbortController(currentInstance).signal;\n}\n\n/**\n * Finalize read subscriptions for an instance after a successful commit.\n * - Update per-state readers map to point to this instance's last committed token\n * - Remove this instance from states it no longer reads\n * This is deterministic and runs synchronously with commit to ensure\n * subscribers are only notified when they actually read a state in their\n * last committed render.\n */\nexport function finalizeReadSubscriptions(instance: ComponentInstance): void {\n finalizeReadableSubscriptions(instance);\n}\n\nexport function getNextStateIndex(): number {\n return stateIndex++;\n}\n\nexport function claimHookIndex(\n instance: ComponentInstance,\n hookName: string\n): number {\n const index = getNextStateIndex();\n\n if (index < instance.stateIndexCheck) {\n throw new Error(\n `Hook index violation: ${hookName}() call at index ${index}, ` +\n `but previously saw index ${instance.stateIndexCheck}. ` +\n `This happens when render-scoped hooks are called conditionally (inside if/for/etc). ` +\n `Move all ${hookName}() calls to the top level of your component function, ` +\n `before any conditionals.`\n );\n }\n\n instance.stateIndexCheck = index;\n\n if (instance.firstRenderComplete) {\n if (instance.expectedStateIndices[index] !== index) {\n throw new Error(\n `Hook order violation: ${hookName}() called at index ${index}, ` +\n `but this index was not in the first render's sequence [${instance.expectedStateIndices.join(', ')}]. ` +\n `This usually means ${hookName}() is inside a conditional or loop. ` +\n `Move all render-scoped hooks to the top level of your component function.`\n );\n }\n } else {\n instance.expectedStateIndices.push(index);\n }\n\n return index;\n}\n\nexport function getCurrentStateIndex(): number {\n return stateIndex;\n}\n\nexport function resetStateIndex(): void {\n stateIndex = 0;\n}\n\nexport function setStateIndex(value: number): void {\n stateIndex = value;\n}\n\n/**\n * Mount a component instance.\n * This is just an alias to executeComponent() to maintain API compatibility.\n * All lifecycle logic is unified in executeComponent().\n */\nexport function mountComponent(instance: ComponentInstance): void {\n executeComponent(instance);\n}\n\n/**\n * Clean up component — abort pending operations\n * Called on unmount or route change\n */\nexport function cleanupComponent(instance: ComponentInstance): void {\n const savedInstance = currentInstance;\n const savedPortalScope = currentPortalScope;\n currentInstance = null;\n currentPortalScope = null;\n\n try {\n const cleanupErrors: unknown[] = [];\n const recordCleanupError = (message: string, err: unknown): void => {\n if (instance.cleanupStrict) {\n cleanupErrors.push(err);\n } else if (isDevelopmentEnvironment()) {\n logger.warn(message, err);\n }\n };\n\n const ownedChildScopes = instance._ownedChildScopes;\n if (ownedChildScopes && ownedChildScopes.size > 0) {\n instance._ownedChildScopes = new Set();\n for (const scope of ownedChildScopes) {\n try {\n scope.dispose();\n } catch (err) {\n recordCleanupError('[Askr] child scope cleanup threw:', err);\n }\n }\n }\n\n // Execute cleanup functions (from mount effects)\n const cleanupFns = instance.cleanupFns;\n instance.cleanupFns = [];\n for (const cleanup of cleanupFns) {\n try {\n cleanup();\n } catch (err) {\n recordCleanupError('[Askr] cleanup function threw:', err);\n }\n }\n\n // Remove deterministic state subscriptions for this instance\n try {\n cleanupReadableSubscriptions(instance);\n } catch (err) {\n recordCleanupError('[Askr] readable subscription cleanup threw:', err);\n }\n\n // Abort all pending operations\n try {\n if (\n instance.abortController &&\n !instance.abortController.signal.aborted\n ) {\n instance.abortController.abort();\n }\n } catch (err) {\n recordCleanupError('[Askr] abort controller cleanup threw:', err);\n }\n instance.abortController = null;\n\n // Clear update callback to prevent dangling references and stale updates\n instance.lifecycleGeneration++;\n instance.evaluationGeneration++;\n instance.mountOperations = [];\n instance.commitOperations = [];\n instance.lifecycleSlots = [];\n instance.hasPendingUpdate = false;\n instance.notifyUpdate = null;\n instance._placeholder = undefined;\n\n // Mark instance as unmounted so external tracking (e.g., portal host lists)\n // can deterministically prune stale instances. Not marking this leads to\n // retained \"mounted\" flags across cleanup boundaries which breaks\n // owner selection in the portal fallback.\n instance.mounted = false;\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n cleanupErrors,\n `Cleanup failed for component ${instance.id}`\n );\n }\n } finally {\n currentInstance = savedInstance;\n currentPortalScope = savedPortalScope;\n }\n}\n\nexport function registerOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n const scopes = (instance._ownedChildScopes ??= new Set());\n scopes.add(scope);\n}\n\nexport function unregisterOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n instance._ownedChildScopes?.delete(scope);\n}\n\nfunction warnInstanceOnce(\n instance: ComponentInstance,\n key: string,\n message: string\n): void {\n if (isProductionEnvironment()) return;\n const warnings = (instance.devWarningsEmitted ??= new Set());\n if (warnings.has(key)) return;\n warnings.add(key);\n logger.warn(message);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuFA,SAAgB,wBACd,IACA,IACA,OACA,QACmB;CACnB,MAAM,WAA8B;EAClC;EACA;EACA;EACA;EACA,gBAAgB;EAChB,aAAa,iBAAiB,eAAe,sBAAsB;EACnE,SAAS;EACT,iBAAiB;EACjB,aAAa,CAAC;EACd,sBAAsB;EACtB,cAAc;EAEd,mBAAmB;EACnB,iBAAiB;EACjB,aAAa;EACb,iBAAiB;EACjB,sBAAsB,CAAC;EACvB,qBAAqB;EACrB,iBAAiB,CAAC;EAClB,kBAAkB,CAAC;EACnB,YAAY,CAAC;EACb,gBAAgB,CAAC;EACjB,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,KAAK;EACL,eAAe;EACf,QAAQ;EAGR,qBAAqB;EACrB,iBAAiB;EACjB,qBAAqB;EACrB,4BAA4B;EAC5B,kBAAkB;EAClB,oBAAoB;CACtB;CAGA,SAAS,wBAAwB;EAE/B,SAAS,mBAAmB;EAC5B,IAAI,SAAS,iBAAiB,MAC5B;EAGF,aAAa,QAAQ;CACvB;CAEA,SAAS,oBAAoB;EAC3B,IAAI,CAAC,SAAS,kBAAkB;GAC9B,SAAS,mBAAmB;GAE5B,gBAAgB,QAAQ,SAAS,eAAgB;EACnD;CACF;CAIA,SAAS,oBAAoB,SAAS;CAEtC,OAAO;AACT;AAEA,IAAI,kBAA4C;AAChD,IAAI,qBAAoC;AACxC,IAAI,aAAa;AAOjB,SAAS,sBAAsB,UAA8C;CAC3E,IAAI,aAAa,SAAS;CAC1B,IAAI,CAAC,cAAc,WAAW,OAAO,SAAS;EAC5C,aAAa,IAAI,gBAAgB;EACjC,SAAS,kBAAkB;CAC7B;CACA,OAAO;AACT;AAGA,SAAgB,8BAAwD;CACtE,OAAO;AACT;AAGA,SAAgB,4BACd,UACM;CACN,kBAAkB;CAClB,qBAAqB,UAAU,eAAe;AAChD;AAEA,SAAgB,wBAAuC;CACrD,OAAO,iBAAiB,eAAe;AACzC;AA8CA,IAAI,8BAA2D;AAE/D,SAAS,4BAAkD;CACzD,MAAM,QAA8B;EAClC,QAAQ;EACR,SAAS,CAAC;EACV,mCAAmB,IAAI,IAAI;EAC3B,aAAa,CAAC;EACd,uCAAuB,IAAI,IAAI;EAC/B,iBAAiB,CAAC;EAClB,2CAA2B,IAAI,IAAI;EACnC,QAAQ;CACV;CACA,8BAA8B;CAC9B,OAAO;AACT;AAEA,SAAS,0BAA0B,OAAsC;CACvE,IAAI,CAAC,MAAM,QACT,OAAO;CAGT,MAAM,SAAS;CACf,8BAA8B,MAAM;CACpC,OAAO;AACT;AAEA,SAAS,uBACP,OACA,UACA,eACM;CACN,MAAM,WAAW,MAAM,kBAAkB,IAAI,QAAQ;CACrD,IAAI,UAAU;EACZ,SAAS,gBAAgB,SAAS,iBAAiB;EACnD;CACF;CAEA,MAAM,QAAQ;EAAE;EAAU;CAAc;CACxC,MAAM,kBAAkB,IAAI,UAAU,KAAK;CAC3C,MAAM,QAAQ,KAAK,KAAK;AAC1B;AAEA,SAAS,8BACP,OACA,UACA,OACA,oBACA,2BACM;CACN,MAAM,WAAW,MAAM,sBAAsB,IAAI,QAAQ;CACzD,MAAM,SAAS,YAAY;EACzB;EACA;EACA;EACA;CACF;CAEA,OAAO,QAAQ;CACf,OAAO,qBAAqB,qBACxB,IAAI,IAAI,kBAAkB,IAC1B;CACJ,OAAO,4BAA4B,4BAC/B,IAAI,IAAI,yBAAyB,IACjC;CAEJ,IAAI,CAAC,UAAU;EACb,MAAM,sBAAsB,IAAI,UAAU,MAAM;EAChD,MAAM,YAAY,KAAK,MAAM;CAC/B;AACF;AAEA,SAAS,4BACP,OACA,UACM;CACN,IAAI,MAAM,0BAA0B,IAAI,SAAS,QAAQ,GACvD;CAGF,MAAM,0BAA0B,IAAI,SAAS,UAAU,QAAQ;CAC/D,MAAM,gBAAgB,KAAK,QAAQ;AACrC;AAEA,SAAgB,4BAA4B,UAAmC;CAC7E,IAAI,CAAC,6BAA6B,QAChC;CAGF,4BAA4B,6BAA6B;EACvD;EACA,OAAO,SAAS;EAChB,YAAY,SAAS;EACrB,aAAa,SAAS;EACtB,gBAAgB,SAAS;EACzB,QAAQ,SAAS;CACnB,CAAC;AACH;AAEA,SAAS,gCACP,UACA,OACA,oBACA,2BACM;CACN,IAAI,6BAA6B,QAAQ;EACvC,8BACE,6BACA,UACA,OACA,oBACA,yBACF;EACA;CACF;CAEA,0CACE,UACA,OACA,oBACA,yBACF;AACF;AAEA,SAAS,0BAA0B,OAAmC;CACpE,IAAI,CAAC,0BAA0B,KAAK,GAClC;CAGF,IAAI,MAAM,QAAQ,QAAQ;EACxB,KAAK,MAAM,YAAY,MAAM,iBAC3B,4BAA4B,MAAM,QAAQ,QAAQ;EAEpD,KAAK,MAAM,UAAU,MAAM,aACzB,8BACE,MAAM,QACN,OAAO,UACP,OAAO,OACP,OAAO,oBACP,OAAO,yBACT;EAEF,KAAK,MAAM,SAAS,MAAM,SACxB,uBAAuB,MAAM,QAAQ,MAAM,UAAU,MAAM,aAAa;EAE1E;CACF;CAEA,KAAK,MAAM,UAAU,MAAM,aACzB,0CACE,OAAO,UACP,OAAO,OACP,OAAO,oBACP,OAAO,yBACT;CAGF,KAAK,MAAM,SAAS,MAAM,SACxB,oCAAoC,MAAM,UAAU,MAAM,aAAa;AAE3E;AAEA,SAAS,4BAA4B,OAAmC;CACtE,IAAI,CAAC,0BAA0B,KAAK,GAClC;CAGF,KAAK,IAAI,QAAQ,MAAM,gBAAgB,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;EACzE,MAAM,WAAW,MAAM,gBAAgB;EACvC,SAAS,SAAS,QAAQ,SAAS;EACnC,SAAS,SAAS,aAAa,SAAS;EACxC,SAAS,SAAS,cAAc,SAAS;EACzC,SAAS,SAAS,iBAAiB,SAAS;EAC5C,SAAS,SAAS,SAAS,SAAS;CACtC;CAEA,KAAK,MAAM,SAAS,MAAM,SAAS;EACjC,IAAI,MAAM,eACR,MAAM,SAAS,kBAAkB,CAAC;EAEpC,wBAAwB,MAAM,QAAQ;CACxC;AACF;AAoBA,SAAgB,wBAAwB,WAAqC;CAC3E,MAAM,WAAW,4BAA4B;CAC7C,IAAI,UAAU;EACZ,IAAI,mBAAmB,GAAG;GACxB,IAAI,yBAAyB,GAC3B,MAAM,IAAI,MACR,6DACF;GAEF;EACF;EACA,SAAS,iBAAiB,KAAK,SAAS;CAC1C;AACF;AAEA,SAAS,+BACP,UACA,qBACA,QACM;CACN,IAAI,cAAc,MAAM,GACtB,QAAQ,QAAQ,MAAM,CAAC,CAAC,MACrB,YAAY;EACX,IAAI,OAAO,YAAY,YAAY;GACjC,IACE,SAAS,wBAAwB,uBACjC,SAAS,SACT;IACA,SAAS,WAAW,KAAK,OAAO;IAChC;GACF;GAEA,IAAI;IACF,QAAQ;GACV,SAAS,KAAK;IACZ,OAAO,MAAM,sCAAsC,GAAG;GACxD;EACF;CACF,IACC,QAAQ;EACP,OAAO,MAAM,wCAAwC,GAAG;CAC1D,CACF;MACK,IAAI,OAAO,WAAW,YAC3B,SAAS,WAAW,KAAK,MAAM;AAEnC;;;;;AAMA,SAAS,uBAAuB,UAAmC;CACjE,MAAM,kBAAkB,SAAS;CACjC,IAAI,gBAAgB,WAAW,GAC7B;CAGF,MAAM,sBAAsB,SAAS;CAErC,KAAK,MAAM,aAAa,iBACtB,+BAA+B,UAAU,qBAAqB,UAAU,CAAC;CAG3E,SAAS,kBAAkB,CAAC;AAC9B;AAEA,SAAS,wBAAwB,UAAmC;CAClE,MAAM,mBAAmB,SAAS;CAClC,IAAI,iBAAiB,WAAW,GAC9B;CAGF,SAAS,mBAAmB,CAAC;CAC7B,MAAM,sBAAsB,SAAS;CAErC,KAAK,MAAM,aAAa,kBACtB,+BAA+B,UAAU,qBAAqB,UAAU,CAAC;AAE7E;AAEA,SAAS,wBAAwB,UAAmC;CAClE,SAAS,mBAAmB,CAAC;AAC/B;AAEA,SAAS,oCACP,UACA,eACM;CACN,IAAI,iBAAiB,SAAS,gBAAgB,SAAS,GACrD,uBAAuB,QAAQ;CAEjC,IAAI,SAAS,iBAAiB,SAAS,GACrC,wBAAwB,QAAQ;AAEpC;AAEA,SAAS,2BACP,UACA,eACM;CACN,IAAI,6BAA6B;EAC/B,uBACE,6BACA,UACA,aACF;EACA;CACF;CAEA,oCAAoC,UAAU,aAAa;AAC7D;AAEA,SAAgB,wBAAwB,UAAmC;CACzE,IAAI,SAAS,WAAW,SAAS,iBAAiB,SAAS,GACzD,2BAA2B,UAAU,KAAK;AAE9C;AAEA,SAAgB,oBACd,UACA,QACM;CACN,SAAS,SAAS;CAGlB,IAAI;EACF,IAAI,kBAAkB,SAAS;GAC7B,MAAM,OAAO;GAKb,MAAM,iBADY,KAAK,oBAAoB,CAAC,EACtB,CAAU,QAAQ,UAAU,UAAU,QAAQ;GACpE,cAAc,KAAK,QAAQ;GAC3B,KAAK,mBAAmB;GACxB,KAAK,kBAAkB,cAAc,MAAM;EAC7C;CACF,SAAS,KAAK,CAEd;CAKA,SAAS,eAAe,SAAS;CAEjC,MAAM,gBAAgB,CAAC,SAAS;CAChC,SAAS,UAAU;CACnB,2BAA2B,UAAU,aAAa;AACpD;;;;;;;;AASA,IAAI,uBAAuB;AAE3B,SAAS,iBAAiB,UAAmC;CAC3D,SAAS,kBAAkB;CAE3B,KAAK,MAAM,SAAS,SAAS,aAC3B,IAAI,OACF,MAAM,eAAe;CAIzB,SAAS,sBAAsB;CAC/B,SAAS,6BAA6B;AACxC;AAEA,SAAS,kBAA0B;CACjC,OAAO,EAAE;AACX;AAEA,SAAgB,sBACd,UACA,iBACA,QACG;CACH,MAAM,gBAAgB;CACtB,MAAM,mBAAmB;CACzB,MAAM,kBAAkB;CAExB,SAAS,eAAe,SAAS;CACjC,iBAAiB,QAAQ;CACzB,SAAS,sBAAsB,gBAAgB;CAE/C,kBAAkB;CAClB,qBAAqB,SAAS,eAAe;CAC7C,aAAa;CAEb,IAAI,cAAc;CAElB,IAAI;EAKF,MAAM,SAAS,YAAY;GAHzB,QAAQ,SAAS;GACjB,QAAQ;EAEiB,GAAgB,MAAM;EACjD,cAAc;EACd,OAAO;CACT,UAAU;EACR,IAAI,CAAC,aAAa;GAChB,SAAS,sBAAsB;GAC/B,SAAS,6BAA6B;GACtC,SAAS,sBAAsB;EACjC;EACA,kBAAkB;EAClB,qBAAqB;EACrB,aAAa;CACf;AACF;AAEA,SAAS,aAAa,UAAmC;CAIvD,SAAS,eAAe,SAAS;CAGjC,SAAS,sBAAsB,gBAAgB;CAC/C,SAAS,sBAAsB;CAC/B,MAAM,cAAc,SAAS,SAAS,SAAS,OAAO,YAAY;CAElE,IAAI;CACJ,IAAI;EACF,SAAS,qBAAqB,QAAQ;CACxC,SAAS,KAAK;EACZ,wBAAwB,QAAQ;EAChC,MAAM;CACR;CACA,IAAI,cAAc,MAAM,GAGtB,MAAM,IAAI,MACR,qEACF;MACK;EAIL,MAAM,iBACJ,WAQA;EACF,IAAI;GAEF,IADa,gBAAgB,yBAAyB,UAAU,MAAM,GAC5D;IACR,qBAAqB,QAAQ;IAC7B;GACF;EACF,SAAS,KAAK;GAEZ,IAAI,yBAAyB,GAAG,MAAM;EACxC;EAGA,gBAAgB,cAAc;GAI5B,IAAI,CAAC,SAAS,UAAU,SAAS,cAAc;IAE7C,IAAI,WAAW,QAAQ,WAAW,QAAW;KAE3C,0BAA0B,QAAQ;KAClC,qBAAqB,QAAQ;KAC7B,wBAAwB,QAAQ;KAChC;IACF;IAGA,MAAM,cAAc,SAAS;IAC7B,MAAM,SAAS,YAAY;IAC3B,IAAI,CAAC,QAAQ;KAEX,OAAO,KACL,8DACF;KACA;IACF;IAGA,MAAM,OAAO,SAAS,cAAc,KAAK;IACzC,MAAM,iBAA+B;KACnC,QAAQ,SAAS;KACjB,QAAQ;IACV;IAGA,MAAM,cAAc;IACpB,kBAAkB;IAClB,MAAM,iBAAiB,0BAA0B;IACjD,IAAI;KACF,IAAI;MACF,YAAY,sBAAsB;OAChC,SAAS,QAAQ,IAAI;MACvB,CAAC;MAGD,OAAO,aAAa,MAAM,WAAW;KACvC,SAAS,KAAK;MACZ,4BAA4B,cAAc;MAC1C,MAAM;KACR;KAGA,SAAS,SAAS;KAClB,SAAS,eAAe;KACxB,KAEE,kBAAkB;KAEpB,0BAA0B,cAAc;KACxC,0BAA0B,QAAQ;KAClC,qBAAqB,QAAQ;KAC7B,wBAAwB,QAAQ;IAClC,UAAU;KACR,kBAAkB;IACpB;IACA;GACF;GAEA,IAAI,SAAS,QAAQ;IACnB,IAAI,cAAsB,CAAC;IAC3B,IAAI,sBAAsB;IAC1B,IAAI;KACF,MAAM,gBAAgB,CAAC,SAAS;KAKhC,MAAM,cAAc;KACpB,kBAAkB;KAClB,MAAM,iBAA+B;MACnC,QAAQ,SAAS;MACjB,QAAQ;KACV;KAIA,cAAc,MAAM,KAAK,SAAS,OAAO,UAAU;KAEnD,MAAM,iBAAiB,0BAA0B;KACjD,IAAI;MACF,IAAI;OACF,YAAY,sBAAsB;QAChC,SAAS,QAAQ,SAAS,QAAQ,QAAW,QAAQ;OACvD,CAAC;MACH,SAAS,GAAG;OACV,4BAA4B,cAAc;OAC1C,MAAM;MACR;KACF,SAAS,GAAG;MAGV,IAAI;OACF,MAAM,cAAc,MAAM,KAAK,SAAS,OAAO,UAAU;OACzD,MAAM,oBAAoB,IAAI,IAAI,WAAW;OAC7C,KAAK,MAAM,KAAK,aAAa;QAC3B,IAAI,kBAAkB,IAAI,CAAC,GACzB;QAEF,IAAI;SACF,sBAAsB,CAAC;QACzB,SAAS,KAAK;SACZ,OAAO,KACL,oDACA,GACF;QACF;OACF;MACF,SAAS,MAAM,CAEf;MAIA,IAAI;OACF,cAAc,qBAAqB;OACnC,YACE,+DACA,IAAI,MAAM,EAAC,CAAC,KACd;MACF,SAAS,GAAG,CAEZ;MACA,SAAS,OAAO,gBAAgB,GAAG,WAAW;MAC9C,sBAAsB;MACtB,MAAM;KACR,UAAU;MACR,kBAAkB;KACpB;KAEA,0BAA0B,cAAc;KAKxC,0BAA0B,QAAQ;KAClC,qBAAqB,QAAQ;KAE7B,SAAS,UAAU;KAGnB,oCAAoC,UAAU,aAAa;IAC7D,SAAS,aAAa;KACpB,wBAAwB,QAAQ;KAGhC,IAAI;MACF,MAAM,kBAAkB,MAAM,KAAK,SAAS,OAAO,UAAU;MAC7D,MAAM,oBAAoB,sBACtB,IAAI,IAAI,WAAW,IACnB;MACJ,KAAK,MAAM,KAAK,iBAAiB;OAC/B,IAAI,mBAAmB,IAAI,CAAC,GAC1B;OAEF,IAAI;QACF,sBAAsB,CAAC;OACzB,SAAS,KAAK;QACZ,OAAO,KACL,8DACA,GACF;OACF;MACF;KACF,SAAS,MAAM,CAEf;KAEA,IAAI;MACF,cAAc,qBAAqB;MACnC,YACE,gEACA,IAAI,MAAM,EAAC,CAAC,KACd;MACA,SAAS,OAAO,gBAAgB,GAAG,WAAW;KAChD,QAAQ;MAEN,SAAS,OAAO,YAAY;KAC9B;KAEA,MAAM;IACR;GACF;EACF,CAAC;CACH;AACF;;;;;;AAOA,SAAgB,sBACd,UAC4B;CAG5B,SAAS,eAAe,SAAS;CAOjC,MAAM,WAAW,SAAS,wBAAwB;CAClD,MAAM,YAAY,SAAS;CAC3B,MAAM,mBAAmB,SAAS;CAClC,MAAM,0BAA0B,SAAS;CACzC,MAAM,gBAAgB;CACtB,MAAM,mBAAmB;CAEzB,IAAI,CAAC,UAAU;EACb,SAAS,sBAAsB,gBAAgB;EAC/C,SAAS,sBAAsB;EAC/B,SAAS,6BAA6B;CACxC;CAEA,IAAI;EACF,MAAM,SAAS,qBAAqB,QAAQ;EAI5C,IAAI,CAAC,UACH,gCACE,UACA,SAAS,qBACT,SAAS,qBACT,SAAS,0BACX;EAEF,wBAAwB,QAAQ;EAChC,OAAO;CACT,UAAU;EAER,SAAS,sBAAsB;EAC/B,SAAS,sBAAsB;EAC/B,SAAS,6BAA6B;EACtC,kBAAkB;EAClB,qBAAqB;CACvB;AACF;AAEA,SAAgB,qBAAqB,UAAmC;CACtE,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,YAAY,QAAQ,KAAK;EACpD,MAAM,QAAQ,SAAS,YAAY;EACnC,MAAM,qBACH,OAAO,UAAU,QAAQ,KAAK,MAC7B,OACE,qBAAqB,QAAQ,KAAK;EAExC,IACE,SACA,CAAC,MAAM,gBACP,CAAC,MAAM,oBACP,CAAC,mBAED,IAAI;GACF,MAAM,OAAO,SAAS,IAAI,QAAQ;GAClC,iBACE,UACA,gBAAgB,KAChB,4CAA4C,KAAK,YAAY,EAAE,iDACjE;EACF,QAAQ;GACN,iBACE,UACA,gBAAgB,KAChB,uFACF;EACF;CAEJ;AACF;AAEA,SAAS,qBACP,UAC4B;CAC5B,iBAAiB,QAAQ;CACzB,cAAc,eAAe;CAC7B,cAAc,iBAAiB;CAE/B,MAAM,mBAAmB;CACzB,kBAAkB;CAClB,qBAAqB,SAAS,eAAe;CAC7C,aAAa;CAEb,IAAI,cAAc;CAElB,IAAI;EAEF,MAAM,kBAAkB,yBAAyB,IAAI,KAAK,IAAI,IAAI;EAGlE,MAAM,UAAU,EACd,IAAI,SAAsB;GACxB,OAAO,sBAAsB,QAAQ,CAAC,CAAC;EACzC,EACF;EAWA,MAAM,SAAS,YAAY;GAHzB,QAAQ,SAAS;GACjB,QAAQ;EAEiB,SACzB,SAAS,GAAG,SAAS,OAAO,OAAO,CACrC;EAGA,MAAM,aAAa,KAAK,IAAI,IAAI;EAChC,IAAI,aAAa,GACf,iBACE,UACA,eACA,gCAAgC,WAAW,+CAC7C;EAKF,IAAI,CAAC,SAAS,qBACZ,SAAS,sBAAsB;EAGjC,cAAc;EACd,OAAO;CACT,UAAU;EACR,IAAI,CAAC,aACH,wBAAwB,QAAQ;EAGlC,kBAAkB;EAClB,qBAAqB;CACvB;AACF;;;;;;AAOA,SAAgB,iBAAiB,UAAmC;CAElE,SAAS,kBAAkB;CAG3B,SAAS,eAAe,SAAS;CAGjC,gBAAgB,QAAQ,SAAS,eAAgB;AACnD;AAEA,SAAgB,qBAA+C;CAC7D,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgB,YAAyB;CACvC,IAAI,CAAC,iBACH,MAAM,IAAI,MACR,oIAEF;CAEF,OAAO,sBAAsB,eAAe,CAAC,CAAC;AAChD;;;;;;;;;AAUA,SAAgB,0BAA0B,UAAmC;CAC3E,8BAA8B,QAAQ;AACxC;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;AACT;AAEA,SAAgB,eACd,UACA,UACQ;CACR,MAAM,QAAQ,kBAAkB;CAEhC,IAAI,QAAQ,SAAS,iBACnB,MAAM,IAAI,MACR,yBAAyB,SAAS,mBAAmB,MAAM,6BAC7B,SAAS,gBAAgB,iGAEzC,SAAS,+EAEzB;CAGF,SAAS,kBAAkB;CAE3B,IAAI,SAAS,qBACX;MAAI,SAAS,qBAAqB,WAAW,OAC3C,MAAM,IAAI,MACR,yBAAyB,SAAS,qBAAqB,MAAM,2DACD,SAAS,qBAAqB,KAAK,IAAI,EAAE,wBAC7E,SAAS,8GAEnC;CACF,OAEA,SAAS,qBAAqB,KAAK,KAAK;CAG1C,OAAO;AACT;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;AACT;;;;;;AAeA,SAAgB,eAAe,UAAmC;CAChE,iBAAiB,QAAQ;AAC3B;;;;;AAMA,SAAgB,iBAAiB,UAAmC;CAClE,MAAM,gBAAgB;CACtB,MAAM,mBAAmB;CACzB,kBAAkB;CAClB,qBAAqB;CAErB,IAAI;EACF,MAAM,gBAA2B,CAAC;EAClC,MAAM,sBAAsB,SAAiB,QAAuB;GAClE,IAAI,SAAS,eACX,cAAc,KAAK,GAAG;QACjB,IAAI,yBAAyB,GAClC,OAAO,KAAK,SAAS,GAAG;EAE5B;EAEA,MAAM,mBAAmB,SAAS;EAClC,IAAI,oBAAoB,iBAAiB,OAAO,GAAG;GACjD,SAAS,oCAAoB,IAAI,IAAI;GACrC,KAAK,MAAM,SAAS,kBAClB,IAAI;IACF,MAAM,QAAQ;GAChB,SAAS,KAAK;IACZ,mBAAmB,qCAAqC,GAAG;GAC7D;EAEJ;EAGA,MAAM,aAAa,SAAS;EAC5B,SAAS,aAAa,CAAC;EACvB,KAAK,MAAM,WAAW,YACpB,IAAI;GACF,QAAQ;EACV,SAAS,KAAK;GACZ,mBAAmB,kCAAkC,GAAG;EAC1D;EAIF,IAAI;GACF,6BAA6B,QAAQ;EACvC,SAAS,KAAK;GACZ,mBAAmB,+CAA+C,GAAG;EACvE;EAGA,IAAI;GACF,IACE,SAAS,mBACT,CAAC,SAAS,gBAAgB,OAAO,SAEjC,SAAS,gBAAgB,MAAM;EAEnC,SAAS,KAAK;GACZ,mBAAmB,0CAA0C,GAAG;EAClE;EACA,SAAS,kBAAkB;EAG3B,SAAS;EACT,SAAS;EACT,SAAS,kBAAkB,CAAC;EAC5B,SAAS,mBAAmB,CAAC;EAC7B,SAAS,iBAAiB,CAAC;EAC3B,SAAS,mBAAmB;EAC5B,SAAS,eAAe;EACxB,SAAS,eAAe;EAMxB,SAAS,UAAU;EAEnB,IAAI,cAAc,SAAS,GACzB,MAAM,IAAI,eACR,eACA,gCAAgC,SAAS,IAC3C;CAEJ,UAAU;EACR,kBAAkB;EAClB,qBAAqB;CACvB;AACF;AAEA,SAAgB,wBACd,UACA,OACM;CAEN,CADgB,SAAS,sCAAsB,IAAI,IAAI,EACvD,CAAO,IAAI,KAAK;AAClB;AAEA,SAAgB,0BACd,UACA,OACM;CACN,SAAS,mBAAmB,OAAO,KAAK;AAC1C;AAEA,SAAS,iBACP,UACA,KACA,SACM;CACN,IAAI,wBAAwB,GAAG;CAC/B,MAAM,WAAY,SAAS,uCAAuB,IAAI,IAAI;CAC1D,IAAI,SAAS,IAAI,GAAG,GAAG;CACvB,SAAS,IAAI,GAAG;CAChB,OAAO,KAAK,OAAO;AACrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for.d.ts","names":[],"sources":["../../src/runtime/for.ts"],"mappings":";;;;;;;;;UAoDiB,eAAA;EACf,GAAA;EACA,IAAA,EAAM,CAAA;EACN,YAAA,EAAc,CAAA;EACd,UAAA,EAAY,aAAA,CAAc,CAAA;EAC1B,mBAAA,EAAqB,GAAA,CAAI,WAAA,EAAa,qBAAA;EACtC,WAAA,EAAa,cAAA;EACb,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,aAAA,MAAmB,cAAA,CAAe,CAAA,WAC9B,CAAA;EACL,IAAA,IAAQ,CAAA;EACR,GAAA,CAAI,QAAA,EAAU,CAAA,EAAG,aAAA;AAAA;AAAA,KAGhB,qBAAA,GAAwB,cAAc;EAEvC,IAAA;EACA,GAAA,CAAI,QAAA,WAAmB,aAAA;AAAA;AAAA,KAGtB,cAAA,GAAiB,cAAc;EAEhC,IAAA;EACA,GAAA,CACE,QAAA,aAAqB,IAAA,sBACrB,aAAA;AAAA;AAAA,KAIM,iBAAA;AAAA,UAOK,QAAA;EACf,IAAA;EACA,YAAA,EAAc,CAAA;EACd,UAAA,EAAY,aAAA,CAAc,CAAA;EAC1B,QAAA,EAAU,KAAA;EACV,aAAA,EAAe,UAAA;EACf,KAAA,EAAO,GAAA,kBAAqB,eAAA,CAAgB,CAAA;EAC5C,WAAA,EAAa,KAAA;EACb,YAAA,EAAc,eAAA,CAAgB,CAAA;EAC9B,aAAA,EAAe,KAAA;EACf,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,CAAA,aAAc,IAAA,EAAM,CAAA,EAAG,KAAA;EAClD,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA;EAC5C,cAAA,EAAgB,iBAAA;EAChB,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,IAAA;EAClB,mBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,qBAAA;EACA,aAAA,EAAe,uBAAA,CAAwB,CAAA;EACvC,oBAAA;EACA,sBAAA;EACA,yBAAA;EACA,WAAA,GAAc,GAAA;AAAA;AAAA,iBAmBA,cAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA,EAC5C,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBA8BI,WAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA,EAC5C,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBAkZI,kBAAA,IACd,GAAA,mBACA,IAAA,EAAM,CAAA,EACN,KAAA,UACA,QAAA,EAAU,QAAA,CAAS,CAAA,IAClB,eAAA,CAAgB,CAAA;AAAA,iBAmMH,iBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,QAAA,EAAU,CAAA,KACT,KAAA;AAAA,iBA6hBa,gBAAA,IAAoB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,KAAA;AAAA,iBAS5C,sBAAA,IAA0B,QAAA,EAAU,QAAQ,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for.js","names":[],"sources":["../../src/runtime/for.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages per-item component instances and array reconciliation\n * to eliminate over-invalidation in list rendering.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport { type DOMElement, type VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { teardownNodeSubtree } from '../renderer/cleanup';\nimport {\n createChildScope,\n disposeChildScope,\n type ChildScope,\n} from './child-scope';\nimport type { ForProps } from '../control/for';\nimport type { ForEachSource } from '../control/for';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\nimport type { FineGrainedEffectHandle } from './effect';\nimport {\n flushBenchMetrics,\n getBenchMetrics,\n isBenchBuildEnabled,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchFastLane,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nconst BENCH_BUILD_ENABLED = isBenchBuildEnabled();\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n};\n\nexport interface ForItemInstance<T> {\n key: string | number;\n item: T;\n reactiveItem: T;\n itemSignal: ForItemSignal<T> | null;\n itemPropertySignals: Map<PropertyKey, ForItemPropertySignal> | null;\n indexSignal: ForIndexSignal;\n scope: ChildScope;\n}\n\ntype ForItemSignal<T> = ReadableSource<T> &\n (() => T) & {\n peek(): T;\n set(newValue: T, notifyReaders?: boolean): void;\n };\n\ntype ForItemPropertySignal = ReadableSource<unknown> &\n (() => unknown) & {\n peek(): unknown;\n set(newValue: unknown, notifyReaders?: boolean): void;\n };\n\ntype ForIndexSignal = ReadableSource<number> &\n (() => number) & {\n peek(): number;\n set(\n newValue: number | ((prev: number) => number),\n notifyReaders?: boolean\n ): void;\n };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedItems: ForItemInstance<T>[];\n orderedVNodes: VNode[];\n byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);\n renderFn: (item: T, index: () => number) => VNode;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedItems: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nfunction createForIndexSignal(initialIndex: number): ForIndexSignal {\n let indexValue = initialIndex;\n const readers = new Map<ComponentInstance, number>();\n\n const indexSignal = (() => {\n indexSignal._hasBeenRead = true;\n recordReadableRead(indexSignal);\n return indexValue;\n }) as ForIndexSignal;\n indexSignal._readers = readers;\n indexSignal.peek = () => indexValue;\n indexSignal.set = (\n newValue: number | ((prev: number) => number),\n notifyReaders = true\n ) => {\n const nextValue =\n typeof newValue === 'function' ? newValue(indexValue) : newValue;\n if (nextValue !== indexValue) {\n indexValue = nextValue;\n if (notifyReaders) {\n markReadableDerivedSubscribersDirty(indexSignal);\n markReactivePropsDirtySource(indexSignal);\n notifyReadableReaders(indexSignal);\n }\n }\n };\n indexSignal._hasBeenRead = false;\n\n return indexSignal;\n}\n\nfunction syncForIndexSignal(\n indexSignal: ForIndexSignal,\n nextIndex: number\n): boolean {\n if (indexSignal.peek() === nextIndex) {\n return false;\n }\n\n indexSignal.set(nextIndex, indexSignal._hasBeenRead);\n return indexSignal._hasBeenRead === true;\n}\n\nfunction syncForItemIndex<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n nextIndex: number\n): boolean {\n const indexSignal = itemInstance.indexSignal;\n if (indexSignal.peek() === nextIndex) {\n return false;\n }\n\n const scopeReadsIndex = scopeReadsSource(itemInstance.scope, indexSignal);\n if (!scopeReadsIndex) {\n syncForIndexSignal(indexSignal, nextIndex);\n return false;\n }\n\n indexSignal.set(nextIndex, false);\n markReadableDerivedSubscribersDirty(indexSignal);\n markReactivePropsDirtySource(indexSignal);\n notifyReadableReaders(indexSignal, itemInstance.scope.componentInstance);\n\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n\n return true;\n}\n\nfunction createForItemSignal<T>(initialItem: T): ForItemSignal<T> {\n let itemValue = initialItem;\n const readers = new Map<ComponentInstance, number>();\n\n const itemSignal = (() => {\n itemSignal._hasBeenRead = true;\n recordReadableRead(itemSignal);\n return itemValue;\n }) as ForItemSignal<T>;\n\n itemSignal._readers = readers;\n itemSignal.peek = () => itemValue;\n itemSignal.set = (newValue: T, notifyReaders = true) => {\n if (Object.is(itemValue, newValue)) {\n return;\n }\n\n itemValue = newValue;\n if (notifyReaders) {\n markReadableDerivedSubscribersDirty(itemSignal);\n markReactivePropsDirtySource(itemSignal);\n notifyReadableReaders(itemSignal);\n }\n };\n itemSignal._hasBeenRead = false;\n\n return itemSignal;\n}\n\nfunction createForItemPropertySignal(\n initialValue: unknown\n): ForItemPropertySignal {\n let propertyValue = initialValue;\n const readers = new Map<ComponentInstance, number>();\n\n const propertySignal = (() => {\n propertySignal._hasBeenRead = true;\n recordReadableRead(propertySignal);\n return propertyValue;\n }) as ForItemPropertySignal;\n\n propertySignal._readers = readers;\n propertySignal.peek = () => propertyValue;\n propertySignal.set = (newValue: unknown, notifyReaders = true) => {\n if (Object.is(propertyValue, newValue)) {\n return;\n }\n\n propertyValue = newValue;\n if (notifyReaders) {\n markReadableDerivedSubscribersDirty(propertySignal);\n markReactivePropsDirtySource(propertySignal);\n notifyReadableReaders(propertySignal);\n }\n };\n propertySignal._hasBeenRead = false;\n\n return propertySignal;\n}\n\nfunction readForItemProperty(item: unknown, prop: PropertyKey): unknown {\n return Reflect.get(Object(item), prop);\n}\n\nfunction haveSameOwnKeys(previousItem: unknown, nextItem: unknown): boolean {\n const previousKeys = Reflect.ownKeys(Object(previousItem));\n const nextKeys = Reflect.ownKeys(Object(nextItem));\n\n if (previousKeys.length !== nextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < previousKeys.length; i += 1) {\n if (previousKeys[i] !== nextKeys[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction scopeReadsSource(\n scope: ChildScope,\n source: ReadableSource<unknown>\n): boolean {\n return source._readers?.has(scope.componentInstance) ?? false;\n}\n\nfunction isForParentReader<T>(\n forState: ForState<T>,\n reader: ComponentInstance\n): boolean {\n let current = forState.parentInstance;\n\n while (current) {\n if (current === reader) {\n return true;\n }\n current = current.parentInstance;\n }\n\n return false;\n}\n\nfunction removeForParentReaders<T>(\n forState: ForState<T>,\n source: ReadableSource<unknown>\n): void {\n const readers = source._readers;\n if (!readers || readers.size === 0) {\n return;\n }\n\n for (const reader of readers.keys()) {\n if (isForParentReader(forState, reader)) {\n readers.delete(reader);\n }\n }\n}\n\nfunction getOrCreateForItemPropertySignal<T>(\n item: T,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>,\n prop: PropertyKey\n): ForItemPropertySignal {\n const existingSignal = propertySignals.get(prop);\n if (existingSignal) {\n return existingSignal;\n }\n\n const propertySignal = createForItemPropertySignal(\n readForItemProperty(item, prop)\n );\n propertySignals.set(prop, propertySignal);\n return propertySignal;\n}\n\nfunction canProxyForItem(item: unknown): item is object {\n return (\n (typeof item === 'object' && item !== null) || typeof item === 'function'\n );\n}\n\nfunction createReactiveForItem<T>(\n itemSignal: ForItemSignal<T>,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>\n): T {\n const target = Object.create(null) as Record<string | symbol, unknown>;\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return Reflect.get(target, prop, receiver);\n }\n\n const currentItem = itemSignal.peek();\n\n if (typeof prop !== 'symbol') {\n return getOrCreateForItemPropertySignal(\n currentItem,\n propertySignals,\n prop\n )();\n }\n\n recordReadableRead(itemSignal);\n return Reflect.get(Object(currentItem), prop, receiver);\n },\n has(target, prop) {\n recordReadableRead(itemSignal);\n return prop in target || prop in Object(itemSignal.peek());\n },\n ownKeys(target) {\n recordReadableRead(itemSignal);\n const keys = new Set<string | symbol>(Reflect.ownKeys(target));\n for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) {\n keys.add(key);\n }\n\n return Array.from(keys);\n },\n getOwnPropertyDescriptor(target, prop) {\n recordReadableRead(itemSignal);\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return ownDescriptor;\n }\n\n return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);\n },\n getPrototypeOf() {\n recordReadableRead(itemSignal);\n return Object.getPrototypeOf(Object(itemSignal.peek()));\n },\n }) as T;\n}\n\nfunction materializeItemVnode(\n key: string | number,\n vnode: VNode | undefined\n): void {\n if (vnode && typeof vnode === 'object' && 'type' in vnode) {\n const vn = vnode as DOMElement;\n vn.key = key;\n\n if (typeof vn.type === 'string') {\n if (!vn.props) vn.props = {};\n if (vn.props['data-key'] === undefined) {\n vn.props['data-key'] = String(key);\n }\n }\n }\n}\n\nfunction renderItemScope<T>(\n forState: ForState<T>,\n scope: ChildScope,\n item: T,\n indexSignal: ForIndexSignal,\n key: string | number\n): VNode {\n recordBenchEvent('rowFactory');\n const vnode = scope.render(() => forState.renderFn(item, indexSignal));\n materializeItemVnode(key, vnode);\n return vnode;\n}\n\nfunction failForValidation(message: string): never {\n throw new Error(message);\n}\n\nfunction validateForKeys<T>(forState: ForState<T>, newArray: T[]): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n\n const seen = new Set<string | number>();\n const keyKinds = new Map<string, 'number' | 'string'>();\n for (let i = 0; i < newArray.length; i++) {\n const key = forState.byFn(newArray[i], i);\n\n if (key === null || key === undefined) {\n failForValidation(\n '[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.'\n );\n }\n\n if (seen.has(key)) {\n failForValidation(\n `[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`\n );\n }\n\n seen.add(key);\n\n const keyString = String(key);\n const keyKind = typeof key;\n const previousKeyKind = forState.devKeyKinds?.get(keyString);\n if (previousKeyKind && previousKeyKind !== keyKind) {\n failForValidation(\n `[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`\n );\n }\n keyKinds.set(keyString, keyKind as 'number' | 'string');\n }\n\n forState.devKeyKinds = keyKinds;\n}\n\ntype RemovedDomCleanupMode = 'none' | 'teardown' | 'full-clear';\n\nfunction disposeItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n recordBenchEvent('itemRemoved');\n const removedDom = itemInstance.scope.dom;\n\n try {\n disposeChildScope(itemInstance.scope);\n } catch (err) {\n if (isDevelopmentEnvironment()) {\n console.error('[For] Cleanup error:', err);\n }\n }\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nexport function createItemInstance<T>(\n key: string | number,\n item: T,\n index: number,\n forState: ForState<T>\n): ForItemInstance<T> {\n recordBenchEvent('itemCreated');\n\n // Create index signal manually without going through state() hook\n // to avoid hook order violations (each For item creates its signal dynamically)\n const indexSignal = createForIndexSignal(index);\n const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;\n const itemPropertySignals = itemSignal\n ? new Map<PropertyKey, ForItemPropertySignal>()\n : null;\n const reactiveItem =\n itemSignal && itemPropertySignals\n ? createReactiveForItem(itemSignal, itemPropertySignals)\n : item;\n let itemInstance: ForItemInstance<T> | null = null;\n const scope = createChildScope(forState.parentInstance, key, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n const parent = forState.parentInstance;\n if (parent) {\n parent._enqueueRun?.();\n }\n });\n\n renderItemScope(forState, scope, reactiveItem, indexSignal, key);\n\n itemInstance = {\n key,\n item,\n reactiveItem,\n itemSignal,\n itemPropertySignals,\n indexSignal,\n scope,\n };\n\n return itemInstance;\n}\n\nfunction rerenderItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): void {\n renderItemScope(\n forState,\n itemInstance.scope,\n item,\n itemInstance.indexSignal,\n itemInstance.key\n );\n}\n\nfunction updateItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): boolean {\n if (itemInstance.item === item) {\n return false;\n }\n\n const previousItem = itemInstance.item;\n itemInstance.item = item;\n\n const scope = itemInstance.scope;\n let scopeReadsChangedSignal = false;\n const itemSignal = itemInstance.itemSignal;\n if (!itemSignal) {\n rerenderItemInstance(forState, itemInstance, item);\n return true;\n }\n\n const propertySignals = itemInstance.itemPropertySignals;\n const changedPropertySignals: Array<[ForItemPropertySignal, unknown]> = [];\n if (propertySignals && propertySignals.size > 0) {\n for (const [prop, propertySignal] of propertySignals) {\n const previousValue = readForItemProperty(previousItem, prop);\n const nextValue = readForItemProperty(item, prop);\n if (Object.is(previousValue, nextValue)) {\n continue;\n }\n\n if (scopeReadsSource(scope, propertySignal)) {\n scopeReadsChangedSignal = true;\n }\n\n changedPropertySignals.push([propertySignal, nextValue]);\n }\n }\n\n if (scopeReadsSource(scope, itemSignal)) {\n scopeReadsChangedSignal = true;\n }\n\n const itemShapeChanged =\n changedPropertySignals.length === 0 && !haveSameOwnKeys(previousItem, item);\n const notifyReaders =\n !scopeReadsChangedSignal &&\n (changedPropertySignals.length > 0 || itemShapeChanged);\n const visibleChange =\n scopeReadsChangedSignal ||\n changedPropertySignals.length > 0 ||\n itemShapeChanged;\n for (const [propertySignal, nextValue] of changedPropertySignals) {\n removeForParentReaders(forState, propertySignal);\n propertySignal.set(nextValue, notifyReaders);\n }\n removeForParentReaders(forState, itemSignal);\n itemSignal.set(item, notifyReaders);\n\n if (scopeReadsChangedSignal) {\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n }\n\n return visibleChange;\n}\n\nconst FOR_FALLBACK_SCOPE_KEY = '__for-fallback__';\n\nfunction disposeFallbackScope<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const fallbackScope = forState.fallbackScope;\n if (!fallbackScope) {\n return;\n }\n\n const removedDom = fallbackScope.dom;\n disposeChildScope(fallbackScope);\n forState.fallbackScope = null;\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nfunction renderFallbackScope<T>(forState: ForState<T>): VNode[] {\n if (forState.fallback == null || forState.fallback === false) {\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n forState.orderedVNodes = [];\n forState.orderedItems = [];\n return [];\n }\n\n const fallbackScope =\n forState.fallbackScope ??\n createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n });\n forState.fallbackScope = fallbackScope;\n\n const vnode = fallbackScope.render(() => forState.fallback as VNode);\n forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];\n forState.orderedItems = [];\n return forState.orderedVNodes;\n}\n\nfunction disposeAllItems<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const { items, orderedKeys } = forState;\n for (let index = 0; index < orderedKeys.length; index += 1) {\n const key = orderedKeys[index];\n const itemInstance = items.get(key);\n if (!itemInstance) {\n continue;\n }\n disposeItemInstance(forState, itemInstance, domCleanup);\n items.delete(key);\n }\n orderedKeys.length = 0;\n forState.orderedKeys = orderedKeys;\n}\n\nexport function reconcileForItems<T>(\n forState: ForState<T>,\n newArray: T[]\n): VNode[] {\n forState.currentItems = newArray;\n validateForKeys(forState, newArray);\n\n if (BENCH_BUILD_ENABLED) {\n resetBenchMetrics();\n }\n\n const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;\n\n const { items, orderedKeys, byFn } = forState;\n const oldLen = orderedKeys.length;\n const newLen = newArray.length;\n forState.lastRemovedNodes = [];\n\n if (newLen === 0) {\n if (oldLen > 0) {\n disposeAllItems(forState, forState.fallback ? 'teardown' : 'none');\n }\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n return renderFallbackScope(forState);\n }\n\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH A: APPEND\n // Guard: oldLen <= newLen && all old keys match new keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen < newLen) {\n let canUseAppendPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseAppendPath = false;\n break;\n }\n }\n\n if (canUseAppendPath) {\n recordBenchFastLane('APPEND');\n forState.lastCommitStrategy = 'APPEND';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n\n // Update existing rows in-place\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = resultItems[i] ?? items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n // Create and append new rows\n for (let i = oldLen; i < newLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultItems[i] = itemInstance;\n resultVNodes[i] = itemInstance.scope.vnode as VNode;\n orderedKeys[i] = key;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH B: TRUNCATE\n // Guard: newLen <= oldLen && all new keys match old keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (newLen < oldLen) {\n if (oldLen === newLen + 1) {\n let removedIndex = -1;\n\n for (let i = 0; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i]) {\n removedIndex = i;\n break;\n }\n }\n\n if (removedIndex !== -1) {\n let canUseRemoveOnePath = true;\n for (let i = removedIndex; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i + 1]) {\n canUseRemoveOnePath = false;\n break;\n }\n }\n\n if (canUseRemoveOnePath) {\n recordBenchFastLane('REMOVE_ONE');\n forState.lastCommitStrategy = 'NO_REORDER';\n\n const previousOrderedItems = forState.orderedItems.slice();\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const dirtyIndices: number[] = [];\n\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];\n const existing = items.get(key)!;\n const scopeNeedsDomUpdate = existing.scope.needsDomUpdate;\n\n const itemChanged = existing.item !== item;\n const indexSignal = existing.indexSignal;\n const indexChanged = indexSignal.peek() !== i;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n const indexVisibleChange = indexChanged\n ? syncForItemIndex(forState, existing, i)\n : false;\n\n if (itemChanged || indexVisibleChange || scopeNeedsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n const removedKey = orderedKeys[removedIndex];\n const removedItem = items.get(removedKey);\n if (removedItem) {\n disposeItemInstance(forState, removedItem, 'teardown');\n items.delete(removedKey);\n }\n\n const nextOrderedKeys = orderedKeys.slice(0, newLen);\n const nextOrderedItems = previousOrderedItems.slice(0, newLen);\n for (let i = removedIndex; i < newLen; i++) {\n nextOrderedKeys[i] = orderedKeys[i + 1];\n nextOrderedItems[i] = previousOrderedItems[i + 1];\n }\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming(\n 'reconcile',\n performance.now() - reconcileStartMs\n );\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n }\n\n let canUseTruncatePath = true;\n for (let i = 0; i < newLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseTruncatePath = false;\n break;\n }\n }\n\n if (canUseTruncatePath) {\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const isFullClear = newLen === 0;\n\n // Update existing rows in-place\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n // Remove tail rows\n for (let i = newLen; i < oldLen; i++) {\n const key = orderedKeys[i];\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(\n forState,\n itemInstance,\n isFullClear ? 'full-clear' : 'teardown'\n );\n items.delete(key);\n }\n }\n\n orderedKeys.length = newLen;\n forState.orderedKeys = orderedKeys;\n forState.orderedItems.length = newLen;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH C: NO-REORDER (in-place update only)\n // Guard: oldLen === newLen && keys match at all indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen === newLen) {\n let canUseNoReorderPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseNoReorderPath = false;\n break;\n }\n }\n\n if (canUseNoReorderPath) {\n recordBenchFastLane('NO_REORDER');\n forState.lastCommitStrategy = 'NO_REORDER';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = oldLen;\n resultItems.length = oldLen;\n const dirtyIndices: number[] = [];\n // Update in-place only, no DOM moves needed\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n const itemChanged = existing.item !== item;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (!itemChanged && existing.scope.needsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n\n let firstMismatch = -1;\n let secondMismatch = -1;\n let firstMismatchKey: string | number | null = null;\n let secondMismatchKey: string | number | null = null;\n let mismatchCount = 0;\n let canUseSwapPath = true;\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(newArray[i], i);\n if (key === orderedKeys[i]) {\n const existing = items.get(key);\n if (existing && existing.item !== item) {\n canUseSwapPath = false;\n break;\n }\n continue;\n }\n\n mismatchCount++;\n if (firstMismatch === -1) {\n firstMismatch = i;\n firstMismatchKey = key;\n continue;\n }\n\n if (secondMismatch === -1) {\n secondMismatch = i;\n secondMismatchKey = key;\n continue;\n }\n\n mismatchCount = 3;\n break;\n }\n\n if (\n canUseSwapPath &&\n mismatchCount === 2 &&\n firstMismatch !== -1 &&\n secondMismatch !== -1 &&\n firstMismatchKey === orderedKeys[secondMismatch] &&\n secondMismatchKey === orderedKeys[firstMismatch]\n ) {\n recordBenchFastLane('SWAP');\n recordBenchEvent('itemMoved');\n recordBenchEvent('itemMoved');\n\n forState.lastCommitStrategy = 'SWAP';\n\n const nextOrderedKeys = orderedKeys.slice();\n nextOrderedKeys[firstMismatch] = firstMismatchKey;\n nextOrderedKeys[secondMismatch] = secondMismatchKey;\n\n const resultVNodes = forState.orderedVNodes;\n const firstExisting = items.get(firstMismatchKey)!;\n const secondExisting = items.get(secondMismatchKey)!;\n const firstItem = newArray[firstMismatch];\n const secondItem = newArray[secondMismatch];\n const nextOrderedItems = forState.orderedItems.slice();\n nextOrderedItems[firstMismatch] = secondExisting;\n nextOrderedItems[secondMismatch] = firstExisting;\n\n recordBenchEvent('itemReused');\n recordBenchEvent('itemReused');\n\n if (firstExisting.item !== firstItem) {\n updateItemInstance(forState, firstExisting, firstItem);\n }\n\n if (secondExisting.item !== secondItem) {\n updateItemInstance(forState, secondExisting, secondItem);\n }\n\n syncForItemIndex(forState, firstExisting, firstMismatch);\n\n syncForItemIndex(forState, secondExisting, secondMismatch);\n\n resultVNodes[firstMismatch] = firstExisting.scope.vnode as VNode;\n resultVNodes[secondMismatch] = secondExisting.scope.vnode as VNode;\n\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = [firstMismatch, secondMismatch];\n forState.pendingMoveOnly = true;\n\n return resultVNodes;\n }\n\n let canUseMoveOnlyPath = true;\n const moveOnlyKeys: Array<string | number> = [];\n const moveOnlyItems: ForItemInstance<T>[] = [];\n const moveOnlyVNodes: VNode[] = [];\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const existing = items.get(key);\n\n if (\n !existing ||\n existing.item !== item ||\n (existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i)\n ) {\n canUseMoveOnlyPath = false;\n break;\n }\n\n moveOnlyKeys[i] = key;\n moveOnlyItems[i] = existing;\n moveOnlyVNodes[i] = existing.scope.vnode as VNode;\n recordBenchEvent('itemReused');\n }\n\n if (canUseMoveOnlyPath) {\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n for (let i = 0; i < moveOnlyItems.length; i++) {\n syncForItemIndex(forState, moveOnlyItems[i], i);\n moveOnlyVNodes[i] = moveOnlyItems[i].scope.vnode as VNode;\n }\n\n forState.orderedKeys = moveOnlyKeys;\n forState.orderedItems = moveOnlyItems;\n forState.orderedVNodes = moveOnlyVNodes;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = true;\n\n return moveOnlyVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FULL KEYED RECONCILIATION (slow path for complex reorders)\n // Avoid allocating newKeyMap: iterate directly and track removals\n // ─────────────────────────────────────────────────────────────────────────\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n const toRemove = new Set(orderedKeys);\n const newOrderedKeys: Array<string | number> = [];\n const newOrderedItems: ForItemInstance<T>[] = [];\n const resultVNodes: VNode[] = [];\n let moveOnly = toRemove.size === newArray.length;\n\n // Single pass: iterate new array directly, no intermediate map\n for (let i = 0; i < newArray.length; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n recordBenchEvent('keyLookup');\n\n toRemove.delete(key);\n newOrderedKeys.push(key);\n\n const existing = items.get(key);\n recordBenchEvent(existing ? 'keyHit' : 'keyMiss');\n\n if (!existing) {\n // Added: create new item instance\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n newOrderedItems.push(itemInstance);\n resultVNodes.push(itemInstance.scope.vnode as VNode);\n } else {\n // Exists: check if item changed (by identity)\n recordBenchEvent('itemReused');\n const itemChanged = existing.item !== item;\n const indexChanged = existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n moveOnly = false;\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n // Index changed: update index signal (triggers re-render if index is used)\n syncForItemIndex(forState, existing, i);\n }\n\n newOrderedItems.push(existing);\n resultVNodes.push(existing.scope.vnode as VNode);\n }\n }\n\n // Remove deleted items\n for (const key of toRemove) {\n moveOnly = false;\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(forState, itemInstance, 'none');\n items.delete(key);\n }\n }\n\n forState.orderedKeys = newOrderedKeys;\n forState.orderedItems = newOrderedItems;\n\n // Record reconcile timing\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = moveOnly;\n\n return resultVNodes;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n const dirtyIndices = forState.pendingDirtyIndices;\n if (dirtyIndices && dirtyIndices.length > 0) {\n for (let i = 0; i < dirtyIndices.length; i++) {\n const itemInstance = forState.orderedItems[dirtyIndices[i]];\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n } else {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n }\n\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n forState._hasResolvedItemDom = forState.orderedKeys.length > 0;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/runtime/operations.ts"],"mappings":";UAeiB,cAAA;EACf,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA,EAAO,KAAK;EACZ,OAAA;AAAA;AAAA,KAGU,iBAAA;AAAA,UAEK,YAAA;EACf,IAAA,GAAO,iBAAA,YAA6B,iBAAiB;AAAA;AAAA,iBAsDvC,WAAA,CACd,WAAA,+BACC,iBAAiB;AAAA,iBAIJ,eAAA,IAAmB,iBAAiB;AAAA,iBAKpC,aAAA,IAAiB,iBAAiB;AAAA,iBAOlC,QAAA,4CACd,EAAA,GAAK,IAAA;EAAQ,MAAA,EAAQ,WAAA;AAAA,MAAkB,WAAA,CAAY,CAAA,IAAK,CAAA,EACxD,IAAA,EAAM,KAAA,GACL,cAAA,CAAe,CAAA;AAAA,KAwPb,eAAA,aAA4B,uBAAuB;AAAA,iBAuGxC,EAAA,CACd,MAAA,EAAQ,WAAA,EACR,KAAA,UACA,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,eAAA;AAAA,iBA8FI,KAAA,CACd,UAAA,UACA,EAAA,cACA,OAAA,GAAU,YAAY;AAAA,iBA8BR,MAAA,IACd,OAAA,WACA,QAAA,GAAW,MAAA;EACR,KAAA,EAAO,CAAA;EAAU,OAAA;EAAkB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAK/B,IAAA,CACd,EAAgE,8BAAhC,WAAW;;;AAtjBU;AAsDvD;;;;AAEoB;AAIpB;;iBAqiBgB,OAAA,IAAW,EAAA,QAAU,CAAA,SAAU,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"operations.js","names":[],"sources":["../../src/runtime/operations.ts"],"sourcesContent":["import {\n claimHookIndex,\n getCurrentComponentInstance,\n registerCommitOperation,\n type ComponentInstance,\n} from './component';\nimport { getCurrentContextFrame } from './context';\nimport { ResourceCell } from './resource-cell';\nimport { state } from './state';\nimport { globalScheduler } from './scheduler';\nimport { getSSRBridge } from './ssr-bridge';\nimport { brandSnapshotSource } from './snapshot-source';\nimport { SSRDataMissingError } from '../common/ssr-errors';\nimport { isRouteActivityActive } from '../common/route-activity';\n\nexport interface ResourceResult<T> {\n value: T | null;\n pending: boolean;\n error: Error | null;\n refresh(): void;\n}\n\nexport type ActivityPredicate = () => boolean;\n\nexport interface TimerOptions {\n when?: ActivityPredicate | readonly ActivityPredicate[];\n}\n\nfunction normalizePredicates(\n predicates: TimerOptions['when']\n): readonly ActivityPredicate[] {\n if (!predicates) {\n return [];\n }\n\n return typeof predicates === 'function' ? [predicates] : predicates;\n}\n\nfunction allPredicatesPass(predicates: readonly ActivityPredicate[]): boolean {\n for (const predicate of predicates) {\n if (!predicate()) {\n return false;\n }\n }\n\n return true;\n}\n\ntype LifecycleSlotKind = 'timer' | 'listener' | 'task';\n\ntype LifecycleSlot = {\n kind: LifecycleSlotKind;\n};\n\nfunction getLifecycleSlot<TSlot extends LifecycleSlot>(\n instance: ComponentInstance,\n index: number,\n kind: TSlot['kind'],\n create: () => TSlot\n): TSlot {\n const existing = instance.lifecycleSlots[index];\n\n if (existing) {\n const slot = existing as LifecycleSlot;\n if (slot.kind !== kind) {\n throw new Error(\n `${kind}() lifecycle order violation: slot ${index} already belongs to ${slot.kind}(). ` +\n 'Keep lifecycle primitives in a stable top-level order.'\n );\n }\n\n return existing as TSlot;\n }\n\n const slot = create();\n instance.lifecycleSlots[index] = slot;\n return slot;\n}\n\nexport function routeActive(\n pathOrPaths: string | readonly string[]\n): ActivityPredicate {\n return () => isRouteActivityActive(pathOrPaths);\n}\n\nexport function documentVisible(): ActivityPredicate {\n return () =>\n typeof document === 'undefined' || document.visibilityState !== 'hidden';\n}\n\nexport function windowFocused(): ActivityPredicate {\n return () =>\n typeof document === 'undefined' ||\n typeof document.hasFocus !== 'function' ||\n document.hasFocus();\n}\n\nexport function resource<T, const TDeps extends readonly unknown[]>(\n fn: (opts: { signal: AbortSignal }) => PromiseLike<T> | T,\n deps: TDeps\n): ResourceResult<T>;\n\n/**\n * Resource primitive — simple, deterministic async primitive\n * Usage: resource(fn, deps)\n * - fn receives { signal }\n * - captures execution context once at creation (synchronous step only)\n * - executes at most once per generation; stale async results are ignored\n * - refresh() cancels in-flight execution, increments generation and re-runs\n * - exposes { value, pending, error, refresh }\n * - during SSR, async results are disallowed and will throw synchronously\n */\nexport function resource<T>(\n fn: (opts: { signal: AbortSignal }) => PromiseLike<T> | T,\n deps: readonly unknown[] = []\n): ResourceResult<T> {\n const instance = getCurrentComponentInstance();\n // Create a non-null alias early so it can be used in nested closures\n // without TypeScript complaining about possible null access.\n const inst = instance as ComponentInstance;\n\n if (!instance) {\n const ssr = getSSRBridge();\n // If we're in a synchronous SSR render that has resolved data, use it.\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n const val = renderData[key] as T;\n return brandSnapshotSource({\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>;\n }\n\n // If we are in an SSR render pass without supplied data, throw for clarity.\n const ssrCtx = ssr.getCurrentSSRContext();\n if (ssrCtx) {\n ssr.throwSSRDataMissing();\n }\n\n // No active component instance and not in SSR render with data.\n // Autopilot invariant: resources must be created during render within an app.\n throw new Error(\n '[Askr] resource() must be called during component render inside an app. ' +\n 'Do not create resources at module scope or outside render.'\n );\n }\n\n // Internal ResourceCell — pure state machine now moved to its own module\n // to keep component wiring separate and ensure no component access here.\n // (See ./resource-cell.ts)\n\n // If we're in a synchronous SSR render that was supplied resolved data, use it\n const ssr = getSSRBridge();\n const renderData = ssr.getCurrentRenderData();\n if (renderData) {\n // Deterministic key generation: the collection step and render step use\n // the same incremental key generation to align resources.\n const key = ssr.getNextKey();\n if (!(key in renderData)) {\n ssr.throwSSRDataMissing();\n }\n\n // Commit synchronous value from render data and return a stable snapshot\n const val = renderData[key] as T;\n\n const holder = state<{\n cell?: ResourceCell<T>;\n snapshot: ResourceResult<T>;\n }>({\n cell: undefined,\n snapshot: brandSnapshotSource({\n value: val,\n pending: false,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>,\n });\n\n const h = holder();\n h.snapshot.value = val;\n h.snapshot.pending = false;\n h.snapshot.error = null;\n return h.snapshot;\n }\n\n // Persist a holder so the snapshot identity is stable across renders.\n const holder = state<{ cell?: ResourceCell<T>; snapshot: ResourceResult<T> }>(\n {\n cell: undefined,\n snapshot: brandSnapshotSource({\n value: null,\n pending: true,\n error: null,\n refresh: () => {},\n }) as ResourceResult<T>,\n }\n );\n\n const h = holder();\n\n // Initialize cell on first call\n if (!h.cell) {\n const frame = getCurrentContextFrame();\n const cell = new ResourceCell<T>(fn, deps, frame);\n // Attach debug label (component name) for richer logs\n cell.ownerName = inst.fn?.name || '<anonymous>';\n h.cell = cell;\n h.snapshot = cell.snapshot as ResourceResult<T>;\n\n // Subscribe and schedule component updates when cell changes\n const unsubscribe = cell.subscribe(() => {\n const cur = holder();\n cur.snapshot.value = cell.snapshot.value;\n cur.snapshot.pending = cell.snapshot.pending;\n cur.snapshot.error = cell.snapshot.error;\n holder.set(cur);\n try {\n inst.notifyUpdate?.();\n } catch {\n // ignore\n }\n });\n\n // Cleanup on unmount\n (inst.cleanupFns ??= []).push(() => {\n unsubscribe();\n cell.dispose();\n });\n\n // Render invariant: do NOT start async work during render on the client.\n // SSR remains strict/synchronous and must throw immediately if async is encountered.\n if (inst.ssr) {\n // SSR: must run synchronously so missing data throws during render\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n // Client: start after render via scheduler (never inline)\n const scheduledGeneration = cell.generation;\n globalScheduler.enqueueInLane('post', () => {\n if (!inst.notifyUpdate || cell.generation !== scheduledGeneration) {\n return;\n }\n\n try {\n cell.start(false, false);\n } catch (err) {\n // Non-SSR: reflect synchronous errors into snapshot via manual update\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = (err as Error) ?? null;\n holder.set(cur);\n inst.notifyUpdate?.();\n return;\n }\n\n // If the resource completed synchronously, subscribers were not notified.\n // Force a re-render so the component can observe the value.\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst.notifyUpdate?.();\n }\n });\n }\n }\n\n const cell = h.cell!;\n cell.setLoader(fn);\n\n // Detect dependency changes and refresh immediately\n const depsChanged =\n !cell.deps ||\n cell.deps.length !== deps.length ||\n cell.deps.some((d, i) => !Object.is(d, deps[i]));\n\n if (depsChanged) {\n cell.deps = deps.slice();\n cell.generation++;\n cell.pending = true;\n cell.error = null;\n\n // Synchronously reflect the pending state into the stable snapshot so the\n // render that triggered the deps change can surface a loading indicator.\n // The async start() runs with notify=false and the deps-change branch never\n // re-published the snapshot, so without this a deps-driven refetch jumped\n // straight from the old value to the new value, never exposing pending.\n // Stale-while-revalidate: the previous value is retained until the new\n // fetch resolves.\n h.snapshot.pending = true;\n h.snapshot.error = null;\n try {\n if (inst.ssr) {\n cell.start(true, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n }\n } else {\n const scheduledGeneration = cell.generation;\n globalScheduler.enqueueInLane('post', () => {\n if (!inst.notifyUpdate || cell.generation !== scheduledGeneration) {\n return;\n }\n\n cell.start(false, false);\n if (!cell.pending) {\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n holder.set(cur);\n inst.notifyUpdate?.();\n }\n });\n }\n } catch (err) {\n if (err instanceof SSRDataMissingError) throw err;\n cell.error = err as Error;\n cell.pending = false;\n const cur = holder();\n cur.snapshot.value = cell.value;\n cur.snapshot.pending = cell.pending;\n cur.snapshot.error = cell.error;\n // Do not call holder.set() here; this is still render.\n }\n }\n\n // Return the stable snapshot object owned by the cell\n return h.snapshot;\n}\n\ntype ListenerOptions = boolean | AddEventListenerOptions | undefined;\n\ntype NormalizedListenerOptions =\n | boolean\n | {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n }\n | undefined;\n\ninterface ListenerSlot extends LifecycleSlot {\n kind: 'listener';\n target: EventTarget | null;\n event: string;\n handler: EventListener;\n listener: EventListener;\n options: NormalizedListenerOptions;\n pendingTarget: EventTarget;\n pendingEvent: string;\n pendingHandler: EventListener;\n pendingOptions: NormalizedListenerOptions;\n attached: boolean;\n cleanupRegistered: boolean;\n}\n\nfunction normalizeListenerOptions(\n options: ListenerOptions\n): NormalizedListenerOptions {\n if (options === undefined || typeof options === 'boolean') {\n return options;\n }\n\n return {\n ...(options.capture !== undefined ? { capture: options.capture } : {}),\n ...(options.once !== undefined ? { once: options.once } : {}),\n ...(options.passive !== undefined ? { passive: options.passive } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n}\n\nfunction listenerOptionsEqual(\n a: NormalizedListenerOptions,\n b: NormalizedListenerOptions\n): boolean {\n if (a === b) {\n return true;\n }\n if (typeof a === 'boolean' || typeof b === 'boolean') {\n return a === b;\n }\n if (!a || !b) {\n return a === b;\n }\n\n return (\n a.capture === b.capture &&\n a.once === b.once &&\n a.passive === b.passive &&\n a.signal === b.signal\n );\n}\n\nfunction detachListenerSlot(slot: ListenerSlot): void {\n if (!slot.attached || !slot.target) {\n return;\n }\n\n slot.target.removeEventListener(slot.event, slot.listener, slot.options);\n slot.attached = false;\n}\n\nfunction commitListenerSlot(\n instance: ComponentInstance,\n slot: ListenerSlot\n): void {\n slot.handler = slot.pendingHandler;\n\n const shouldReattach =\n !slot.attached ||\n slot.target !== slot.pendingTarget ||\n slot.event !== slot.pendingEvent ||\n !listenerOptionsEqual(slot.options, slot.pendingOptions);\n\n if (shouldReattach) {\n detachListenerSlot(slot);\n slot.target = slot.pendingTarget;\n slot.event = slot.pendingEvent;\n slot.options = slot.pendingOptions;\n slot.target.addEventListener(slot.event, slot.listener, slot.options);\n slot.attached = true;\n }\n\n if (!slot.cleanupRegistered) {\n slot.cleanupRegistered = true;\n instance.cleanupFns.push(() => {\n detachListenerSlot(slot);\n slot.cleanupRegistered = false;\n });\n }\n}\n\nexport function on(\n target: EventTarget,\n event: string,\n handler: EventListener,\n options?: ListenerOptions\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'on');\n const normalizedOptions = normalizeListenerOptions(options);\n const slot = getLifecycleSlot<ListenerSlot>(\n instance,\n index,\n 'listener',\n () => {\n const createdSlot = {\n kind: 'listener' as const,\n target: null,\n event,\n handler,\n listener: ((evt: Event) => {\n createdSlot.handler.call(createdSlot.target, evt);\n }) as EventListener,\n options: undefined,\n pendingTarget: target,\n pendingEvent: event,\n pendingHandler: handler,\n pendingOptions: normalizedOptions,\n attached: false,\n cleanupRegistered: false,\n };\n return createdSlot;\n }\n );\n\n slot.pendingTarget = target;\n slot.pendingEvent = event;\n slot.pendingHandler = handler;\n slot.pendingOptions = normalizedOptions;\n\n registerCommitOperation(() => {\n commitListenerSlot(instance, slot);\n });\n}\n\ninterface TimerSlot extends LifecycleSlot {\n kind: 'timer';\n id: ReturnType<typeof setInterval> | null;\n intervalMs: number | null;\n pendingIntervalMs: number;\n callback: () => void;\n predicates: readonly ActivityPredicate[];\n pendingCallback: () => void;\n pendingPredicates: readonly ActivityPredicate[];\n cleanupRegistered: boolean;\n}\n\nfunction stopTimerSlot(slot: TimerSlot): void {\n if (slot.id === null) {\n return;\n }\n\n clearInterval(slot.id);\n slot.id = null;\n}\n\nfunction startTimerSlot(slot: TimerSlot): void {\n slot.id = setInterval(() => {\n if (allPredicatesPass(slot.predicates)) {\n slot.callback();\n }\n }, slot.intervalMs ?? slot.pendingIntervalMs);\n}\n\nfunction commitTimerSlot(instance: ComponentInstance, slot: TimerSlot): void {\n const intervalChanged = slot.intervalMs !== slot.pendingIntervalMs;\n\n slot.callback = slot.pendingCallback;\n slot.predicates = slot.pendingPredicates;\n\n if (slot.id === null || intervalChanged) {\n stopTimerSlot(slot);\n slot.intervalMs = slot.pendingIntervalMs;\n startTimerSlot(slot);\n }\n\n if (!slot.cleanupRegistered) {\n slot.cleanupRegistered = true;\n instance.cleanupFns.push(() => {\n stopTimerSlot(slot);\n slot.cleanupRegistered = false;\n });\n }\n}\n\nexport function timer(\n intervalMs: number,\n fn: () => void,\n options?: TimerOptions\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'timer');\n const predicates = normalizePredicates(options?.when);\n const slot = getLifecycleSlot<TimerSlot>(instance, index, 'timer', () => ({\n kind: 'timer',\n id: null,\n intervalMs: null,\n pendingIntervalMs: intervalMs,\n callback: fn,\n predicates,\n pendingCallback: fn,\n pendingPredicates: predicates,\n cleanupRegistered: false,\n }));\n\n slot.pendingIntervalMs = intervalMs;\n slot.pendingCallback = fn;\n slot.pendingPredicates = predicates;\n\n registerCommitOperation(() => {\n commitTimerSlot(instance, slot);\n });\n}\n\nexport function stream<T>(\n _source: unknown,\n _options?: Record<string, unknown>\n): { value: T | null; pending: boolean; error: Error | null } {\n // Stub implementation: no-op.\n return { value: null, pending: true, error: null };\n}\n\nexport function task(\n fn: () => void | (() => void) | PromiseLike<void | (() => void)>\n): void {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n return;\n }\n\n const index = claimHookIndex(instance, 'task');\n const slot = getLifecycleSlot<\n LifecycleSlot & {\n kind: 'task';\n started: boolean;\n task: typeof fn;\n }\n >(instance, index, 'task', () => ({\n kind: 'task',\n started: false,\n task: fn,\n }));\n\n if (!slot.started) {\n slot.task = fn;\n registerCommitOperation(async () => {\n if (slot.started) {\n return;\n }\n\n slot.started = true;\n return await slot.task();\n });\n }\n}\n\n/**\n * Capture the result of a synchronous expression at call time and return a\n * thunk that returns the captured value later. This is a low-level helper for\n * cases where async continuations need to observe a snapshot of values at the\n * moment scheduling occurred.\n *\n * Usage (public API):\n * const snapshot = capture(() => someState());\n * Promise.resolve().then(() => { use(snapshot()); });\n */\nexport function capture<T>(fn: () => T): () => T {\n const value = fn();\n return () => value;\n}\n"],"mappings":";;;;;;;;;;AA4BA,SAAS,oBACP,YAC8B;CAC9B,IAAI,CAAC,YACH,OAAO,CAAC;CAGV,OAAO,OAAO,eAAe,aAAa,CAAC,UAAU,IAAI;AAC3D;AAEA,SAAS,kBAAkB,YAAmD;CAC5E,KAAK,MAAM,aAAa,YACtB,IAAI,CAAC,UAAU,GACb,OAAO;CAIX,OAAO;AACT;AAQA,SAAS,iBACP,UACA,OACA,MACA,QACO;CACP,MAAM,WAAW,SAAS,eAAe;CAEzC,IAAI,UAAU;EACZ,MAAM,OAAO;EACb,IAAI,KAAK,SAAS,MAChB,MAAM,IAAI,MACR,GAAG,KAAK,qCAAqC,MAAM,sBAAsB,KAAK,KAAK,2DAErF;EAGF,OAAO;CACT;CAEA,MAAM,OAAO,OAAO;CACpB,SAAS,eAAe,SAAS;CACjC,OAAO;AACT;AAEA,SAAgB,YACd,aACmB;CACnB,aAAa,sBAAsB,WAAW;AAChD;AAEA,SAAgB,kBAAqC;CACnD,aACE,OAAO,aAAa,eAAe,SAAS,oBAAoB;AACpE;AAEA,SAAgB,gBAAmC;CACjD,aACE,OAAO,aAAa,eACpB,OAAO,SAAS,aAAa,cAC7B,SAAS,SAAS;AACtB;;;;;;;;;;;AAiBA,SAAgB,SACd,IACA,OAA2B,CAAC,GACT;CACnB,MAAM,WAAW,4BAA4B;CAG7C,MAAM,OAAO;CAEb,IAAI,CAAC,UAAU;EACb,MAAM,MAAM,aAAa;EAEzB,MAAM,aAAa,IAAI,qBAAqB;EAC5C,IAAI,YAAY;GACd,MAAM,MAAM,IAAI,WAAW;GAC3B,IAAI,EAAE,OAAO,aACX,IAAI,oBAAoB;GAE1B,MAAM,MAAM,WAAW;GACvB,OAAO,oBAAoB;IACzB,OAAO;IACP,SAAS;IACT,OAAO;IACP,eAAe,CAAC;GAClB,CAAC;EACH;EAIA,IADe,IAAI,qBACf,GACF,IAAI,oBAAoB;EAK1B,MAAM,IAAI,MACR,oIAEF;CACF;CAOA,MAAM,MAAM,aAAa;CACzB,MAAM,aAAa,IAAI,qBAAqB;CAC5C,IAAI,YAAY;EAGd,MAAM,MAAM,IAAI,WAAW;EAC3B,IAAI,EAAE,OAAO,aACX,IAAI,oBAAoB;EAI1B,MAAM,MAAM,WAAW;EAevB,MAAM,IAbS,MAGZ;GACD,MAAM;GACN,UAAU,oBAAoB;IAC5B,OAAO;IACP,SAAS;IACT,OAAO;IACP,eAAe,CAAC;GAClB,CAAC;EACH,CAEU,CAAA,CAAO;EACjB,EAAE,SAAS,QAAQ;EACnB,EAAE,SAAS,UAAU;EACrB,EAAE,SAAS,QAAQ;EACnB,OAAO,EAAE;CACX;CAGA,MAAM,SAAS,MACb;EACE,MAAM;EACN,UAAU,oBAAoB;GAC5B,OAAO;GACP,SAAS;GACT,OAAO;GACP,eAAe,CAAC;EAClB,CAAC;CACH,CACF;CAEA,MAAM,IAAI,OAAO;CAGjB,IAAI,CAAC,EAAE,MAAM;EAEX,MAAM,OAAO,IAAI,aAAgB,IAAI,MADvB,uBAC6B,CAAK;EAEhD,KAAK,YAAY,KAAK,IAAI,QAAQ;EAClC,EAAE,OAAO;EACT,EAAE,WAAW,KAAK;EAGlB,MAAM,cAAc,KAAK,gBAAgB;GACvC,MAAM,MAAM,OAAO;GACnB,IAAI,SAAS,QAAQ,KAAK,SAAS;GACnC,IAAI,SAAS,UAAU,KAAK,SAAS;GACrC,IAAI,SAAS,QAAQ,KAAK,SAAS;GACnC,OAAO,IAAI,GAAG;GACd,IAAI;IACF,KAAK,eAAe;GACtB,QAAQ,CAER;EACF,CAAC;EAGD,CAAC,KAAK,eAAe,CAAC,EAAA,CAAG,WAAW;GAClC,YAAY;GACZ,KAAK,QAAQ;EACf,CAAC;EAID,IAAI,KAAK,KAAK;GAEZ,KAAK,MAAM,MAAM,KAAK;GACtB,IAAI,CAAC,KAAK,SAAS;IACjB,MAAM,MAAM,OAAO;IACnB,IAAI,SAAS,QAAQ,KAAK;IAC1B,IAAI,SAAS,UAAU,KAAK;IAC5B,IAAI,SAAS,QAAQ,KAAK;GAC5B;EACF,OAAO;GAEL,MAAM,sBAAsB,KAAK;GACjC,gBAAgB,cAAc,cAAc;IAC1C,IAAI,CAAC,KAAK,gBAAgB,KAAK,eAAe,qBAC5C;IAGF,IAAI;KACF,KAAK,MAAM,OAAO,KAAK;IACzB,SAAS,KAAK;KAEZ,MAAM,MAAM,OAAO;KACnB,IAAI,SAAS,QAAQ,KAAK;KAC1B,IAAI,SAAS,UAAU,KAAK;KAC5B,IAAI,SAAS,QAAS,OAAiB;KACvC,OAAO,IAAI,GAAG;KACd,KAAK,eAAe;KACpB;IACF;IAIA,IAAI,CAAC,KAAK,SAAS;KACjB,MAAM,MAAM,OAAO;KACnB,IAAI,SAAS,QAAQ,KAAK;KAC1B,IAAI,SAAS,UAAU,KAAK;KAC5B,IAAI,SAAS,QAAQ,KAAK;KAC1B,OAAO,IAAI,GAAG;KACd,KAAK,eAAe;IACtB;GACF,CAAC;EACH;CACF;CAEA,MAAM,OAAO,EAAE;CACf,KAAK,UAAU,EAAE;CAQjB,IAJE,CAAC,KAAK,QACN,KAAK,KAAK,WAAW,KAAK,UAC1B,KAAK,KAAK,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC,GAEhC;EACf,KAAK,OAAO,KAAK,MAAM;EACvB,KAAK;EACL,KAAK,UAAU;EACf,KAAK,QAAQ;EASb,EAAE,SAAS,UAAU;EACrB,EAAE,SAAS,QAAQ;EACnB,IAAI;GACF,IAAI,KAAK,KAAK;IACZ,KAAK,MAAM,MAAM,KAAK;IACtB,IAAI,CAAC,KAAK,SAAS;KACjB,MAAM,MAAM,OAAO;KACnB,IAAI,SAAS,QAAQ,KAAK;KAC1B,IAAI,SAAS,UAAU,KAAK;KAC5B,IAAI,SAAS,QAAQ,KAAK;IAC5B;GACF,OAAO;IACL,MAAM,sBAAsB,KAAK;IACjC,gBAAgB,cAAc,cAAc;KAC1C,IAAI,CAAC,KAAK,gBAAgB,KAAK,eAAe,qBAC5C;KAGF,KAAK,MAAM,OAAO,KAAK;KACvB,IAAI,CAAC,KAAK,SAAS;MACjB,MAAM,MAAM,OAAO;MACnB,IAAI,SAAS,QAAQ,KAAK;MAC1B,IAAI,SAAS,UAAU,KAAK;MAC5B,IAAI,SAAS,QAAQ,KAAK;MAC1B,OAAO,IAAI,GAAG;MACd,KAAK,eAAe;KACtB;IACF,CAAC;GACH;EACF,SAAS,KAAK;GACZ,IAAI,eAAe,qBAAqB,MAAM;GAC9C,KAAK,QAAQ;GACb,KAAK,UAAU;GACf,MAAM,MAAM,OAAO;GACnB,IAAI,SAAS,QAAQ,KAAK;GAC1B,IAAI,SAAS,UAAU,KAAK;GAC5B,IAAI,SAAS,QAAQ,KAAK;EAE5B;CACF;CAGA,OAAO,EAAE;AACX;AA6BA,SAAS,yBACP,SAC2B;CAC3B,IAAI,YAAY,UAAa,OAAO,YAAY,WAC9C,OAAO;CAGT,OAAO;EACL,GAAI,QAAQ,YAAY,SAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;EACpE,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAC3D,GAAI,QAAQ,YAAY,SAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;EACpE,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;CACnE;AACF;AAEA,SAAS,qBACP,GACA,GACS;CACT,IAAI,MAAM,GACR,OAAO;CAET,IAAI,OAAO,MAAM,aAAa,OAAO,MAAM,WACzC,OAAO,MAAM;CAEf,IAAI,CAAC,KAAK,CAAC,GACT,OAAO,MAAM;CAGf,OACE,EAAE,YAAY,EAAE,WAChB,EAAE,SAAS,EAAE,QACb,EAAE,YAAY,EAAE,WAChB,EAAE,WAAW,EAAE;AAEnB;AAEA,SAAS,mBAAmB,MAA0B;CACpD,IAAI,CAAC,KAAK,YAAY,CAAC,KAAK,QAC1B;CAGF,KAAK,OAAO,oBAAoB,KAAK,OAAO,KAAK,UAAU,KAAK,OAAO;CACvE,KAAK,WAAW;AAClB;AAEA,SAAS,mBACP,UACA,MACM;CACN,KAAK,UAAU,KAAK;CAQpB,IALE,CAAC,KAAK,YACN,KAAK,WAAW,KAAK,iBACrB,KAAK,UAAU,KAAK,gBACpB,CAAC,qBAAqB,KAAK,SAAS,KAAK,cAAc,GAErC;EAClB,mBAAmB,IAAI;EACvB,KAAK,SAAS,KAAK;EACnB,KAAK,QAAQ,KAAK;EAClB,KAAK,UAAU,KAAK;EACpB,KAAK,OAAO,iBAAiB,KAAK,OAAO,KAAK,UAAU,KAAK,OAAO;EACpE,KAAK,WAAW;CAClB;CAEA,IAAI,CAAC,KAAK,mBAAmB;EAC3B,KAAK,oBAAoB;EACzB,SAAS,WAAW,WAAW;GAC7B,mBAAmB,IAAI;GACvB,KAAK,oBAAoB;EAC3B,CAAC;CACH;AACF;AAEA,SAAgB,GACd,QACA,OACA,SACA,SACM;CACN,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH;CAGF,MAAM,QAAQ,eAAe,UAAU,IAAI;CAC3C,MAAM,oBAAoB,yBAAyB,OAAO;CAC1D,MAAM,OAAO,iBACX,UACA,OACA,kBACM;EACJ,MAAM,cAAc;GAClB,MAAM;GACN,QAAQ;GACR;GACA;GACA,YAAY,QAAe;IACzB,YAAY,QAAQ,KAAK,YAAY,QAAQ,GAAG;GAClD;GACA,SAAS;GACT,eAAe;GACf,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,UAAU;GACV,mBAAmB;EACrB;EACA,OAAO;CACT,CACF;CAEA,KAAK,gBAAgB;CACrB,KAAK,eAAe;CACpB,KAAK,iBAAiB;CACtB,KAAK,iBAAiB;CAEtB,8BAA8B;EAC5B,mBAAmB,UAAU,IAAI;CACnC,CAAC;AACH;AAcA,SAAS,cAAc,MAAuB;CAC5C,IAAI,KAAK,OAAO,MACd;CAGF,cAAc,KAAK,EAAE;CACrB,KAAK,KAAK;AACZ;AAEA,SAAS,eAAe,MAAuB;CAC7C,KAAK,KAAK,kBAAkB;EAC1B,IAAI,kBAAkB,KAAK,UAAU,GACnC,KAAK,SAAS;CAElB,GAAG,KAAK,cAAc,KAAK,iBAAiB;AAC9C;AAEA,SAAS,gBAAgB,UAA6B,MAAuB;CAC3E,MAAM,kBAAkB,KAAK,eAAe,KAAK;CAEjD,KAAK,WAAW,KAAK;CACrB,KAAK,aAAa,KAAK;CAEvB,IAAI,KAAK,OAAO,QAAQ,iBAAiB;EACvC,cAAc,IAAI;EAClB,KAAK,aAAa,KAAK;EACvB,eAAe,IAAI;CACrB;CAEA,IAAI,CAAC,KAAK,mBAAmB;EAC3B,KAAK,oBAAoB;EACzB,SAAS,WAAW,WAAW;GAC7B,cAAc,IAAI;GAClB,KAAK,oBAAoB;EAC3B,CAAC;CACH;AACF;AAEA,SAAgB,MACd,YACA,IACA,SACM;CACN,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH;CAGF,MAAM,QAAQ,eAAe,UAAU,OAAO;CAC9C,MAAM,aAAa,oBAAoB,SAAS,IAAI;CACpD,MAAM,OAAO,iBAA4B,UAAU,OAAO,gBAAgB;EACxE,MAAM;EACN,IAAI;EACJ,YAAY;EACZ,mBAAmB;EACnB,UAAU;EACV;EACA,iBAAiB;EACjB,mBAAmB;EACnB,mBAAmB;CACrB,EAAE;CAEF,KAAK,oBAAoB;CACzB,KAAK,kBAAkB;CACvB,KAAK,oBAAoB;CAEzB,8BAA8B;EAC5B,gBAAgB,UAAU,IAAI;CAChC,CAAC;AACH;AAEA,SAAgB,OACd,SACA,UAC4D;CAE5D,OAAO;EAAE,OAAO;EAAM,SAAS;EAAM,OAAO;CAAK;AACnD;AAEA,SAAgB,KACd,IACM;CACN,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH;CAIF,MAAM,OAAO,iBAMX,UAPY,eAAe,UAAU,MAO3B,GAAO,eAAe;EAChC,MAAM;EACN,SAAS;EACT,MAAM;CACR,EAAE;CAEF,IAAI,CAAC,KAAK,SAAS;EACjB,KAAK,OAAO;EACZ,wBAAwB,YAAY;GAClC,IAAI,KAAK,SACP;GAGF,KAAK,UAAU;GACf,OAAO,MAAM,KAAK,KAAK;EACzB,CAAC;CACH;AACF;;;;;;;;;;;AAYA,SAAgB,QAAW,IAAsB;CAC/C,MAAM,QAAQ,GAAG;CACjB,aAAa;AACf"}
@@ -1,24 +0,0 @@
1
- let bridge = {
2
- getCurrentSSRContext() {
3
- return null;
4
- },
5
- throwSSRDataMissing() {
6
- throw new Error("[Askr] SSR data missing (SSR bridge not installed). If you are rendering on the server, ensure you are using the askr SSR entrypoints.");
7
- },
8
- getCurrentRenderData() {
9
- return null;
10
- },
11
- getNextKey() {
12
- throw new Error("[Askr] getNextKey() called outside SSR render phase (SSR bridge not installed).");
13
- }
14
- };
15
- function installSSRBridge(next) {
16
- bridge = next;
17
- }
18
- function getSSRBridge() {
19
- return bridge;
20
- }
21
- //#endregion
22
- export { getSSRBridge, installSSRBridge };
23
-
24
- //# sourceMappingURL=ssr-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssr-bridge.js","names":[],"sources":["../../src/runtime/ssr-bridge.ts"],"sourcesContent":["import type { RenderContext } from '../common/ssr';\n\nexport type SSRBridge = {\n getCurrentSSRContext(): RenderContext | null;\n throwSSRDataMissing(): never;\n\n // Deterministic SSR render-phase data lookup\n getCurrentRenderData(): Record<string, unknown> | null;\n getNextKey(): string;\n};\n\nconst defaultBridge: SSRBridge = {\n getCurrentSSRContext() {\n return null;\n },\n throwSSRDataMissing() {\n throw new Error(\n '[Askr] SSR data missing (SSR bridge not installed). ' +\n 'If you are rendering on the server, ensure you are using the askr SSR entrypoints.'\n );\n },\n getCurrentRenderData() {\n return null;\n },\n getNextKey() {\n throw new Error(\n '[Askr] getNextKey() called outside SSR render phase (SSR bridge not installed).'\n );\n },\n};\n\nlet bridge: SSRBridge = defaultBridge;\n\nexport function installSSRBridge(next: SSRBridge): void {\n bridge = next;\n}\n\nexport function getSSRBridge(): SSRBridge {\n return bridge;\n}\n"],"mappings":"AA+BA,IAAI,SAAoB;CAnBtB,uBAAuB;EACrB,OAAO;CACT;CACA,sBAAsB;EACpB,MAAM,IAAI,MACR,wIAEF;CACF;CACA,uBAAuB;EACrB,OAAO;CACT;CACA,aAAa;EACX,MAAM,IAAI,MACR,iFACF;CACF;AAGsB;AAExB,SAAgB,iBAAiB,MAAuB;CACtD,SAAS;AACX;AAEA,SAAgB,eAA0B;CACxC,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/ssr/index.ts"],"mappings":";;;;;;;;;;;;;iBAosCgB,kBAAA,CACd,SAAA,GACE,KAAA,GAAQ,MAAA,sBACL,KAAA,GAAQ,UAAA,iDACb,KAAA,GAAQ,MAAA,mBACR,OAAA;EAAY,IAAA;EAAe,IAAA,GAAO,OAAA;AAAA;AAAA,iBAgCd,cAAA,CACpB,IAAA;EAEM,GAAA;EACA,QAAA,EAAU,aAAA;EACV,MAAA,GAAS,KAAA;IACP,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,WAAA;AAAA;EAGT,GAAA;EACA,QAAA,GAAW,aAAA;EACX,MAAA,EAAQ,KAAA;IACN,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,WAAA;AAAA,IAEd,OAAA,CAAQ,kBAAA;AAAA,KAsCC,QAAA;EACV,IAAA;EACA,OAAA,EAAS,YAAY;EACrB,SAAA;AAAA;AAAA,KAGG,kBAAA;EACH,GAAA;EACA,MAAA,EAAQ,QAAA;EACR,IAAA;EACA,IAAA,GAAO,OAAA;EACP,QAAA,GAAW,gBAAA;AAAA;AAAA,KAGR,kBAAA,GAAqB,kBAAkB;EAC1C,OAAA,CAAQ,IAAA;EACR,UAAA;AAAA;AAAA,iBAiGc,cAAA,CACd,SAAA,GACE,KAAA,GAAQ,MAAA,sBACL,KAAA,GAAQ,UAAA;AAAA,iBAEC,cAAA,CAAe,IAAwB,EAAlB,kBAAkB;AAAA,iBAiBvC,cAAA,CAAe,IAAwB,EAAlB,kBAAkB"}