@askrjs/askr 0.0.52 → 0.0.54

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 (386) hide show
  1. package/README.md +5 -1
  2. package/dist/{runtime/scheduler.js → access-Bg4RJNC8.js} +182 -9
  3. package/dist/actions/index.d.ts +2 -0
  4. package/dist/actions/index.js +103 -0
  5. package/dist/{common/attr-names.js → attr-names-CjhzmHOn.js} +1 -1
  6. package/dist/benchmark.d.ts +6 -2
  7. package/dist/benchmark.js +63 -11
  8. package/dist/boot/index.d.ts +61 -2
  9. package/dist/boot/index.js +1 -203
  10. package/dist/boot-2ZR3MtO0.js +647 -0
  11. package/dist/cleanup-DScKZG2i.js +487 -0
  12. package/dist/component-internal-D9PLuFUc.js +614 -0
  13. package/dist/component-lifecycle-C7lnU9Bt.js +359 -0
  14. package/dist/{runtime/component-scope.js → component-scope-CC3cojX9.js} +8 -1
  15. package/dist/component-scope-CvPba6O6.d.ts +12 -0
  16. package/dist/components/index.d.ts +17 -2
  17. package/dist/components/index.js +39 -1
  18. package/dist/compose-ref-Cc_YkUpM.js +92 -0
  19. package/dist/{foundations/utilities/compose-ref.d.ts → compose-ref-Cizq72-x.d.ts} +1 -1
  20. package/dist/control/index.d.ts +1 -3
  21. package/dist/control/index.js +1 -3
  22. package/dist/control-BI4RMD2z.d.ts +437 -0
  23. package/dist/control-Bf4Wkdvv.d.ts +9 -0
  24. package/dist/{common/control.js → control-DhFRTIoE.js} +1 -1
  25. package/dist/control-mXROCjL3.js +165 -0
  26. package/dist/data/index.d.ts +2 -6
  27. package/dist/data/index.js +4 -5
  28. package/dist/data-B9dauyDn.js +559 -0
  29. package/dist/{data/data-runtime.js → data-runtime-SJ1BSUvk.js} +32 -31
  30. package/dist/deferred-DklLG4qM.js +386 -0
  31. package/dist/{runtime/effect.js → effect-BwnIvLah.js} +4 -4
  32. package/dist/fastlane-Dw8SOBr9.js +343 -0
  33. package/dist/for-internal-CSz8Unkq.js +1563 -0
  34. package/dist/foundations/icon/index.d.ts +68 -2
  35. package/dist/foundations/icon/index.js +85 -1
  36. package/dist/foundations/index.d.ts +2 -5
  37. package/dist/foundations/index.js +2 -5
  38. package/dist/foundations/interactions/index.d.ts +264 -6
  39. package/dist/foundations/interactions/index.js +1 -6
  40. package/dist/foundations/state/index.d.ts +32 -1
  41. package/dist/foundations/state/index.js +78 -1
  42. package/dist/foundations/structures/index.d.ts +2 -7
  43. package/dist/foundations/structures/index.js +2 -7
  44. package/dist/foundations/utilities/index.d.ts +2 -6
  45. package/dist/foundations/utilities/index.js +2 -5
  46. package/dist/fx/index.d.ts +190 -3
  47. package/dist/fx/index.js +454 -4
  48. package/dist/index-B1LNotpU.d.ts +239 -0
  49. package/dist/index-Bki2rqcr.d.ts +233 -0
  50. package/dist/index-BnU0NPwM.d.ts +101 -0
  51. package/dist/index-C8iW3xCt.d.ts +44 -0
  52. package/dist/index-DwxdIA-t.d.ts +48 -0
  53. package/dist/{runtime/runtime.d.ts → index-Zb31mCiU.d.ts} +31 -8
  54. package/dist/index.d.ts +8 -13
  55. package/dist/index.js +150 -15
  56. package/dist/interactions-w7gQN4ha.js +280 -0
  57. package/dist/{data/invalidation-listeners.js → invalidation-listeners-Des3AHYs.js} +1 -1
  58. package/dist/{common/props.d.ts → jsx-CP0gmYwJ.d.ts} +17 -5
  59. package/dist/{common/jsx.js → jsx-CUpRxrLH.js} +1 -1
  60. package/dist/jsx-dev-runtime.d.ts +2 -4
  61. package/dist/jsx-dev-runtime.js +7 -5
  62. package/dist/jsx-runtime-92bV2hSa.d.ts +34 -0
  63. package/dist/jsx-runtime-BVVgDSdq.d.ts +1 -0
  64. package/dist/jsx-runtime.d.ts +2 -35
  65. package/dist/jsx-runtime.js +11 -5
  66. package/dist/{runtime/lifecycle-operations.js → lifecycle-operations-CdRjdsHo.js} +4 -5
  67. package/dist/navigate-BVDCzOuB.d.ts +34 -0
  68. package/dist/navigate-D17eVQyI.js +1449 -0
  69. package/dist/{runtime/portal.js → portal-C47xkwXj.js} +71 -41
  70. package/dist/query-registry-CQIT4mXr.js +73 -0
  71. package/dist/{common/render-context.js → render-context-Clw3rFiO.js} +14 -6
  72. package/dist/renderer-DrLRAD5y.js +6266 -0
  73. package/dist/{runtime/resource-operation.js → resource-operation-BNY29MVH.js} +118 -15
  74. package/dist/resources/index.d.ts +42 -3
  75. package/dist/resources/index.js +3 -4
  76. package/dist/{common/route-activity.js → route-activity-CNJfpwx-.js} +1 -1
  77. package/dist/route-matching-vJpvLVbX.js +515 -0
  78. package/dist/router/index.d.ts +166 -14
  79. package/dist/router/index.js +150 -12
  80. package/dist/{common/router.d.ts → router-DCfwLBr-.d.ts} +72 -28
  81. package/dist/{common/router-internal.js → router-internal-BC0w1_xk.js} +1 -1
  82. package/dist/{runtime/scheduler.d.ts → scheduler-CmLO4Dfm.d.ts} +1 -3
  83. package/dist/{runtime/selector.js → selector-DafVYzV4.js} +34 -11
  84. package/dist/{runtime/snapshot-source.js → snapshot-source-BB42xgwb.js} +1 -1
  85. package/dist/ssg/index.d.ts +252 -4
  86. package/dist/ssg/index.js +857 -1
  87. package/dist/ssr/index.d.ts +225 -8
  88. package/dist/ssr/index.js +3 -6
  89. package/dist/{common/ssr.js → ssr-CbQO5xd3.js} +1 -1
  90. package/dist/ssr-DEARZxJ5.js +1413 -0
  91. package/dist/{runtime/state.js → state-DPl8lffD.js} +3 -5
  92. package/dist/structures-DUB3HchX.js +221 -0
  93. package/dist/testing/index.d.ts +3 -2
  94. package/dist/testing/index.js +2 -5
  95. package/dist/{jsx/types.d.ts → types-DnQVG4ZY.d.ts} +2 -5
  96. package/dist/{foundations/utilities/use-id.js → utilities-C_CGX4Dz.js} +1 -1
  97. package/dist/{ssr/verify-hydration.js → verify-hydration-BWwu-mWu.js} +2 -2
  98. package/dist/{common/vnode.js → vnode-CGMJYPMB.js} +2 -2
  99. package/package.json +12 -7
  100. package/dist/bench/components/benchmark-row.d.ts +0 -20
  101. package/dist/bench/components/benchmark-row.js +0 -40
  102. package/dist/bench/components/benchmark-table.js +0 -23
  103. package/dist/bin/askr-ssg.d.ts +0 -27
  104. package/dist/bin/askr-ssg.js +0 -186
  105. package/dist/boot/hydration.js +0 -139
  106. package/dist/boot/root-lifecycle.d.ts +0 -18
  107. package/dist/boot/root-lifecycle.js +0 -209
  108. package/dist/boot/route-startup.js +0 -54
  109. package/dist/boot/types.d.ts +0 -61
  110. package/dist/common/component.d.ts +0 -18
  111. package/dist/common/control.d.ts +0 -12
  112. package/dist/common/dom-range.d.ts +0 -13
  113. package/dist/common/env.js +0 -41
  114. package/dist/common/error-boundary.d.ts +0 -15
  115. package/dist/common/invariant.js +0 -15
  116. package/dist/common/jsx.d.ts +0 -22
  117. package/dist/common/logger.js +0 -34
  118. package/dist/common/promise.js +0 -6
  119. package/dist/common/ssr-errors.d.ts +0 -10
  120. package/dist/common/ssr-errors.js +0 -14
  121. package/dist/common/ssr.d.ts +0 -41
  122. package/dist/common/vnode.d.ts +0 -21
  123. package/dist/components/error-boundary.d.ts +0 -14
  124. package/dist/components/error-boundary.js +0 -41
  125. package/dist/components/link.d.ts +0 -68
  126. package/dist/components/link.js +0 -74
  127. package/dist/control/case.d.ts +0 -18
  128. package/dist/control/case.js +0 -68
  129. package/dist/control/for.d.ts +0 -23
  130. package/dist/control/for.js +0 -61
  131. package/dist/control/shared.d.ts +0 -8
  132. package/dist/control/shared.js +0 -18
  133. package/dist/control/show.d.ts +0 -14
  134. package/dist/control/show.js +0 -32
  135. package/dist/data/data-runtime.d.ts +0 -27
  136. package/dist/data/invalidation.d.ts +0 -8
  137. package/dist/data/invalidation.js +0 -25
  138. package/dist/data/mutation-cell.d.ts +0 -27
  139. package/dist/data/mutation-cell.js +0 -133
  140. package/dist/data/query-cell.d.ts +0 -47
  141. package/dist/data/query-cell.js +0 -324
  142. package/dist/data/query-key.js +0 -40
  143. package/dist/data/shared.js +0 -20
  144. package/dist/data/testing.js +0 -2
  145. package/dist/data/types.d.ts +0 -160
  146. package/dist/foundations/icon/icon.d.ts +0 -52
  147. package/dist/foundations/icon/icon.js +0 -86
  148. package/dist/foundations/icon/icon.types.d.ts +0 -21
  149. package/dist/foundations/interactions/dismissable.d.ts +0 -71
  150. package/dist/foundations/interactions/dismissable.js +0 -24
  151. package/dist/foundations/interactions/focusable.d.ts +0 -21
  152. package/dist/foundations/interactions/focusable.js +0 -16
  153. package/dist/foundations/interactions/hoverable.d.ts +0 -25
  154. package/dist/foundations/interactions/hoverable.js +0 -13
  155. package/dist/foundations/interactions/interaction-policy.d.ts +0 -49
  156. package/dist/foundations/interactions/interaction-policy.js +0 -120
  157. package/dist/foundations/interactions/pressable.d.ts +0 -60
  158. package/dist/foundations/interactions/pressable.js +0 -49
  159. package/dist/foundations/interactions/roving-focus.d.ts +0 -51
  160. package/dist/foundations/interactions/roving-focus.js +0 -69
  161. package/dist/foundations/state/controllable.d.ts +0 -32
  162. package/dist/foundations/state/controllable.js +0 -80
  163. package/dist/foundations/structures/collection.d.ts +0 -51
  164. package/dist/foundations/structures/collection.js +0 -49
  165. package/dist/foundations/structures/layer.d.ts +0 -80
  166. package/dist/foundations/structures/layer.js +0 -79
  167. package/dist/foundations/structures/layout.d.ts +0 -32
  168. package/dist/foundations/structures/layout.js +0 -11
  169. package/dist/foundations/structures/portal.d.ts +0 -2
  170. package/dist/foundations/structures/portal.js +0 -3
  171. package/dist/foundations/structures/presence.d.ts +0 -36
  172. package/dist/foundations/structures/presence.js +0 -37
  173. package/dist/foundations/structures/slot.d.ts +0 -34
  174. package/dist/foundations/structures/slot.js +0 -39
  175. package/dist/foundations/utilities/aria.d.ts +0 -15
  176. package/dist/foundations/utilities/aria.js +0 -15
  177. package/dist/foundations/utilities/compose-handlers.d.ts +0 -36
  178. package/dist/foundations/utilities/compose-handlers.js +0 -18
  179. package/dist/foundations/utilities/compose-ref.js +0 -16
  180. package/dist/foundations/utilities/event-types.d.ts +0 -19
  181. package/dist/foundations/utilities/merge-props.d.ts +0 -4
  182. package/dist/foundations/utilities/merge-props.js +0 -47
  183. package/dist/foundations/utilities/use-id.d.ts +0 -31
  184. package/dist/fx/fx.d.ts +0 -32
  185. package/dist/fx/fx.js +0 -211
  186. package/dist/fx/noop.js +0 -7
  187. package/dist/fx/timing.d.ts +0 -158
  188. package/dist/fx/timing.js +0 -241
  189. package/dist/jsx/index.d.ts +0 -2
  190. package/dist/jsx/index.js +0 -4
  191. package/dist/jsx/types.js +0 -2
  192. package/dist/jsx/utils.d.ts +0 -4
  193. package/dist/jsx/utils.js +0 -17
  194. package/dist/jsx-runtime2.d.ts +0 -3
  195. package/dist/jsx-runtime2.js +0 -4
  196. package/dist/renderer/attributes.js +0 -254
  197. package/dist/renderer/boundaries.js +0 -142
  198. package/dist/renderer/boundary-materialization.js +0 -72
  199. package/dist/renderer/boundary-range-adoption.js +0 -76
  200. package/dist/renderer/boundary-range-sync.js +0 -101
  201. package/dist/renderer/boundary-state.js +0 -50
  202. package/dist/renderer/child-shape.js +0 -83
  203. package/dist/renderer/children-fastpath.js +0 -149
  204. package/dist/renderer/children.js +0 -158
  205. package/dist/renderer/cleanup.js +0 -267
  206. package/dist/renderer/component-host-cleanup.js +0 -143
  207. package/dist/renderer/component-host-instances.js +0 -116
  208. package/dist/renderer/component-host-replacement.js +0 -105
  209. package/dist/renderer/component-host-results.js +0 -138
  210. package/dist/renderer/component-host.js +0 -172
  211. package/dist/renderer/dom-host.js +0 -11
  212. package/dist/renderer/dom-internal.js +0 -243
  213. package/dist/renderer/dom-range.js +0 -161
  214. package/dist/renderer/dom.js +0 -11
  215. package/dist/renderer/element-children.js +0 -359
  216. package/dist/renderer/env.js +0 -2
  217. package/dist/renderer/error-boundary-dom.js +0 -86
  218. package/dist/renderer/evaluate-dom-range.js +0 -84
  219. package/dist/renderer/evaluate-reconcile.js +0 -257
  220. package/dist/renderer/evaluate.js +0 -95
  221. package/dist/renderer/fastpath.js +0 -142
  222. package/dist/renderer/for-commit-dom-map.js +0 -71
  223. package/dist/renderer/for-commit-removal.js +0 -27
  224. package/dist/renderer/for-commit-reorder.js +0 -87
  225. package/dist/renderer/for-commit.js +0 -442
  226. package/dist/renderer/hydration-boundaries.js +0 -60
  227. package/dist/renderer/hydration-listener-transaction.js +0 -49
  228. package/dist/renderer/index.js +0 -39
  229. package/dist/renderer/intrinsic-blueprint-analysis.js +0 -202
  230. package/dist/renderer/intrinsic-blueprint-bindings.js +0 -152
  231. package/dist/renderer/intrinsic-blueprint-materialization.js +0 -100
  232. package/dist/renderer/intrinsic-blueprint.js +0 -30
  233. package/dist/renderer/intrinsic-hydration-adoption.js +0 -66
  234. package/dist/renderer/keyed-children.js +0 -26
  235. package/dist/renderer/keyed.js +0 -167
  236. package/dist/renderer/namespaces.js +0 -21
  237. package/dist/renderer/prop-bindings.js +0 -315
  238. package/dist/renderer/reactive-child-dom.js +0 -139
  239. package/dist/renderer/reactive-child-sources.js +0 -182
  240. package/dist/renderer/reactive-children.js +0 -303
  241. package/dist/renderer/reconcile-commit.js +0 -36
  242. package/dist/renderer/reconcile-fastpaths.js +0 -100
  243. package/dist/renderer/reconcile-resolution.js +0 -163
  244. package/dist/renderer/reconcile.js +0 -37
  245. package/dist/renderer/retained-element-rollback.js +0 -288
  246. package/dist/renderer/stable-patch.js +0 -80
  247. package/dist/renderer/static-reuse.js +0 -94
  248. package/dist/renderer/types.js +0 -2
  249. package/dist/renderer/utils.js +0 -265
  250. package/dist/router/access.js +0 -34
  251. package/dist/router/activity.d.ts +0 -9
  252. package/dist/router/activity.js +0 -85
  253. package/dist/router/authoring.d.ts +0 -21
  254. package/dist/router/authoring.js +0 -196
  255. package/dist/router/internal-types.d.ts +0 -30
  256. package/dist/router/lazy.d.ts +0 -18
  257. package/dist/router/lazy.js +0 -50
  258. package/dist/router/manifest.d.ts +0 -9
  259. package/dist/router/manifest.js +0 -47
  260. package/dist/router/match.js +0 -120
  261. package/dist/router/navigate.d.ts +0 -10
  262. package/dist/router/navigate.js +0 -73
  263. package/dist/router/navigation-registry.d.ts +0 -31
  264. package/dist/router/navigation-registry.js +0 -103
  265. package/dist/router/navigation-scroll.d.ts +0 -13
  266. package/dist/router/navigation-scroll.js +0 -91
  267. package/dist/router/navigation-targets.d.ts +0 -30
  268. package/dist/router/navigation-targets.js +0 -634
  269. package/dist/router/policy.d.ts +0 -27
  270. package/dist/router/policy.js +0 -130
  271. package/dist/router/rendering.d.ts +0 -9
  272. package/dist/router/rendering.js +0 -47
  273. package/dist/router/resolution.d.ts +0 -3
  274. package/dist/router/resolution.js +0 -84
  275. package/dist/router/route-context.js +0 -77
  276. package/dist/router/route-matching.d.ts +0 -19
  277. package/dist/router/route-matching.js +0 -173
  278. package/dist/router/route-query.d.ts +0 -16
  279. package/dist/router/route-query.js +0 -45
  280. package/dist/router/route.d.ts +0 -8
  281. package/dist/router/route.js +0 -10
  282. package/dist/router/store.d.ts +0 -49
  283. package/dist/router/store.js +0 -169
  284. package/dist/router/testing.js +0 -4
  285. package/dist/runtime/access.d.ts +0 -19
  286. package/dist/runtime/access.js +0 -43
  287. package/dist/runtime/child-scope.d.ts +0 -41
  288. package/dist/runtime/child-scope.js +0 -134
  289. package/dist/runtime/component-cleanup.d.ts +0 -15
  290. package/dist/runtime/component-cleanup.js +0 -68
  291. package/dist/runtime/component-commit.js +0 -167
  292. package/dist/runtime/component-facade.d.ts +0 -5
  293. package/dist/runtime/component-facade.js +0 -6
  294. package/dist/runtime/component-internal.d.ts +0 -105
  295. package/dist/runtime/component-internal.js +0 -237
  296. package/dist/runtime/component-lifecycle.d.ts +0 -10
  297. package/dist/runtime/component-lifecycle.js +0 -33
  298. package/dist/runtime/component-scope.d.ts +0 -54
  299. package/dist/runtime/component.d.ts +0 -5
  300. package/dist/runtime/component.js +0 -6
  301. package/dist/runtime/context.d.ts +0 -72
  302. package/dist/runtime/context.js +0 -236
  303. package/dist/runtime/control.d.ts +0 -62
  304. package/dist/runtime/control.js +0 -239
  305. package/dist/runtime/derive.d.ts +0 -16
  306. package/dist/runtime/derive.js +0 -140
  307. package/dist/runtime/dev-namespace.d.ts +0 -30
  308. package/dist/runtime/dev-namespace.js +0 -64
  309. package/dist/runtime/effect.d.ts +0 -35
  310. package/dist/runtime/error-boundary.d.ts +0 -4
  311. package/dist/runtime/error-boundary.js +0 -29
  312. package/dist/runtime/events.d.ts +0 -58
  313. package/dist/runtime/events.js +0 -201
  314. package/dist/runtime/execution-model.d.ts +0 -6
  315. package/dist/runtime/execution-model.js +0 -13
  316. package/dist/runtime/fastlane.d.ts +0 -33
  317. package/dist/runtime/fastlane.js +0 -173
  318. package/dist/runtime/for-bench.d.ts +0 -40
  319. package/dist/runtime/for-bench.js +0 -13
  320. package/dist/runtime/for-internal.d.ts +0 -106
  321. package/dist/runtime/for-internal.js +0 -285
  322. package/dist/runtime/for-reconcile.d.ts +0 -7
  323. package/dist/runtime/for-reconcile.js +0 -442
  324. package/dist/runtime/for-scopes.d.ts +0 -26
  325. package/dist/runtime/for-scopes.js +0 -280
  326. package/dist/runtime/for-signals.d.ts +0 -39
  327. package/dist/runtime/for-signals.js +0 -213
  328. package/dist/runtime/for-types.d.ts +0 -8
  329. package/dist/runtime/for.d.ts +0 -4
  330. package/dist/runtime/for.js +0 -5
  331. package/dist/runtime/index.d.ts +0 -24
  332. package/dist/runtime/index.js +0 -33
  333. package/dist/runtime/lifecycle-batch.d.ts +0 -59
  334. package/dist/runtime/lifecycle-batch.js +0 -178
  335. package/dist/runtime/lifecycle-operation-settlement.d.ts +0 -5
  336. package/dist/runtime/lifecycle-operation-settlement.js +0 -51
  337. package/dist/runtime/lifecycle-operations.d.ts +0 -30
  338. package/dist/runtime/operations.d.ts +0 -3
  339. package/dist/runtime/operations.js +0 -3
  340. package/dist/runtime/perf-metrics.d.ts +0 -27
  341. package/dist/runtime/perf-metrics.js +0 -6
  342. package/dist/runtime/portal.d.ts +0 -21
  343. package/dist/runtime/readable.d.ts +0 -34
  344. package/dist/runtime/readable.js +0 -183
  345. package/dist/runtime/resource-cell.js +0 -112
  346. package/dist/runtime/resource-operation.d.ts +0 -12
  347. package/dist/runtime/runtime.js +0 -57
  348. package/dist/runtime/selector-store.js +0 -22
  349. package/dist/runtime/selector.d.ts +0 -10
  350. package/dist/runtime/snapshot-source.d.ts +0 -9
  351. package/dist/runtime/state.d.ts +0 -54
  352. package/dist/ssg/batch-render.js +0 -101
  353. package/dist/ssg/create-static-gen.d.ts +0 -66
  354. package/dist/ssg/create-static-gen.js +0 -250
  355. package/dist/ssg/generate-metadata.js +0 -92
  356. package/dist/ssg/generation-plan.js +0 -68
  357. package/dist/ssg/incremental-manifest.js +0 -54
  358. package/dist/ssg/resolve-ssg-data.js +0 -103
  359. package/dist/ssg/route-utils.js +0 -22
  360. package/dist/ssg/static-routes.js +0 -100
  361. package/dist/ssg/types.d.ts +0 -188
  362. package/dist/ssg/write-static-files.js +0 -77
  363. package/dist/ssr/attrs.js +0 -92
  364. package/dist/ssr/boundaries.js +0 -124
  365. package/dist/ssr/component-runtime.js +0 -85
  366. package/dist/ssr/context.d.ts +0 -49
  367. package/dist/ssr/context.js +0 -89
  368. package/dist/ssr/errors.d.ts +0 -9
  369. package/dist/ssr/errors.js +0 -12
  370. package/dist/ssr/escape.js +0 -191
  371. package/dist/ssr/hydration-data.js +0 -8
  372. package/dist/ssr/hydration-verify.d.ts +0 -11
  373. package/dist/ssr/hydration-verify.js +0 -171
  374. package/dist/ssr/index-internal.d.ts +0 -14
  375. package/dist/ssr/index-internal.js +0 -17
  376. package/dist/ssr/render-keys.js +0 -14
  377. package/dist/ssr/render-resolved.d.ts +0 -19
  378. package/dist/ssr/render-resolved.js +0 -33
  379. package/dist/ssr/render-sync.d.ts +0 -20
  380. package/dist/ssr/render-sync.js +0 -283
  381. package/dist/ssr/route-policy-resolution.js +0 -76
  382. package/dist/ssr/route-render.d.ts +0 -76
  383. package/dist/ssr/route-render.js +0 -118
  384. package/dist/ssr/sink.d.ts +0 -25
  385. package/dist/ssr/sink.js +0 -84
  386. package/dist/ssr/types.d.ts +0 -22
@@ -1,634 +0,0 @@
1
- import { isDevelopmentEnvironment } from "../common/env.js";
2
- import { logger } from "../common/logger.js";
3
- import { flushRuntimeScheduler } from "../runtime/access.js";
4
- import { ELEMENT_TYPE, Fragment } from "../common/jsx.js";
5
- import { cleanupComponent } from "../runtime/component-cleanup.js";
6
- import { isPromiseLike } from "../common/promise.js";
7
- import { beginLifecycleCommitBatch, discardLifecycleCommitBatch, drainLifecycleCommitErrors, flushLifecycleCommitBatch } from "../runtime/lifecycle-batch.js";
8
- import { mountComponent } from "../runtime/component-internal.js";
9
- import { DefaultPortal, clearDefaultPortalForInstance } from "../runtime/portal.js";
10
- import "../runtime/index.js";
11
- import { teardownNodeSubtree } from "../renderer/cleanup.js";
12
- import "../jsx/index.js";
13
- import { resolveRouteFromRoutes } from "./route-matching.js";
14
- import { resolveRouteRequest } from "./resolution.js";
15
- import "./route.js";
16
- import { getCurrentHref, getCurrentPathname, getRegisteredAppsSnapshot, parseTargetUrl, setCurrentRouteLocation, syncAppRegistrationLocation, syncRegisteredRouteSnapshot } from "./navigation-registry.js";
17
- import { applyHistoryScroll, applyNavigationScroll, saveScrollPosition } from "./navigation-scroll.js";
18
- //#region src/router/navigation-targets.ts
19
- const MAX_NAVIGATION_REDIRECTS = 20;
20
- let activeRouteRequestId = 0;
21
- let activeRouteRequestController = null;
22
- function beginRouteRequest() {
23
- activeRouteRequestId += 1;
24
- activeRouteRequestController?.abort();
25
- activeRouteRequestController = new AbortController();
26
- return {
27
- id: activeRouteRequestId,
28
- signal: activeRouteRequestController.signal
29
- };
30
- }
31
- function isStaleRouteRequest(requestId) {
32
- return requestId !== activeRouteRequestId;
33
- }
34
- function cancelRouteRequests() {
35
- activeRouteRequestId += 1;
36
- activeRouteRequestController?.abort();
37
- activeRouteRequestController = null;
38
- }
39
- function isRenderResult(result) {
40
- return result !== null && result.kind === "render";
41
- }
42
- function getRedirectHistoryMode(replace) {
43
- return replace === false ? "push" : "replace";
44
- }
45
- function getNavigationHistoryMode(options) {
46
- if (options.history) return options.history;
47
- return options.replace ? "replace" : "push";
48
- }
49
- function createDeniedResolvedRoute(status) {
50
- return {
51
- handler: () => ({
52
- type: "div",
53
- props: { "data-route-denied": String(status) },
54
- children: [String(status)]
55
- }),
56
- params: {}
57
- };
58
- }
59
- function bindResolvedRouteHandler(resolved) {
60
- return () => resolved.handler(resolved.params);
61
- }
62
- function wrapRootRouteHandler(componentFn) {
63
- const wrappedFn = (props, ctx) => {
64
- const out = componentFn(props, ctx);
65
- if (isPromiseLike(out)) throw new Error("Async components are not supported. Components must return synchronously.");
66
- const portalVNode = {
67
- $$typeof: ELEMENT_TYPE,
68
- type: DefaultPortal,
69
- props: { __askrAutoDefaultPortal: true },
70
- key: "__default_portal"
71
- };
72
- return {
73
- $$typeof: ELEMENT_TYPE,
74
- type: Fragment,
75
- props: { children: out === void 0 || out === null ? [portalVNode] : [out, portalVNode] }
76
- };
77
- };
78
- Object.defineProperty(wrappedFn, "name", { value: componentFn.name || "Component" });
79
- return wrappedFn;
80
- }
81
- function flattenLifecycleErrors(error, result) {
82
- if (error instanceof AggregateError) {
83
- for (const nested of error.errors) flattenLifecycleErrors(nested, result);
84
- return;
85
- }
86
- result.push(error);
87
- }
88
- function reportRouteCleanupErrors(errors) {
89
- for (const error of errors) {
90
- const flattened = [];
91
- flattenLifecycleErrors(error, flattened);
92
- for (const cleanupError of flattened.length > 0 ? flattened : [error]) logger.error("[Askr] route cleanup failed:", cleanupError);
93
- }
94
- }
95
- function captureRouteDom(root) {
96
- if (!root) return null;
97
- const nodes = [];
98
- const visit = (node) => {
99
- nodes.push({
100
- node,
101
- children: Array.from(node.childNodes),
102
- attributes: node instanceof Element ? Array.from(node.attributes).map((attribute) => [attribute.name, attribute.value]) : null,
103
- nodeValue: node.nodeValue
104
- });
105
- for (const child of Array.from(node.childNodes)) visit(child);
106
- };
107
- visit(root);
108
- return {
109
- root,
110
- nodes
111
- };
112
- }
113
- function collectProvisionalRouteNodes(snapshot) {
114
- const originalNodes = new Set(snapshot.nodes.map((entry) => entry.node));
115
- const provisional = [];
116
- const visit = (node) => {
117
- if (!originalNodes.has(node)) {
118
- provisional.push(node);
119
- return;
120
- }
121
- for (const child of Array.from(node.childNodes)) visit(child);
122
- };
123
- for (const child of Array.from(snapshot.root.childNodes)) visit(child);
124
- return provisional;
125
- }
126
- function restoreRouteDom(snapshot) {
127
- if (!snapshot) return [];
128
- const errors = [];
129
- for (const node of collectProvisionalRouteNodes(snapshot)) try {
130
- teardownNodeSubtree(node, { strict: true });
131
- } catch (error) {
132
- errors.push(error);
133
- }
134
- for (const entry of snapshot.nodes) {
135
- const { node, attributes } = entry;
136
- try {
137
- if (attributes && node instanceof Element) {
138
- const expected = new Map(attributes);
139
- for (const attribute of Array.from(node.attributes)) if (!expected.has(attribute.name)) node.removeAttribute(attribute.name);
140
- for (const [name, value] of attributes) if (node.getAttribute(name) !== value) node.setAttribute(name, value);
141
- } else if (!(node instanceof Element)) node.nodeValue = entry.nodeValue;
142
- if (node instanceof Element || node instanceof DocumentFragment) node.replaceChildren(...entry.children);
143
- } catch (error) {
144
- errors.push(error);
145
- }
146
- }
147
- return errors;
148
- }
149
- function collectHostInstances(root) {
150
- const instances = [];
151
- const seen = /* @__PURE__ */ new Set();
152
- const pending = [root];
153
- while (pending.length > 0) {
154
- const node = pending.pop();
155
- if (node instanceof Element) {
156
- const host = node;
157
- for (const instance of host.__ASKR_INSTANCES ?? []) if (!seen.has(instance)) {
158
- seen.add(instance);
159
- instances.push(instance);
160
- }
161
- if (host.__ASKR_INSTANCE && !seen.has(host.__ASKR_INSTANCE)) {
162
- seen.add(host.__ASKR_INSTANCE);
163
- instances.push(host.__ASKR_INSTANCE);
164
- }
165
- } else {
166
- const instance = node.__ASKR_INSTANCE;
167
- if (instance && !seen.has(instance)) {
168
- seen.add(instance);
169
- instances.push(instance);
170
- }
171
- }
172
- for (let child = node.lastChild; child; child = child.previousSibling) pending.push(child);
173
- }
174
- return instances;
175
- }
176
- function captureDeferredRouteCleanup(instance) {
177
- return {
178
- instance,
179
- previousFn: instance.fn,
180
- previousProps: instance.props,
181
- previousExpectedStateIndices: instance.expectedStateIndices,
182
- previousFirstRenderComplete: instance.firstRenderComplete,
183
- previousStateIndexCheck: instance.stateIndexCheck,
184
- previousErrorBoundaryState: instance.errorBoundaryState,
185
- previousTarget: instance.target,
186
- previousDom: captureRouteDom(instance.target),
187
- previousStateValues: instance.stateValues,
188
- previousCleanupFns: instance.cleanupFns,
189
- previousOwnedChildScopes: instance._ownedChildScopes,
190
- previousAbortController: instance.abortController,
191
- previousMountOperations: instance.mountOperations,
192
- previousCommitOperations: instance.commitOperations,
193
- previousLifecycleSlots: instance.lifecycleSlots,
194
- previousLifecycleGeneration: instance.lifecycleGeneration,
195
- previousEvaluationGeneration: instance.evaluationGeneration,
196
- previousHasPendingUpdate: instance.hasPendingUpdate,
197
- previousNotifyUpdate: instance.notifyUpdate,
198
- previousPlaceholder: instance._placeholder,
199
- previousMounted: instance.mounted,
200
- previousCurrentRenderToken: instance._currentRenderToken,
201
- previousLastRenderToken: instance.lastRenderToken,
202
- previousPendingReadSources: instance._pendingReadSources,
203
- previousPendingReadSourceVersions: instance._pendingReadSourceVersions,
204
- previousLastReadSources: instance._lastReadSources,
205
- previousInstances: instance.target ? collectHostInstances(instance.target) : []
206
- };
207
- }
208
- function restoreDeferredRouteInstance(deferred) {
209
- const instance = deferred.instance;
210
- const errors = restoreRouteDom(deferred.previousDom);
211
- instance.fn = deferred.previousFn;
212
- instance.props = deferred.previousProps;
213
- instance.expectedStateIndices = deferred.previousExpectedStateIndices;
214
- instance.firstRenderComplete = deferred.previousFirstRenderComplete;
215
- instance.stateIndexCheck = deferred.previousStateIndexCheck;
216
- instance.errorBoundaryState = deferred.previousErrorBoundaryState;
217
- instance.target = deferred.previousTarget;
218
- instance.stateValues = deferred.previousStateValues;
219
- instance.cleanupFns = deferred.previousCleanupFns;
220
- instance._ownedChildScopes = deferred.previousOwnedChildScopes;
221
- instance.abortController = deferred.previousAbortController;
222
- instance.mountOperations = deferred.previousMountOperations;
223
- instance.commitOperations = deferred.previousCommitOperations;
224
- instance.lifecycleSlots = deferred.previousLifecycleSlots;
225
- instance.lifecycleGeneration = deferred.previousLifecycleGeneration;
226
- instance.evaluationGeneration = deferred.previousEvaluationGeneration;
227
- instance.hasPendingUpdate = deferred.previousHasPendingUpdate;
228
- instance.notifyUpdate = deferred.previousNotifyUpdate;
229
- instance._placeholder = deferred.previousPlaceholder;
230
- instance.mounted = deferred.previousMounted;
231
- instance._currentRenderToken = deferred.previousCurrentRenderToken;
232
- instance.lastRenderToken = deferred.previousLastRenderToken;
233
- instance._pendingReadSources = deferred.previousPendingReadSources;
234
- instance._pendingReadSourceVersions = deferred.previousPendingReadSourceVersions;
235
- instance._lastReadSources = deferred.previousLastReadSources;
236
- return errors;
237
- }
238
- function restoreDeferredRouteInstances(deferredCleanups) {
239
- const errors = [];
240
- for (let index = deferredCleanups.length - 1; index >= 0; index -= 1) errors.push(...restoreDeferredRouteInstance(deferredCleanups[index]));
241
- if (errors.length > 0) reportRouteCleanupErrors(errors);
242
- }
243
- function cleanupDeferredRouteInstance(deferred) {
244
- const errors = [];
245
- const instance = deferred.instance;
246
- const current = {
247
- stateValues: instance.stateValues,
248
- cleanupFns: instance.cleanupFns,
249
- ownedChildScopes: instance._ownedChildScopes,
250
- abortController: instance.abortController,
251
- mountOperations: instance.mountOperations,
252
- commitOperations: instance.commitOperations,
253
- lifecycleSlots: instance.lifecycleSlots,
254
- lifecycleGeneration: instance.lifecycleGeneration,
255
- evaluationGeneration: instance.evaluationGeneration,
256
- hasPendingUpdate: instance.hasPendingUpdate,
257
- notifyUpdate: instance.notifyUpdate,
258
- placeholder: instance._placeholder,
259
- mounted: instance.mounted,
260
- currentRenderToken: instance._currentRenderToken,
261
- lastRenderToken: instance.lastRenderToken,
262
- pendingReadSources: instance._pendingReadSources,
263
- pendingReadSourceVersions: instance._pendingReadSourceVersions,
264
- lastReadSources: instance._lastReadSources
265
- };
266
- instance.stateValues = deferred.previousStateValues;
267
- instance.cleanupFns = deferred.previousCleanupFns;
268
- instance._ownedChildScopes = deferred.previousOwnedChildScopes;
269
- instance.abortController = deferred.previousAbortController;
270
- instance.mountOperations = deferred.previousMountOperations;
271
- instance.commitOperations = deferred.previousCommitOperations;
272
- instance.lifecycleSlots = deferred.previousLifecycleSlots;
273
- instance.lifecycleGeneration = deferred.previousLifecycleGeneration;
274
- instance.evaluationGeneration = deferred.previousEvaluationGeneration;
275
- instance.hasPendingUpdate = deferred.previousHasPendingUpdate;
276
- instance.notifyUpdate = deferred.previousNotifyUpdate;
277
- instance._placeholder = deferred.previousPlaceholder;
278
- instance.mounted = deferred.previousMounted;
279
- instance._currentRenderToken = deferred.previousCurrentRenderToken;
280
- instance.lastRenderToken = deferred.previousLastRenderToken;
281
- instance._pendingReadSources = deferred.previousPendingReadSources;
282
- instance._pendingReadSourceVersions = deferred.previousPendingReadSourceVersions;
283
- instance._lastReadSources = deferred.previousLastReadSources;
284
- try {
285
- cleanupComponent(instance);
286
- } catch (error) {
287
- errors.push(error);
288
- } finally {
289
- instance.stateValues = current.stateValues;
290
- instance.cleanupFns = current.cleanupFns;
291
- instance._ownedChildScopes = current.ownedChildScopes;
292
- instance.abortController = current.abortController;
293
- instance.mountOperations = current.mountOperations;
294
- instance.commitOperations = current.commitOperations;
295
- instance.lifecycleSlots = current.lifecycleSlots;
296
- instance.lifecycleGeneration = current.lifecycleGeneration;
297
- instance.evaluationGeneration = current.evaluationGeneration;
298
- instance.hasPendingUpdate = current.hasPendingUpdate;
299
- instance.notifyUpdate = current.notifyUpdate;
300
- instance._placeholder = current.placeholder;
301
- instance.mounted = current.mounted;
302
- instance._currentRenderToken = current.currentRenderToken;
303
- instance.lastRenderToken = current.lastRenderToken;
304
- instance._pendingReadSources = current.pendingReadSources;
305
- instance._pendingReadSourceVersions = current.pendingReadSourceVersions;
306
- instance._lastReadSources = current.lastReadSources;
307
- }
308
- const root = instance.target;
309
- const liveInstances = root ? new Set(collectHostInstances(root)) : /* @__PURE__ */ new Set();
310
- for (let index = deferred.previousInstances.length - 1; index >= 0; index--) {
311
- const previous = deferred.previousInstances[index];
312
- if (previous === instance || liveInstances.has(previous)) continue;
313
- try {
314
- cleanupComponent(previous);
315
- } catch (error) {
316
- errors.push(error);
317
- }
318
- }
319
- return errors;
320
- }
321
- function remountResolvedRoute(instance, resolved, pathname, href, existingSnapshot) {
322
- const deferredCleanup = existingSnapshot ?? captureDeferredRouteCleanup(instance);
323
- clearDefaultPortalForInstance(instance);
324
- instance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));
325
- instance.props = {};
326
- instance.stateValues = [];
327
- instance.expectedStateIndices = [];
328
- instance.firstRenderComplete = false;
329
- instance.stateIndexCheck = -1;
330
- instance.evaluationGeneration++;
331
- instance.notifyUpdate = null;
332
- instance.mountOperations = [];
333
- instance.commitOperations = [];
334
- instance.lifecycleSlots = [];
335
- instance.cleanupFns = [];
336
- instance._ownedChildScopes = /* @__PURE__ */ new Set();
337
- instance._placeholder = void 0;
338
- instance.hasPendingUpdate = false;
339
- instance._currentRenderToken = void 0;
340
- instance.lastRenderToken = 0;
341
- instance._pendingReadSources = void 0;
342
- instance._lastReadSources = void 0;
343
- instance.abortController = null;
344
- mountComponent(instance);
345
- setCurrentRouteLocation(pathname, href);
346
- return deferredCleanup;
347
- }
348
- function rerenderResolvedRoute(instance, pathname, href) {
349
- setCurrentRouteLocation(pathname, href);
350
- instance._enqueueRun?.();
351
- return true;
352
- }
353
- function resolveAppRouteRequest(app, pathname, href, signal) {
354
- if (app.manifest) return resolveRouteRequest(href, {
355
- manifest: app.manifest,
356
- auth: app.auth,
357
- signal
358
- });
359
- if (app.routes) {
360
- const resolved = resolveRouteFromRoutes(pathname, app.routes);
361
- if (!resolved) return null;
362
- return {
363
- kind: "render",
364
- handler: resolved.handler,
365
- params: resolved.params
366
- };
367
- }
368
- return resolveRouteRequest(href, {
369
- auth: app.auth,
370
- signal
371
- });
372
- }
373
- function getResolvedRouteHandler(resolved) {
374
- if (!resolved) throw new Error("[Askr] cannot prepare an unmatched navigation target");
375
- if (resolved.kind === "deny") return createDeniedResolvedRoute(resolved.status);
376
- if (!isRenderResult(resolved)) throw new Error("[Askr] cannot prepare a redirect as a destination root");
377
- return {
378
- handler: resolved.handler,
379
- params: resolved.params
380
- };
381
- }
382
- function resolveNavigationTargetsForApps(pathname, href, signal) {
383
- const apps = getRegisteredAppsSnapshot();
384
- if (apps.length === 1) {
385
- const app = apps[0];
386
- const resolved = resolveAppRouteRequest(app, pathname, href, signal);
387
- if (isPromiseLike(resolved)) return Promise.resolve(resolved).then((next) => [{
388
- app,
389
- resolved: next
390
- }]);
391
- return [{
392
- app,
393
- resolved
394
- }];
395
- }
396
- const syncTargets = [];
397
- const pendingTargets = [];
398
- for (const app of apps) {
399
- const resolved = resolveAppRouteRequest(app, pathname, href, signal);
400
- if (isPromiseLike(resolved)) {
401
- pendingTargets.push(Promise.resolve(resolved).then((next) => ({
402
- app,
403
- resolved: next
404
- })));
405
- continue;
406
- }
407
- syncTargets.push({
408
- app,
409
- resolved
410
- });
411
- }
412
- if (pendingTargets.length === 0) return syncTargets;
413
- return Promise.all([...syncTargets.map((target) => Promise.resolve(target)), ...pendingTargets]);
414
- }
415
- function applyNavigationTargets(requestId, path, options, redirectState, pathname, href, targets, navigateWithRedirectState) {
416
- if (isStaleRouteRequest(requestId)) return;
417
- const previousPathname = getCurrentPathname();
418
- const previousHref = getCurrentHref();
419
- for (const target of targets) {
420
- const resolved = target.resolved;
421
- if (!resolved || resolved.kind !== "redirect") continue;
422
- const redirectTarget = parseTargetUrl(resolved.to);
423
- const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;
424
- if (redirectHref === href) {
425
- if (isDevelopmentEnvironment()) logger.warn(`Navigation guard redirected to the same path: ${redirectHref}`);
426
- return;
427
- }
428
- if (redirectState.visited.has(redirectHref)) throw new Error(`[Askr] Navigation redirect cycle detected at ${redirectHref}.`);
429
- if (redirectState.redirects >= MAX_NAVIGATION_REDIRECTS) throw new Error(`[Askr] Navigation redirect limit exceeded (${MAX_NAVIGATION_REDIRECTS}).`);
430
- redirectState.visited.add(redirectHref);
431
- redirectState.redirects++;
432
- navigateWithRedirectState(redirectHref, { history: getRedirectHistoryMode(resolved.replace) }, redirectState);
433
- return;
434
- }
435
- const matchedTargets = targets.filter((target) => target.resolved !== null);
436
- if (matchedTargets.length === 0) {
437
- if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${path}`);
438
- return;
439
- }
440
- if (isStaleRouteRequest(requestId)) return;
441
- const samePathTargets = [];
442
- const rootsToPrepare = [];
443
- for (const target of matchedTargets) {
444
- const resolved = target.resolved;
445
- if (resolved.kind === "redirect") continue;
446
- if (pathname === target.app.pathname && isRenderResult(resolved)) {
447
- samePathTargets.push(target);
448
- continue;
449
- }
450
- rootsToPrepare.push(target);
451
- }
452
- const rollbackSnapshots = matchedTargets.map((target) => captureDeferredRouteCleanup(target.app.instance));
453
- const rollbackSnapshotByInstance = new Map(rollbackSnapshots.map((snapshot) => [snapshot.instance, snapshot]));
454
- const deferredCleanups = [];
455
- const cleanupErrors = [];
456
- const previousAppLocations = matchedTargets.map((target) => ({
457
- app: target.app,
458
- pathname: target.app.pathname,
459
- href: target.app.href
460
- }));
461
- const restoreOnExit = () => {
462
- if (!navigationBatchClosed) {
463
- discardLifecycleCommitBatch(navigationBatch);
464
- navigationBatchClosed = true;
465
- }
466
- restoreDeferredRouteInstances(rollbackSnapshots);
467
- for (const previous of previousAppLocations) {
468
- previous.app.pathname = previous.pathname;
469
- previous.app.href = previous.href;
470
- }
471
- setCurrentRouteLocation(previousPathname, previousHref);
472
- };
473
- const navigationBatch = beginLifecycleCommitBatch();
474
- let navigationBatchClosed = false;
475
- try {
476
- for (const target of rootsToPrepare) {
477
- if (isStaleRouteRequest(requestId)) {
478
- restoreOnExit();
479
- return;
480
- }
481
- const deferredCleanup = remountResolvedRoute(target.app.instance, getResolvedRouteHandler(target.resolved), pathname, href, rollbackSnapshotByInstance.get(target.app.instance));
482
- deferredCleanups.push(deferredCleanup);
483
- }
484
- if (isStaleRouteRequest(requestId)) {
485
- restoreOnExit();
486
- return;
487
- }
488
- flushRuntimeScheduler();
489
- cleanupErrors.push(...drainLifecycleCommitErrors());
490
- if (isStaleRouteRequest(requestId)) {
491
- restoreOnExit();
492
- return;
493
- }
494
- for (const target of samePathTargets) {
495
- if (isStaleRouteRequest(requestId)) {
496
- restoreOnExit();
497
- return;
498
- }
499
- rerenderResolvedRoute(target.app.instance, pathname, href);
500
- }
501
- flushRuntimeScheduler();
502
- cleanupErrors.push(...drainLifecycleCommitErrors());
503
- if (isStaleRouteRequest(requestId)) {
504
- restoreOnExit();
505
- return;
506
- }
507
- flushLifecycleCommitBatch(navigationBatch);
508
- navigationBatchClosed = true;
509
- cleanupErrors.push(...drainLifecycleCommitErrors());
510
- for (const target of matchedTargets) if (target.resolved && target.resolved.kind !== "redirect") syncAppRegistrationLocation(target.app, pathname, href);
511
- if (isStaleRouteRequest(requestId)) {
512
- restoreOnExit();
513
- return;
514
- }
515
- saveScrollPosition(previousHref);
516
- const historyMethod = getNavigationHistoryMode(options) === "replace" ? "replaceState" : "pushState";
517
- window.history[historyMethod]({ path: href }, "", href);
518
- setCurrentRouteLocation(pathname, href);
519
- syncRegisteredRouteSnapshot();
520
- if (pathname !== previousPathname) applyNavigationScroll(options.scroll);
521
- for (const deferredCleanup of deferredCleanups) cleanupErrors.push(...cleanupDeferredRouteInstance(deferredCleanup));
522
- for (const error of cleanupErrors) reportRouteCleanupErrors([error]);
523
- } catch (error) {
524
- restoreOnExit();
525
- logger.error("[Askr] navigation failed:", error);
526
- throw error;
527
- }
528
- }
529
- function applyPopStateNavigationTargets(requestId, previousHref, previousState, pathname, href, state, targets, navigate) {
530
- if (isStaleRouteRequest(requestId)) return;
531
- const matchedTargets = targets.filter((target) => target.resolved !== null);
532
- if (matchedTargets.length === 0) {
533
- if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${pathname}`);
534
- return;
535
- }
536
- for (const target of matchedTargets) {
537
- const resolved = target.resolved;
538
- if (resolved.kind !== "redirect") continue;
539
- navigate(resolved.to, { history: getRedirectHistoryMode(resolved.replace) });
540
- return;
541
- }
542
- const samePathTargets = [];
543
- const rootsToPrepare = [];
544
- for (const target of matchedTargets) {
545
- const resolved = target.resolved;
546
- if (pathname === target.app.pathname && isRenderResult(resolved)) {
547
- samePathTargets.push(target);
548
- continue;
549
- }
550
- if (resolved.kind === "redirect") continue;
551
- rootsToPrepare.push(target);
552
- }
553
- const previousPathname = getCurrentPathname();
554
- const rollbackSnapshots = matchedTargets.map((target) => captureDeferredRouteCleanup(target.app.instance));
555
- const rollbackSnapshotByInstance = new Map(rollbackSnapshots.map((snapshot) => [snapshot.instance, snapshot]));
556
- const deferredCleanups = [];
557
- const cleanupErrors = [];
558
- const previousAppLocations = matchedTargets.map((target) => ({
559
- app: target.app,
560
- pathname: target.app.pathname,
561
- href: target.app.href
562
- }));
563
- const restoreOnExit = () => {
564
- if (!navigationBatchClosed) {
565
- discardLifecycleCommitBatch(navigationBatch);
566
- navigationBatchClosed = true;
567
- }
568
- restoreDeferredRouteInstances(rollbackSnapshots);
569
- for (const previous of previousAppLocations) {
570
- previous.app.pathname = previous.pathname;
571
- previous.app.href = previous.href;
572
- }
573
- setCurrentRouteLocation(previousPathname, previousHref);
574
- };
575
- const navigationBatch = beginLifecycleCommitBatch();
576
- let navigationBatchClosed = false;
577
- try {
578
- for (const target of rootsToPrepare) {
579
- if (isStaleRouteRequest(requestId)) {
580
- restoreOnExit();
581
- return;
582
- }
583
- const deferredCleanup = remountResolvedRoute(target.app.instance, getResolvedRouteHandler(target.resolved), pathname, href, rollbackSnapshotByInstance.get(target.app.instance));
584
- deferredCleanups.push(deferredCleanup);
585
- }
586
- if (isStaleRouteRequest(requestId)) {
587
- restoreOnExit();
588
- return;
589
- }
590
- flushRuntimeScheduler();
591
- cleanupErrors.push(...drainLifecycleCommitErrors());
592
- if (isStaleRouteRequest(requestId)) {
593
- restoreOnExit();
594
- return;
595
- }
596
- for (const target of samePathTargets) {
597
- if (isStaleRouteRequest(requestId)) {
598
- restoreOnExit();
599
- return;
600
- }
601
- rerenderResolvedRoute(target.app.instance, pathname, href);
602
- }
603
- flushRuntimeScheduler();
604
- cleanupErrors.push(...drainLifecycleCommitErrors());
605
- if (isStaleRouteRequest(requestId)) {
606
- restoreOnExit();
607
- return;
608
- }
609
- flushLifecycleCommitBatch(navigationBatch);
610
- navigationBatchClosed = true;
611
- cleanupErrors.push(...drainLifecycleCommitErrors());
612
- for (const target of matchedTargets) if (target.resolved && target.resolved.kind !== "redirect") syncAppRegistrationLocation(target.app, pathname, href);
613
- if (isStaleRouteRequest(requestId)) {
614
- restoreOnExit();
615
- return;
616
- }
617
- setCurrentRouteLocation(pathname, href);
618
- syncRegisteredRouteSnapshot();
619
- applyHistoryScroll(href, state);
620
- for (const deferredCleanup of deferredCleanups) cleanupErrors.push(...cleanupDeferredRouteInstance(deferredCleanup));
621
- for (const error of cleanupErrors) reportRouteCleanupErrors([error]);
622
- } catch (error) {
623
- restoreOnExit();
624
- try {
625
- window.history.replaceState(previousState, "", previousHref);
626
- syncRegisteredRouteSnapshot();
627
- } catch (rollbackError) {
628
- logger.error("[Askr] failed to restore URL after popstate failure:", rollbackError);
629
- }
630
- throw error;
631
- }
632
- }
633
- //#endregion
634
- export { applyNavigationTargets, applyPopStateNavigationTargets, beginRouteRequest, cancelRouteRequests, getRedirectHistoryMode, isStaleRouteRequest, resolveNavigationTargetsForApps };
@@ -1,27 +0,0 @@
1
- import { AccessAllowDecision, AccessDecision, AccessDenyDecision, AccessDenyStatus, AccessRedirectDecision, AccessRedirectStatus, RouteAuthOptions, RouteContext, RoutePolicy } from "../common/router.js";
2
-
3
- //#region src/router/policy.d.ts
4
- type BuiltInRoutePolicyKind = 'auth' | 'guest' | 'role' | 'permission';
5
- interface BuiltInRoutePolicyMetadata {
6
- kind: BuiltInRoutePolicyKind;
7
- value?: string;
8
- }
9
- declare function allow(): AccessAllowDecision;
10
- declare function redirect(to: string, init?: {
11
- status?: AccessRedirectStatus;
12
- replace?: boolean;
13
- }): AccessRedirectDecision;
14
- declare function deny(status: AccessDenyStatus): AccessDenyDecision;
15
- declare function unauthorized(): AccessDenyDecision;
16
- declare function forbidden(): AccessDenyDecision;
17
- declare function notFound(): AccessDenyDecision;
18
- declare function normalizeAccessDecision(result: AccessDecision): AccessDecision;
19
- declare function withRouteAuthOptions(context: RouteContext, auth: RouteAuthOptions | undefined): RouteContext;
20
- declare function _getBuiltInRoutePolicy(policy: RoutePolicy): BuiltInRoutePolicyMetadata | null;
21
- declare function requireAuth(): RoutePolicy;
22
- declare function requireGuest(): RoutePolicy;
23
- declare function requireRole(role: string): RoutePolicy;
24
- declare function requirePermission(permission: string): RoutePolicy;
25
- declare function evaluateRoutePolicy(policy: RoutePolicy, context: RouteContext): Promise<AccessDecision>;
26
- //#endregion
27
- export { BuiltInRoutePolicyKind, BuiltInRoutePolicyMetadata, allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized };