@askrjs/askr 0.0.50 → 0.0.52

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 (594) hide show
  1. package/dist/bench/components/benchmark-row.d.ts +2 -2
  2. package/dist/bench/components/benchmark-row.js +0 -2
  3. package/dist/bench/components/benchmark-table.js +0 -2
  4. package/dist/benchmark.d.ts +1 -2
  5. package/dist/benchmark.js +5 -6
  6. package/dist/bin/askr-ssg.d.ts +1 -2
  7. package/dist/bin/askr-ssg.js +21 -6
  8. package/dist/boot/hydration.js +10 -11
  9. package/dist/boot/index.d.ts +1 -2
  10. package/dist/boot/index.js +21 -11
  11. package/dist/boot/root-lifecycle.d.ts +6 -3
  12. package/dist/boot/root-lifecycle.js +18 -14
  13. package/dist/boot/route-startup.js +13 -4
  14. package/dist/boot/types.d.ts +1 -2
  15. package/dist/common/attr-names.js +0 -2
  16. package/dist/common/component.d.ts +1 -2
  17. package/dist/common/control.d.ts +1 -2
  18. package/dist/common/control.js +0 -2
  19. package/dist/common/dom-range.d.ts +13 -0
  20. package/dist/common/env.js +1 -7
  21. package/dist/common/error-boundary.d.ts +15 -0
  22. package/dist/common/invariant.js +15 -0
  23. package/dist/common/jsx.d.ts +1 -2
  24. package/dist/common/jsx.js +0 -2
  25. package/dist/{dev → common}/logger.js +5 -8
  26. package/dist/common/promise.js +0 -2
  27. package/dist/common/props.d.ts +1 -2
  28. package/dist/common/render-context.js +0 -2
  29. package/dist/common/route-activity.js +0 -2
  30. package/dist/common/router-internal.js +0 -2
  31. package/dist/common/router.d.ts +1 -2
  32. package/dist/common/ssr-errors.d.ts +1 -2
  33. package/dist/common/ssr-errors.js +0 -2
  34. package/dist/common/ssr.d.ts +1 -2
  35. package/dist/common/ssr.js +0 -2
  36. package/dist/common/vnode.d.ts +1 -2
  37. package/dist/common/vnode.js +0 -2
  38. package/dist/components/error-boundary.d.ts +2 -16
  39. package/dist/components/error-boundary.js +2 -76
  40. package/dist/components/index.d.ts +2 -1
  41. package/dist/components/link.d.ts +2 -2
  42. package/dist/components/link.js +2 -2
  43. package/dist/control/case.d.ts +1 -2
  44. package/dist/control/case.js +1 -2
  45. package/dist/control/for.d.ts +3 -4
  46. package/dist/control/for.js +2 -4
  47. package/dist/control/shared.d.ts +1 -2
  48. package/dist/control/shared.js +0 -2
  49. package/dist/control/show.d.ts +1 -2
  50. package/dist/control/show.js +1 -2
  51. package/dist/data/data-runtime.d.ts +1 -2
  52. package/dist/data/data-runtime.js +3 -5
  53. package/dist/data/invalidation-listeners.js +0 -2
  54. package/dist/data/invalidation.d.ts +1 -2
  55. package/dist/data/invalidation.js +2 -4
  56. package/dist/data/mutation-cell.d.ts +1 -2
  57. package/dist/data/mutation-cell.js +7 -6
  58. package/dist/data/query-cell.d.ts +3 -2
  59. package/dist/data/query-cell.js +45 -11
  60. package/dist/data/query-key.js +0 -2
  61. package/dist/data/shared.js +3 -3
  62. package/dist/data/testing.js +2 -0
  63. package/dist/data/types.d.ts +1 -2
  64. package/dist/foundations/icon/icon.d.ts +1 -2
  65. package/dist/foundations/icon/icon.js +0 -2
  66. package/dist/foundations/icon/icon.types.d.ts +1 -2
  67. package/dist/foundations/index.d.ts +1 -1
  68. package/dist/foundations/index.js +1 -1
  69. package/dist/foundations/interactions/dismissable.d.ts +1 -2
  70. package/dist/foundations/interactions/dismissable.js +0 -2
  71. package/dist/foundations/interactions/focusable.d.ts +1 -2
  72. package/dist/foundations/interactions/focusable.js +0 -2
  73. package/dist/foundations/interactions/hoverable.d.ts +1 -2
  74. package/dist/foundations/interactions/hoverable.js +0 -2
  75. package/dist/foundations/interactions/interaction-policy.d.ts +1 -2
  76. package/dist/foundations/interactions/interaction-policy.js +0 -2
  77. package/dist/foundations/interactions/pressable.d.ts +1 -2
  78. package/dist/foundations/interactions/pressable.js +0 -2
  79. package/dist/foundations/interactions/roving-focus.d.ts +1 -2
  80. package/dist/foundations/interactions/roving-focus.js +0 -2
  81. package/dist/foundations/state/controllable.d.ts +1 -3
  82. package/dist/foundations/state/controllable.js +1 -2
  83. package/dist/foundations/structures/collection.d.ts +1 -2
  84. package/dist/foundations/structures/collection.js +0 -2
  85. package/dist/foundations/structures/index.d.ts +1 -1
  86. package/dist/foundations/structures/index.js +2 -1
  87. package/dist/foundations/structures/layer.d.ts +1 -2
  88. package/dist/foundations/structures/layer.js +0 -2
  89. package/dist/foundations/structures/layout.d.ts +1 -2
  90. package/dist/foundations/structures/layout.js +0 -2
  91. package/dist/foundations/structures/portal.d.ts +2 -24
  92. package/dist/foundations/structures/portal.js +3 -187
  93. package/dist/foundations/structures/presence.d.ts +1 -2
  94. package/dist/foundations/structures/presence.js +0 -2
  95. package/dist/foundations/structures/slot.d.ts +1 -2
  96. package/dist/foundations/structures/slot.js +0 -2
  97. package/dist/foundations/utilities/aria.d.ts +1 -2
  98. package/dist/foundations/utilities/aria.js +0 -2
  99. package/dist/foundations/utilities/compose-handlers.d.ts +1 -2
  100. package/dist/foundations/utilities/compose-handlers.js +0 -2
  101. package/dist/foundations/utilities/compose-ref.d.ts +1 -2
  102. package/dist/foundations/utilities/compose-ref.js +0 -2
  103. package/dist/foundations/utilities/event-types.d.ts +1 -2
  104. package/dist/foundations/utilities/merge-props.d.ts +1 -2
  105. package/dist/foundations/utilities/merge-props.js +0 -2
  106. package/dist/foundations/utilities/use-id.d.ts +1 -2
  107. package/dist/foundations/utilities/use-id.js +0 -2
  108. package/dist/fx/fx.d.ts +1 -2
  109. package/dist/fx/fx.js +2 -4
  110. package/dist/fx/index.js +1 -0
  111. package/dist/fx/noop.js +0 -2
  112. package/dist/fx/timing.d.ts +1 -2
  113. package/dist/fx/timing.js +0 -2
  114. package/dist/index.d.ts +4 -4
  115. package/dist/index.js +4 -6
  116. package/dist/jsx/types.d.ts +1 -2
  117. package/dist/jsx/utils.d.ts +1 -2
  118. package/dist/jsx/utils.js +0 -2
  119. package/dist/jsx-dev-runtime.d.ts +16 -2
  120. package/dist/jsx-dev-runtime.js +4 -12
  121. package/dist/jsx-runtime.d.ts +16 -2
  122. package/dist/jsx-runtime.js +16 -24
  123. package/dist/jsx-runtime2.d.ts +1 -1
  124. package/dist/renderer/attributes.js +29 -6
  125. package/dist/renderer/boundaries.js +50 -174
  126. package/dist/renderer/boundary-materialization.js +72 -0
  127. package/dist/renderer/boundary-range-adoption.js +76 -0
  128. package/dist/renderer/boundary-range-sync.js +101 -0
  129. package/dist/renderer/boundary-state.js +50 -0
  130. package/dist/renderer/child-shape.js +2 -4
  131. package/dist/renderer/children-fastpath.js +149 -0
  132. package/dist/renderer/children.js +3 -140
  133. package/dist/renderer/cleanup.js +72 -15
  134. package/dist/renderer/component-host-cleanup.js +124 -49
  135. package/dist/renderer/component-host-instances.js +60 -9
  136. package/dist/renderer/component-host-replacement.js +105 -0
  137. package/dist/renderer/component-host-results.js +138 -0
  138. package/dist/renderer/component-host.js +95 -170
  139. package/dist/renderer/dom-host.js +0 -2
  140. package/dist/renderer/dom-internal.js +115 -57
  141. package/dist/renderer/dom-range.js +161 -0
  142. package/dist/renderer/dom.js +7 -5
  143. package/dist/renderer/element-children.js +112 -32
  144. package/dist/renderer/error-boundary-dom.js +70 -13
  145. package/dist/renderer/evaluate-dom-range.js +3 -4
  146. package/dist/renderer/evaluate-reconcile.js +18 -42
  147. package/dist/renderer/evaluate.js +14 -3
  148. package/dist/renderer/fastpath.js +7 -14
  149. package/dist/renderer/for-commit-dom-map.js +6 -18
  150. package/dist/renderer/for-commit-removal.js +8 -17
  151. package/dist/renderer/for-commit-reorder.js +2 -4
  152. package/dist/renderer/for-commit.js +173 -45
  153. package/dist/renderer/hydration-boundaries.js +60 -0
  154. package/dist/renderer/hydration-listener-transaction.js +49 -0
  155. package/dist/renderer/index.js +11 -8
  156. package/dist/renderer/intrinsic-blueprint-analysis.js +202 -0
  157. package/dist/renderer/intrinsic-blueprint-bindings.js +152 -0
  158. package/dist/renderer/intrinsic-blueprint-materialization.js +100 -0
  159. package/dist/renderer/intrinsic-blueprint.js +30 -0
  160. package/dist/renderer/intrinsic-hydration-adoption.js +66 -0
  161. package/dist/renderer/keyed-children.js +3 -9
  162. package/dist/renderer/keyed.js +10 -10
  163. package/dist/renderer/namespaces.js +0 -2
  164. package/dist/renderer/prop-bindings.js +59 -24
  165. package/dist/renderer/reactive-child-dom.js +10 -4
  166. package/dist/renderer/reactive-child-sources.js +0 -2
  167. package/dist/renderer/reactive-children.js +33 -24
  168. package/dist/renderer/reconcile-commit.js +0 -2
  169. package/dist/renderer/reconcile-fastpaths.js +6 -12
  170. package/dist/renderer/reconcile-resolution.js +32 -56
  171. package/dist/renderer/reconcile.js +0 -2
  172. package/dist/renderer/retained-element-rollback.js +161 -149
  173. package/dist/renderer/stable-patch.js +5 -7
  174. package/dist/renderer/static-reuse.js +0 -2
  175. package/dist/renderer/utils.js +20 -10
  176. package/dist/resources/index.js +1 -2
  177. package/dist/router/access.js +0 -2
  178. package/dist/router/activity.d.ts +1 -2
  179. package/dist/router/activity.js +20 -24
  180. package/dist/router/authoring.d.ts +1 -2
  181. package/dist/router/authoring.js +1 -3
  182. package/dist/router/index.d.ts +1 -1
  183. package/dist/router/internal-types.d.ts +1 -2
  184. package/dist/router/lazy.d.ts +1 -2
  185. package/dist/router/lazy.js +0 -2
  186. package/dist/router/manifest.d.ts +1 -2
  187. package/dist/router/manifest.js +0 -2
  188. package/dist/router/match.js +0 -2
  189. package/dist/router/navigate.d.ts +1 -2
  190. package/dist/router/navigate.js +5 -8
  191. package/dist/router/navigation-registry.d.ts +1 -2
  192. package/dist/router/navigation-registry.js +1 -3
  193. package/dist/router/navigation-scroll.d.ts +1 -2
  194. package/dist/router/navigation-scroll.js +0 -2
  195. package/dist/router/navigation-targets.d.ts +3 -4
  196. package/dist/router/navigation-targets.js +425 -44
  197. package/dist/router/policy.d.ts +1 -2
  198. package/dist/router/policy.js +0 -2
  199. package/dist/router/rendering.d.ts +1 -2
  200. package/dist/router/rendering.js +5 -3
  201. package/dist/router/resolution.d.ts +2 -16
  202. package/dist/router/resolution.js +6 -175
  203. package/dist/router/route-context.js +0 -2
  204. package/dist/router/route-matching.d.ts +19 -0
  205. package/dist/router/route-matching.js +173 -0
  206. package/dist/router/route-query.d.ts +1 -2
  207. package/dist/router/route-query.js +1 -3
  208. package/dist/router/route.js +4 -2
  209. package/dist/router/store.d.ts +1 -2
  210. package/dist/router/store.js +0 -2
  211. package/dist/router/testing.js +4 -0
  212. package/dist/runtime/access.d.ts +19 -0
  213. package/dist/runtime/access.js +0 -2
  214. package/dist/runtime/child-scope.d.ts +21 -2
  215. package/dist/runtime/child-scope.js +101 -54
  216. package/dist/runtime/component-cleanup.d.ts +1 -2
  217. package/dist/runtime/component-cleanup.js +3 -5
  218. package/dist/runtime/component-commit.js +26 -24
  219. package/dist/runtime/component-facade.js +5 -3
  220. package/dist/runtime/component-internal.d.ts +12 -7
  221. package/dist/runtime/component-internal.js +64 -46
  222. package/dist/runtime/component-lifecycle.d.ts +2 -41
  223. package/dist/runtime/component-lifecycle.js +6 -149
  224. package/dist/runtime/component-scope.d.ts +4 -5
  225. package/dist/runtime/component-scope.js +27 -8
  226. package/dist/runtime/component.js +4 -3
  227. package/dist/runtime/context.d.ts +5 -2
  228. package/dist/runtime/context.js +29 -3
  229. package/dist/runtime/control.d.ts +22 -3
  230. package/dist/runtime/control.js +168 -55
  231. package/dist/runtime/derive.d.ts +1 -2
  232. package/dist/runtime/derive.js +0 -2
  233. package/dist/runtime/dev-namespace.d.ts +30 -0
  234. package/dist/runtime/dev-namespace.js +32 -25
  235. package/dist/runtime/effect.d.ts +8 -5
  236. package/dist/runtime/effect.js +158 -75
  237. package/dist/runtime/error-boundary.d.ts +4 -0
  238. package/dist/runtime/error-boundary.js +29 -0
  239. package/dist/runtime/events.d.ts +58 -0
  240. package/dist/runtime/events.js +67 -70
  241. package/dist/runtime/execution-model.d.ts +6 -0
  242. package/dist/runtime/execution-model.js +0 -2
  243. package/dist/runtime/fastlane.d.ts +33 -0
  244. package/dist/runtime/fastlane.js +0 -2
  245. package/dist/runtime/for-bench.d.ts +1 -2
  246. package/dist/runtime/for-bench.js +9 -167
  247. package/dist/runtime/for-internal.d.ts +73 -10
  248. package/dist/runtime/for-internal.js +201 -14
  249. package/dist/runtime/for-reconcile.d.ts +1 -2
  250. package/dist/runtime/for-reconcile.js +76 -23
  251. package/dist/runtime/for-scopes.d.ts +5 -5
  252. package/dist/runtime/for-scopes.js +168 -48
  253. package/dist/runtime/for-signals.d.ts +14 -5
  254. package/dist/runtime/for-signals.js +157 -83
  255. package/dist/runtime/for-types.d.ts +8 -0
  256. package/dist/runtime/for.d.ts +2 -2
  257. package/dist/runtime/for.js +3 -3
  258. package/dist/runtime/index.d.ts +24 -0
  259. package/dist/runtime/index.js +33 -0
  260. package/dist/runtime/lifecycle-batch.d.ts +59 -0
  261. package/dist/runtime/lifecycle-batch.js +178 -0
  262. package/dist/runtime/lifecycle-operation-settlement.d.ts +5 -0
  263. package/dist/runtime/lifecycle-operation-settlement.js +51 -0
  264. package/dist/runtime/lifecycle-operations.d.ts +1 -2
  265. package/dist/runtime/lifecycle-operations.js +5 -6
  266. package/dist/runtime/perf-metrics.d.ts +27 -0
  267. package/dist/runtime/perf-metrics.js +4 -68
  268. package/dist/runtime/portal.d.ts +21 -0
  269. package/dist/runtime/portal.js +305 -0
  270. package/dist/runtime/readable.d.ts +9 -4
  271. package/dist/runtime/readable.js +41 -17
  272. package/dist/runtime/resource-cell.js +3 -5
  273. package/dist/runtime/resource-operation.d.ts +1 -2
  274. package/dist/runtime/resource-operation.js +38 -35
  275. package/dist/runtime/runtime.d.ts +2 -3
  276. package/dist/runtime/runtime.js +0 -2
  277. package/dist/runtime/scheduler.d.ts +1 -2
  278. package/dist/runtime/scheduler.js +10 -13
  279. package/dist/runtime/selector-store.js +22 -0
  280. package/dist/runtime/selector.d.ts +1 -2
  281. package/dist/runtime/selector.js +6 -29
  282. package/dist/runtime/snapshot-source.d.ts +1 -2
  283. package/dist/runtime/snapshot-source.js +0 -2
  284. package/dist/runtime/state.d.ts +1 -2
  285. package/dist/runtime/state.js +1 -3
  286. package/dist/ssg/batch-render.js +0 -2
  287. package/dist/ssg/create-static-gen.d.ts +4 -2
  288. package/dist/ssg/create-static-gen.js +66 -14
  289. package/dist/ssg/generate-metadata.js +0 -2
  290. package/dist/ssg/generation-plan.js +0 -2
  291. package/dist/ssg/incremental-manifest.js +1 -3
  292. package/dist/ssg/resolve-ssg-data.js +0 -2
  293. package/dist/ssg/route-utils.js +0 -2
  294. package/dist/ssg/static-routes.js +1 -2
  295. package/dist/ssg/types.d.ts +2 -3
  296. package/dist/ssg/write-static-files.js +16 -12
  297. package/dist/ssr/attrs.js +0 -2
  298. package/dist/ssr/boundaries.js +17 -6
  299. package/dist/ssr/component-runtime.js +4 -30
  300. package/dist/ssr/context.d.ts +1 -2
  301. package/dist/ssr/context.js +0 -2
  302. package/dist/ssr/errors.d.ts +1 -2
  303. package/dist/ssr/errors.js +0 -2
  304. package/dist/ssr/escape.js +0 -2
  305. package/dist/ssr/hydration-data.js +0 -2
  306. package/dist/ssr/hydration-verify.d.ts +1 -2
  307. package/dist/ssr/hydration-verify.js +34 -7
  308. package/dist/ssr/index-internal.d.ts +1 -2
  309. package/dist/ssr/index-internal.js +0 -2
  310. package/dist/ssr/render-keys.js +0 -2
  311. package/dist/ssr/render-resolved.d.ts +1 -2
  312. package/dist/ssr/render-resolved.js +1 -3
  313. package/dist/ssr/render-sync.d.ts +1 -2
  314. package/dist/ssr/render-sync.js +28 -20
  315. package/dist/ssr/route-policy-resolution.js +2 -3
  316. package/dist/ssr/route-render.d.ts +1 -2
  317. package/dist/ssr/route-render.js +2 -3
  318. package/dist/ssr/sink.d.ts +1 -2
  319. package/dist/ssr/sink.js +0 -2
  320. package/dist/ssr/types.d.ts +1 -2
  321. package/dist/ssr/verify-hydration.js +0 -2
  322. package/dist/testing/index.d.ts +1 -2
  323. package/dist/testing/index.js +3 -4
  324. package/package.json +60 -47
  325. package/dist/bench/components/benchmark-row.d.ts.map +0 -1
  326. package/dist/bench/components/benchmark-row.js.map +0 -1
  327. package/dist/bench/components/benchmark-table.js.map +0 -1
  328. package/dist/benchmark.d.ts.map +0 -1
  329. package/dist/benchmark.js.map +0 -1
  330. package/dist/bin/askr-ssg.d.ts.map +0 -1
  331. package/dist/bin/askr-ssg.js.map +0 -1
  332. package/dist/boot/hydration.js.map +0 -1
  333. package/dist/boot/index.d.ts.map +0 -1
  334. package/dist/boot/index.js.map +0 -1
  335. package/dist/boot/root-lifecycle.d.ts.map +0 -1
  336. package/dist/boot/root-lifecycle.js.map +0 -1
  337. package/dist/boot/route-startup.js.map +0 -1
  338. package/dist/boot/types.d.ts.map +0 -1
  339. package/dist/common/attr-names.js.map +0 -1
  340. package/dist/common/component.d.ts.map +0 -1
  341. package/dist/common/control.d.ts.map +0 -1
  342. package/dist/common/control.js.map +0 -1
  343. package/dist/common/env.js.map +0 -1
  344. package/dist/common/jsx.d.ts.map +0 -1
  345. package/dist/common/jsx.js.map +0 -1
  346. package/dist/common/promise.js.map +0 -1
  347. package/dist/common/props.d.ts.map +0 -1
  348. package/dist/common/render-context.js.map +0 -1
  349. package/dist/common/route-activity.js.map +0 -1
  350. package/dist/common/router-internal.js.map +0 -1
  351. package/dist/common/router.d.ts.map +0 -1
  352. package/dist/common/ssr-errors.d.ts.map +0 -1
  353. package/dist/common/ssr-errors.js.map +0 -1
  354. package/dist/common/ssr.d.ts.map +0 -1
  355. package/dist/common/ssr.js.map +0 -1
  356. package/dist/common/vnode.d.ts.map +0 -1
  357. package/dist/common/vnode.js.map +0 -1
  358. package/dist/components/error-boundary.d.ts.map +0 -1
  359. package/dist/components/error-boundary.js.map +0 -1
  360. package/dist/components/link.d.ts.map +0 -1
  361. package/dist/components/link.js.map +0 -1
  362. package/dist/control/case.d.ts.map +0 -1
  363. package/dist/control/case.js.map +0 -1
  364. package/dist/control/for.d.ts.map +0 -1
  365. package/dist/control/for.js.map +0 -1
  366. package/dist/control/shared.d.ts.map +0 -1
  367. package/dist/control/shared.js.map +0 -1
  368. package/dist/control/show.d.ts.map +0 -1
  369. package/dist/control/show.js.map +0 -1
  370. package/dist/data/data-runtime.d.ts.map +0 -1
  371. package/dist/data/data-runtime.js.map +0 -1
  372. package/dist/data/invalidation-listeners.js.map +0 -1
  373. package/dist/data/invalidation.d.ts.map +0 -1
  374. package/dist/data/invalidation.js.map +0 -1
  375. package/dist/data/mutation-cell.d.ts.map +0 -1
  376. package/dist/data/mutation-cell.js.map +0 -1
  377. package/dist/data/query-cell.d.ts.map +0 -1
  378. package/dist/data/query-cell.js.map +0 -1
  379. package/dist/data/query-key.js.map +0 -1
  380. package/dist/data/shared.js.map +0 -1
  381. package/dist/data/types.d.ts.map +0 -1
  382. package/dist/dev/invariant.js +0 -29
  383. package/dist/dev/invariant.js.map +0 -1
  384. package/dist/dev/logger.js.map +0 -1
  385. package/dist/foundations/icon/icon.d.ts.map +0 -1
  386. package/dist/foundations/icon/icon.js.map +0 -1
  387. package/dist/foundations/icon/icon.types.d.ts.map +0 -1
  388. package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
  389. package/dist/foundations/interactions/dismissable.js.map +0 -1
  390. package/dist/foundations/interactions/focusable.d.ts.map +0 -1
  391. package/dist/foundations/interactions/focusable.js.map +0 -1
  392. package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
  393. package/dist/foundations/interactions/hoverable.js.map +0 -1
  394. package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
  395. package/dist/foundations/interactions/interaction-policy.js.map +0 -1
  396. package/dist/foundations/interactions/pressable.d.ts.map +0 -1
  397. package/dist/foundations/interactions/pressable.js.map +0 -1
  398. package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
  399. package/dist/foundations/interactions/roving-focus.js.map +0 -1
  400. package/dist/foundations/state/controllable.d.ts.map +0 -1
  401. package/dist/foundations/state/controllable.js.map +0 -1
  402. package/dist/foundations/structures/collection.d.ts.map +0 -1
  403. package/dist/foundations/structures/collection.js.map +0 -1
  404. package/dist/foundations/structures/layer.d.ts.map +0 -1
  405. package/dist/foundations/structures/layer.js.map +0 -1
  406. package/dist/foundations/structures/layout.d.ts.map +0 -1
  407. package/dist/foundations/structures/layout.js.map +0 -1
  408. package/dist/foundations/structures/portal.d.ts.map +0 -1
  409. package/dist/foundations/structures/portal.js.map +0 -1
  410. package/dist/foundations/structures/presence.d.ts.map +0 -1
  411. package/dist/foundations/structures/presence.js.map +0 -1
  412. package/dist/foundations/structures/slot.d.ts.map +0 -1
  413. package/dist/foundations/structures/slot.js.map +0 -1
  414. package/dist/foundations/utilities/aria.d.ts.map +0 -1
  415. package/dist/foundations/utilities/aria.js.map +0 -1
  416. package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
  417. package/dist/foundations/utilities/compose-handlers.js.map +0 -1
  418. package/dist/foundations/utilities/compose-ref.d.ts.map +0 -1
  419. package/dist/foundations/utilities/compose-ref.js.map +0 -1
  420. package/dist/foundations/utilities/event-types.d.ts.map +0 -1
  421. package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
  422. package/dist/foundations/utilities/merge-props.js.map +0 -1
  423. package/dist/foundations/utilities/use-id.d.ts.map +0 -1
  424. package/dist/foundations/utilities/use-id.js.map +0 -1
  425. package/dist/fx/fx.d.ts.map +0 -1
  426. package/dist/fx/fx.js.map +0 -1
  427. package/dist/fx/noop.js.map +0 -1
  428. package/dist/fx/timing.d.ts.map +0 -1
  429. package/dist/fx/timing.js.map +0 -1
  430. package/dist/index.js.map +0 -1
  431. package/dist/jsx/types.d.ts.map +0 -1
  432. package/dist/jsx/utils.d.ts.map +0 -1
  433. package/dist/jsx/utils.js.map +0 -1
  434. package/dist/jsx-dev-runtime.d.ts.map +0 -1
  435. package/dist/jsx-dev-runtime.js.map +0 -1
  436. package/dist/jsx-runtime.d.ts.map +0 -1
  437. package/dist/jsx-runtime.js.map +0 -1
  438. package/dist/renderer/attributes.js.map +0 -1
  439. package/dist/renderer/boundaries.js.map +0 -1
  440. package/dist/renderer/child-shape.js.map +0 -1
  441. package/dist/renderer/children.js.map +0 -1
  442. package/dist/renderer/cleanup.js.map +0 -1
  443. package/dist/renderer/component-host-cleanup.js.map +0 -1
  444. package/dist/renderer/component-host-instances.js.map +0 -1
  445. package/dist/renderer/component-host.js.map +0 -1
  446. package/dist/renderer/dom-host.js.map +0 -1
  447. package/dist/renderer/dom-internal.js.map +0 -1
  448. package/dist/renderer/element-children.js.map +0 -1
  449. package/dist/renderer/error-boundary-dom.js.map +0 -1
  450. package/dist/renderer/evaluate-dom-range.js.map +0 -1
  451. package/dist/renderer/evaluate-reconcile.js.map +0 -1
  452. package/dist/renderer/evaluate.js.map +0 -1
  453. package/dist/renderer/fastpath.js.map +0 -1
  454. package/dist/renderer/for-commit-dom-map.js.map +0 -1
  455. package/dist/renderer/for-commit-removal.js.map +0 -1
  456. package/dist/renderer/for-commit-reorder.js.map +0 -1
  457. package/dist/renderer/for-commit.js.map +0 -1
  458. package/dist/renderer/index.js.map +0 -1
  459. package/dist/renderer/keyed-children.js.map +0 -1
  460. package/dist/renderer/keyed.js.map +0 -1
  461. package/dist/renderer/namespaces.js.map +0 -1
  462. package/dist/renderer/prop-bindings.js.map +0 -1
  463. package/dist/renderer/reactive-child-dom.js.map +0 -1
  464. package/dist/renderer/reactive-child-sources.js.map +0 -1
  465. package/dist/renderer/reactive-children.js.map +0 -1
  466. package/dist/renderer/reconcile-commit.js.map +0 -1
  467. package/dist/renderer/reconcile-fastpaths.js.map +0 -1
  468. package/dist/renderer/reconcile-resolution.js.map +0 -1
  469. package/dist/renderer/reconcile.js.map +0 -1
  470. package/dist/renderer/retained-element-rollback.js.map +0 -1
  471. package/dist/renderer/stable-patch.js.map +0 -1
  472. package/dist/renderer/static-reuse.js.map +0 -1
  473. package/dist/renderer/utils.js.map +0 -1
  474. package/dist/router/access.js.map +0 -1
  475. package/dist/router/activity.d.ts.map +0 -1
  476. package/dist/router/activity.js.map +0 -1
  477. package/dist/router/authoring.d.ts.map +0 -1
  478. package/dist/router/authoring.js.map +0 -1
  479. package/dist/router/internal-types.d.ts.map +0 -1
  480. package/dist/router/lazy.d.ts.map +0 -1
  481. package/dist/router/lazy.js.map +0 -1
  482. package/dist/router/manifest.d.ts.map +0 -1
  483. package/dist/router/manifest.js.map +0 -1
  484. package/dist/router/match.js.map +0 -1
  485. package/dist/router/navigate.d.ts.map +0 -1
  486. package/dist/router/navigate.js.map +0 -1
  487. package/dist/router/navigation-registry.d.ts.map +0 -1
  488. package/dist/router/navigation-registry.js.map +0 -1
  489. package/dist/router/navigation-scroll.d.ts.map +0 -1
  490. package/dist/router/navigation-scroll.js.map +0 -1
  491. package/dist/router/navigation-targets.d.ts.map +0 -1
  492. package/dist/router/navigation-targets.js.map +0 -1
  493. package/dist/router/policy.d.ts.map +0 -1
  494. package/dist/router/policy.js.map +0 -1
  495. package/dist/router/rendering.d.ts.map +0 -1
  496. package/dist/router/rendering.js.map +0 -1
  497. package/dist/router/resolution.d.ts.map +0 -1
  498. package/dist/router/resolution.js.map +0 -1
  499. package/dist/router/route-context.js.map +0 -1
  500. package/dist/router/route-query.d.ts.map +0 -1
  501. package/dist/router/route-query.js.map +0 -1
  502. package/dist/router/store.d.ts.map +0 -1
  503. package/dist/router/store.js.map +0 -1
  504. package/dist/runtime/access.js.map +0 -1
  505. package/dist/runtime/child-scope.d.ts.map +0 -1
  506. package/dist/runtime/child-scope.js.map +0 -1
  507. package/dist/runtime/component-cleanup.d.ts.map +0 -1
  508. package/dist/runtime/component-cleanup.js.map +0 -1
  509. package/dist/runtime/component-commit.js.map +0 -1
  510. package/dist/runtime/component-contracts.js +0 -5
  511. package/dist/runtime/component-internal.d.ts.map +0 -1
  512. package/dist/runtime/component-internal.js.map +0 -1
  513. package/dist/runtime/component-lifecycle.d.ts.map +0 -1
  514. package/dist/runtime/component-lifecycle.js.map +0 -1
  515. package/dist/runtime/component-scope.d.ts.map +0 -1
  516. package/dist/runtime/component-scope.js.map +0 -1
  517. package/dist/runtime/context.d.ts.map +0 -1
  518. package/dist/runtime/context.js.map +0 -1
  519. package/dist/runtime/control.d.ts.map +0 -1
  520. package/dist/runtime/control.js.map +0 -1
  521. package/dist/runtime/derive.d.ts.map +0 -1
  522. package/dist/runtime/derive.js.map +0 -1
  523. package/dist/runtime/dev-namespace.js.map +0 -1
  524. package/dist/runtime/effect.d.ts.map +0 -1
  525. package/dist/runtime/effect.js.map +0 -1
  526. package/dist/runtime/events.js.map +0 -1
  527. package/dist/runtime/execution-model.js.map +0 -1
  528. package/dist/runtime/fastlane.js.map +0 -1
  529. package/dist/runtime/for-bench.d.ts.map +0 -1
  530. package/dist/runtime/for-bench.js.map +0 -1
  531. package/dist/runtime/for-internal.d.ts.map +0 -1
  532. package/dist/runtime/for-internal.js.map +0 -1
  533. package/dist/runtime/for-reconcile.d.ts.map +0 -1
  534. package/dist/runtime/for-reconcile.js.map +0 -1
  535. package/dist/runtime/for-scopes.d.ts.map +0 -1
  536. package/dist/runtime/for-scopes.js.map +0 -1
  537. package/dist/runtime/for-signals.d.ts.map +0 -1
  538. package/dist/runtime/for-signals.js.map +0 -1
  539. package/dist/runtime/lifecycle-operations.d.ts.map +0 -1
  540. package/dist/runtime/lifecycle-operations.js.map +0 -1
  541. package/dist/runtime/perf-metrics.js.map +0 -1
  542. package/dist/runtime/readable.d.ts.map +0 -1
  543. package/dist/runtime/readable.js.map +0 -1
  544. package/dist/runtime/resource-cell.js.map +0 -1
  545. package/dist/runtime/resource-operation.d.ts.map +0 -1
  546. package/dist/runtime/resource-operation.js.map +0 -1
  547. package/dist/runtime/runtime.d.ts.map +0 -1
  548. package/dist/runtime/runtime.js.map +0 -1
  549. package/dist/runtime/scheduler.d.ts.map +0 -1
  550. package/dist/runtime/scheduler.js.map +0 -1
  551. package/dist/runtime/selector.d.ts.map +0 -1
  552. package/dist/runtime/selector.js.map +0 -1
  553. package/dist/runtime/snapshot-source.d.ts.map +0 -1
  554. package/dist/runtime/snapshot-source.js.map +0 -1
  555. package/dist/runtime/state.d.ts.map +0 -1
  556. package/dist/runtime/state.js.map +0 -1
  557. package/dist/ssg/batch-render.js.map +0 -1
  558. package/dist/ssg/create-static-gen.d.ts.map +0 -1
  559. package/dist/ssg/create-static-gen.js.map +0 -1
  560. package/dist/ssg/generate-metadata.js.map +0 -1
  561. package/dist/ssg/generation-plan.js.map +0 -1
  562. package/dist/ssg/incremental-manifest.js.map +0 -1
  563. package/dist/ssg/resolve-ssg-data.js.map +0 -1
  564. package/dist/ssg/route-utils.js.map +0 -1
  565. package/dist/ssg/static-routes.js.map +0 -1
  566. package/dist/ssg/types.d.ts.map +0 -1
  567. package/dist/ssg/write-static-files.js.map +0 -1
  568. package/dist/ssr/attrs.js.map +0 -1
  569. package/dist/ssr/boundaries.js.map +0 -1
  570. package/dist/ssr/component-runtime.js.map +0 -1
  571. package/dist/ssr/context.d.ts.map +0 -1
  572. package/dist/ssr/context.js.map +0 -1
  573. package/dist/ssr/errors.d.ts.map +0 -1
  574. package/dist/ssr/errors.js.map +0 -1
  575. package/dist/ssr/escape.js.map +0 -1
  576. package/dist/ssr/hydration-data.js.map +0 -1
  577. package/dist/ssr/hydration-verify.d.ts.map +0 -1
  578. package/dist/ssr/hydration-verify.js.map +0 -1
  579. package/dist/ssr/index-internal.d.ts.map +0 -1
  580. package/dist/ssr/index-internal.js.map +0 -1
  581. package/dist/ssr/render-keys.js.map +0 -1
  582. package/dist/ssr/render-resolved.d.ts.map +0 -1
  583. package/dist/ssr/render-resolved.js.map +0 -1
  584. package/dist/ssr/render-sync.d.ts.map +0 -1
  585. package/dist/ssr/render-sync.js.map +0 -1
  586. package/dist/ssr/route-policy-resolution.js.map +0 -1
  587. package/dist/ssr/route-render.d.ts.map +0 -1
  588. package/dist/ssr/route-render.js.map +0 -1
  589. package/dist/ssr/sink.d.ts.map +0 -1
  590. package/dist/ssr/sink.js.map +0 -1
  591. package/dist/ssr/types.d.ts.map +0 -1
  592. package/dist/ssr/verify-hydration.js.map +0 -1
  593. package/dist/testing/index.d.ts.map +0 -1
  594. package/dist/testing/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-reuse.js","names":[],"sources":["../../src/renderer/static-reuse.ts"],"sourcesContent":["/**\n * Static subtree reuse checks for intrinsic DOM children.\n */\n\nimport { Fragment } from '../jsx/jsx-runtime';\nimport { hasMatchingStaticProps } from './attributes';\nimport { _isDOMElement, type DOMElement } from './types';\nimport { tagNamesEqualIgnoreCase } from './utils';\n\nfunction isFragmentVNode(node: unknown): node is DOMElement {\n return (\n _isDOMElement(node) &&\n typeof (node as DOMElement).type === 'symbol' &&\n ((node as DOMElement).type === Fragment ||\n String((node as DOMElement).type) === 'Symbol(askr.fragment)')\n );\n}\n\nfunction upperCommonTagName(tag: string): string | null {\n switch (tag) {\n case 'div':\n return 'DIV';\n case 'span':\n return 'SPAN';\n case 'p':\n return 'P';\n case 'a':\n return 'A';\n case 'button':\n return 'BUTTON';\n case 'input':\n return 'INPUT';\n case 'ul':\n return 'UL';\n case 'ol':\n return 'OL';\n case 'li':\n return 'LI';\n default:\n return null;\n }\n}\n\nexport function tagsEqualIgnoreCase(\n elementTagName: string,\n vnodeType: string\n): boolean {\n const upperCommon = upperCommonTagName(vnodeType);\n if (upperCommon !== null && elementTagName === upperCommon) return true;\n return tagNamesEqualIgnoreCase(elementTagName, vnodeType);\n}\n\ntype StaticChildSlot =\n | { kind: 'text'; value: string }\n | { kind: 'element'; value: DOMElement };\n\nconst STATIC_CHILD_SLOTS_CACHE = Symbol.for('__askrStaticChildSlots');\nlet staticChildSlotsCacheEnabled = true;\n\ninterface StaticChildSlotsCacheNode {\n [STATIC_CHILD_SLOTS_CACHE]?: StaticChildSlot[] | null;\n}\n\nexport function setStaticChildSlotsCacheEnabled(enabled: boolean): void {\n staticChildSlotsCacheEnabled = enabled;\n}\n\nfunction collectStaticChildSlots(\n children: unknown,\n slots: StaticChildSlot[]\n): boolean {\n if (isFragmentVNode(children)) {\n const fragmentChildren = children.props?.children ?? children.children;\n return collectStaticChildSlots(fragmentChildren, slots);\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n if (!collectStaticChildSlots(child, slots)) {\n return false;\n }\n }\n return true;\n }\n\n if (children === null || children === undefined || children === false) {\n return true;\n }\n\n if (typeof children === 'string' || typeof children === 'number') {\n slots.push({ kind: 'text', value: String(children) });\n return true;\n }\n\n if (\n _isDOMElement(children) &&\n typeof (children as DOMElement).type === 'string'\n ) {\n slots.push({ kind: 'element', value: children as DOMElement });\n return true;\n }\n\n return false;\n}\n\nfunction getStaticChildSlots(vnode: DOMElement): StaticChildSlot[] | null {\n if (staticChildSlotsCacheEnabled) {\n const cacheNode = vnode as DOMElement & StaticChildSlotsCacheNode;\n const cached = cacheNode[STATIC_CHILD_SLOTS_CACHE];\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const slots: StaticChildSlot[] = [];\n const staticSlots = collectStaticChildSlots(\n (vnode.props?.children ?? vnode.children) as unknown,\n slots\n )\n ? slots\n : null;\n if (staticChildSlotsCacheEnabled) {\n const cacheNode = vnode as DOMElement & StaticChildSlotsCacheNode;\n if (Object.isExtensible(vnode)) {\n cacheNode[STATIC_CHILD_SLOTS_CACHE] = staticSlots;\n }\n }\n return staticSlots;\n}\n\nexport function canReuseStaticSubtree(el: Element, vnode: DOMElement): boolean {\n if (\n typeof vnode.type !== 'string' ||\n !tagsEqualIgnoreCase(el.tagName, vnode.type)\n ) {\n return false;\n }\n\n const props = (vnode.props || {}) as Record<string, unknown>;\n if (!hasMatchingStaticProps(el, props, vnode.type)) {\n return false;\n }\n\n const slots = getStaticChildSlots(vnode);\n if (!slots) {\n return false;\n }\n\n if (el.childNodes.length !== slots.length) {\n return false;\n }\n\n for (let index = 0; index < slots.length; index += 1) {\n const slot = slots[index];\n const current = el.childNodes[index];\n if (!current) {\n return false;\n }\n\n if (slot.kind === 'text') {\n if (current.nodeType !== 3 || (current as Text).data !== slot.value) {\n return false;\n }\n continue;\n }\n\n if (!(current instanceof Element)) {\n return false;\n }\n\n if (!canReuseStaticSubtree(current, slot.value)) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAS,gBAAgB,MAAmC;CAC1D,OACE,cAAc,IAAI,KAClB,OAAQ,KAAoB,SAAS,aACnC,KAAoB,SAAS,YAC7B,OAAQ,KAAoB,IAAI,MAAM;AAE5C;AAEA,SAAS,mBAAmB,KAA4B;CACtD,QAAQ,KAAR;EACE,KAAK,OACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBACd,gBACA,WACS;CACT,MAAM,cAAc,mBAAmB,SAAS;CAChD,IAAI,gBAAgB,QAAQ,mBAAmB,aAAa,OAAO;CACnE,OAAO,wBAAwB,gBAAgB,SAAS;AAC1D;AAMA,MAAM,2BAA2B,OAAO,IAAI,wBAAwB;AACpE,IAAI,+BAA+B;AAMnC,SAAgB,gCAAgC,SAAwB;CACtE,+BAA+B;AACjC;AAEA,SAAS,wBACP,UACA,OACS;CACT,IAAI,gBAAgB,QAAQ,GAE1B,OAAO,wBADkB,SAAS,OAAO,YAAY,SAAS,UACb,KAAK;CAGxD,IAAI,MAAM,QAAQ,QAAQ,GAAG;EAC3B,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,wBAAwB,OAAO,KAAK,GACvC,OAAO;EAGX,OAAO;CACT;CAEA,IAAI,aAAa,QAAQ,aAAa,UAAa,aAAa,OAC9D,OAAO;CAGT,IAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU;EAChE,MAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,OAAO,QAAQ;EAAE,CAAC;EACpD,OAAO;CACT;CAEA,IACE,cAAc,QAAQ,KACtB,OAAQ,SAAwB,SAAS,UACzC;EACA,MAAM,KAAK;GAAE,MAAM;GAAW,OAAO;EAAuB,CAAC;EAC7D,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,oBAAoB,OAA6C;CACxE,IAAI,8BAA8B;EAEhC,MAAM,SAAS,MAAU;EACzB,IAAI,WAAW,QACb,OAAO;CAEX;CAEA,MAAM,QAA2B,CAAC;CAClC,MAAM,cAAc,wBACjB,MAAM,OAAO,YAAY,MAAM,UAChC,KACF,IACI,QACA;CACJ,IAAI,8BAA8B;EAChC,MAAM,YAAY;EAClB,IAAI,OAAO,aAAa,KAAK,GAC3B,UAAU,4BAA4B;CAE1C;CACA,OAAO;AACT;AAEA,SAAgB,sBAAsB,IAAa,OAA4B;CAC7E,IACE,OAAO,MAAM,SAAS,YACtB,CAAC,oBAAoB,GAAG,SAAS,MAAM,IAAI,GAE3C,OAAO;CAIT,IAAI,CAAC,uBAAuB,IADb,MAAM,SAAS,CAAC,GACQ,MAAM,IAAI,GAC/C,OAAO;CAGT,MAAM,QAAQ,oBAAoB,KAAK;CACvC,IAAI,CAAC,OACH,OAAO;CAGT,IAAI,GAAG,WAAW,WAAW,MAAM,QACjC,OAAO;CAGT,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU,GAAG,WAAW;EAC9B,IAAI,CAAC,SACH,OAAO;EAGT,IAAI,KAAK,SAAS,QAAQ;GACxB,IAAI,QAAQ,aAAa,KAAM,QAAiB,SAAS,KAAK,OAC5D,OAAO;GAET;EACF;EAEA,IAAI,EAAE,mBAAmB,UACvB,OAAO;EAGT,IAAI,CAAC,sBAAsB,SAAS,KAAK,KAAK,GAC5C,OAAO;CAEX;CAEA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/renderer/utils.ts"],"sourcesContent":["/**\n * Shared utilities for the renderer module.\n * Consolidates common patterns to reduce code duplication.\n */\n\nimport { runRuntimeHandlerScope } from '../runtime/access';\nimport { logger } from '../dev/logger';\nimport { getPublicAttributeName } from '../common/attr-names';\nimport { getRuntimeEnv } from './env';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\n\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n// Keep direct replaceChildren(...nodes) commits below a conservative argument\n// count until browser benchmarks prove larger spreads are safe.\nexport const DIRECT_REPLACE_CHILDREN_SPREAD_LIMIT = 4096;\n\nexport function canUseDirectReplaceChildrenSpread(count: number): boolean {\n return count <= DIRECT_REPLACE_CHILDREN_SPREAD_LIMIT;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ListenerEntry {\n handler: EventListener;\n original: EventListener;\n eventName: string;\n options?: boolean | AddEventListenerOptions;\n updateHandler?: (nextHandler: EventListener) => void;\n}\n\nexport interface ParsedEventProp {\n eventName: string;\n capture: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Handler Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Handler pooling cache to avoid recreating wrapped handlers\n// Key: handler reference, Value: { wrapped: EventListener, flushAfter: boolean }\nconst handlerCache = new WeakMap<EventListener, Map<boolean, EventListener>>();\nlet cacheSize = 0;\nconst MAX_CACHE_SIZE = 1000;\n\n/**\n * Parse an event prop name (e.g., 'onClick') to its DOM event name (e.g., 'click')\n */\nexport function parseEventName(propName: string): string | null {\n return parseEventProp(propName)?.eventName ?? null;\n}\n\nexport function parseEventProp(propName: string): ParsedEventProp | null {\n if (!propName.startsWith('on') || propName.length <= 2) return null;\n const capture =\n propName.endsWith('Capture') && propName.length > 'onCapture'.length;\n const normalizedPropName = capture\n ? propName.slice(0, -'Capture'.length)\n : propName;\n\n return normalizedPropName.length <= 2\n ? null\n : {\n eventName:\n normalizedPropName.slice(2).charAt(0).toLowerCase() +\n normalizedPropName.slice(3).toLowerCase(),\n capture,\n };\n}\n\nexport function getEventListenerKey(\n eventName: string,\n capture = false\n): string {\n return capture ? `${eventName}:capture` : eventName;\n}\n\nexport function getEventListenerOptions(\n eventName: string,\n capture = false\n): AddEventListenerOptions | undefined {\n const passiveOptions = getPassiveOptions(eventName);\n if (!capture) {\n return passiveOptions;\n }\n\n return passiveOptions\n ? { ...passiveOptions, capture: true }\n : { capture: true };\n}\n\n/**\n * Get default event listener options for passive events\n */\nexport function getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\n/**\n * Create a wrapped event handler that integrates with the scheduler\n * Uses caching to avoid recreating wrappers for the same handler\n */\nexport function createWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): EventListener {\n // Check cache first\n const cachedByFlush = handlerCache.get(handler);\n if (cachedByFlush) {\n const cached = cachedByFlush.get(flushAfter);\n if (cached) return cached;\n }\n\n const wrapped: EventListener = (event: Event) => {\n try {\n runRuntimeHandlerScope(\n () => {\n try {\n handler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n // Cache the wrapped handler\n try {\n if (!handlerCache.has(handler)) {\n // Limit cache size to prevent memory leaks\n if (cacheSize >= MAX_CACHE_SIZE) {\n // Simple eviction - just don't cache new entries when full\n } else {\n cacheSize++;\n handlerCache.set(handler, new Map());\n }\n }\n handlerCache.get(handler)?.set(flushAfter, wrapped);\n } catch {\n // WeakMap can throw if handler is not a valid key\n }\n\n return wrapped;\n}\n\nexport function createMutableWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): {\n handler: EventListener;\n updateHandler: (nextHandler: EventListener) => void;\n} {\n let currentHandler = handler;\n\n const wrapped: EventListener = (event: Event) => {\n try {\n runRuntimeHandlerScope(\n () => {\n try {\n currentHandler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n return {\n handler: wrapped,\n updateHandler(nextHandler: EventListener) {\n currentHandler = nextHandler;\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Prop/Attribute Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Props that should be skipped during attribute processing */\nexport function isSkippedProp(key: string): boolean {\n return key === 'children' || key === 'key' || key === 'ref';\n}\n\n/** Check if prop should be ignored for prop-change detection */\nexport function isIgnoredForPropChanges(key: string): boolean {\n if (key === 'children' || key === 'key') return true;\n if (key.startsWith('on') && key.length > 2) return true;\n if (key.startsWith('data-')) return true;\n return false;\n}\n\n/**\n * Check if an element's current attribute value differs from vnode value\n */\nexport function hasPropChanged(\n el: Element,\n key: string,\n value: unknown\n): boolean {\n try {\n if (key === 'class' || key === 'className') {\n return readElementClassName(el) !== String(value);\n }\n if (key === 'value' || key === 'checked') {\n return (el as HTMLElement & Record<string, unknown>)[key] !== value;\n }\n const attr = el.getAttribute(getRenderedAttributeName(el, key));\n if (value === undefined || value === null || value === false) {\n return attr !== null;\n }\n return String(value) !== attr;\n } catch {\n return true;\n }\n}\n\nexport function isSVGDomElement(el: Element): el is SVGElement {\n return typeof SVGElement !== 'undefined' && el instanceof SVGElement;\n}\n\nexport function getRenderedAttributeName(\n el: Element,\n propName: string\n): string {\n const attributeName = getPublicAttributeName(propName);\n\n return el.namespaceURI === SVG_NAMESPACE\n ? attributeName\n : attributeName.toLowerCase();\n}\n\nexport function setRenderedAttribute(\n el: Element,\n propName: string,\n value: string\n): void {\n el.setAttribute(getRenderedAttributeName(el, propName), value);\n}\n\nexport function removeRenderedAttribute(el: Element, propName: string): void {\n el.removeAttribute(getRenderedAttributeName(el, propName));\n}\n\nexport function readElementClassName(el: Element): string {\n if (isSVGDomElement(el)) {\n return el.getAttribute('class') ?? '';\n }\n\n return (el as HTMLElement).className;\n}\n\nexport function writeElementClassName(el: Element, value: string): void {\n if (isSVGDomElement(el)) {\n if (value.length > 0) {\n el.setAttribute('class', value);\n } else {\n el.removeAttribute('class');\n }\n return;\n }\n\n (el as HTMLElement).className = value;\n}\n\nexport function tagNamesEqualIgnoreCase(a: string, b: string): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index += 1) {\n const aCode = a.charCodeAt(index);\n const bCode = b.charCodeAt(index);\n if (aCode === bCode) continue;\n\n const normalizedA = aCode >= 65 && aCode <= 90 ? aCode + 32 : aCode;\n const normalizedB = bCode >= 65 && bCode <= 90 ? bCode + 32 : bCode;\n if (normalizedA !== normalizedB) return false;\n }\n\n return true;\n}\n\n/**\n * Check if a vnode has non-trivial props (excluding events and data-*)\n */\nexport function hasNonTrivialProps(props: Record<string, unknown>): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n return true;\n }\n return false;\n}\n\n/**\n * Check for prop changes between vnode and existing element\n */\nexport function checkPropChanges(\n el: Element,\n props: Record<string, unknown>\n): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n return false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extract key from a vnode object\n */\nexport function extractKey(vnode: unknown): string | number | undefined {\n if (typeof vnode !== 'object' || vnode === null) return undefined;\n const obj = vnode as Record<string, unknown>;\n const rawKey =\n obj.key ?? (obj.props as Record<string, unknown> | undefined)?.key;\n if (rawKey === undefined || rawKey === null) return undefined;\n return typeof rawKey === 'symbol'\n ? String(rawKey)\n : (rawKey as string | number);\n}\n\n/**\n * Build a key map from element's children\n */\nexport function buildKeyMapFromChildren(\n parent: Element\n): Map<string | number, Element> {\n const map = new Map<string | number, Element>();\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n map.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, ch);\n }\n }\n return map;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Diagnostic Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Record DOM replace operation for diagnostics\n */\nexport function recordDOMReplace(source: string): void {\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(`__LAST_DOM_REPLACE_STACK_${source}`, new Error().stack);\n } catch {\n // ignore\n }\n}\n\n/**\n * Record fast-path stats for diagnostics\n */\nexport function recordFastPathStats(\n stats: Record<string, unknown>,\n counterName?: string\n): void {\n try {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n if (counterName) {\n incDevCounter(counterName);\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Conditionally log debug info for fast-path operations\n */\nexport function logFastPathDebug(\n message: string,\n indexOrData?: number | unknown,\n data?: unknown\n): void {\n const env = getRuntimeEnv();\n if (env.ASKR_FASTPATH_DEBUG === '1' || env.ASKR_FASTPATH_DEBUG === 'true') {\n if (data !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData, data);\n } else if (indexOrData !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData);\n } else {\n logger.warn(`[Askr][FASTPATH] ${message}`);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get current high-resolution timestamp\n */\nexport function now(): number {\n return typeof performance !== 'undefined' && performance.now\n ? performance.now()\n : Date.now();\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"access.js","names":[],"sources":["../../src/router/access.ts"],"sourcesContent":["import type {\n GroupHelperOptions,\n RouteOptions,\n RoutePolicy,\n} from '../common/router';\nimport {\n requireAuth,\n requireGuest,\n requirePermission,\n requireRole,\n} from './policy';\nimport type { AccessScopeState } from './internal-types';\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\nexport function 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\nexport function 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\nexport function 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"],"mappings":";;AAaA,SAAS,uBACP,MACS;CACT,OAAO,KAAK,SAAS,UAAa,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;AAC1D;AAEA,SAAS,+BACP,MACM;CACN,IAAI,KAAK,SAAS,YAAY,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,aAClD,MAAM,IAAI,MACR,4EACF;AAEJ;AAEA,SAAgB,uBACd,MACA,SAIM;CACN,+BAA+B,IAAI;CAEnC,MAAM,wBACJ,KAAK,SAAS,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;CAE9C,IACE,KAAK,SAAS,YACb,QAAQ,MAAM,iBAAiB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,aAEtD,MAAM,IAAI,MACR,8EACF;CAGF,IAAI,QAAQ,MAAM,aAAa,uBAC7B,MAAM,IAAI,MACR,uFACF;CAGF,IAAI,uBAAuB,IAAI,KAAK,CAAC,QAAQ,gBAC3C,MAAM,IAAI,MACR,6FACF;AAEJ;AAEA,SAAgB,qBACd,MACA,OACkB;CAClB,MAAM,wBACJ,KAAK,SAAS,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;CAE9C,OAAO;EACL,WAAW,MAAM,aAAa,KAAK,SAAS;EAC5C,eAAe,MAAM,iBAAiB;CACxC;AACF;AAEA,SAAgB,oBACd,MAIe;CACf,+BAA+B,IAAI;CAEnC,MAAM,WAA0B,CAAC;CAEjC,IAAI,KAAK,SAAS,MAChB,SAAS,KAAK,YAAY,CAAC;MACtB,IAAI,KAAK,SAAS,SACvB,SAAS,KAAK,aAAa,CAAC;CAG9B,IAAI,KAAK,MACP,SAAS,KAAK,YAAY,KAAK,IAAI,CAAC;CAGtC,IAAI,KAAK,YACP,SAAS,KAAK,kBAAkB,KAAK,UAAU,CAAC;CAGlD,IAAI,KAAK,UAAU,QACjB,SAAS,KAAK,GAAG,KAAK,QAAQ;CAGhC,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"activity.d.ts","names":[],"sources":["../../src/router/activity.ts"],"mappings":";;;iBAyBgB,iBAAA,CAAkB,GAAkB;AAAA,iBA6DpC,iBAAA,CACd,WAAuC;AAAA,iBA8EzB,YAAA,iBACE,WAAA,GAAc,WAAA,KAC3B,aAAA,CAAc,OAAA;AAAA,iBAiBH,wBAAA,CACd,QAAA,UACA,MAAA,UACA,IAAA,UACA,eAAA,YAA2B,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"activity.js","names":[],"sources":["../../src/router/activity.ts"],"sourcesContent":["import type { RouteMatch, RouteParams, RouteSnapshot } from '../common/router';\nimport { syncRouteActivitySnapshot } from '../common/route-activity';\nimport { getActiveRenderContext } from '../common/render-context';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport {\n markReadableDerivedSubscribersDirty,\n markReactivePropsDirtySource,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from '../runtime/readable';\nimport { deepFreeze, makeQuery, parseLocation } from './route-context';\nimport { computeMatchesFromRoutes } from './resolution';\nimport { getActiveRoutes } from './store';\n\nlet currentRouteSnapshot = buildRouteSnapshot('/', '', '');\n\nconst currentRouteSource = (() =>\n currentRouteSnapshot) as ReadableSource<RouteSnapshot> &\n (() => RouteSnapshot);\n\ncurrentRouteSource._readers = new Map();\n\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\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 = getActiveRenderContext();\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"],"mappings":";;;;;;;;;AAeA,IAAI,uBAAuB,mBAAmB,KAAK,IAAI,EAAE;AAEzD,MAAM,4BACJ;AAGF,mBAAmB,2BAAW,IAAI,IAAI;AAEtC,IAAI,iBAAgC;AAEpC,SAAgB,kBAAkB,KAA0B;CAC1D,iBAAiB;CACjB,IAAI,KAAK;EACP,MAAM,SAAS,cAAc,GAAG;EAChC,0BACE,OAAO,UACP,yBAAyB,OAAO,UAAU,gBAAgB,CAAC,CAC7D;EACA;CACF;CAEA,0BACE,qBAAqB,MACrB,qBAAqB,OACvB;AACF;AAEA,SAAS,mBACP,UACA,QACA,MACe;CACf,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,yBAAyB,UAAU,gBAAgB,CAAC;CAEpE,OAAO,OAAO,OAAO;EACnB,MAAM;EACN,QAAQ,WAAW,EAAE,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC;EAC5C;EACA,MAAM,QAAQ;EACd,SAAS,OAAO,OAAO,OAAO;CAChC,CAAC;AACH;AAEA,SAAS,wBACP,UACA,QACA,MACA,iBACM;CACN,uBAAuB,mBAAmB,UAAU,QAAQ,IAAI;CAChE,0BACE,UACA,mBAAmB,qBAAqB,OAC1C;CAEA,MAAM,WAAW,4BAA4B;CAC7C,oCAAoC,kBAAkB;CACtD,6BAA6B,kBAAkB;CAC/C,sBAAsB,oBAAoB,QAAQ;AACpD;AAsCA,SAAS,2BAEmB;CAC1B,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,+HAEF;CAGF,IAAI,WAAW;CACf,IAAI,SAAS;CACb,IAAI,OAAO;CACX,MAAM,gBAAgB,uBAAuB;CAE7C,IAAI,SAAS,OAAO,eAAe,KAAK;EACtC,MAAM,SAAS,cAAc,cAAc,GAAG;EAC9C,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,OAAO,OAAO;CAChB,OAAO,IAAI,OAAO,WAAW,eAAe,OAAO,UAAU;EAC3D,WAAW,OAAO,SAAS,YAAY;EACvC,SAAS,OAAO,SAAS,UAAU;EACnC,OAAO,OAAO,SAAS,QAAQ;CACjC,OAAO,IAAI,gBAAgB;EACzB,MAAM,SAAS,cAAc,cAAc;EAC3C,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,OAAO,OAAO;CAChB;CAEA,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,yBAAyB,UAAU,gBAAgB,CAAC;CACpE,MAAM,iBAAiB,SAAS;CAKhC,MAAM,SAAS,WAAW,EACxB,GAJA,OAAO,KAAK,cAAc,CAAC,CAAC,SAAS,IACjC,iBACC,QAAQ,EAAE,EAAE,UAAU,CAAC,EAG9B,CAAC;CAED,OAAO,OAAO,OAAO;EACnB,MAAM;EACN;EACA;EACA,MAAM,QAAQ;EACd,SAAS,OAAO,OAAO,OAAO;CAChC,CAAC;AACH;AAEA,SAAgB,eAEY;CAC1B,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,+HAEF;CAGF,IAAI,OAAO,WAAW,eAAe,SAAS,KAC5C,OAAO,yBAAkC;CAG3C,mBAAmB,kBAAkB;CACrC,OAAO,yBAAkC;AAC3C;AAEA,SAAgB,yBACd,UACA,QACA,MACA,iBACM;CACN,wBAAwB,UAAU,QAAQ,MAAM,eAAe;AACjE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authoring.d.ts","names":[],"sources":["../../src/router/authoring.ts"],"mappings":";;;;KAsCK,mBAAA,oBAAuC,iBAAA,IAC1C,UAAA,CAAW,UAAA,yBAAmC,UAAA,CAAW,UAAA;AAAA,KAEtD,gCAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,UAAA,GACA,eAAA,CAAgB,IAAA,UAAc,mBAAA,CAAoB,UAAA,IAChD,UAAA;AAAA,KAGH,gCAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,UAAA,GACA,mBAAA,CAAoB,UAAA,UAAoB,MAAA,OAC9B,eAAA,CAAgB,IAAA,aAGxB,UAAA;AAAA,KAGH,wBAAA,yCAEgB,iBAAA,IACjB,IAAA,wBACA,gCAAA,CAAiC,IAAA,EAAM,UAAA,IACvC,gCAAA,CAAiC,IAAA,EAAM,UAAA;AAAA,KAEtC,wBAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,YAAA,CAAa,eAAA,CAAgB,IAAA,KAC7B,mBAAA,CAAoB,UAAA,UAAoB,WAAA,GACtC,YAAA,CAAa,mBAAA,CAAoB,UAAA,KACjC,YAAA,CAAa,eAAA,CAAgB,IAAA;AAAA,iBAmSrB,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,EAAA,EAAI,eAAe;AAAA,iBAKtD,IAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,OAAA,EAAS,iBAAA,EACT,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,OAAA,EAAS,iBAAA,EACT,EAAA,EAAI,eAAA;AAAA,iBA2BU,KAAA,CAAM,SAAA,EAAW,cAAA,EAAgB,OAAA,GAAU,YAAY;AAAA,iBAavD,QAAA,CAAS,SAAyB,EAAd,cAAc;AAAA,iBAmClC,cAAA,CACd,UAAA,EAAY,eAAA,EACZ,OAAA,GAAS,qBAA0B;AAAA,iBAWrB,KAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,OAAA,GAAU,YAAA,CAAa,eAAA,CAAgB,KAAA;AAAA,iBAEzB,KAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,OAAA,GAAU,wBAAA,CAAyB,KAAA,EAAO,UAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authoring.js","names":[],"sources":["../../src/router/authoring.ts"],"sourcesContent":["import type {\n GroupHelperOptions,\n PageHelperOptions,\n RegisterRoutesOptions,\n RouteComponent,\n RouteDefinition,\n RouteOptions,\n RouteParams,\n RoutePathParams,\n} from '../common/router';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { getExecutionModel } from '../runtime/execution-model';\nimport { computeRank, normalizeRouteSegmentName, parseSegments } from './match';\nimport {\n compileNodePolicies,\n nextAccessScopeState,\n validateAccessMetadata,\n} from './access';\nimport type { AnyRouteComponent, InternalRouteRecord } from './internal-types';\nimport { createRouteHandler } from './rendering';\nimport {\n addRouteToStores,\n assertRouteRegistrationUnlocked,\n getCurrentAccessScopeState,\n getCurrentInheritedPolicies,\n getCurrentLayoutChain,\n getCurrentPageChain,\n getCurrentPageScope,\n getCurrentPathPrefix,\n getCurrentRegistrationSession,\n getCurrentScopeKind,\n hasActivePageScope,\n insertRecordSorted,\n pushRegistrationScope,\n pushRegistrationSession,\n setDefaultRouteAuthOptions,\n} from './store';\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\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 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\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 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 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 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 =\n getCurrentInheritedPolicies().length === 0 &&\n !getCurrentAccessScopeState().guestOnly &&\n !getCurrentAccessScopeState().authenticated;\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\nexport function registerRoutes(\n definition: RouteDefinition,\n options: RegisterRoutesOptions = {}\n): void {\n setDefaultRouteAuthOptions(options.auth);\n pushRegistrationSession(\n {\n authConfigured: !!options.auth?.resolve,\n },\n definition\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 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 assertRouteRegistrationUnlocked();\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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal-types.d.ts","names":[],"sources":["../../src/router/internal-types.ts"],"mappings":";;;;KAUY,iBAAA,OAAwB,IAAA,YAAgB,eAAe;AAAA,KAEvD,aAAA,GAAgB,KAAK;EAC/B,cAAc;AAAA;AAAA,KAGJ,mBAAA,GAAsB,WAAA;EAChC,cAAA;EACA,aAAA,GAAgB,YAAY;AAAA;AAAA,KAGlB,gBAAA;EACV,SAAA;EACA,aAAa;AAAA;AAAA,KAGH,iBAAA;EACV,IAAA;EACA,UAAA;EACA,MAAA,GAAS,iBAAA;EACT,IAAA,GAAO,eAAA;EACP,QAAA;EACA,QAAA,WAAmB,WAAA;EACnB,KAAA,EAAO,gBAAA;AAAA;AAAA,KAGG,mBAAA;EACV,cAAc;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lazy.d.ts","names":[],"sources":["../../src/router/lazy.ts"],"mappings":";;;;iBAYgB,IAAA,oBAAwB,iBAAA,EACtC,OAAA,QAAe,OAAA;EAAU,OAAA,EAAS,UAAA;AAAA,IAAe,UAAA,IAChD,UAAA;AAAA,iBA+Ba,aAAA,IAAiB,OAAO;AAAA,iBAIxB,wBAAA,CAAyB,MAAA;EACvC,QAAA,GAAW,aAAA;EACX,QAAA,GAAW,aAAA;AAAA,IACT,OAAA;AAAA,iBAmBY,UAAA,CACd,iBAAA,GAAmB,QAAA,CAAS,OAAA,aAC3B,OAAA;AAAA,iBASa,wBAAA,CACd,QAAA,EAAU,aAAA,EACV,QAAA,EAAU,aAAA,EACV,WAAA,EAAa,OAAA;AAAA,iBAUC,gBAAA;AAAA,iBAIA,kBAAA,CAAmB,WAAwC,WAAlB,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../../src/router/lazy.ts"],"sourcesContent":["import type {\n RouteManifest,\n RouteParams,\n RouteRegistry,\n RouteComponent,\n} from '../common/router';\nimport type { AnyRouteComponent } from './internal-types';\n\nconst pendingLazy = new Set<Promise<unknown>>();\nconst registryLazyImports = new WeakMap<RouteRegistry, Promise<unknown>[]>();\nconst manifestLazyImports = new WeakMap<RouteManifest, Promise<unknown>[]>();\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\nexport function _snapshotLazy(): Promise<unknown>[] {\n return [...pendingLazy];\n}\n\nexport function _snapshotRouteSourceLazy(source: {\n registry?: RouteRegistry;\n manifest?: RouteManifest;\n}): Promise<unknown>[] {\n const imports = new Set<Promise<unknown>>();\n\n if (source.registry) {\n for (const lazyImport of registryLazyImports.get(source.registry) ?? []) {\n imports.add(lazyImport);\n }\n }\n\n const manifest = source.manifest ?? source.registry?.manifest;\n if (manifest) {\n for (const lazyImport of manifestLazyImports.get(manifest) ?? []) {\n imports.add(lazyImport);\n }\n }\n\n return [...imports];\n}\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 associateRouteSourceLazy(\n registry: RouteRegistry,\n manifest: RouteManifest,\n lazyImports: Promise<unknown>[]\n): void {\n if (lazyImports.length === 0) {\n return;\n }\n\n registryLazyImports.set(registry, lazyImports);\n manifestLazyImports.set(manifest, lazyImports);\n}\n\nexport function clearPendingLazy(): void {\n pendingLazy.clear();\n}\n\nexport function restorePendingLazy(lazyImports: readonly Promise<unknown>[]) {\n pendingLazy.clear();\n for (const lazyImport of lazyImports) {\n pendingLazy.add(lazyImport);\n }\n}\n"],"mappings":";AAQA,MAAM,8BAAc,IAAI,IAAsB;AAC9C,MAAM,sCAAsB,IAAI,QAA2C;AAC3E,MAAM,sCAAsB,IAAI,QAA2C;AAE3E,SAAgB,KACd,SACY;CACZ,IAAI,WAA8B;CAClC,IAAI,YAAqB;CAEzB,MAAM,UAAU,QAAQ,CAAC,CAAC,MACvB,QAAQ;EACP,WACE,OAAO,QAAQ,aACX,MACC,IAAgC;EACvC,YAAY,OAAO,OAAO;CAC5B,IACC,QAAiB;EAChB,YAAY;EACZ,YAAY,OAAO,OAAO;CAC5B,CACF;CACA,YAAY,IAAI,OAAO;CAEvB,SAAS,WAAwB;EAC/B,IAAI,WAAW,MAAM;EACrB,IAAI,CAAC,UACH,MAAM,IAAI,MACR,iHAEF;EAEF,OAAQ,SAAyC,MAAM;CACzD;AACF;AAEA,SAAgB,gBAAoC;CAClD,OAAO,CAAC,GAAG,WAAW;AACxB;AAEA,SAAgB,yBAAyB,QAGlB;CACrB,MAAM,0BAAU,IAAI,IAAsB;CAE1C,IAAI,OAAO,UACT,KAAK,MAAM,cAAc,oBAAoB,IAAI,OAAO,QAAQ,KAAK,CAAC,GACpE,QAAQ,IAAI,UAAU;CAI1B,MAAM,WAAW,OAAO,YAAY,OAAO,UAAU;CACrD,IAAI,UACF,KAAK,MAAM,cAAc,oBAAoB,IAAI,QAAQ,KAAK,CAAC,GAC7D,QAAQ,IAAI,UAAU;CAI1B,OAAO,CAAC,GAAG,OAAO;AACpB;AAEA,SAAgB,WACd,oBAAgD,CAAC,GAClC;CACf,MAAM,2BAAW,IAAI,IAAsB,CACzC,GAAG,mBACH,GAAG,WACL,CAAC;CACD,IAAI,SAAS,SAAS,GAAG,OAAO,QAAQ,QAAQ;CAChD,OAAO,QAAQ,WAAW,QAAQ,CAAC,CAAC,WAAW,MAAS;AAC1D;AAEA,SAAgB,yBACd,UACA,UACA,aACM;CACN,IAAI,YAAY,WAAW,GACzB;CAGF,oBAAoB,IAAI,UAAU,WAAW;CAC7C,oBAAoB,IAAI,UAAU,WAAW;AAC/C;AAEA,SAAgB,mBAAyB;CACvC,YAAY,MAAM;AACpB;AAEA,SAAgB,mBAAmB,aAA0C;CAC3E,YAAY,MAAM;CAClB,KAAK,MAAM,cAAc,aACvB,YAAY,IAAI,UAAU;AAE9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","names":[],"sources":["../../src/router/manifest.ts"],"mappings":";;;iBA0BgB,WAAA,IAAe,aAAa;AAAA,iBAQ5B,cAAA,CAAe,QAAuB,EAAb,aAAa;AAAA,iBAkBtC,WAAA;AAAA,iBAKA,mBAAA,CACd,UAAA,EAAY,eAAA,EACZ,OAAA,GAAS,qBAAA,GACR,aAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","names":[],"sources":["../../src/router/manifest.ts"],"sourcesContent":["import type {\n RegisterRoutesOptions,\n RouteManifest,\n RouteRegistry,\n RouteDefinition,\n} from '../common/router';\nimport { registerRoutes } from './authoring';\nimport {\n addRouteToStores,\n clearRouteState,\n getDefaultRouteAuthOptions,\n getRouteRecords,\n getRoutes,\n insertRecordSorted,\n restoreRouteState,\n setDefaultRouteAuthOptions,\n snapshotRouteState,\n} from './store';\nimport type { InternalRouteRecord } from './internal-types';\nimport {\n _snapshotLazy,\n associateRouteSourceLazy,\n clearPendingLazy,\n restorePendingLazy,\n} from './lazy';\n\nexport function getManifest(): RouteManifest {\n const auth = getDefaultRouteAuthOptions();\n return {\n records: [...getRouteRecords()],\n ...(auth ? { auth } : {}),\n };\n}\n\nexport function _applyManifest(manifest: RouteManifest): void {\n setDefaultRouteAuthOptions(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\nexport function clearRoutes(): void {\n clearRouteState();\n clearPendingLazy();\n}\n\nexport function createRouteRegistry(\n definition: RouteDefinition,\n options: RegisterRoutesOptions = {}\n): RouteRegistry {\n const previous = snapshotRouteState();\n const previousLazy = _snapshotLazy();\n clearRoutes();\n\n try {\n registerRoutes(definition, options);\n const manifest = getManifest();\n const registry = Object.freeze({\n manifest,\n routes: getRoutes(),\n });\n const lazyImports = _snapshotLazy();\n associateRouteSourceLazy(registry, manifest, lazyImports);\n\n return registry;\n } finally {\n restoreRouteState(previous);\n restorePendingLazy(previousLazy);\n }\n}\n"],"mappings":";;;;AA0BA,SAAgB,cAA6B;CAC3C,MAAM,OAAO,2BAA2B;CACxC,OAAO;EACL,SAAS,CAAC,GAAG,gBAAgB,CAAC;EAC9B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CACzB;AACF;AAEA,SAAgB,eAAe,UAA+B;CAC5D,2BAA2B,SAAS,IAAI;CACxC,KAAK,MAAM,UAAU,SAAS,SAAS;EACrC,mBAAmB,MAA6B;EAChD,iBAAiB;GACf,MAAM,OAAO;GACb,SAAS,OAAO;GAChB,WAAW,OAAO,QAAQ;GAC1B,GAAI,oBAAoB,UACxB,OAAQ,OAA+B,mBAAmB,WACtD,EACE,gBAAiB,OAA+B,eAClD,IACA,CAAC;EACP,CAAC;CACH;AACF;AAEA,SAAgB,cAAoB;CAClC,gBAAgB;CAChB,iBAAiB;AACnB;AAEA,SAAgB,oBACd,YACA,UAAiC,CAAC,GACnB;CACf,MAAM,WAAW,mBAAmB;CACpC,MAAM,eAAe,cAAc;CACnC,YAAY;CAEZ,IAAI;EACF,eAAe,YAAY,OAAO;EAClC,MAAM,WAAW,YAAY;EAC7B,MAAM,WAAW,OAAO,OAAO;GAC7B;GACA,QAAQ,UAAU;EACpB,CAAC;EAED,yBAAyB,UAAU,UADf,cACyB,CAAW;EAExD,OAAO;CACT,UAAU;EACR,kBAAkB,QAAQ;EAC1B,mBAAmB,YAAY;CACjC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"match.js","names":[],"sources":["../../src/router/match.ts"],"sourcesContent":["/**\n * Path matching, segment parsing, and specificity scoring.\n */\n\nimport type { ParsedSegment } from '../common/router';\n\nexport function splitPathSegments(path: string): string[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n if (!normalized || normalized === '/') {\n return [];\n }\n\n const withoutLeadingSlash = normalized.startsWith('/')\n ? normalized.slice(1)\n : normalized;\n\n return withoutLeadingSlash.length === 0 ? [] : withoutLeadingSlash.split('/');\n}\n\nexport function normalizeRouteSegmentName(value: string): string {\n return value.trim();\n}\n\n/**\n * Parse a route template path into typed segments.\n *\n * @example\n * parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]\n * parseSegments('/*') // [{kind:'catchall',value:'*'}]\n * parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]\n * parseSegments('/files/{*path}') // [{kind:'static',value:'files'},{kind:'splat',value:'path'}]\n */\nexport function parseSegments(path: string): ParsedSegment[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n const parts = normalized.split('/').filter(Boolean);\n\n // Bare catch-all: /*\n if (parts.length === 1 && parts[0] === '*') {\n return [{ kind: 'catchall', value: '*' }];\n }\n\n return parts.map((segment): ParsedSegment => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n const value = normalizeRouteSegmentName(segment.slice(1, -1));\n if (value.startsWith('*')) {\n return {\n kind: 'splat',\n value: normalizeRouteSegmentName(value.slice(1)),\n };\n }\n return { kind: 'param', value };\n }\n if (segment === '*') {\n return { kind: 'wildcard', value: '*' };\n }\n return { kind: 'static', value: segment };\n });\n}\n\n/**\n * Compute a numeric specificity rank from a parsed segment list.\n *\n * Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.\n * Higher rank wins when multiple routes match the same path.\n */\nexport function computeRank(segments: ParsedSegment[]): number {\n if (segments.length === 1 && segments[0].kind === 'catchall') return -1;\n let score = 0;\n for (const seg of segments) {\n if (seg.kind === 'static') score += 3;\n else if (seg.kind === 'param') score += 2;\n else if (seg.kind === 'wildcard') score += 1;\n else if (seg.kind === 'splat') score -= 0.5;\n // catchall contributes 0 per segment but is handled above\n }\n return score;\n}\n\n/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */\nconst emptyParams: Record<string, string> = Object.freeze(\n Object.create(null) as Record<string, string>\n);\n\n/** Returned for every failed match — avoids per-call allocation. */\nconst noMatch: MatchResult = Object.freeze({\n matched: false,\n params: emptyParams,\n});\n\nfunction decodeRouteParam(part: string): string {\n if (!part.includes('%')) {\n return part;\n }\n\n try {\n return decodeURIComponent(part);\n } catch {\n return part;\n }\n}\n\n/**\n * Match pre-split URL parts against pre-parsed route segments.\n *\n * This is the hot-path matcher used by `resolveRoute` and\n * `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse\n * `urlParts` across all route comparisons in a single resolution call.\n *\n * - Returns a params object (possibly the shared `{}`) on match.\n * - Returns `null` on no match.\n * - Params are allocated lazily — purely-static routes return the frozen\n * empty sentinel without any heap allocation.\n */\nexport function matchSegments(\n urlParts: string[],\n segments: ParsedSegment[]\n): Record<string, string> | null {\n // catch-all /* — matches every URL at any depth\n if (segments.length === 1 && segments[0].kind === 'catchall') {\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n const splatIndex = segments.findIndex((segment) => segment.kind === 'splat');\n if (splatIndex !== -1) {\n if (splatIndex !== segments.length - 1) {\n return null;\n }\n if (urlParts.length < splatIndex) {\n return null;\n }\n } else if (urlParts.length !== segments.length) {\n return null;\n }\n\n // non-catchall: part count must equal segment count\n\n // Walk segments; allocate the params object lazily on first capture\n let params: Record<string, string> | null = null;\n\n const normalizeCapturedSplatParts = (parts: string[]): string[] => {\n let start = 0;\n while (start < parts.length && parts[start] === '') {\n start += 1;\n }\n\n return start === 0 ? parts : parts.slice(start);\n };\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const part = urlParts[i];\n if (seg.kind === 'static') {\n if (seg.value !== part) return null;\n } else if (seg.kind === 'splat') {\n if (params === null) params = {};\n params[seg.value] = normalizeCapturedSplatParts(\n urlParts.slice(i).map(decodeRouteParam)\n ).join('/');\n return params;\n } else {\n if (params === null) params = {};\n if (seg.kind === 'param') {\n params[seg.value] = decodeRouteParam(part);\n } else {\n // wildcard\n params['*'] = part;\n }\n }\n }\n return params ?? emptyParams;\n}\n\nexport interface MatchResult {\n matched: boolean;\n params: Record<string, string>;\n}\n\n/**\n * Match a path against a route pattern and extract params\n *\n * @example\n * match('/users/123', '/users/{id}')\n * // → { matched: true, params: { id: '123' } }\n *\n * match('/posts/hello-world/edit', '/posts/{slug}/{action}')\n * // → { matched: true, params: { slug: 'hello-world', action: 'edit' } }\n *\n * match('/users', '/posts/{id}')\n * // → { matched: false, params: {} }\n */\nexport function match(path: string, pattern: string): MatchResult {\n // Normalize trailing slashes\n const normalizedPath =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n const normalizedPattern =\n pattern.endsWith('/') && pattern !== '/' ? pattern.slice(0, -1) : pattern;\n\n const pathSegments = splitPathSegments(normalizedPath);\n const patternSegments = parseSegments(normalizedPattern);\n const params = matchSegments(pathSegments, patternSegments);\n\n return params === null ? noMatch : { matched: true, params };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigate.d.ts","names":[],"sources":["../../src/router/navigate.ts"],"mappings":";;;;;iBAmDgB,QAAA,CAAS,IAAA,UAAc,OAAA,GAAS,eAAoB;AAAA,iBAyHpD,oBAAA;AAAA,iBASA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigate.js","names":[],"sources":["../../src/router/navigate.ts"],"sourcesContent":["/**\n * Client-side navigation with History API\n */\n\nimport { isPromiseLike } from '../common/promise';\nimport { logger } from '../dev/logger';\nimport { saveScrollPosition } from './navigation-scroll';\nimport {\n configureNavigationRegistryHost,\n getCurrentHref,\n hasRegisteredApps,\n parseTargetUrl,\n} from './navigation-registry';\nimport {\n applyNavigationTargets,\n applyPopStateNavigationTargets,\n beginRouteRequest,\n cancelRouteRequests,\n isStaleRouteRequest,\n resolveNavigationTargetsForApps,\n type AppNavigationTarget,\n type NavigateOptions,\n type NavigationRedirectState,\n} from './navigation-targets';\n\nexport { configureScrollRestoration } from './navigation-scroll';\nexport type {\n HistoryScrollBehavior,\n NavigationScrollBehavior,\n ScrollRestorationOptions,\n} from './navigation-scroll';\nexport {\n registerAppInstance,\n unregisterAppInstance,\n} from './navigation-registry';\nexport { updateRouteQuery } from './route-query';\nexport type {\n RouteQueryParamInput,\n RouteQueryParamValue,\n RouteQueryUpdater,\n RouteQueryUpdates,\n UpdateRouteQueryOptions,\n} from './route-query';\nexport type { NavigateOptions };\n\nlet navigationInitialized = false;\n\nconfigureNavigationRegistryHost({\n cancelRouteRequests,\n});\n\nexport function navigate(path: string, options: NavigateOptions = {}): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const initialTarget = parseTargetUrl(path);\n navigateWithRedirectState(path, options, {\n redirects: 0,\n visited: new Set([\n `${initialTarget.pathname}${initialTarget.search}${initialTarget.hash}`,\n ]),\n });\n}\n\nfunction navigateWithRedirectState(\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState\n): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const request = beginRouteRequest();\n\n const target = parseTargetUrl(path);\n const pathname = target.pathname;\n const href = `${target.pathname}${target.search}${target.hash}`;\n const resolvedTargets = resolveNavigationTargetsForApps(\n pathname,\n href,\n request.signal\n );\n\n if (isPromiseLike(resolvedTargets)) {\n void Promise.resolve(resolvedTargets).then(\n (targets) => {\n if (isStaleRouteRequest(request.id)) {\n return;\n }\n\n try {\n applyNavigationTargets(\n path,\n options,\n redirectState,\n pathname,\n href,\n targets,\n navigateWithRedirectState\n );\n } catch (error) {\n logger.error('[Askr] navigation failed:', error);\n }\n },\n (error) => {\n logger.error('[Askr] navigation failed:', error);\n }\n );\n return;\n }\n\n applyNavigationTargets(\n path,\n options,\n redirectState,\n pathname,\n href,\n resolvedTargets,\n navigateWithRedirectState\n );\n}\n\nfunction handlePopState(event: PopStateEvent): void {\n const request = beginRouteRequest();\n const previousHref = getCurrentHref();\n const pathname = window.location.pathname;\n const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n\n saveScrollPosition(previousHref);\n\n if (!hasRegisteredApps()) {\n return;\n }\n\n const applyResolved = (targets: AppNavigationTarget[]) => {\n try {\n applyPopStateNavigationTargets(\n request.id,\n pathname,\n href,\n event.state,\n targets,\n navigate\n );\n } catch (error) {\n logger.error('[Askr] popstate navigation failed:', error);\n }\n };\n\n const resolvedTargets = resolveNavigationTargetsForApps(\n pathname,\n href,\n request.signal\n );\n\n if (isPromiseLike<AppNavigationTarget[]>(resolvedTargets)) {\n void Promise.resolve(resolvedTargets).then(\n (next) => {\n applyResolved(next);\n },\n (error) => {\n logger.error('[Askr] popstate navigation failed:', error);\n }\n );\n return;\n }\n\n applyResolved(resolvedTargets);\n}\n\nexport function initializeNavigation(): void {\n if (typeof window === 'undefined' || navigationInitialized) {\n return;\n }\n\n navigationInitialized = true;\n window.addEventListener('popstate', handlePopState);\n}\n\nexport function cleanupNavigation(): void {\n cancelRouteRequests();\n\n if (typeof window === 'undefined' || !navigationInitialized) {\n return;\n }\n\n navigationInitialized = false;\n window.removeEventListener('popstate', handlePopState);\n}\n"],"mappings":";;;;;;;;;;AA6CA,IAAI,wBAAwB;AAE5B,gCAAgC,EAC9B,oBACF,CAAC;AAED,SAAgB,SAAS,MAAc,UAA2B,CAAC,GAAS;CAC1E,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,gBAAgB,eAAe,IAAI;CACzC,0BAA0B,MAAM,SAAS;EACvC,WAAW;EACX,yBAAS,IAAI,IAAI,CACf,GAAG,cAAc,WAAW,cAAc,SAAS,cAAc,MACnE,CAAC;CACH,CAAC;AACH;AAEA,SAAS,0BACP,MACA,SACA,eACM;CACN,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,UAAU,kBAAkB;CAElC,MAAM,SAAS,eAAe,IAAI;CAClC,MAAM,WAAW,OAAO;CACxB,MAAM,OAAO,GAAG,OAAO,WAAW,OAAO,SAAS,OAAO;CACzD,MAAM,kBAAkB,gCACtB,UACA,MACA,QAAQ,MACV;CAEA,IAAI,cAAc,eAAe,GAAG;EAClC,AAAK,QAAQ,QAAQ,eAAe,CAAC,CAAC,MACnC,YAAY;GACX,IAAI,oBAAoB,QAAQ,EAAE,GAChC;GAGF,IAAI;IACF,uBACE,MACA,SACA,eACA,UACA,MACA,SACA,yBACF;GACF,SAAS,OAAO;IACd,OAAO,MAAM,6BAA6B,KAAK;GACjD;EACF,IACC,UAAU;GACT,OAAO,MAAM,6BAA6B,KAAK;EACjD,CACF;EACA;CACF;CAEA,uBACE,MACA,SACA,eACA,UACA,MACA,iBACA,yBACF;AACF;AAEA,SAAS,eAAe,OAA4B;CAClD,MAAM,UAAU,kBAAkB;CAClC,MAAM,eAAe,eAAe;CACpC,MAAM,WAAW,OAAO,SAAS;CACjC,MAAM,OAAO,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;CAEpF,mBAAmB,YAAY;CAE/B,IAAI,CAAC,kBAAkB,GACrB;CAGF,MAAM,iBAAiB,YAAmC;EACxD,IAAI;GACF,+BACE,QAAQ,IACR,UACA,MACA,MAAM,OACN,SACA,QACF;EACF,SAAS,OAAO;GACd,OAAO,MAAM,sCAAsC,KAAK;EAC1D;CACF;CAEA,MAAM,kBAAkB,gCACtB,UACA,MACA,QAAQ,MACV;CAEA,IAAI,cAAqC,eAAe,GAAG;EACzD,AAAK,QAAQ,QAAQ,eAAe,CAAC,CAAC,MACnC,SAAS;GACR,cAAc,IAAI;EACpB,IACC,UAAU;GACT,OAAO,MAAM,sCAAsC,KAAK;EAC1D,CACF;EACA;CACF;CAEA,cAAc,eAAe;AAC/B;AAEA,SAAgB,uBAA6B;CAC3C,IAAI,OAAO,WAAW,eAAe,uBACnC;CAGF,wBAAwB;CACxB,OAAO,iBAAiB,YAAY,cAAc;AACpD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-registry.d.ts","names":[],"sources":["../../src/router/navigation-registry.ts"],"mappings":";;;;KASY,mBAAA;EACV,QAAA,GAAW,aAAA;EACX,MAAA,YAAkB,KAAA;EAClB,IAAA,GAAO,gBAAA;AAAA;AAAA,KAGG,eAAA,GAAkB,mBAAA;EAC5B,QAAA,EAAU,iBAAiB;EAC3B,QAAA;EACA,IAAA;AAAA;AAAA,KAGG,sBAAA;EACH,mBAAmB;AAAA;AAAA,iBAUL,+BAAA,CACd,IAA4B,EAAtB,sBAAsB;AAAA,iBAKd,kBAAA;AAAA,iBAIA,cAAA;AAAA,iBAIA,uBAAA,CAAwB,QAAA,UAAkB,IAAY;AAAA,iBAKtD,aAAA;AAAA,iBAQA,cAAA,CAAe,IAAA,WAAe,GAAG;AAAA,iBAiBjC,yBAAA,IAA6B,eAAe;AAAA,iBAI5C,iBAAA;AAAA,iBAIA,2BAAA,CACd,GAAA,EAAK,eAAe,EACpB,QAAA,UACA,IAAA;AAAA,iBA+Bc,2BAAA;AAAA,iBAcA,mBAAA,CACd,QAAA,EAAU,iBAAA,EACV,IAAA,UACA,MAAA,GAAQ,mBAAwB;AAAA,iBA0BlB,qBAAA,CAAsB,QAA2B,EAAjB,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-registry.js","names":[],"sources":["../../src/router/navigation-registry.ts"],"sourcesContent":["import type { Route, RouteAuthOptions, RouteManifest } from '../common/router';\nimport { isProductionEnvironment } from '../common/env';\nimport type { ComponentInstance } from '../runtime/component';\nimport {\n computeRouteActivityMatches,\n lockRouteRegistration,\n syncCurrentRouteSnapshot,\n} from './route';\n\nexport type AppNavigationSource = {\n manifest?: RouteManifest;\n routes?: readonly Route[];\n auth?: RouteAuthOptions;\n};\n\nexport type AppRegistration = AppNavigationSource & {\n instance: ComponentInstance;\n pathname: string;\n href: string;\n};\n\ntype NavigationRegistryHost = {\n cancelRouteRequests(): void;\n};\n\nlet currentInstance: ComponentInstance | null = null;\nlet currentPathname = '/';\nlet currentHref = '/';\nlet navigationRegistryHost: NavigationRegistryHost | null = null;\n\nconst registeredApps: AppRegistration[] = [];\n\nexport function configureNavigationRegistryHost(\n host: NavigationRegistryHost\n): void {\n navigationRegistryHost = host;\n}\n\nexport function getCurrentPathname(): string {\n return currentPathname;\n}\n\nexport function getCurrentHref(): string {\n return currentHref;\n}\n\nexport function setCurrentRouteLocation(pathname: string, href: string): void {\n currentPathname = pathname;\n currentHref = href;\n}\n\nexport function getWindowHref(): string {\n if (typeof window === 'undefined') {\n return currentHref;\n }\n\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nexport function parseTargetUrl(path: string): URL {\n const pathname = window.location.pathname || '/';\n const search = window.location.search || '';\n const hash = window.location.hash || '';\n const href =\n typeof window.location.href === 'string' ? window.location.href : '';\n const base =\n href &&\n href !== 'about:blank' &&\n !href.startsWith('about:') &&\n !href.startsWith('data:')\n ? href\n : `http://localhost${pathname}${search}${hash}`;\n\n return new URL(path, base);\n}\n\nexport function getRegisteredAppsSnapshot(): AppRegistration[] {\n return [...registeredApps];\n}\n\nexport function hasRegisteredApps(): boolean {\n return registeredApps.length > 0;\n}\n\nexport function syncAppRegistrationLocation(\n app: AppRegistration,\n pathname: string,\n href: string\n): void {\n app.pathname = pathname;\n app.href = href;\n}\n\nfunction collectRouteActivityMatches(\n pathname: string,\n apps: readonly AppRegistration[] = registeredApps\n) {\n const matches: ReturnType<typeof computeRouteActivityMatches> = [];\n const seenPaths = new Set<string>();\n\n for (const app of apps) {\n const appMatches = computeRouteActivityMatches(pathname, {\n manifest: app.manifest,\n routes: app.routes,\n });\n\n for (const match of appMatches) {\n if (seenPaths.has(match.path)) {\n continue;\n }\n seenPaths.add(match.path);\n matches.push(match);\n }\n }\n\n return matches;\n}\n\nexport function syncRegisteredRouteSnapshot(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const pathname = window.location.pathname || '/';\n syncCurrentRouteSnapshot(\n pathname,\n window.location.search || '',\n window.location.hash || '',\n collectRouteActivityMatches(pathname)\n );\n}\n\nexport function registerAppInstance(\n instance: ComponentInstance,\n path: string,\n source: AppNavigationSource = {}\n): void {\n const existingIndex = registeredApps.findIndex(\n (app) => app.instance === instance\n );\n const registration: AppRegistration = {\n instance,\n pathname: path,\n href: getWindowHref(),\n ...source,\n };\n if (existingIndex >= 0) {\n registeredApps[existingIndex] = registration;\n } else {\n registeredApps.push(registration);\n }\n\n currentInstance = instance;\n currentPathname = path;\n currentHref = getWindowHref();\n syncRegisteredRouteSnapshot();\n if (isProductionEnvironment()) {\n lockRouteRegistration();\n }\n}\n\nexport function unregisterAppInstance(instance: ComponentInstance): void {\n const existingIndex = registeredApps.findIndex(\n (app) => app.instance === instance\n );\n if (existingIndex >= 0) {\n registeredApps.splice(existingIndex, 1);\n }\n syncRegisteredRouteSnapshot();\n\n if (currentInstance !== instance) {\n return;\n }\n\n const nextApp =\n registeredApps.length > 0\n ? registeredApps[registeredApps.length - 1]!\n : null;\n currentInstance = nextApp?.instance ?? null;\n if (nextApp) {\n currentPathname = nextApp.pathname;\n currentHref = nextApp.href;\n syncRegisteredRouteSnapshot();\n return;\n }\n\n navigationRegistryHost?.cancelRouteRequests();\n currentPathname = '/';\n currentHref = '/';\n if (typeof window === 'undefined') {\n syncCurrentRouteSnapshot('/', '', '', []);\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-scroll.d.ts","names":[],"sources":["../../src/router/navigation-scroll.ts"],"mappings":";KAAY,wBAAA;AAAA,KACA,qBAAA;AAAA,KAEA,wBAAA;EACV,UAAA,GAAa,wBAAA;EACb,OAAA,GAAU,qBAAqB;AAAA;AAAA,iBAkGjB,kBAAA,CAAmB,IAAY;AAAA,iBAkB/B,qBAAA,CACd,QAAmC,GAAxB,wBAAwB;AAAA,iBAUrB,kBAAA,CACd,IAAA,UACA,KAAA,EAAO,aAAa;AAAA,iBA6BN,0BAAA,CACd,OAA4C,aAAxB,wBAAwB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-scroll.js","names":[],"sources":["../../src/router/navigation-scroll.ts"],"sourcesContent":["export type NavigationScrollBehavior = 'top' | 'preserve';\nexport type HistoryScrollBehavior = 'restore' | 'top' | 'preserve';\n\nexport type ScrollRestorationOptions = {\n navigation?: NavigationScrollBehavior;\n history?: HistoryScrollBehavior;\n};\n\ntype NormalizedScrollRestorationOptions = {\n enabled: boolean;\n navigation: NavigationScrollBehavior;\n history: HistoryScrollBehavior;\n};\n\nconst DEFAULT_SCROLL_RESTORATION: NormalizedScrollRestorationOptions = {\n enabled: true,\n navigation: 'top',\n history: 'restore',\n};\n\nlet scrollRestorationOptions: NormalizedScrollRestorationOptions = {\n ...DEFAULT_SCROLL_RESTORATION,\n};\n\nconst scrollPositions = new Map<string, { x: number; y: number }>();\n\nfunction getWindowHref(): string {\n if (typeof window === 'undefined') {\n return '/';\n }\n\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nfunction normalizeScrollRestorationOptions(\n options?: boolean | ScrollRestorationOptions\n): NormalizedScrollRestorationOptions {\n if (options === false) {\n return {\n enabled: false,\n navigation: DEFAULT_SCROLL_RESTORATION.navigation,\n history: DEFAULT_SCROLL_RESTORATION.history,\n };\n }\n\n if (options === true || options === undefined) {\n return { ...DEFAULT_SCROLL_RESTORATION };\n }\n\n return {\n enabled: true,\n navigation: options.navigation ?? DEFAULT_SCROLL_RESTORATION.navigation,\n history: options.history ?? DEFAULT_SCROLL_RESTORATION.history,\n };\n}\n\nfunction readScrollPosition(): { x: number; y: number } {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 };\n }\n\n const x =\n typeof window.scrollX === 'number'\n ? window.scrollX\n : typeof window.pageXOffset === 'number'\n ? window.pageXOffset\n : 0;\n const y =\n typeof window.scrollY === 'number'\n ? window.scrollY\n : typeof window.pageYOffset === 'number'\n ? window.pageYOffset\n : 0;\n\n return { x, y };\n}\n\nfunction writeHistoryScrollPosition(\n href: string,\n position: { x: number; y: number }\n): void {\n if (typeof window === 'undefined' || getWindowHref() !== href) {\n return;\n }\n if (typeof window.history?.replaceState !== 'function') {\n return;\n }\n const state =\n window.history.state && typeof window.history.state === 'object'\n ? window.history.state\n : {};\n\n window.history.replaceState(\n {\n ...state,\n path: href,\n scroll: position,\n },\n '',\n href\n );\n}\n\nexport function saveScrollPosition(href: string): void {\n if (!scrollRestorationOptions.enabled || typeof window === 'undefined') {\n return;\n }\n\n const position = readScrollPosition();\n scrollPositions.set(href, position);\n writeHistoryScrollPosition(href, position);\n}\n\nfunction scrollToPosition(position: { x: number; y: number }): void {\n if (typeof window === 'undefined' || typeof window.scrollTo !== 'function') {\n return;\n }\n\n window.scrollTo(position.x, position.y);\n}\n\nexport function applyNavigationScroll(\n behavior?: NavigationScrollBehavior\n): void {\n const nextBehavior = behavior ?? scrollRestorationOptions.navigation;\n if (!scrollRestorationOptions.enabled || nextBehavior === 'preserve') {\n return;\n }\n\n scrollToPosition({ x: 0, y: 0 });\n}\n\nexport function applyHistoryScroll(\n href: string,\n state: PopStateEvent['state']\n): void {\n if (!scrollRestorationOptions.enabled) {\n return;\n }\n\n if (scrollRestorationOptions.history === 'preserve') {\n return;\n }\n\n if (scrollRestorationOptions.history === 'top') {\n scrollToPosition({ x: 0, y: 0 });\n return;\n }\n\n const fromState =\n state && typeof state === 'object' && 'scroll' in state\n ? (state.scroll as { x?: unknown; y?: unknown })\n : undefined;\n const saved =\n fromState &&\n typeof fromState.x === 'number' &&\n typeof fromState.y === 'number'\n ? { x: fromState.x, y: fromState.y }\n : scrollPositions.get(href);\n\n scrollToPosition(saved ?? { x: 0, y: 0 });\n}\n\nexport function configureScrollRestoration(\n options?: boolean | ScrollRestorationOptions\n): void {\n scrollRestorationOptions = normalizeScrollRestorationOptions(options);\n\n if (typeof window === 'undefined') {\n return;\n }\n\n if ('scrollRestoration' in window.history) {\n try {\n window.history.scrollRestoration = scrollRestorationOptions.enabled\n ? 'manual'\n : 'auto';\n } catch {\n // Ignore environments that expose but do not allow setting scrollRestoration.\n }\n }\n}\n"],"mappings":";AAcA,MAAM,6BAAiE;CACrE,SAAS;CACT,YAAY;CACZ,SAAS;AACX;AAEA,IAAI,2BAA+D,EACjE,GAAG,2BACL;AAEA,MAAM,kCAAkB,IAAI,IAAsC;AAElE,SAAS,gBAAwB;CAC/B,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,OAAO,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;AAChF;AAEA,SAAS,kCACP,SACoC;CACpC,IAAI,YAAY,OACd,OAAO;EACL,SAAS;EACT,YAAY,2BAA2B;EACvC,SAAS,2BAA2B;CACtC;CAGF,IAAI,YAAY,QAAQ,YAAY,QAClC,OAAO,EAAE,GAAG,2BAA2B;CAGzC,OAAO;EACL,SAAS;EACT,YAAY,QAAQ,cAAc,2BAA2B;EAC7D,SAAS,QAAQ,WAAW,2BAA2B;CACzD;AACF;AAEA,SAAS,qBAA+C;CACtD,IAAI,OAAO,WAAW,aACpB,OAAO;EAAE,GAAG;EAAG,GAAG;CAAE;CAgBtB,OAAO;EAAE,GAZP,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,OAAO,OAAO,gBAAgB,WAC5B,OAAO,cACP;EAQI,GANV,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,OAAO,OAAO,gBAAgB,WAC5B,OAAO,cACP;CAEM;AAChB;AAEA,SAAS,2BACP,MACA,UACM;CACN,IAAI,OAAO,WAAW,eAAe,cAAc,MAAM,MACvD;CAEF,IAAI,OAAO,OAAO,SAAS,iBAAiB,YAC1C;CAEF,MAAM,QACJ,OAAO,QAAQ,SAAS,OAAO,OAAO,QAAQ,UAAU,WACpD,OAAO,QAAQ,QACf,CAAC;CAEP,OAAO,QAAQ,aACb;EACE,GAAG;EACH,MAAM;EACN,QAAQ;CACV,GACA,IACA,IACF;AACF;AAEA,SAAgB,mBAAmB,MAAoB;CACrD,IAAI,CAAC,yBAAyB,WAAW,OAAO,WAAW,aACzD;CAGF,MAAM,WAAW,mBAAmB;CACpC,gBAAgB,IAAI,MAAM,QAAQ;CAClC,2BAA2B,MAAM,QAAQ;AAC3C;AAEA,SAAS,iBAAiB,UAA0C;CAClE,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa,YAC9D;CAGF,OAAO,SAAS,SAAS,GAAG,SAAS,CAAC;AACxC;AAEA,SAAgB,sBACd,UACM;CACN,MAAM,eAAe,YAAY,yBAAyB;CAC1D,IAAI,CAAC,yBAAyB,WAAW,iBAAiB,YACxD;CAGF,iBAAiB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;AACjC;AAEA,SAAgB,mBACd,MACA,OACM;CACN,IAAI,CAAC,yBAAyB,SAC5B;CAGF,IAAI,yBAAyB,YAAY,YACvC;CAGF,IAAI,yBAAyB,YAAY,OAAO;EAC9C,iBAAiB;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC;EAC/B;CACF;CAEA,MAAM,YACJ,SAAS,OAAO,UAAU,YAAY,YAAY,QAC7C,MAAM,SACP;CAQN,kBANE,aACA,OAAO,UAAU,MAAM,YACvB,OAAO,UAAU,MAAM,WACnB;EAAE,GAAG,UAAU;EAAG,GAAG,UAAU;CAAE,IACjC,gBAAgB,IAAI,IAAI,MAEJ;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;AAC1C;AAEA,SAAgB,2BACd,SACM;CACN,2BAA2B,kCAAkC,OAAO;CAEpE,IAAI,OAAO,WAAW,aACpB;CAGF,IAAI,uBAAuB,OAAO,SAChC,IAAI;EACF,OAAO,QAAQ,oBAAoB,yBAAyB,UACxD,WACA;CACN,QAAQ,CAER;AAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-targets.d.ts","names":[],"sources":["../../src/router/navigation-targets.ts"],"mappings":";;;;;KAqCY,eAAA;EACV,OAAA;EACA,OAAA;EACA,MAAA,GAAS,wBAAwB;AAAA;AAAA,KAGvB,uBAAA;EACV,SAAA;EACA,OAAA,EAAS,GAAG;AAAA;AAAA,KAGF,mBAAA;EACV,GAAA,EAAK,eAAA;EACL,QAAA,EAAU,kBAAkB;AAAA;AAAA,iBAQd,iBAAA;EAAuB,EAAA;EAAY,MAAA,EAAQ,WAAW;AAAA;AAAA,iBAWtD,mBAAA,CAAoB,SAAiB;AAAA,iBAIrC,mBAAA;AAAA,iBAYA,sBAAA,CACd,OAA4B;AAAA,iBA+Kd,+BAAA,CACd,QAAA,UACA,IAAA,UACA,MAAA,EAAQ,WAAA,GACP,mBAAA,KAAwB,OAAA,CAAQ,mBAAA;AAAA,iBAgDnB,sBAAA,CACd,IAAA,UACA,OAAA,EAAS,eAAA,EACT,aAAA,EAAe,uBAAA,EACf,QAAA,UACA,IAAA,UACA,OAAA,EAAS,mBAAA,IACT,yBAAA,GACE,IAAA,UACA,OAAA,EAAS,eAAA,EACT,aAAA,EAAe,uBAAA;AAAA,iBA6FH,8BAAA,CACd,SAAA,UACA,QAAA,UACA,IAAA,UACA,KAAA,WACA,OAAA,EAAS,mBAAA,IACT,QAAA,GAAW,IAAA,UAAc,OAAA,EAAS,eAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation-targets.js","names":[],"sources":["../../src/router/navigation-targets.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport { isPromiseLike } from '../common/promise';\nimport type { RouteRenderResult, RouteRequestResult } from '../common/router';\nimport {\n DefaultPortal,\n clearDefaultPortalForInstance,\n} from '../foundations/structures/portal';\nimport { ELEMENT_TYPE, Fragment } from '../jsx';\nimport { logger } from '../dev/logger';\nimport { cleanupInstancesUnder } from '../renderer/cleanup';\nimport {\n cleanupComponent,\n mountComponent,\n type ComponentInstance,\n} from '../runtime/component';\nimport {\n applyHistoryScroll,\n applyNavigationScroll,\n saveScrollPosition,\n type NavigationScrollBehavior,\n} from './navigation-scroll';\nimport {\n getCurrentHref,\n getCurrentPathname,\n getRegisteredAppsSnapshot,\n parseTargetUrl,\n setCurrentRouteLocation,\n syncAppRegistrationLocation,\n syncRegisteredRouteSnapshot,\n type AppRegistration,\n} from './navigation-registry';\nimport {\n resolveRouteFromRoutes,\n resolveRouteRequest,\n type ResolvedRoute,\n} from './route';\n\nexport type NavigateOptions = {\n history?: 'push' | 'replace';\n replace?: boolean;\n scroll?: NavigationScrollBehavior;\n};\n\nexport type NavigationRedirectState = {\n redirects: number;\n visited: Set<string>;\n};\n\nexport type AppNavigationTarget = {\n app: AppRegistration;\n resolved: RouteRequestResult;\n};\n\nconst MAX_NAVIGATION_REDIRECTS = 20;\n\nlet activeRouteRequestId = 0;\nlet activeRouteRequestController: AbortController | null = null;\n\nexport function beginRouteRequest(): { id: number; signal: AbortSignal } {\n activeRouteRequestId += 1;\n activeRouteRequestController?.abort();\n activeRouteRequestController = new AbortController();\n\n return {\n id: activeRouteRequestId,\n signal: activeRouteRequestController.signal,\n };\n}\n\nexport function isStaleRouteRequest(requestId: number): boolean {\n return requestId !== activeRouteRequestId;\n}\n\nexport function cancelRouteRequests(): void {\n activeRouteRequestId += 1;\n activeRouteRequestController?.abort();\n activeRouteRequestController = null;\n}\n\nfunction isRenderResult(\n result: RouteRequestResult\n): result is RouteRenderResult {\n return result !== null && result.kind === 'render';\n}\n\nexport function getRedirectHistoryMode(\n replace: boolean | undefined\n): 'push' | 'replace' {\n return replace === false ? 'push' : 'replace';\n}\n\nfunction getNavigationHistoryMode(\n options: NavigateOptions\n): 'push' | 'replace' {\n if (options.history) {\n return options.history;\n }\n\n return options.replace ? 'replace' : 'push';\n}\n\nfunction createDeniedResolvedRoute(status: number): ResolvedRoute {\n return {\n handler: () => ({\n type: 'div',\n props: {\n 'data-route-denied': String(status),\n },\n children: [String(status)],\n }),\n params: {},\n };\n}\n\nfunction bindResolvedRouteHandler(\n resolved: ResolvedRoute\n): ComponentInstance['fn'] {\n return () =>\n resolved.handler(resolved.params) as ReturnType<ComponentInstance['fn']>;\n}\n\nfunction wrapRootRouteHandler(\n componentFn: ComponentInstance['fn']\n): ComponentInstance['fn'] {\n const wrappedFn: ComponentInstance['fn'] = (props, ctx) => {\n const out = componentFn(props, ctx);\n if (isPromiseLike(out)) {\n throw new Error(\n 'Async components are not supported. Components must return synchronously.'\n );\n }\n const portalVNode = {\n $$typeof: ELEMENT_TYPE,\n type: DefaultPortal,\n props: {},\n key: '__default_portal',\n } as unknown;\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: {\n children:\n out === undefined || out === null\n ? [portalVNode]\n : [out, portalVNode],\n },\n } as ReturnType<ComponentInstance['fn']>;\n };\n\n Object.defineProperty(wrappedFn, 'name', {\n value: componentFn.name || 'Component',\n });\n\n return wrappedFn;\n}\n\nfunction cleanupRouteOwnership(instance: ComponentInstance): void {\n const cleanupErrors: unknown[] = [];\n const children = instance.target\n ? Array.from(instance.target.childNodes)\n : [];\n\n for (const child of children) {\n try {\n cleanupInstancesUnder(child, { strict: instance.cleanupStrict });\n } catch (error) {\n cleanupErrors.push(error);\n }\n }\n\n try {\n cleanupComponent(instance);\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(cleanupErrors, 'Route cleanup failed');\n }\n}\n\nfunction remountResolvedRoute(\n instance: ComponentInstance,\n resolved: ResolvedRoute,\n pathname: string,\n href: string\n): boolean {\n clearDefaultPortalForInstance(instance);\n cleanupRouteOwnership(instance);\n\n instance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));\n instance.props = {};\n\n instance.stateValues = [];\n instance.expectedStateIndices = [];\n instance.firstRenderComplete = false;\n instance.stateIndexCheck = -1;\n instance.evaluationGeneration++;\n instance.notifyUpdate = null;\n instance.mountOperations = [];\n instance.commitOperations = [];\n instance.lifecycleSlots = [];\n instance.cleanupFns = [];\n instance._placeholder = undefined;\n instance.hasPendingUpdate = false;\n instance._currentRenderToken = undefined;\n instance.lastRenderToken = 0;\n instance._pendingReadSources = undefined;\n instance._lastReadSources = undefined;\n\n instance.abortController = null;\n\n mountComponent(instance);\n setCurrentRouteLocation(pathname, href);\n return true;\n}\n\nfunction rerenderResolvedRoute(\n instance: ComponentInstance,\n pathname: string,\n href: string\n): boolean {\n setCurrentRouteLocation(pathname, href);\n instance._enqueueRun?.();\n return true;\n}\n\nfunction resolveAppRouteRequest(\n app: AppRegistration,\n pathname: string,\n href: string,\n signal: AbortSignal\n): RouteRequestResult | Promise<RouteRequestResult> {\n if (app.manifest) {\n return resolveRouteRequest(href, {\n manifest: app.manifest,\n auth: app.auth,\n signal,\n });\n }\n\n if (app.routes) {\n const resolved = resolveRouteFromRoutes(pathname, app.routes);\n if (!resolved) {\n return null;\n }\n\n return {\n kind: 'render',\n handler: resolved.handler,\n params: resolved.params,\n };\n }\n\n return resolveRouteRequest(href, {\n auth: app.auth,\n signal,\n });\n}\n\nexport function resolveNavigationTargetsForApps(\n pathname: string,\n href: string,\n signal: AbortSignal\n): AppNavigationTarget[] | Promise<AppNavigationTarget[]> {\n const apps = getRegisteredAppsSnapshot();\n\n if (apps.length === 1) {\n const app = apps[0]!;\n const resolved = resolveAppRouteRequest(app, pathname, href, signal);\n if (isPromiseLike<RouteRequestResult>(resolved)) {\n return Promise.resolve(resolved).then((next) => [\n {\n app,\n resolved: next,\n },\n ]);\n }\n\n return [\n {\n app,\n resolved,\n },\n ];\n }\n\n const syncTargets: AppNavigationTarget[] = [];\n const pendingTargets: Array<Promise<AppNavigationTarget>> = [];\n\n for (const app of apps) {\n const resolved = resolveAppRouteRequest(app, pathname, href, signal);\n if (isPromiseLike<RouteRequestResult>(resolved)) {\n pendingTargets.push(\n Promise.resolve(resolved).then((next) => ({ app, resolved: next }))\n );\n continue;\n }\n\n syncTargets.push({ app, resolved });\n }\n\n if (pendingTargets.length === 0) {\n return syncTargets;\n }\n\n return Promise.all([\n ...syncTargets.map((target) => Promise.resolve(target)),\n ...pendingTargets,\n ]);\n}\n\nexport function applyNavigationTargets(\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState,\n pathname: string,\n href: string,\n targets: AppNavigationTarget[],\n navigateWithRedirectState: (\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState\n ) => void\n): void {\n const previousPathname = getCurrentPathname();\n\n for (const target of targets) {\n const resolved = target.resolved;\n if (!resolved || resolved.kind !== 'redirect') {\n continue;\n }\n\n const redirectTarget = parseTargetUrl(resolved.to);\n const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;\n if (redirectHref === href) {\n if (isDevelopmentEnvironment()) {\n logger.warn(\n `Navigation guard redirected to the same path: ${redirectHref}`\n );\n }\n return;\n }\n\n if (redirectState.visited.has(redirectHref)) {\n throw new Error(\n `[Askr] Navigation redirect cycle detected at ${redirectHref}.`\n );\n }\n if (redirectState.redirects >= MAX_NAVIGATION_REDIRECTS) {\n throw new Error(\n `[Askr] Navigation redirect limit exceeded (${MAX_NAVIGATION_REDIRECTS}).`\n );\n }\n\n redirectState.visited.add(redirectHref);\n redirectState.redirects++;\n navigateWithRedirectState(\n redirectHref,\n {\n history: getRedirectHistoryMode(resolved.replace),\n },\n redirectState\n );\n return;\n }\n\n const matchedTargets = targets.filter((target) => target.resolved !== null);\n if (matchedTargets.length === 0) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${path}`);\n }\n return;\n }\n\n saveScrollPosition(getCurrentHref());\n\n const historyMethod =\n getNavigationHistoryMode(options) === 'replace'\n ? 'replaceState'\n : 'pushState';\n window.history[historyMethod]({ path: href }, '', href);\n syncRegisteredRouteSnapshot();\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (resolved.kind === 'redirect') {\n continue;\n }\n\n if (pathname === target.app.pathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(target.app.instance, pathname, href);\n syncAppRegistrationLocation(target.app, pathname, href);\n continue;\n }\n\n remountResolvedRoute(\n target.app.instance,\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n },\n pathname,\n href\n );\n syncAppRegistrationLocation(target.app, pathname, href);\n }\n\n if (pathname !== previousPathname) {\n applyNavigationScroll(options.scroll);\n }\n}\n\nexport function applyPopStateNavigationTargets(\n requestId: number,\n pathname: string,\n href: string,\n state: unknown,\n targets: AppNavigationTarget[],\n navigate: (path: string, options: NavigateOptions) => void\n): void {\n if (isStaleRouteRequest(requestId)) {\n return;\n }\n\n const matchedTargets = targets.filter((target) => target.resolved !== null);\n if (matchedTargets.length === 0) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${pathname}`);\n }\n return;\n }\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (resolved.kind !== 'redirect') {\n continue;\n }\n\n navigate(resolved.to, {\n history: getRedirectHistoryMode(resolved.replace),\n });\n return;\n }\n\n syncRegisteredRouteSnapshot();\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (pathname === target.app.pathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(target.app.instance, pathname, href);\n syncAppRegistrationLocation(target.app, pathname, href);\n continue;\n }\n\n if (resolved.kind === 'redirect') {\n continue;\n }\n\n remountResolvedRoute(\n target.app.instance,\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n },\n pathname,\n href\n );\n syncAppRegistrationLocation(target.app, pathname, href);\n }\n\n applyHistoryScroll(href, state);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.d.ts","names":[],"sources":["../../src/router/policy.ts"],"mappings":";;;KAoBY,sBAAA;AAAA,UAEK,0BAAA;EACf,IAAA,EAAM,sBAAsB;EAC5B,KAAA;AAAA;AAAA,iBAWc,KAAA,IAAS,mBAAmB;AAAA,iBAI5B,QAAA,CACd,EAAA,UACA,IAAA;EACE,MAAA,GAAS,oBAAA;EACT,OAAA;AAAA,IAED,sBAAsB;AAAA,iBAST,IAAA,CAAK,MAAA,EAAQ,gBAAA,GAAmB,kBAAkB;AAAA,iBAIlD,YAAA,IAAgB,kBAAkB;AAAA,iBAIlC,SAAA,IAAa,kBAAkB;AAAA,iBAI/B,QAAA,IAAY,kBAAkB;AAAA,iBAI9B,uBAAA,CACd,MAAA,EAAQ,cAAA,GACP,cAAc;AAAA,iBAID,oBAAA,CACd,OAAA,EAAS,YAAA,EACT,IAAA,EAAM,gBAAA,eACL,YAAA;AAAA,iBA0Ca,sBAAA,CACd,MAAA,EAAQ,WAAA,GACP,0BAA0B;AAAA,iBAoGb,WAAA,IAAe,WAAW;AAAA,iBAa1B,YAAA,IAAgB,WAAW;AAAA,iBAa3B,WAAA,CAAY,IAAA,WAAe,WAAW;AAAA,iBAwBtC,iBAAA,CAAkB,UAAA,WAAqB,WAAW;AAAA,iBAwB5C,mBAAA,CACpB,MAAA,EAAQ,WAAA,EACR,OAAA,EAAS,YAAA,GACR,OAAA,CAAQ,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.js","names":[],"sources":["../../src/router/policy.ts"],"sourcesContent":["import type {\n AccessDecision,\n AccessAllowDecision,\n AccessDenyDecision,\n AccessDenyStatus,\n AccessRedirectDecision,\n AccessRedirectStatus,\n RouteAuthOptions,\n RouteContext,\n RoutePolicy,\n} from '../common/router';\nimport { isPromiseLike } from '../common/promise';\n\nconst ROUTE_AUTH_OPTIONS = Symbol.for('__ASKR_ROUTE_AUTH_OPTIONS__');\nconst BUILT_IN_ROUTE_POLICY = Symbol.for('__ASKR_BUILT_IN_ROUTE_POLICY__');\n\ntype InternalRouteContext = RouteContext & {\n [ROUTE_AUTH_OPTIONS]?: RouteAuthOptions;\n};\n\nexport type BuiltInRoutePolicyKind = 'auth' | 'guest' | 'role' | 'permission';\n\nexport interface BuiltInRoutePolicyMetadata {\n kind: BuiltInRoutePolicyKind;\n value?: string;\n}\n\ntype InternalRoutePolicy = RoutePolicy & {\n [BUILT_IN_ROUTE_POLICY]?: BuiltInRoutePolicyMetadata;\n};\n\ntype RoutePathResolver =\n | string\n | ((context: RouteContext) => string | PromiseLike<string>);\n\nexport function allow(): AccessAllowDecision {\n return { kind: 'allow' };\n}\n\nexport function redirect(\n to: string,\n init: {\n status?: AccessRedirectStatus;\n replace?: boolean;\n } = {}\n): AccessRedirectDecision {\n return {\n kind: 'redirect',\n to,\n ...(init.status ? { status: init.status } : {}),\n ...(init.replace !== undefined ? { replace: init.replace } : {}),\n };\n}\n\nexport function deny(status: AccessDenyStatus): AccessDenyDecision {\n return { kind: 'deny', status };\n}\n\nexport function unauthorized(): AccessDenyDecision {\n return deny(401);\n}\n\nexport function forbidden(): AccessDenyDecision {\n return deny(403);\n}\n\nexport function notFound(): AccessDenyDecision {\n return deny(404);\n}\n\nexport function normalizeAccessDecision(\n result: AccessDecision\n): AccessDecision {\n return result;\n}\n\nexport function withRouteAuthOptions(\n context: RouteContext,\n auth: RouteAuthOptions | undefined\n): RouteContext {\n const internal = context as InternalRouteContext;\n\n if (!auth) {\n delete internal[ROUTE_AUTH_OPTIONS];\n return context;\n }\n\n internal[ROUTE_AUTH_OPTIONS] = auth;\n return context;\n}\n\nfunction getRouteAuthOptions(\n context: RouteContext\n): RouteAuthOptions | undefined {\n return (context as InternalRouteContext)[ROUTE_AUTH_OPTIONS];\n}\n\nfunction assertRouteAuthOptions(context: RouteContext): RouteAuthOptions {\n const auth = getRouteAuthOptions(context);\n if (!auth?.resolve) {\n throw new Error(\n 'Built-in auth policies require router auth configuration. ' +\n 'Provide `auth` to registerRoutes(...), createSPA(...), hydrateSPA(...), or SSR route resolution.'\n );\n }\n\n return auth;\n}\n\nfunction markBuiltInRoutePolicy(\n policy: RoutePolicy,\n metadata: BuiltInRoutePolicyMetadata\n): RoutePolicy {\n Object.defineProperty(policy, BUILT_IN_ROUTE_POLICY, {\n value: Object.freeze({ ...metadata }),\n enumerable: false,\n configurable: false,\n });\n return policy;\n}\n\nexport function _getBuiltInRoutePolicy(\n policy: RoutePolicy\n): BuiltInRoutePolicyMetadata | null {\n return (policy as InternalRoutePolicy)[BUILT_IN_ROUTE_POLICY] ?? null;\n}\n\nfunction resolvePathSetting(\n value: RoutePathResolver | undefined,\n fallback: string,\n context: RouteContext\n): string | PromiseLike<string> {\n if (!value) {\n return fallback;\n }\n\n if (typeof value === 'function') {\n return value(context);\n }\n\n return value;\n}\n\nfunction appendNextTarget(path: string, href: string): string {\n const resolved = new URL(path, 'http://localhost');\n resolved.searchParams.set('next', href);\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nfunction collectStringValues(value: unknown): string[] {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string');\n }\n\n if (value instanceof Set) {\n return Array.from(value).filter(\n (entry): entry is string => typeof entry === 'string'\n );\n }\n\n return [];\n}\n\nfunction defaultHasRole(user: unknown, role: string): boolean {\n if (!user || typeof user !== 'object') {\n return false;\n }\n\n return collectStringValues((user as { roles?: unknown }).roles).includes(\n role\n );\n}\n\nfunction defaultHasPermission(user: unknown, permission: string): boolean {\n if (!user || typeof user !== 'object') {\n return false;\n }\n\n return collectStringValues(\n (user as { permissions?: unknown }).permissions\n ).includes(permission);\n}\n\nfunction resolveUnauthenticatedRedirect(\n context: RouteContext\n): AccessDecision | Promise<AccessDecision> {\n const auth = assertRouteAuthOptions(context);\n const loginPath = resolvePathSetting(auth.loginPath, '/login', context);\n if (isPromiseLike<string>(loginPath)) {\n return Promise.resolve(loginPath).then((nextPath) =>\n redirect(appendNextTarget(nextPath, context.href), {\n replace: context.mode === 'spa',\n })\n );\n }\n\n return redirect(appendNextTarget(loginPath, context.href), {\n replace: context.mode === 'spa',\n });\n}\n\nfunction resolveAuthenticatedRedirect(\n context: RouteContext\n): AccessDecision | Promise<AccessDecision> {\n const auth = assertRouteAuthOptions(context);\n const target = resolvePathSetting(auth.guestRedirectTo, '/', context);\n if (isPromiseLike<string>(target)) {\n return Promise.resolve(target).then((nextTarget) =>\n redirect(nextTarget, {\n replace: true,\n })\n );\n }\n\n return redirect(target, {\n replace: true,\n });\n}\n\nexport function requireAuth(): RoutePolicy {\n return markBuiltInRoutePolicy(\n (context) => {\n if (context.session) {\n return allow();\n }\n\n return resolveUnauthenticatedRedirect(context);\n },\n { kind: 'auth' }\n );\n}\n\nexport function requireGuest(): RoutePolicy {\n return markBuiltInRoutePolicy(\n (context) => {\n if (!context.session) {\n return allow();\n }\n\n return resolveAuthenticatedRedirect(context);\n },\n { kind: 'guest' }\n );\n}\n\nexport function requireRole(role: string): RoutePolicy {\n return markBuiltInRoutePolicy(\n (context) => {\n if (!context.user) {\n return resolveUnauthenticatedRedirect(context);\n }\n\n const auth = assertRouteAuthOptions(context);\n const hasRole = auth.hasRole\n ? auth.hasRole(context.user, role, context)\n : defaultHasRole(context.user, role);\n\n if (isPromiseLike<boolean>(hasRole)) {\n return Promise.resolve(hasRole).then((next) =>\n next ? allow() : forbidden()\n );\n }\n\n return hasRole ? allow() : forbidden();\n },\n { kind: 'role', value: role }\n );\n}\n\nexport function requirePermission(permission: string): RoutePolicy {\n return markBuiltInRoutePolicy(\n (context) => {\n if (!context.user) {\n return resolveUnauthenticatedRedirect(context);\n }\n\n const auth = assertRouteAuthOptions(context);\n const hasPermission = auth.hasPermission\n ? auth.hasPermission(context.user, permission, context)\n : defaultHasPermission(context.user, permission);\n\n if (isPromiseLike<boolean>(hasPermission)) {\n return Promise.resolve(hasPermission).then((next) =>\n next ? allow() : forbidden()\n );\n }\n\n return hasPermission ? allow() : forbidden();\n },\n { kind: 'permission', value: permission }\n );\n}\n\nexport async function evaluateRoutePolicy(\n policy: RoutePolicy,\n context: RouteContext\n): Promise<AccessDecision> {\n const result = await policy(context);\n return result;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendering.d.ts","names":[],"sources":["../../src/router/rendering.ts"],"mappings":";;;;iBAegB,MAAA,IAAU,UAAU;AAAA,iBA2CpB,kBAAA,CACd,SAAA,EAAW,cAAA,EACX,SAAA,WAAoB,eAAA,IACpB,WAAA,WAAsB,iBAAA,IACtB,eAAA,aACC,YAAA;AAAA,iBAgBa,gBAAA,CAAiB,MAAA,EAAQ,WAAA,GAAc,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendering.js","names":[],"sources":["../../src/router/rendering.ts"],"sourcesContent":["import { ELEMENT_TYPE, Fragment, type JSXElement } from '../common/jsx';\nimport type {\n LayoutScopeRecord,\n PageScopeRecord,\n RouteComponent,\n RouteHandler,\n RouteRecord,\n} from '../common/router';\nimport { ROUTE_ROOT_COMPONENT } from '../common/router-internal';\nimport type { RenderableChild } from '../common/vnode';\nimport { defineContext, readContext } from '../runtime/context';\nimport type { InternalRouteRecord } from './internal-types';\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\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\nexport function 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\nexport function 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"],"mappings":";;;;AAaA,MAAM,gBAAgB,cAA+B,IAAI;AAEzD,SAAgB,SAAqB;CACnC,OAAO;EACL,UAAU;EACV,MAAM;EACN,OAAO,EAAE,UAAU,YAAY,aAAa,EAAE;EAC9C,KAAK;CACP;AACF;AAEA,SAAS,eACP,WACA,QACA,SACA,kBAAkB,OACD;CACjB,IAAI,cAAc;CAElB,KAAK,IAAI,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,KACzC,cAAc,cAAc,MAAM;EAChC,OAAO;EACP,UAAU,kBACN,0BAA0B,UAAU,EAAE,CAAC,WAAW,MAAM,IACxD,UAAU,EAAE,CAAC,UAAU,MAAM;CACnC,CAAC;CAGH,OAAO;AACT;AAEA,SAAS,0BACP,WACA,QACA,YAAY,OACK;CACjB,OAAO;EACL,UAAU;EACV,MAAM;EACN,OAAO;EACP,KAAK;EACL,GAAI,YAAY,GAAG,uBAAuB,KAAK,IAAI,CAAC;CACtD;AACF;AAEA,SAAgB,mBACd,WACA,WACA,aACA,kBAAkB,OACJ;CACd,QAAQ,WAAW;EACjB,IAAI,UAAU,kBACV,0BAA0B,WAAW,QAAQ,IAAI,IACjD,UAAU,MAAM;EAEpB,UAAU,eAAe,WAAW,QAAQ,SAAS,eAAe;EAEpE,KAAK,IAAI,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAC3C,UAAU,YAAY,EAAE,CAAC,UAAU,EAAE,UAAU,QAAQ,CAAC;EAG1D,OAAO;CACT;AACF;AAEA,SAAgB,iBAAiB,QAAmC;CAElE,OACE,OAAe,iBACf,mBACE,OAAO,WACP,OAAO,WACP,OAAO,aACP,IACF;AAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolution.d.ts","names":[],"sources":["../../src/router/resolution.ts"],"mappings":";;;iBAsPgB,wBAAA,CACd,QAAA,UACA,UAAA,WAAqB,KAAA,KACpB,UAAU;AAAA,iBAyBG,8BAAA,CACd,QAAA,UACA,YAAA,WAAuB,WAAA,KACtB,UAAU;AAAA,iBAgBG,2BAAA,CACd,QAAA,UACA,OAAA;EACE,QAAA,GAAW,aAAA;EACX,MAAA,YAAkB,KAAA;AAAA,IAEnB,UAAA;AAAA,iBAYa,YAAA,CAAa,QAAA,WAAmB,aAAa;AAAA,iBA+H7C,mBAAA,CACd,MAAA,UACA,OAAA,GAAS,mBAAA,GACR,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;AAAA,iBAsDhB,sBAAA,CACd,QAAA,UACA,SAAA,WAAoB,KAAA,KACnB,aAAa;AAAA,iBAOA,4BAAA,CACd,QAAA,UACA,SAAA,WAAoB,KAAA;EACjB,KAAA,EAAO,KAAA;EAAO,MAAA,EAAQ,MAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolution.js","names":[],"sources":["../../src/router/resolution.ts"],"sourcesContent":["import type {\n Route,\n RouteContext,\n RouteHandler,\n RouteManifest,\n RouteMatch,\n RouteOptions,\n RoutePolicy,\n RouteRecord,\n RouteRenderResult,\n RouteRequestOptions,\n RouteRequestResult,\n ResolvedRoute,\n} from '../common/router';\nimport { isPromiseLike } from '../common/promise';\nimport { getActiveRenderContext } from '../common/render-context';\nimport {\n buildRouteContext,\n buildRouteContextBase,\n deepFreeze,\n parseLocation,\n} from './route-context';\nimport { compileNodePolicies } from './access';\nimport {\n computeRank,\n matchSegments,\n parseSegments,\n splitPathSegments,\n} from './match';\nimport type { InternalRoute, InternalRouteRecord } from './internal-types';\nimport { getRenderHandler } from './rendering';\nimport {\n getActiveRouteAuthOptions,\n getActiveRoutes,\n getRouteRecords,\n isRouteStoreRoutes,\n} from './store';\n\nconst routeSegsCache = new WeakMap<Route, ReturnType<typeof parseSegments>>();\nconst routeRankCache = new WeakMap<Route, number>();\nconst sortedListCache = new WeakMap<\n ReadonlyArray<Route>,\n ReadonlyArray<Route>\n>();\n\nfunction cachedSegs(route: Route): ReturnType<typeof parseSegments> {\n let segments = routeSegsCache.get(route);\n if (!segments) {\n segments = parseSegments(route.path);\n routeSegsCache.set(route, segments);\n }\n return segments;\n}\n\nfunction cachedRank(route: Route): number {\n let rank = routeRankCache.get(route);\n if (rank === undefined) {\n rank = computeRank(cachedSegs(route));\n routeRankCache.set(route, rank);\n }\n return rank;\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\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 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 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\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\nexport function computeMatchesFromRoutes(\n pathname: string,\n routesList: readonly Route[]\n): RouteMatch[] {\n const bestMatch = isRouteStoreRoutes(routesList)\n ? getMatchingRecord(pathname, getRouteRecords())\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\nexport function 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.manifest) {\n return computeMatchesFromRouteRecords(pathname, options.manifest.records);\n }\n\n if (options.routes) {\n return computeMatchesFromRoutes(pathname, options.routes);\n }\n\n return computeMatchesFromRoutes(pathname, getActiveRoutes());\n}\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 const records = getRouteRecords();\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 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 = getActiveRenderContext();\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 ?? getRouteRecords();\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 getActiveRenderContext()?.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\nexport function resolveRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): ResolvedRoute | null {\n if (isRouteStoreRoutes(routeList)) 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":";;;;;;;;AAsCA,MAAM,iCAAiB,IAAI,QAAiD;AAC5E,MAAM,iCAAiB,IAAI,QAAuB;AAClD,MAAM,kCAAkB,IAAI,QAG1B;AAEF,SAAS,WAAW,OAAgD;CAClE,IAAI,WAAW,eAAe,IAAI,KAAK;CACvC,IAAI,CAAC,UAAU;EACb,WAAW,cAAc,MAAM,IAAI;EACnC,eAAe,IAAI,OAAO,QAAQ;CACpC;CACA,OAAO;AACT;AAEA,SAAS,WAAW,OAAsB;CACxC,IAAI,OAAO,eAAe,IAAI,KAAK;CACnC,IAAI,SAAS,QAAW;EACtB,OAAO,YAAY,WAAW,KAAK,CAAC;EACpC,eAAe,IAAI,OAAO,IAAI;CAChC;CACA,OAAO;AACT;AAEA,SAAS,iBACP,WACsB;CACtB,IAAI,SAAS,gBAAgB,IAAI,SAAS;CAC1C,IAAI,CAAC,QAAQ;EACX,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;EACpE,gBAAgB,IAAI,WAAW,MAAM;CACvC;CACA,OAAO;AACT;AAEA,SAAS,oBACP,UACA,gBAC+B;CAC/B,MAAM,iBACJ,SAAS,SAAS,GAAG,KAAK,aAAa,MACnC,SAAS,MAAM,GAAG,EAAE,IACpB;CACN,MAAM,mBACJ,eAAe,SAAS,GAAG,KAAK,mBAAmB,MAC/C,eAAe,MAAM,GAAG,EAAE,IAC1B;CAEN,IAAI,qBAAqB,KAAK;EAC5B,MAAM,WAAW,kBAAkB,cAAc;EACjD,OAAO,EACL,KACE,SAAS,WAAW,IAChB,MACA,SAAS,WAAW,IAClB,SAAS,KACT,MAAM,SAAS,KAAK,GAAG,EACjC;CACF;CAEA,IACE,mBAAmB,oBACnB,CAAC,eAAe,WAAW,GAAG,iBAAiB,EAAE,GAEjD,OAAO;CAOT,MAAM,iBAAiB,kBAHrB,mBAAmB,mBACf,MACA,eAAe,MAAM,iBAAiB,MAAM,CACA;CAElD,OAAO,EACL,KACE,eAAe,WAAW,IACtB,MACA,eAAe,WAAW,IACxB,eAAe,KACf,MAAM,eAAe,KAAK,GAAG,EACvC;AACF;AAEA,SAAS,gCACP,UACA,WACyD;CACzD,MAAM,aACJ,SAAS,SAAS,GAAG,KAAK,aAAa,MACnC,SAAS,MAAM,GAAG,EAAE,IACpB;CACN,MAAM,WAAW,kBAAkB,UAAU;CAE7C,MAAM,SAAS,iBAAiB,SAAS;CACzC,IAAI,YAA0B;CAC9B,IAAI,aAAqC,CAAC;CAC1C,IAAI,WAAW;CAEf,KAAK,MAAM,SAAS,QAAQ;EAE1B,IAAI,MAAc,gBAChB;EAGF,MAAM,OAAO,WAAW,KAAK;EAC7B,IAAI,OAAO,UAAU;EACrB,IAAI,cAAc,QAAQ,SAAS,UAAU;EAE7C,MAAM,SAAS,cAAc,UAAU,WAAW,KAAK,CAAC;EACxD,IAAI,WAAW,MAAM;GACnB,YAAY;GACZ,aAAa;GACb,WAAW;EACb;CACF;CAEA,IAAI,cAAc,MAChB,OAAO;EAAE,OAAO;EAAW,QAAQ;CAAW;CAGhD,IAAI,eAAqC;CACzC,IAAI,qBAAoD;CACxD,IAAI,mBAAmB;CAEvB,KAAK,MAAM,SAAS,WAAW;EAC7B,MAAM,gBAAgB;EACtB,IAAI,CAAC,cAAc,gBACjB;EAGF,MAAM,SAAS,oBACb,YACA,cAAc,cAChB;EACA,IAAI,WAAW,MACb;EAGF,IAAI,cAAc,eAAe,SAAS,kBAAkB;GAC1D,eAAe;GACf,qBAAqB;GACrB,mBAAmB,cAAc,eAAe;EAClD;CACF;CAEA,OAAO,gBAAgB,qBACnB;EAAE,OAAO;EAAc,QAAQ;CAAmB,IAClD;AACN;AAEA,SAAS,6BACP,UACA,cACwE;CACxE,IAAI,aAAyC;CAC7C,IAAI,aAA4C;CAChD,IAAI,mBAAmB;CAEvB,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,SAAS;EACf,IAAI,CAAC,OAAO,gBACV;EAGF,MAAM,SAAS,oBAAoB,UAAU,OAAO,cAAc;EAClE,IAAI,WAAW,MACb;EAGF,IAAI,OAAO,eAAe,SAAS,kBAAkB;GACnD,aAAa;GACb,aAAa;GACb,mBAAmB,OAAO,eAAe;EAC3C;CACF;CAEA,OAAO,cAAc,aACjB;EAAE,QAAQ;EAAY,QAAQ;CAAW,IACzC;AACN;AAEA,SAAS,kBACP,QACA,cACgE;CAChE,MAAM,WAAW,cAAc,MAAM;CACrC,MAAM,aACJ,SAAS,SAAS,SAAS,GAAG,KAAK,SAAS,aAAa,MACrD,SAAS,SAAS,MAAM,GAAG,EAAE,IAC7B,SAAS;CACf,MAAM,WAAW,kBAAkB,UAAU;CAE7C,KAAK,MAAM,UAAU,cAAc;EAEjC,IAAI,OAAe,gBACjB;EAGF,MAAM,SAAS,cAAc,UAAU,OAAO,QAAQ;EACtD,IAAI,WAAW,MACb,OAAO;GAAE;GAAQ;EAAO;CAE5B;CAEA,OAAO,6BAA6B,YAAY,YAAY;AAC9D;AAEA,SAAgB,yBACd,UACA,YACc;CACd,MAAM,YAAY,mBAAmB,UAAU,IAC3C,kBAAkB,UAAU,gBAAgB,CAAC,IAC7C,gCAAgC,UAAU,UAAU;CAExD,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,OAAO,CACL;EACE,MAAM,WAAW,YAAY,UAAU,MAAM,OAAO,UAAU,OAAO;EACrE,QAAQ,WAAW,EAAE,GAAG,UAAU,OAAO,CAAC;EAC1C,MACE,WAAW,YACN,UAAU,MAA4B,OACvC;EACN,WACE,WAAW,YACP,UAAU,MAAM,YAChB,UAAU,OAAO,QAAQ;CACjC,CACF;AACF;AAEA,SAAgB,+BACd,UACA,cACc;CACd,MAAM,YAAY,kBAAkB,UAAU,YAAY;CAE1D,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,OAAO,CACL;EACE,MAAM,UAAU,OAAO;EACvB,QAAQ,WAAW,EAAE,GAAG,UAAU,OAAO,CAAC;EAC1C,WAAW,UAAU,OAAO,QAAQ;CACtC,CACF;AACF;AAEA,SAAgB,4BACd,UACA,UAGI,CAAC,GACS;CACd,IAAI,QAAQ,UACV,OAAO,+BAA+B,UAAU,QAAQ,SAAS,OAAO;CAG1E,IAAI,QAAQ,QACV,OAAO,yBAAyB,UAAU,QAAQ,MAAM;CAG1D,OAAO,yBAAyB,UAAU,gBAAgB,CAAC;AAC7D;AAEA,SAAgB,aAAa,UAAwC;CACnE,MAAM,aACJ,SAAS,SAAS,GAAG,KAAK,aAAa,MACnC,SAAS,MAAM,GAAG,EAAE,IACpB;CACN,MAAM,WAAW,kBAAkB,UAAU;CAC7C,MAAM,UAAU,gBAAgB;CAEhC,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,gBACT;EAGF,MAAM,SAAS,cAAc,UAAU,OAAO,QAAQ;EACtD,IAAI,WAAW,MACb,OAAO;GAAE,SAAS,OAAO;GAAS;EAAO;CAE7C;CAEA,MAAM,gBAAgB,6BAA6B,YAAY,OAAO;CACtE,OAAO,gBACH;EAAE,SAAS,cAAc,OAAO;EAAS,QAAQ,cAAc;CAAO,IACtE;AACN;AAEA,SAAS,iBACP,SACwB;CACxB,IAAI,CAAC,SACH,OAAO,CAAC;CAGV,IAAI,QAAQ,UAAU,QACpB,OAAO,QAAQ;CAGjB,OAAO,oBAAoB,OAAO;AACpC;AAEA,SAAS,sBAA4C;CACnD,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,6BACP,SACA,MACc;CACd,QAAQ,QAAQ,YAAY;EAC1B,MAAM,gBAAgB,uBAAuB;EAC7C,IAAI,eACF,cAAc,aAAc,QAAQ;EAMtC,OAAO,QAAQ,QAAQ,OAAO;CAChC;AACF;AAEA,SAAS,kBACP,QACA,QACA,MACkD;CAClD,MAAM,gBAAgB,iBAAiB,MAAM;CAC7C,MAAM,SAAS,SAAS,QAAQ,OAAO,SAAS,SAAS;CACzD,IAAI,QAAQ;EACV,MAAM,SAAS,OAAO,EAAE,OAAO,CAAC;EAChC,MAAM,YAAY,UAAsC;GACtD,MAAM;GACN,SAAS,6BAA6B,eAAe,IAAI;GACzD;EACF;EAEA,IAAI,cAAc,MAAM,GACtB,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,MAAM,SAAS,SAAS,IAAI,CAAC;EAG9D,OAAO,SAAS,MAAM;CACxB;CAEA,OAAO;EACL,MAAM;EACN,SAAS;EACT;CACF;AACF;AAEA,SAAS,sBACP,UACA,SACA,QACA,QACA,aAAa,GACqC;CAClD,KAAK,IAAI,QAAQ,YAAY,QAAQ,SAAS,QAAQ,SAAS,GAAG;EAChE,MAAM,eAAe,SAAS,MAAM,CAAC,OAAO;EAE5C,IAAI,cAAc,YAAY,GAC5B,OAAO,QAAQ,QAAQ,YAAY,CAAC,CAAC,MAAM,SAAS;GAClD,IAAI,KAAK,SAAS,SAChB,OAAO;GAGT,OAAO,sBACL,UACA,SACA,QACA,QACA,QAAQ,CACV;EACF,CAAC;EAGH,IAAI,aAAa,SAAS,SACxB,OAAO;CAEX;CAEA,OAAO,kBAAkB,QAAQ,QAAQ,QAAQ,IAAI;AACvD;AAEA,SAAgB,oBACd,QACA,UAA+B,CAAC,GACkB;CAElD,MAAM,QAAQ,kBAAkB,QADX,QAAQ,UAAU,WAAW,gBAAgB,CACd;CAEpD,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,WAAW,iBAAiB,OAAO,OAAO;CAChD,MAAM,OAAO,QAAQ,QAAQ,oBAAoB;CAEjD,IAAI,SAAS,WAAW,GACtB,OAAO,kBAAkB,QAAQ,QAAQ,IAAI;CAG/C,MAAM,SACJ,QAAQ,UACR,uBAAuB,CAAC,EAAE,UAC1B,IAAI,gBAAgB,CAAC,CAAC;CACxB,MAAM,OAAO,0BACX,QAAQ,QAAQ,QAAQ,UAAU,IACpC;CACA,MAAM,cAAc,sBAAsB,QAAQ,QAAQ;EACxD;EACA;CACF,CAAC;CAED,MAAM,YAAY,cAChB,sBACE,UACA,kBAAkB,QAAQ,QAAQ;EAChC;EACA;EACA;EACA,SAAS,UAAU;EACnB,MAAM,UAAU;CAClB,CAAC,GACD,QACA,MACF;CAEF,IAAI,CAAC,MAAM,SACT,OAAO,SAAS;EAAE,SAAS;EAAM,MAAM;CAAK,CAAC;CAG/C,MAAM,YAAY,KAAK,QAAQ,WAAW;CAC1C,IAAI,cAAc,SAAS,GACzB,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,MAAM,SAAS,SAAS,IAAI,CAAC;CAGjE,OAAO,SAAS,SAAS;AAC3B;AAEA,SAAgB,uBACd,UACA,WACsB;CACtB,IAAI,mBAAmB,SAAS,GAAG,OAAO,aAAa,QAAQ;CAE/D,MAAM,QAAQ,gCAAgC,UAAU,SAAS;CACjE,OAAO,QAAQ;EAAE,SAAS,MAAM,MAAM;EAAS,QAAQ,MAAM;CAAO,IAAI;AAC1E;AAEA,SAAgB,6BACd,UACA,WACyD;CACzD,OAAO,gCAAgC,UAAU,SAAS;AAC5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"route-context.js","names":[],"sources":["../../src/router/route-context.ts"],"sourcesContent":["import { withRouteAuthOptions } from './policy';\n\nimport type {\n RouteAuthOptions,\n RouteContext,\n RouteQuery,\n} from '../common/router';\n\nexport function parseLocation(url: string): {\n pathname: string;\n search: string;\n hash: string;\n} {\n try {\n const parsedUrl = new URL(url, 'http://localhost');\n return {\n pathname: parsedUrl.pathname,\n search: parsedUrl.search,\n hash: parsedUrl.hash,\n };\n } catch {\n return { pathname: '/', search: '', hash: '' };\n }\n}\n\nexport function deepFreeze<T>(obj: T): T {\n if (obj && typeof obj === 'object' && !Object.isFrozen(obj)) {\n Object.freeze(obj as Record<string, unknown>);\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n const value = (obj as Record<string, unknown>)[key];\n if (value && typeof value === 'object') {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nexport function makeQuery(search: string): RouteQuery {\n const searchParams = new URLSearchParams(search || '');\n const mapping = new Map<string, string[]>();\n\n for (const [key, value] of searchParams.entries()) {\n const existing = mapping.get(key);\n if (existing) {\n existing.push(value);\n } else {\n mapping.set(key, [value]);\n }\n }\n\n const query: RouteQuery = {\n get(key: string) {\n const values = mapping.get(key);\n return values ? values[0] : null;\n },\n getAll(key: string) {\n const values = mapping.get(key);\n return values ? [...values] : [];\n },\n has(key: string) {\n return mapping.has(key);\n },\n toJSON() {\n const output: Record<string, string | string[]> = {};\n for (const [key, values] of mapping.entries()) {\n output[key] = values.length > 1 ? [...values] : values[0];\n }\n return output;\n },\n };\n\n return deepFreeze(query);\n}\n\nexport function buildRouteContextBase(\n target: string,\n params: Record<string, string>,\n options: {\n mode: RouteContext['mode'];\n signal: AbortSignal;\n }\n): Omit<RouteContext, 'session' | 'user'> {\n const parsed = parseLocation(target);\n const href = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n\n return {\n mode: options.mode,\n params,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n href,\n signal: options.signal,\n };\n}\n\nexport function buildRouteContext(\n target: string,\n params: Record<string, string>,\n options: {\n mode: RouteContext['mode'];\n signal: AbortSignal;\n auth?: RouteAuthOptions;\n session?: unknown;\n user?: unknown;\n }\n): RouteContext {\n const context: RouteContext = {\n ...buildRouteContextBase(target, params, options),\n session: options.session ?? null,\n user: options.user ?? null,\n };\n\n return withRouteAuthOptions(context, options.auth);\n}\n"],"mappings":";;AAQA,SAAgB,cAAc,KAI5B;CACA,IAAI;EACF,MAAM,YAAY,IAAI,IAAI,KAAK,kBAAkB;EACjD,OAAO;GACL,UAAU,UAAU;GACpB,QAAQ,UAAU;GAClB,MAAM,UAAU;EAClB;CACF,QAAQ;EACN,OAAO;GAAE,UAAU;GAAK,QAAQ;GAAI,MAAM;EAAG;CAC/C;AACF;AAEA,SAAgB,WAAc,KAAW;CACvC,IAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,GAAG,GAAG;EAC3D,OAAO,OAAO,GAA8B;EAC5C,KAAK,MAAM,OAAO,OAAO,KAAK,GAA8B,GAAG;GAC7D,MAAM,QAAS,IAAgC;GAC/C,IAAI,SAAS,OAAO,UAAU,UAC5B,WAAW,KAAK;EAEpB;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,UAAU,QAA4B;CACpD,MAAM,eAAe,IAAI,gBAAgB,UAAU,EAAE;CACrD,MAAM,0BAAU,IAAI,IAAsB;CAE1C,KAAK,MAAM,CAAC,KAAK,UAAU,aAAa,QAAQ,GAAG;EACjD,MAAM,WAAW,QAAQ,IAAI,GAAG;EAChC,IAAI,UACF,SAAS,KAAK,KAAK;OAEnB,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC;CAE5B;CAuBA,OAAO,WAAW;EApBhB,IAAI,KAAa;GACf,MAAM,SAAS,QAAQ,IAAI,GAAG;GAC9B,OAAO,SAAS,OAAO,KAAK;EAC9B;EACA,OAAO,KAAa;GAClB,MAAM,SAAS,QAAQ,IAAI,GAAG;GAC9B,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;EACjC;EACA,IAAI,KAAa;GACf,OAAO,QAAQ,IAAI,GAAG;EACxB;EACA,SAAS;GACP,MAAM,SAA4C,CAAC;GACnD,KAAK,MAAM,CAAC,KAAK,WAAW,QAAQ,QAAQ,GAC1C,OAAO,OAAO,OAAO,SAAS,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO;GAEzD,OAAO;EACT;CAGgB,CAAK;AACzB;AAEA,SAAgB,sBACd,QACA,QACA,SAIwC;CACxC,MAAM,SAAS,cAAc,MAAM;CACnC,MAAM,OAAO,GAAG,OAAO,WAAW,OAAO,SAAS,OAAO;CAEzD,OAAO;EACL,MAAM,QAAQ;EACd;EACA,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf,MAAM,OAAO;EACb;EACA,QAAQ,QAAQ;CAClB;AACF;AAEA,SAAgB,kBACd,QACA,QACA,SAOc;CAOd,OAAO,qBAAqB;EAL1B,GAAG,sBAAsB,QAAQ,QAAQ,OAAO;EAChD,SAAS,QAAQ,WAAW;EAC5B,MAAM,QAAQ,QAAQ;CAGI,GAAS,QAAQ,IAAI;AACnD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"route-query.d.ts","names":[],"sources":["../../src/router/route-query.ts"],"mappings":";KAWY,oBAAA;AAAA,KACA,oBAAA,GACR,oBAAA,YACS,oBAAoB;AAAA,KACrB,iBAAA,GAAoB,MAAM,SAAS,oBAAA;AAAA,KACnC,iBAAA,IAAqB,YAA6B,EAAf,eAAe;AAAA,KAElD,uBAAA;EAPoB;AAChC;;;EAWE,OAAA;EACA,OAAO;AAAA;AAAA,iBAmDO,gBAAA,CACd,OAAA,EAAS,iBAAA,GAAoB,iBAAA,EAC7B,OAAA,GAAS,uBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"route-query.js","names":[],"sources":["../../src/router/route-query.ts"],"sourcesContent":["import { saveScrollPosition } from './navigation-scroll';\nimport {\n getCurrentHref,\n getRegisteredAppsSnapshot,\n getWindowHref,\n parseTargetUrl,\n setCurrentRouteLocation,\n syncAppRegistrationLocation,\n syncRegisteredRouteSnapshot,\n} from './navigation-registry';\n\nexport type RouteQueryParamValue = string | number | boolean | null | undefined;\nexport type RouteQueryParamInput =\n | RouteQueryParamValue\n | readonly RouteQueryParamValue[];\nexport type RouteQueryUpdates = Record<string, RouteQueryParamInput>;\nexport type RouteQueryUpdater = (searchParams: URLSearchParams) => void;\n\nexport type UpdateRouteQueryOptions = {\n /**\n * Defaults to replace so high-frequency controls such as search inputs do not\n * create one browser-history entry per character.\n */\n history?: 'push' | 'replace';\n replace?: boolean;\n};\n\nfunction getRouteQueryHistoryMode(\n options: UpdateRouteQueryOptions\n): 'push' | 'replace' {\n if (options.history) {\n return options.history;\n }\n\n return options.replace === false ? 'push' : 'replace';\n}\n\nfunction setRouteQueryValue(\n searchParams: URLSearchParams,\n key: string,\n value: RouteQueryParamInput\n): void {\n searchParams.delete(key);\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (entry === null || entry === undefined) {\n continue;\n }\n searchParams.append(key, String(entry));\n }\n return;\n }\n\n if (value === null || value === undefined) {\n return;\n }\n\n searchParams.set(key, String(value));\n}\n\nfunction applyRouteQueryUpdates(\n searchParams: URLSearchParams,\n updates: RouteQueryUpdates | RouteQueryUpdater\n): void {\n if (typeof updates === 'function') {\n updates(searchParams);\n return;\n }\n\n for (const [key, value] of Object.entries(updates)) {\n setRouteQueryValue(searchParams, key, value);\n }\n}\n\nexport function updateRouteQuery(\n updates: RouteQueryUpdates | RouteQueryUpdater,\n options: UpdateRouteQueryOptions = {}\n): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const url = parseTargetUrl(getWindowHref());\n applyRouteQueryUpdates(url.searchParams, updates);\n\n const href = `${url.pathname}${url.search}${url.hash}`;\n if (href === getWindowHref()) {\n return;\n }\n\n const historyMode = getRouteQueryHistoryMode(options);\n if (historyMode === 'push') {\n saveScrollPosition(getCurrentHref());\n }\n\n const state =\n window.history.state && typeof window.history.state === 'object'\n ? window.history.state\n : {};\n\n window.history[historyMode === 'replace' ? 'replaceState' : 'pushState'](\n {\n ...state,\n path: href,\n },\n '',\n href\n );\n\n setCurrentRouteLocation(url.pathname, href);\n for (const app of getRegisteredAppsSnapshot()) {\n syncAppRegistrationLocation(app, url.pathname, href);\n }\n syncRegisteredRouteSnapshot();\n}\n"],"mappings":";;;AA2BA,SAAS,yBACP,SACoB;CACpB,IAAI,QAAQ,SACV,OAAO,QAAQ;CAGjB,OAAO,QAAQ,YAAY,QAAQ,SAAS;AAC9C;AAEA,SAAS,mBACP,cACA,KACA,OACM;CACN,aAAa,OAAO,GAAG;CAEvB,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,KAAK,MAAM,SAAS,OAAO;GACzB,IAAI,UAAU,QAAQ,UAAU,QAC9B;GAEF,aAAa,OAAO,KAAK,OAAO,KAAK,CAAC;EACxC;EACA;CACF;CAEA,IAAI,UAAU,QAAQ,UAAU,QAC9B;CAGF,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AACrC;AAEA,SAAS,uBACP,cACA,SACM;CACN,IAAI,OAAO,YAAY,YAAY;EACjC,QAAQ,YAAY;EACpB;CACF;CAEA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,mBAAmB,cAAc,KAAK,KAAK;AAE/C;AAEA,SAAgB,iBACd,SACA,UAAmC,CAAC,GAC9B;CACN,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,MAAM,eAAe,cAAc,CAAC;CAC1C,uBAAuB,IAAI,cAAc,OAAO;CAEhD,MAAM,OAAO,GAAG,IAAI,WAAW,IAAI,SAAS,IAAI;CAChD,IAAI,SAAS,cAAc,GACzB;CAGF,MAAM,cAAc,yBAAyB,OAAO;CACpD,IAAI,gBAAgB,QAClB,mBAAmB,eAAe,CAAC;CAGrC,MAAM,QACJ,OAAO,QAAQ,SAAS,OAAO,OAAO,QAAQ,UAAU,WACpD,OAAO,QAAQ,QACf,CAAC;CAEP,OAAO,QAAQ,gBAAgB,YAAY,iBAAiB,YAAY,CACtE;EACE,GAAG;EACH,MAAM;CACR,GACA,IACA,IACF;CAEA,wBAAwB,IAAI,UAAU,IAAI;CAC1C,KAAK,MAAM,OAAO,0BAA0B,GAC1C,4BAA4B,KAAK,IAAI,UAAU,IAAI;CAErD,4BAA4B;AAC9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","names":[],"sources":["../../src/router/store.ts"],"mappings":";;;;KA6BK,kBAAA;EACH,MAAA,EAAQ,aAAA;EACR,OAAA,EAAS,mBAAA;EACT,UAAA;EACA,kBAAA;EACA,uBAAA,EAAyB,gBAAA;EACzB,4BAAA,EAA8B,gBAAA;EAC9B,aAAA,EAAe,KAAA,UAAe,KAAA;EAC9B,sBAAA,EAAwB,iBAAA;EACxB,wBAAA,EAA0B,mBAAA;AAAA;AAAA,iBASZ,eAAA,aAA4B,mBAAmB;AAAA,iBAI/C,kBAAA,CAAmB,SAA2B,WAAP,KAAK;AAAA,iBAI5C,kBAAA,CAAmB,MAA2B,EAAnB,mBAAmB;AAAA,iBAW9C,gBAAA,CAAiB,QAAuB,EAAb,aAAa;AAAA,iBAgBxC,eAAA,aAA4B,KAAK;AAAA,iBAKjC,yBAAA,CACd,QAAA,GAAW,gBAAA,GACV,gBAAgB;AAAA,iBAaH,0BAAA,CACd,IAAkC,EAA5B,gBAAgB;AAAA,iBAKR,0BAAA,IAA8B,gBAAgB;AAAA,iBAI9C,0BAAA,CACd,IAAkC,EAA5B,gBAAgB;AAAA,iBAKR,6BAAA,IAAiC,mBAAmB;AAAA,iBAQpD,0BAAA,IAA8B,gBAAgB;AAAA,iBAS9C,qBAAA,IAAyB,iBAAiB;AAAA,iBAY1C,mBAAA,IAAuB,eAAe;AAAA,iBAYtC,kBAAA;AAAA,iBAIA,mBAAA,IAAuB,iBAAiB;AAAA,iBAWxC,mBAAA,IAAuB,iBAAiB;AAAA,iBAMxC,oBAAA;AAAA,iBAMA,2BAAA,IAA+B,WAAW;AAAA,iBAY1C,qBAAA,CACd,KAAA,EAAO,iBAAA,EACP,EAAA,EAAI,eAAe;AAAA,iBAUL,uBAAA,CACd,OAAA,EAAS,mBAAA,EACT,EAAA,EAAI,eAAe;AAAA,iBAUL,qBAAA;AAAA,iBAIA,8BAAA;AAAA,iBAIA,gCAAA;AAAA,iBAIA,+BAAA;AAAA,iBASA,SAAA,IAAa,KAAK;AAAA,iBAIlB,mBAAA;AAAA,iBAIA,kBAAA,CAAmB,SAAA,WAAoB,KAAK;AAAA,iBAI5C,eAAA,CAAgB,SAAiB;AAAA,iBA2BjC,mBAAA;AAAA,iBAIA,eAAA;AAAA,iBAYA,kBAAA,IAAsB,kBAAkB;AAAA,iBAiBxC,iBAAA,CAAkB,QAA4B,EAAlB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","names":[],"sources":["../../src/router/store.ts"],"sourcesContent":["import type {\n LayoutScopeRecord,\n PageScopeRecord,\n Route,\n RouteAuthOptions,\n RouteDefinition,\n RoutePolicy,\n} from '../common/router';\nimport { getActiveRenderContext } from '../common/render-context';\nimport type {\n AccessScopeState,\n InternalRoute,\n InternalRouteRecord,\n RegistrationScope,\n RegistrationSession,\n} from './internal-types';\n\nconst routes: InternalRoute[] = [];\nconst records: InternalRouteRecord[] = [];\nconst namespaces = new Set<string>();\nconst routesByDepth = new Map<number, Route[]>();\n\nconst registrationScopeStack: RegistrationScope[] = [];\nconst registrationSessionStack: RegistrationSession[] = [];\n\nlet registrationLocked = false;\nlet defaultRouteAuthOptions: RouteAuthOptions | undefined;\nlet activeClientRouteAuthOptions: RouteAuthOptions | undefined;\n\ntype RouteStateSnapshot = {\n routes: InternalRoute[];\n records: InternalRouteRecord[];\n namespaces: string[];\n registrationLocked: boolean;\n defaultRouteAuthOptions: RouteAuthOptions | undefined;\n activeClientRouteAuthOptions: RouteAuthOptions | undefined;\n routesByDepth: Array<[number, Route[]]>;\n registrationScopeStack: RegistrationScope[];\n registrationSessionStack: RegistrationSession[];\n};\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\nexport function getRouteRecords(): readonly InternalRouteRecord[] {\n return records;\n}\n\nexport function isRouteStoreRoutes(routeList: readonly Route[]): boolean {\n return routeList === routes;\n}\n\nexport function insertRecordSorted(record: InternalRouteRecord): void {\n let lo = 0;\n let hi = records.length;\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\nexport function addRouteToStores(routeObj: InternalRoute): void {\n routes.push(routeObj);\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\nexport function getActiveRoutes(): readonly Route[] {\n const renderContext = getActiveRenderContext();\n return renderContext?.routes ?? routes;\n}\n\nexport function getActiveRouteAuthOptions(\n override?: RouteAuthOptions\n): RouteAuthOptions | undefined {\n if (override) {\n return override;\n }\n\n const renderContext = getActiveRenderContext();\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\nexport function getDefaultRouteAuthOptions(): RouteAuthOptions | undefined {\n return defaultRouteAuthOptions;\n}\n\nexport function setDefaultRouteAuthOptions(\n auth: RouteAuthOptions | undefined\n): void {\n defaultRouteAuthOptions = auth;\n}\n\nexport function getCurrentRegistrationSession(): RegistrationSession {\n return (\n registrationSessionStack[registrationSessionStack.length - 1] ?? {\n authConfigured: !!defaultRouteAuthOptions?.resolve,\n }\n );\n}\n\nexport function getCurrentAccessScopeState(): AccessScopeState {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.state ?? {\n guestOnly: false,\n authenticated: false,\n }\n );\n}\n\nexport function 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\nexport function 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\nexport function hasActivePageScope(): boolean {\n return registrationScopeStack.some((scope) => !!scope.page);\n}\n\nexport function 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\nexport function getCurrentScopeKind(): RegistrationScope['kind'] | null {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.kind ?? null\n );\n}\n\nexport function getCurrentPathPrefix(): string {\n return (\n registrationScopeStack[registrationScopeStack.length - 1]?.pathPrefix ?? ''\n );\n}\n\nexport function 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\nexport function 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\nexport function pushRegistrationSession(\n session: RegistrationSession,\n fn: RouteDefinition\n): void {\n registrationSessionStack.push(session);\n try {\n fn();\n } finally {\n registrationSessionStack.pop();\n }\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\nexport function assertRouteRegistrationUnlocked(): void {\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\nexport function getRoutes(): Route[] {\n return [...routes];\n}\n\nexport function hasRegisteredRoutes(): boolean {\n return routes.length > 0 || records.length > 0;\n}\n\nexport function getNamespaceRoutes(namespace: string): Route[] {\n return routes.filter((route) => route.namespace === namespace);\n}\n\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 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\nexport function getLoadedNamespaces(): string[] {\n return Array.from(namespaces);\n}\n\nexport function clearRouteState(): 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}\n\nexport function snapshotRouteState(): RouteStateSnapshot {\n return {\n routes: [...routes],\n records: [...records],\n namespaces: [...namespaces],\n registrationLocked,\n defaultRouteAuthOptions,\n activeClientRouteAuthOptions,\n routesByDepth: [...routesByDepth.entries()].map(([depth, depthRoutes]) => [\n depth,\n [...depthRoutes],\n ]),\n registrationScopeStack: [...registrationScopeStack],\n registrationSessionStack: [...registrationSessionStack],\n };\n}\n\nexport function restoreRouteState(snapshot: RouteStateSnapshot): void {\n routes.length = 0;\n routes.push(...snapshot.routes);\n\n records.length = 0;\n records.push(...snapshot.records);\n\n namespaces.clear();\n for (const namespace of snapshot.namespaces) {\n namespaces.add(namespace);\n }\n\n routesByDepth.clear();\n for (const [depth, depthRoutes] of snapshot.routesByDepth) {\n routesByDepth.set(depth, [...depthRoutes]);\n }\n\n registrationScopeStack.length = 0;\n registrationScopeStack.push(...snapshot.registrationScopeStack);\n\n registrationSessionStack.length = 0;\n registrationSessionStack.push(...snapshot.registrationSessionStack);\n\n registrationLocked = snapshot.registrationLocked;\n defaultRouteAuthOptions = snapshot.defaultRouteAuthOptions;\n activeClientRouteAuthOptions = snapshot.activeClientRouteAuthOptions;\n}\n"],"mappings":";;AAiBA,MAAM,SAA0B,CAAC;AACjC,MAAM,UAAiC,CAAC;AACxC,MAAM,6BAAa,IAAI,IAAY;AACnC,MAAM,gCAAgB,IAAI,IAAqB;AAE/C,MAAM,yBAA8C,CAAC;AACrD,MAAM,2BAAkD,CAAC;AAEzD,IAAI,qBAAqB;AACzB,IAAI;AACJ,IAAI;AAcJ,SAAS,SAAS,MAAsB;CACtC,MAAM,aACJ,KAAK,SAAS,GAAG,KAAK,SAAS,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI;CAC3D,OAAO,eAAe,MAAM,IAAI,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;AACxE;AAEA,SAAgB,kBAAkD;CAChE,OAAO;AACT;AAEA,SAAgB,mBAAmB,WAAsC;CACvE,OAAO,cAAc;AACvB;AAEA,SAAgB,mBAAmB,QAAmC;CACpE,IAAI,KAAK;CACT,IAAI,KAAK,QAAQ;CACjB,OAAO,KAAK,IAAI;EACd,MAAM,MAAO,KAAK,OAAQ;EAC1B,IAAI,QAAQ,IAAI,CAAC,QAAQ,OAAO,MAAM,KAAK,MAAM;OAC5C,KAAK;CACZ;CACA,QAAQ,OAAO,IAAI,GAAG,MAAM;AAC9B;AAEA,SAAgB,iBAAiB,UAA+B;CAC9D,OAAO,KAAK,QAAQ;CAEpB,MAAM,QAAQ,SAAS,SAAS,IAAI;CACpC,IAAI,cAAc,cAAc,IAAI,KAAK;CACzC,IAAI,CAAC,aAAa;EAChB,cAAc,CAAC;EACf,cAAc,IAAI,OAAO,WAAW;CACtC;CACA,YAAY,KAAK,QAAQ;CAEzB,IAAI,SAAS,WACX,WAAW,IAAI,SAAS,SAAS;AAErC;AAEA,SAAgB,kBAAoC;CAElD,OADsB,uBACf,CAAA,EAAe,UAAU;AAClC;AAEA,SAAgB,0BACd,UAC8B;CAC9B,IAAI,UACF,OAAO;CAIT,OADsB,uBAEpB,CAAA,EAAe,aACf,gCACA;AAEJ;AAEA,SAAgB,2BACd,MACM;CACN,+BAA+B;AACjC;AAEA,SAAgB,6BAA2D;CACzE,OAAO;AACT;AAEA,SAAgB,2BACd,MACM;CACN,0BAA0B;AAC5B;AAEA,SAAgB,gCAAqD;CACnE,OACE,yBAAyB,yBAAyB,SAAS,MAAM,EAC/D,gBAAgB,CAAC,CAAC,yBAAyB,QAC7C;AAEJ;AAEA,SAAgB,6BAA+C;CAC7D,OACE,uBAAuB,uBAAuB,SAAS,EAAE,EAAE,SAAS;EAClE,WAAW;EACX,eAAe;CACjB;AAEJ;AAEA,SAAgB,wBAA6C;CAC3D,MAAM,cAAmC,CAAC;CAE1C,KAAK,MAAM,SAAS,wBAClB,IAAI,MAAM,QACR,YAAY,KAAK,EAAE,WAAW,MAAM,OAAO,CAAC;CAIhD,OAAO;AACT;AAEA,SAAgB,sBAAyC;CACvD,MAAM,YAA+B,CAAC;CAEtC,KAAK,MAAM,SAAS,wBAClB,IAAI,MAAM,MACR,UAAU,KAAK,EAAE,WAAW,MAAM,KAAK,CAAC;CAI5C,OAAO;AACT;AAEA,SAAgB,qBAA8B;CAC5C,OAAO,uBAAuB,MAAM,UAAU,CAAC,CAAC,MAAM,IAAI;AAC5D;AAEA,SAAgB,sBAAgD;CAC9D,KAAK,IAAI,QAAQ,uBAAuB,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;EAC1E,MAAM,QAAQ,uBAAuB;EACrC,IAAI,MAAM,SAAS,QACjB,OAAO;CAEX;CAEA,OAAO;AACT;AAEA,SAAgB,sBAAwD;CACtE,OACE,uBAAuB,uBAAuB,SAAS,EAAE,EAAE,QAAQ;AAEvE;AAEA,SAAgB,uBAA+B;CAC7C,OACE,uBAAuB,uBAAuB,SAAS,EAAE,EAAE,cAAc;AAE7E;AAEA,SAAgB,8BAA6C;CAC3D,MAAM,WAA0B,CAAC;CAEjC,KAAK,MAAM,SAAS,wBAClB,IAAI,MAAM,SAAS,SAAS,GAC1B,SAAS,KAAK,GAAG,MAAM,QAAQ;CAInC,OAAO;AACT;AAEA,SAAgB,sBACd,OACA,IACM;CACN,uBAAuB,KAAK,KAAK;CACjC,IAAI;EACF,GAAG;CACL,UAAU;EACR,uBAAuB,IAAI;CAC7B;AACF;AAEA,SAAgB,wBACd,SACA,IACM;CACN,yBAAyB,KAAK,OAAO;CACrC,IAAI;EACF,GAAG;CACL,UAAU;EACR,yBAAyB,IAAI;CAC/B;AACF;AAEA,SAAgB,wBAA8B;CAC5C,qBAAqB;AACvB;AAUA,SAAgB,kCAAwC;CACtD,IAAI,oBACF,MAAM,IAAI,MACR,4HAEF;AAEJ;AAEA,SAAgB,YAAqB;CACnC,OAAO,CAAC,GAAG,MAAM;AACnB;AAEA,SAAgB,sBAA+B;CAC7C,OAAO,OAAO,SAAS,KAAK,QAAQ,SAAS;AAC/C;AAqCA,SAAgB,kBAAwB;CACtC,OAAO,SAAS;CAChB,QAAQ,SAAS;CACjB,WAAW,MAAM;CACjB,cAAc,MAAM;CACpB,uBAAuB,SAAS;CAChC,yBAAyB,SAAS;CAClC,qBAAqB;CACrB,0BAA0B;CAC1B,+BAA+B;AACjC;AAEA,SAAgB,qBAAyC;CACvD,OAAO;EACL,QAAQ,CAAC,GAAG,MAAM;EAClB,SAAS,CAAC,GAAG,OAAO;EACpB,YAAY,CAAC,GAAG,UAAU;EAC1B;EACA;EACA;EACA,eAAe,CAAC,GAAG,cAAc,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CACxE,OACA,CAAC,GAAG,WAAW,CACjB,CAAC;EACD,wBAAwB,CAAC,GAAG,sBAAsB;EAClD,0BAA0B,CAAC,GAAG,wBAAwB;CACxD;AACF;AAEA,SAAgB,kBAAkB,UAAoC;CACpE,OAAO,SAAS;CAChB,OAAO,KAAK,GAAG,SAAS,MAAM;CAE9B,QAAQ,SAAS;CACjB,QAAQ,KAAK,GAAG,SAAS,OAAO;CAEhC,WAAW,MAAM;CACjB,KAAK,MAAM,aAAa,SAAS,YAC/B,WAAW,IAAI,SAAS;CAG1B,cAAc,MAAM;CACpB,KAAK,MAAM,CAAC,OAAO,gBAAgB,SAAS,eAC1C,cAAc,IAAI,OAAO,CAAC,GAAG,WAAW,CAAC;CAG3C,uBAAuB,SAAS;CAChC,uBAAuB,KAAK,GAAG,SAAS,sBAAsB;CAE9D,yBAAyB,SAAS;CAClC,yBAAyB,KAAK,GAAG,SAAS,wBAAwB;CAElE,qBAAqB,SAAS;CAC9B,0BAA0B,SAAS;CACnC,+BAA+B,SAAS;AAC1C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"access.js","names":[],"sources":["../../src/runtime/access.ts"],"sourcesContent":["import type { ReadableSource } from './readable';\nimport {\n getDefaultRuntime,\n type AskrRuntime,\n type RuntimeRendererHost,\n} from './runtime';\nimport type { Scheduler, SchedulerLane } from './scheduler';\n\ntype RuntimeTask = () => void;\n\nexport function getRuntimeScheduler(): Scheduler {\n return getDefaultRuntime().scheduler;\n}\n\nexport function getDefaultRuntimeInstance(): AskrRuntime {\n return getDefaultRuntime();\n}\n\nexport function getRuntimeRenderer(): RuntimeRendererHost {\n return getDefaultRuntime().renderer;\n}\n\nexport function enqueueRuntimeTask(task: RuntimeTask): void {\n getRuntimeScheduler().enqueue(task);\n}\n\nexport function enqueueRuntimeLane(\n lane: SchedulerLane,\n task: RuntimeTask\n): void {\n getRuntimeScheduler().enqueueInLane(lane, task);\n}\n\nexport function runRuntimeHandlerScope<T>(\n fn: () => T,\n flushMode: 'defer' | 'sync' = 'defer'\n): T {\n return getRuntimeScheduler().runInHandlerScope(fn, flushMode);\n}\n\nexport function runRuntimeWithSyncProgress<T>(fn: () => T): T {\n return getRuntimeScheduler().runWithSyncProgress(fn);\n}\n\nexport function getRuntimeSchedulerState(): ReturnType<Scheduler['getState']> {\n return getRuntimeScheduler().getState();\n}\n\nexport function isRuntimeSchedulerExecuting(): boolean {\n return getRuntimeScheduler().isExecuting();\n}\n\nexport function getRuntimeFlushVersion(): number {\n return getRuntimeScheduler().getFlushVersion();\n}\n\nexport function flushRuntimeScheduler(): void {\n getRuntimeScheduler().flush();\n}\n\nexport function setRuntimeBulkCommitProbe(probe: () => boolean): void {\n getRuntimeScheduler().setBulkCommitProbe(probe);\n}\n\nexport function markRuntimeReactivePropsDirtySource(\n source: ReadableSource<unknown>\n): void {\n getRuntimeRenderer().markReactivePropsDirtySource(source);\n}\n"],"mappings":";;AAUA,SAAgB,sBAAiC;CAC/C,OAAO,kBAAkB,CAAC,CAAC;AAC7B;AAEA,SAAgB,4BAAyC;CACvD,OAAO,kBAAkB;AAC3B;AAEA,SAAgB,qBAA0C;CACxD,OAAO,kBAAkB,CAAC,CAAC;AAC7B;AAEA,SAAgB,mBAAmB,MAAyB;CAC1D,oBAAoB,CAAC,CAAC,QAAQ,IAAI;AACpC;AAEA,SAAgB,mBACd,MACA,MACM;CACN,oBAAoB,CAAC,CAAC,cAAc,MAAM,IAAI;AAChD;AAEA,SAAgB,uBACd,IACA,YAA8B,SAC3B;CACH,OAAO,oBAAoB,CAAC,CAAC,kBAAkB,IAAI,SAAS;AAC9D;AAEA,SAAgB,2BAA8B,IAAgB;CAC5D,OAAO,oBAAoB,CAAC,CAAC,oBAAoB,EAAE;AACrD;AAEA,SAAgB,2BAA8D;CAC5E,OAAO,oBAAoB,CAAC,CAAC,SAAS;AACxC;AAEA,SAAgB,8BAAuC;CACrD,OAAO,oBAAoB,CAAC,CAAC,YAAY;AAC3C;AAEA,SAAgB,yBAAiC;CAC/C,OAAO,oBAAoB,CAAC,CAAC,gBAAgB;AAC/C;AAEA,SAAgB,wBAA8B;CAC5C,oBAAoB,CAAC,CAAC,MAAM;AAC9B;AAEA,SAAgB,0BAA0B,OAA4B;CACpE,oBAAoB,CAAC,CAAC,mBAAmB,KAAK;AAChD;AAEA,SAAgB,oCACd,QACM;CACN,mBAAmB,CAAC,CAAC,6BAA6B,MAAM;AAC1D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"child-scope.d.ts","names":[],"sources":["../../src/runtime/child-scope.ts"],"mappings":";;;;UAciB,UAAA;EACf,GAAA;EACA,iBAAA,EAAmB,iBAAA;EACnB,aAAA,EAAe,KAAA;EACf,KAAA,EAAO,KAAA;EACP,GAAA,GAAM,IAAA;EACN,cAAA;EACA,gBAAA;EACA,MAAA,CAAO,QAAA,QAAgB,KAAA,GAAQ,KAAA;EAC/B,SAAA;EACA,OAAA;AAAA;AAAA,iBAiEc,kBAAA,CAAmB,KAAA,EAAO,UAAA,GAAa,KAAK;AAAA,iBAI5C,iBAAA,CAAkB,KAAiB,EAAV,UAAU;AAAA,iBAInC,gBAAA,CACd,MAAA,EAAQ,iBAAA,SACR,GAAA,mBACA,OAAA,gBACC,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"child-scope.js","names":[],"sources":["../../src/runtime/child-scope.ts"],"sourcesContent":["import type { VNode } from '../common/vnode';\nimport { _isDOMElement } from '../common/vnode';\nimport {\n cleanupComponent,\n createComponentInstance,\n finalizeReadSubscriptions,\n getCurrentStateIndex,\n registerOwnedChildScope,\n renderScopedComponent,\n unregisterOwnedChildScope,\n type ComponentInstance,\n} from './component';\nimport { isDevelopmentEnvironment } from '../common/env';\n\nexport interface ChildScope {\n key: string | number;\n componentInstance: ComponentInstance;\n previousVnode: VNode | undefined;\n vnode: VNode | undefined;\n dom?: Node;\n needsDomUpdate: boolean;\n hydrationPending: boolean;\n render(renderFn: () => VNode): VNode;\n markDirty(): void;\n dispose(): void;\n}\n\ninterface MutableChildScope extends ChildScope {\n _startStateIndex: number;\n _renderFn?: (() => VNode) | undefined;\n _onDirty?: (() => void) | undefined;\n _parent?: ComponentInstance | null;\n _disposed: boolean;\n}\n\nfunction renderScope(scope: MutableChildScope): VNode | undefined {\n if (scope._disposed) {\n if (isDevelopmentEnvironment()) {\n throw new Error(\n `[askr] Attempted to render disposed child scope ${String(scope.key)}.`\n );\n }\n return scope.vnode;\n }\n\n if (!scope._renderFn) {\n return scope.vnode;\n }\n\n const { componentInstance } = scope;\n const previousVNode = scope.vnode;\n\n try {\n const nextVNode = renderScopedComponent(\n componentInstance,\n scope._startStateIndex,\n scope._renderFn\n );\n if (\n previousVNode &&\n nextVNode &&\n _isDOMElement(previousVNode) &&\n _isDOMElement(nextVNode) &&\n typeof previousVNode.type === 'function' &&\n previousVNode.type === nextVNode.type &&\n '__instance' in previousVNode &&\n !('__instance' in nextVNode)\n ) {\n (\n nextVNode as VNode & {\n __instance?: ComponentInstance;\n }\n ).__instance = (\n previousVNode as VNode & {\n __instance?: ComponentInstance;\n }\n ).__instance;\n }\n scope.previousVnode = previousVNode;\n scope.vnode = nextVNode;\n scope.markDirty();\n finalizeReadSubscriptions(componentInstance);\n return scope.vnode;\n } catch (error) {\n componentInstance.hasPendingUpdate = false;\n throw error;\n }\n}\n\nexport function rerenderChildScope(scope: ChildScope): VNode | undefined {\n return renderScope(scope as MutableChildScope);\n}\n\nexport function disposeChildScope(scope: ChildScope): void {\n scope.dispose();\n}\n\nexport function createChildScope(\n parent: ComponentInstance | null,\n key: string | number,\n onDirty?: () => void\n): ChildScope {\n const scope = {} as MutableChildScope;\n\n const componentInstance = createComponentInstance(\n `child-scope-${String(key)}`,\n () => scope._renderFn?.() ?? null,\n {},\n null\n );\n\n if (parent) {\n componentInstance.parentInstance = parent;\n componentInstance.ownerFrame = parent.ownerFrame;\n componentInstance.portalScope = parent.portalScope;\n }\n\n scope.key = key;\n scope.componentInstance = componentInstance;\n scope.previousVnode = undefined;\n scope.vnode = undefined;\n scope.dom = undefined;\n scope.needsDomUpdate = true;\n scope.hydrationPending = true;\n scope._startStateIndex = getCurrentStateIndex();\n scope._renderFn = undefined;\n scope._onDirty = onDirty;\n scope._parent = parent;\n scope._disposed = false;\n scope.markDirty = () => {\n scope.needsDomUpdate = true;\n };\n scope.render = (renderFn: () => VNode) => {\n scope._renderFn = renderFn;\n return renderScope(scope) as VNode;\n };\n scope.dispose = () => {\n if (scope._disposed) {\n return;\n }\n scope._disposed = true;\n if (scope._parent) {\n unregisterOwnedChildScope(scope._parent, scope);\n }\n cleanupComponent(componentInstance);\n scope._renderFn = undefined;\n scope.previousVnode = undefined;\n scope.vnode = undefined;\n scope.dom = undefined;\n scope.needsDomUpdate = false;\n scope.hydrationPending = false;\n componentInstance.hasPendingUpdate = false;\n };\n\n componentInstance._pendingFlushTask = () => {\n componentInstance.hasPendingUpdate = false;\n if (componentInstance.notifyUpdate === null || scope._disposed) {\n return;\n }\n renderScope(scope);\n scope._onDirty?.();\n };\n\n if (parent) {\n registerOwnedChildScope(parent, scope);\n }\n\n return scope;\n}\n"],"mappings":";;;;;;;AAmCA,SAAS,YAAY,OAA6C;CAChE,IAAI,MAAM,WAAW;EACnB,IAAI,yBAAyB,GAC3B,MAAM,IAAI,MACR,mDAAmD,OAAO,MAAM,GAAG,EAAE,EACvE;EAEF,OAAO,MAAM;CACf;CAEA,IAAI,CAAC,MAAM,WACT,OAAO,MAAM;CAGf,MAAM,EAAE,sBAAsB;CAC9B,MAAM,gBAAgB,MAAM;CAE5B,IAAI;EACF,MAAM,YAAY,sBAChB,mBACA,MAAM,kBACN,MAAM,SACR;EACA,IACE,iBACA,aACA,cAAc,aAAa,KAC3B,cAAc,SAAS,KACvB,OAAO,cAAc,SAAS,cAC9B,cAAc,SAAS,UAAU,QACjC,gBAAgB,iBAChB,EAAE,gBAAgB,YAElB,UAIE,aACA,cAGA;EAEJ,MAAM,gBAAgB;EACtB,MAAM,QAAQ;EACd,MAAM,UAAU;EAChB,0BAA0B,iBAAiB;EAC3C,OAAO,MAAM;CACf,SAAS,OAAO;EACd,kBAAkB,mBAAmB;EACrC,MAAM;CACR;AACF;AAEA,SAAgB,mBAAmB,OAAsC;CACvE,OAAO,YAAY,KAA0B;AAC/C;AAEA,SAAgB,kBAAkB,OAAyB;CACzD,MAAM,QAAQ;AAChB;AAEA,SAAgB,iBACd,QACA,KACA,SACY;CACZ,MAAM,QAAQ,CAAC;CAEf,MAAM,oBAAoB,wBACxB,eAAe,OAAO,GAAG,WACnB,MAAM,YAAY,KAAK,MAC7B,CAAC,GACD,IACF;CAEA,IAAI,QAAQ;EACV,kBAAkB,iBAAiB;EACnC,kBAAkB,aAAa,OAAO;EACtC,kBAAkB,cAAc,OAAO;CACzC;CAEA,MAAM,MAAM;CACZ,MAAM,oBAAoB;CAC1B,MAAM,gBAAgB;CACtB,MAAM,QAAQ;CACd,MAAM,MAAM;CACZ,MAAM,iBAAiB;CACvB,MAAM,mBAAmB;CACzB,MAAM,mBAAmB,qBAAqB;CAC9C,MAAM,YAAY;CAClB,MAAM,WAAW;CACjB,MAAM,UAAU;CAChB,MAAM,YAAY;CAClB,MAAM,kBAAkB;EACtB,MAAM,iBAAiB;CACzB;CACA,MAAM,UAAU,aAA0B;EACxC,MAAM,YAAY;EAClB,OAAO,YAAY,KAAK;CAC1B;CACA,MAAM,gBAAgB;EACpB,IAAI,MAAM,WACR;EAEF,MAAM,YAAY;EAClB,IAAI,MAAM,SACR,0BAA0B,MAAM,SAAS,KAAK;EAEhD,iBAAiB,iBAAiB;EAClC,MAAM,YAAY;EAClB,MAAM,gBAAgB;EACtB,MAAM,QAAQ;EACd,MAAM,MAAM;EACZ,MAAM,iBAAiB;EACvB,MAAM,mBAAmB;EACzB,kBAAkB,mBAAmB;CACvC;CAEA,kBAAkB,0BAA0B;EAC1C,kBAAkB,mBAAmB;EACrC,IAAI,kBAAkB,iBAAiB,QAAQ,MAAM,WACnD;EAEF,YAAY,KAAK;EACjB,MAAM,WAAW;CACnB;CAEA,IAAI,QACF,wBAAwB,QAAQ,KAAK;CAGvC,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-cleanup.d.ts","names":[],"sources":["../../src/runtime/component-cleanup.ts"],"mappings":";;;KAaY,eAAA;EACV,GAAA;EACA,OAAO;AAAA;AAMT;;;AAAA,iBAAgB,gBAAA,CAAiB,QAA2B,EAAjB,iBAAiB;AAAA,iBA0E5C,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-cleanup.js","names":[],"sources":["../../src/runtime/component-cleanup.ts"],"sourcesContent":["/**\n * Component cleanup and owned child-scope bookkeeping.\n */\n\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { logger } from '../dev/logger';\nimport type { ComponentInstance } from './component-internal';\nimport {\n clearCurrentComponentScope,\n restoreCurrentComponentScope,\n} from './component-scope';\nimport { cleanupReadableSubscriptions } from './readable';\n\nexport type OwnedChildScope = {\n key: string | number;\n dispose(): void;\n};\n\n/**\n * Clean up component resources on unmount or route changes.\n */\nexport function cleanupComponent(instance: ComponentInstance): void {\n const savedScope = clearCurrentComponentScope();\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 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 try {\n cleanupReadableSubscriptions(instance);\n } catch (err) {\n recordCleanupError('[Askr] readable subscription cleanup threw:', err);\n }\n\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 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 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 restoreCurrentComponentScope(savedScope);\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"],"mappings":";;;;;;;;;;;AAqBA,SAAgB,iBAAiB,UAAmC;CAClE,MAAM,aAAa,2BAA2B;CAE9C,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;EAEA,MAAM,aAAa,SAAS;EAC5B,SAAS,aAAa,CAAC;EACvB,KAAK,MAAM,WAAW,YACpB,IAAI;GACF,QAAQ;EACV,SAAS,KAAK;GACZ,mBAAmB,kCAAkC,GAAG;EAC1D;EAGF,IAAI;GACF,6BAA6B,QAAQ;EACvC,SAAS,KAAK;GACZ,mBAAmB,+CAA+C,GAAG;EACvE;EAEA,IAAI;GACF,IACE,SAAS,mBACT,CAAC,SAAS,gBAAgB,OAAO,SAEjC,SAAS,gBAAgB,MAAM;EAEnC,SAAS,KAAK;GACZ,mBAAmB,0CAA0C,GAAG;EAClE;EACA,SAAS,kBAAkB;EAE3B,SAAS;EACT,SAAS;EACT,SAAS,kBAAkB,CAAC;EAC5B,SAAS,mBAAmB,CAAC;EAC7B,SAAS,iBAAiB,CAAC;EAC3B,SAAS,mBAAmB;EAC5B,SAAS,eAAe;EACxB,SAAS,eAAe;EACxB,SAAS,UAAU;EAEnB,IAAI,cAAc,SAAS,GACzB,MAAM,IAAI,eACR,eACA,gCAAgC,SAAS,IAC3C;CAEJ,UAAU;EACR,6BAA6B,UAAU;CACzC;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"}