@askrjs/askr 0.0.28 → 0.0.30
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.
- package/README.md +44 -172
- package/dist/_virtual/_rolldown/runtime.js +7 -0
- package/dist/bench/components/benchmark-row.d.ts +20 -0
- package/dist/bench/components/benchmark-row.d.ts.map +1 -0
- package/dist/bench/components/benchmark-row.js +42 -0
- package/dist/bench/components/benchmark-row.js.map +1 -0
- package/dist/bench/components/benchmark-table.js +25 -0
- package/dist/bench/components/benchmark-table.js.map +1 -0
- package/dist/benchmark.d.ts +22 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +64 -1
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/askr-ssg.d.ts +22 -26
- package/dist/bin/askr-ssg.d.ts.map +1 -1
- package/dist/bin/askr-ssg.js +149 -2
- package/dist/bin/askr-ssg.js.map +1 -0
- package/dist/boot/index.d.ts +64 -42
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +416 -2
- package/dist/boot/index.js.map +1 -0
- package/dist/common/component.d.ts +14 -13
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/control.d.ts +13 -0
- package/dist/common/control.d.ts.map +1 -0
- package/dist/common/control.js +14 -0
- package/dist/common/control.js.map +1 -0
- package/dist/common/env.js +47 -0
- package/dist/common/env.js.map +1 -0
- package/dist/common/jsx.d.ts +17 -15
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js +8 -1
- package/dist/common/jsx.js.map +1 -0
- package/dist/common/props.d.ts +14 -11
- package/dist/common/props.d.ts.map +1 -1
- package/dist/common/router.d.ts +190 -32
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr-errors.d.ts +6 -3
- package/dist/common/ssr-errors.d.ts.map +1 -1
- package/dist/common/ssr-errors.js +16 -1
- package/dist/common/ssr-errors.js.map +1 -0
- package/dist/common/ssr.d.ts +12 -9
- package/dist/common/ssr.d.ts.map +1 -1
- package/dist/common/vnode.d.ts +17 -15
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js +10 -1
- package/dist/common/vnode.js.map +1 -0
- package/dist/components/link.d.ts +37 -25
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +64 -1
- package/dist/components/link.js.map +1 -0
- package/dist/control/case.d.ts +17 -0
- package/dist/control/case.d.ts.map +1 -0
- package/dist/control/case.js +69 -0
- package/dist/control/case.js.map +1 -0
- package/dist/control/for.d.ts +23 -0
- package/dist/control/for.d.ts.map +1 -0
- package/dist/control/for.js +62 -0
- package/dist/control/for.js.map +1 -0
- package/dist/control/index.d.ts +4 -0
- package/dist/control/index.js +4 -0
- package/dist/control/shared.js +20 -0
- package/dist/control/shared.js.map +1 -0
- package/dist/control/show.d.ts +14 -0
- package/dist/control/show.d.ts.map +1 -0
- package/dist/control/show.js +33 -0
- package/dist/control/show.js.map +1 -0
- package/dist/dev/invariant.js +29 -2
- package/dist/dev/invariant.js.map +1 -0
- package/dist/dev/logger.js +37 -1
- package/dist/dev/logger.js.map +1 -0
- package/dist/foundations/core.d.ts +15 -23
- package/dist/foundations/core.js +13 -1
- package/dist/foundations/icon/icon.d.ts +53 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -0
- package/dist/foundations/icon/icon.js +88 -0
- package/dist/foundations/icon/icon.js.map +1 -0
- package/dist/foundations/icon/icon.types.d.ts +21 -0
- package/dist/foundations/icon/icon.types.d.ts.map +1 -0
- package/dist/foundations/index.d.ts +23 -3
- package/dist/foundations/index.js +22 -1
- package/dist/foundations/interactions/dismissable.d.ts +25 -17
- package/dist/foundations/interactions/dismissable.d.ts.map +1 -1
- package/dist/foundations/interactions/dismissable.js +26 -1
- package/dist/foundations/interactions/dismissable.js.map +1 -0
- package/dist/foundations/interactions/focusable.d.ts +13 -7
- package/dist/foundations/interactions/focusable.d.ts.map +1 -1
- package/dist/foundations/interactions/focusable.js +18 -1
- package/dist/foundations/interactions/focusable.js.map +1 -0
- package/dist/foundations/interactions/hoverable.d.ts +17 -10
- package/dist/foundations/interactions/hoverable.d.ts.map +1 -1
- package/dist/foundations/interactions/hoverable.js +15 -1
- package/dist/foundations/interactions/hoverable.js.map +1 -0
- package/dist/foundations/interactions/interaction-policy.d.ts +32 -78
- package/dist/foundations/interactions/interaction-policy.d.ts.map +1 -1
- package/dist/foundations/interactions/interaction-policy.js +122 -1
- package/dist/foundations/interactions/interaction-policy.js.map +1 -0
- package/dist/foundations/interactions/pressable.d.ts +25 -18
- package/dist/foundations/interactions/pressable.d.ts.map +1 -1
- package/dist/foundations/interactions/pressable.js +51 -1
- package/dist/foundations/interactions/pressable.js.map +1 -0
- package/dist/foundations/interactions/roving-focus.d.ts +49 -114
- package/dist/foundations/interactions/roving-focus.d.ts.map +1 -1
- package/dist/foundations/interactions/roving-focus.js +71 -1
- package/dist/foundations/interactions/roving-focus.js.map +1 -0
- package/dist/foundations/state/controllable.d.ts +22 -41
- package/dist/foundations/state/controllable.d.ts.map +1 -1
- package/dist/foundations/state/controllable.js +81 -1
- package/dist/foundations/state/controllable.js.map +1 -0
- package/dist/foundations/structures/collection.d.ts +25 -40
- package/dist/foundations/structures/collection.d.ts.map +1 -1
- package/dist/foundations/structures/collection.js +51 -1
- package/dist/foundations/structures/collection.js.map +1 -0
- package/dist/foundations/structures/layer.d.ts +47 -68
- package/dist/foundations/structures/layer.d.ts.map +1 -1
- package/dist/foundations/structures/layer.js +81 -1
- package/dist/foundations/structures/layer.js.map +1 -0
- package/dist/foundations/structures/layout.d.ts +6 -3
- package/dist/foundations/structures/layout.d.ts.map +1 -1
- package/dist/foundations/structures/layout.js +13 -1
- package/dist/foundations/structures/layout.js.map +1 -0
- package/dist/foundations/structures/portal.d.ts +17 -10
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +105 -1
- package/dist/foundations/structures/portal.js.map +1 -0
- package/dist/foundations/structures/presence.d.ts +11 -5
- package/dist/foundations/structures/presence.d.ts.map +1 -1
- package/dist/foundations/structures/presence.js +39 -1
- package/dist/foundations/structures/presence.js.map +1 -0
- package/dist/foundations/structures/slot.d.ts +11 -8
- package/dist/foundations/structures/slot.d.ts.map +1 -1
- package/dist/foundations/structures/slot.js +41 -1
- package/dist/foundations/structures/slot.js.map +1 -0
- package/dist/foundations/structures.d.ts +7 -14
- package/dist/foundations/structures.js +6 -1
- package/dist/foundations/utilities/aria.d.ts +9 -6
- package/dist/foundations/utilities/aria.d.ts.map +1 -1
- package/dist/foundations/utilities/aria.js +17 -1
- package/dist/foundations/utilities/aria.js.map +1 -0
- package/dist/foundations/utilities/compose-handlers.d.ts +10 -7
- package/dist/foundations/utilities/compose-handlers.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-handlers.js +20 -1
- package/dist/foundations/utilities/compose-handlers.js.map +1 -0
- package/dist/foundations/utilities/compose-ref.d.ts +7 -4
- package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
- package/dist/foundations/utilities/compose-ref.js +18 -1
- package/dist/foundations/utilities/compose-ref.js.map +1 -0
- package/dist/foundations/utilities/event-types.d.ts +14 -11
- package/dist/foundations/utilities/event-types.d.ts.map +1 -1
- package/dist/foundations/utilities/merge-props.d.ts +4 -1
- package/dist/foundations/utilities/merge-props.d.ts.map +1 -1
- package/dist/foundations/utilities/merge-props.js +49 -1
- package/dist/foundations/utilities/merge-props.js.map +1 -0
- package/dist/foundations/utilities/use-id.d.ts +9 -6
- package/dist/foundations/utilities/use-id.d.ts.map +1 -1
- package/dist/foundations/utilities/use-id.js +29 -1
- package/dist/foundations/utilities/use-id.js.map +1 -0
- package/dist/fx/fx.d.ts +24 -21
- package/dist/fx/fx.d.ts.map +1 -1
- package/dist/fx/fx.js +212 -1
- package/dist/fx/fx.js.map +1 -0
- package/dist/fx/index.d.ts +4 -7
- package/dist/fx/index.js +4 -1
- package/dist/fx/noop.js +9 -1
- package/dist/fx/noop.js.map +1 -0
- package/dist/fx/timing.d.ts +24 -21
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +236 -1
- package/dist/fx/timing.js.map +1 -0
- package/dist/index.d.ts +21 -23
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -0
- package/dist/jsx/index.d.ts +1 -4
- package/dist/jsx/index.js +3 -1
- package/dist/jsx/types.d.ts +18 -25
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/types.js +1 -1
- package/dist/jsx/utils.d.ts +4 -3
- package/dist/jsx/utils.d.ts.map +1 -1
- package/dist/jsx/utils.js +19 -1
- package/dist/jsx/utils.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +8 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +32 -1
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +12 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +45 -1
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-runtime2.d.ts +2 -0
- package/dist/jsx-runtime2.js +3 -0
- package/dist/renderer/children.js +293 -0
- package/dist/renderer/children.js.map +1 -0
- package/dist/renderer/cleanup.js +150 -1
- package/dist/renderer/cleanup.js.map +1 -0
- package/dist/renderer/dom.js +2439 -1
- package/dist/renderer/dom.js.map +1 -0
- package/dist/renderer/env.js +1 -0
- package/dist/renderer/evaluate.js +450 -1
- package/dist/renderer/evaluate.js.map +1 -0
- package/dist/renderer/fastpath.js +145 -1
- package/dist/renderer/fastpath.js.map +1 -0
- package/dist/renderer/index.js +24 -1
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/keyed.js +119 -1
- package/dist/renderer/keyed.js.map +1 -0
- package/dist/renderer/reconcile.js +359 -1
- package/dist/renderer/reconcile.js.map +1 -0
- package/dist/renderer/types.js +1 -1
- package/dist/renderer/utils.js +220 -1
- package/dist/renderer/utils.js.map +1 -0
- package/dist/resources/index.d.ts +3 -9
- package/dist/resources/index.js +3 -1
- package/dist/router/index.d.ts +6 -10
- package/dist/router/index.js +5 -1
- package/dist/router/match.js +83 -1
- package/dist/router/match.js.map +1 -0
- package/dist/router/navigate.d.ts +20 -8
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +288 -1
- package/dist/router/navigate.js.map +1 -0
- package/dist/router/policy.d.ts +22 -0
- package/dist/router/policy.d.ts.map +1 -0
- package/dist/router/policy.js +116 -0
- package/dist/router/policy.js.map +1 -0
- package/dist/router/route-context.js +79 -0
- package/dist/router/route-context.js.map +1 -0
- package/dist/router/route.d.ts +101 -34
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +599 -1
- package/dist/router/route.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +21 -0
- package/dist/runtime/child-scope.d.ts.map +1 -0
- package/dist/runtime/child-scope.js +77 -0
- package/dist/runtime/child-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +67 -56
- package/dist/runtime/component.d.ts.map +1 -1
- package/dist/runtime/component.js +462 -1
- package/dist/runtime/component.js.map +1 -0
- package/dist/runtime/context.d.ts +28 -42
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js +205 -1
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/control.d.ts +43 -0
- package/dist/runtime/control.d.ts.map +1 -0
- package/dist/runtime/control.js +125 -0
- package/dist/runtime/control.js.map +1 -0
- package/dist/runtime/derive.d.ts +12 -9
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +134 -1
- package/dist/runtime/derive.js.map +1 -0
- package/dist/runtime/dev-namespace.js +57 -1
- package/dist/runtime/dev-namespace.js.map +1 -0
- package/dist/runtime/effect.d.ts +32 -0
- package/dist/runtime/effect.d.ts.map +1 -0
- package/dist/runtime/effect.js +146 -0
- package/dist/runtime/effect.js.map +1 -0
- package/dist/runtime/events.js +162 -1
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/execution-model.js +15 -1
- package/dist/runtime/execution-model.js.map +1 -0
- package/dist/runtime/fastlane.js +204 -1
- package/dist/runtime/fastlane.js.map +1 -0
- package/dist/runtime/for-bench.d.ts +41 -0
- package/dist/runtime/for-bench.d.ts.map +1 -0
- package/dist/runtime/for-bench.js +173 -0
- package/dist/runtime/for-bench.js.map +1 -0
- package/dist/runtime/for.d.ts +62 -49
- package/dist/runtime/for.d.ts.map +1 -1
- package/dist/runtime/for.js +668 -1
- package/dist/runtime/for.js.map +1 -0
- package/dist/runtime/operations.d.ts +18 -15
- package/dist/runtime/operations.d.ts.map +1 -1
- package/dist/runtime/operations.js +209 -1
- package/dist/runtime/operations.js.map +1 -0
- package/dist/runtime/perf-metrics.js +64 -1
- package/dist/runtime/perf-metrics.js.map +1 -0
- package/dist/runtime/readable.d.ts +24 -18
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +118 -1
- package/dist/runtime/readable.js.map +1 -0
- package/dist/runtime/resource-cell.js +102 -1
- package/dist/runtime/resource-cell.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +51 -50
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +328 -1
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/selector.d.ts +7 -5
- package/dist/runtime/selector.d.ts.map +1 -1
- package/dist/runtime/selector.js +188 -1
- package/dist/runtime/selector.js.map +1 -0
- package/dist/runtime/ssr-bridge.js +24 -1
- package/dist/runtime/ssr-bridge.js.map +1 -0
- package/dist/runtime/state.d.ts +11 -19
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +99 -1
- package/dist/runtime/state.js.map +1 -0
- package/dist/ssg/batch-render.d.ts +10 -10
- package/dist/ssg/batch-render.d.ts.map +1 -1
- package/dist/ssg/batch-render.js +84 -1
- package/dist/ssg/batch-render.js.map +1 -0
- package/dist/ssg/create-static-gen.d.ts +28 -29
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +282 -1
- package/dist/ssg/create-static-gen.js.map +1 -0
- package/dist/ssg/generate-metadata.d.ts +12 -15
- package/dist/ssg/generate-metadata.d.ts.map +1 -1
- package/dist/ssg/generate-metadata.js +94 -1
- package/dist/ssg/generate-metadata.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +56 -1
- package/dist/ssg/incremental-manifest.js.map +1 -0
- package/dist/ssg/index.d.ts +8 -28
- package/dist/ssg/index.js +7 -1
- package/dist/ssg/resolve-ssg-data.d.ts +10 -13
- package/dist/ssg/resolve-ssg-data.d.ts.map +1 -1
- package/dist/ssg/resolve-ssg-data.js +46 -1
- package/dist/ssg/resolve-ssg-data.js.map +1 -0
- package/dist/ssg/route-utils.d.ts +14 -10
- package/dist/ssg/route-utils.d.ts.map +1 -1
- package/dist/ssg/route-utils.js +24 -1
- package/dist/ssg/route-utils.js.map +1 -0
- package/dist/ssg/types.d.ts +157 -144
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssg/write-static-files.d.ts +8 -14
- package/dist/ssg/write-static-files.d.ts.map +1 -1
- package/dist/ssg/write-static-files.js +73 -1
- package/dist/ssg/write-static-files.js.map +1 -0
- package/dist/ssr/attrs.js +93 -1
- package/dist/ssr/attrs.js.map +1 -0
- package/dist/ssr/context.d.ts +31 -35
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +63 -1
- package/dist/ssr/context.js.map +1 -0
- package/dist/ssr/errors.d.ts +6 -4
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/errors.js +4 -1
- package/dist/ssr/errors.js.map +1 -0
- package/dist/ssr/escape.js +153 -1
- package/dist/ssr/escape.js.map +1 -0
- package/dist/ssr/index.d.ts +74 -72
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +543 -1
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/render-keys.d.ts +27 -29
- package/dist/ssr/render-keys.d.ts.map +1 -1
- package/dist/ssr/render-keys.js +39 -1
- package/dist/ssr/render-keys.js.map +1 -0
- package/dist/ssr/sink.js +86 -1
- package/dist/ssr/sink.js.map +1 -0
- package/dist/ssr/stream-render.js +76 -1
- package/dist/ssr/stream-render.js.map +1 -0
- package/dist/ssr/types.d.ts +14 -13
- package/dist/ssr/types.d.ts.map +1 -1
- package/package.json +49 -69
- package/dist/_virtual/___vite-browser-external.js +0 -1
- package/dist/_virtual/__vite-browser-external.js +0 -1
- package/dist/_virtual/_commonjsHelpers.js +0 -1
- package/dist/_virtual/_fs.js +0 -1
- package/dist/_virtual/_path.js +0 -1
- package/dist/_virtual/main.js +0 -1
- package/dist/_virtual/preload-helper.js +0 -1
- package/dist/bench/benchmark-entry.d.ts +0 -14
- package/dist/bench/benchmark-entry.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -53
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/index.d.ts +0 -14
- package/dist/common/index.d.ts.map +0 -1
- package/dist/dev/invariant.d.ts +0 -83
- package/dist/dev/invariant.d.ts.map +0 -1
- package/dist/dev/logger.d.ts +0 -13
- package/dist/dev/logger.d.ts.map +0 -1
- package/dist/dev/vite-plugin-askr.d.ts +0 -25
- package/dist/dev/vite-plugin-askr.d.ts.map +0 -1
- package/dist/dev/warnings.d.ts +0 -5
- package/dist/dev/warnings.d.ts.map +0 -1
- package/dist/for/for.d.ts +0 -16
- package/dist/for/for.d.ts.map +0 -1
- package/dist/for/for.js +0 -1
- package/dist/for/index.d.ts +0 -2
- package/dist/for/index.d.ts.map +0 -1
- package/dist/for/index.js +0 -1
- package/dist/foundations/core.d.ts.map +0 -1
- package/dist/foundations/index.d.ts.map +0 -1
- package/dist/foundations/interactions/index.d.ts +0 -5
- package/dist/foundations/interactions/index.d.ts.map +0 -1
- package/dist/foundations/state/index.d.ts +0 -2
- package/dist/foundations/state/index.d.ts.map +0 -1
- package/dist/foundations/structures/index.d.ts +0 -5
- package/dist/foundations/structures/index.d.ts.map +0 -1
- package/dist/foundations/structures.d.ts.map +0 -1
- package/dist/foundations/utilities/index.d.ts +0 -7
- package/dist/foundations/utilities/index.d.ts.map +0 -1
- package/dist/fx/index.d.ts.map +0 -1
- package/dist/fx/noop.d.ts +0 -12
- package/dist/fx/noop.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/jsx/index.d.ts.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.ts +0 -4
- package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx/jsx-runtime.d.ts +0 -10
- package/dist/jsx/jsx-runtime.d.ts.map +0 -1
- package/dist/node_modules/esbuild/lib/main.js +0 -65
- package/dist/renderer/cleanup.d.ts +0 -28
- package/dist/renderer/cleanup.d.ts.map +0 -1
- package/dist/renderer/dom.d.ts +0 -64
- package/dist/renderer/dom.d.ts.map +0 -1
- package/dist/renderer/evaluate.d.ts +0 -4
- package/dist/renderer/evaluate.d.ts.map +0 -1
- package/dist/renderer/fastpath.d.ts +0 -7
- package/dist/renderer/fastpath.d.ts.map +0 -1
- package/dist/renderer/index.d.ts +0 -6
- package/dist/renderer/index.d.ts.map +0 -1
- package/dist/renderer/keyed.d.ts +0 -23
- package/dist/renderer/keyed.d.ts.map +0 -1
- package/dist/renderer/reconcile.d.ts +0 -88
- package/dist/renderer/reconcile.d.ts.map +0 -1
- package/dist/renderer/types.d.ts +0 -3
- package/dist/renderer/types.d.ts.map +0 -1
- package/dist/renderer/utils.d.ts +0 -63
- package/dist/renderer/utils.d.ts.map +0 -1
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/match.d.ts +0 -22
- package/dist/router/match.d.ts.map +0 -1
- package/dist/runtime/dev-namespace.d.ts +0 -31
- package/dist/runtime/dev-namespace.d.ts.map +0 -1
- package/dist/runtime/events.d.ts +0 -53
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/execution-model.d.ts +0 -4
- package/dist/runtime/execution-model.d.ts.map +0 -1
- package/dist/runtime/fastlane.d.ts +0 -27
- package/dist/runtime/fastlane.d.ts.map +0 -1
- package/dist/runtime/hydration.d.ts +0 -25
- package/dist/runtime/hydration.d.ts.map +0 -1
- package/dist/runtime/perf-metrics.d.ts +0 -25
- package/dist/runtime/perf-metrics.d.ts.map +0 -1
- package/dist/runtime/resource-cell.d.ts +0 -35
- package/dist/runtime/resource-cell.d.ts.map +0 -1
- package/dist/runtime/snapshot.d.ts +0 -25
- package/dist/runtime/snapshot.d.ts.map +0 -1
- package/dist/runtime/ssr-bridge.d.ts +0 -10
- package/dist/runtime/ssr-bridge.d.ts.map +0 -1
- package/dist/ssg/discover-resources.d.ts +0 -15
- package/dist/ssg/discover-resources.d.ts.map +0 -1
- package/dist/ssg/incremental-manifest.d.ts +0 -23
- package/dist/ssg/incremental-manifest.d.ts.map +0 -1
- package/dist/ssg/index.d.ts.map +0 -1
- package/dist/ssr/attrs.d.ts +0 -26
- package/dist/ssr/attrs.d.ts.map +0 -1
- package/dist/ssr/create-ssr.d.ts +0 -19
- package/dist/ssr/create-ssr.d.ts.map +0 -1
- package/dist/ssr/escape.d.ts +0 -38
- package/dist/ssr/escape.d.ts.map +0 -1
- package/dist/ssr/sink.d.ts +0 -23
- package/dist/ssr/sink.d.ts.map +0 -1
- package/dist/ssr/stream-render.d.ts +0 -7
- package/dist/ssr/stream-render.d.ts.map +0 -1
- package/dist/vite/index.js +0 -4
package/dist/router/route.js
CHANGED
|
@@ -1 +1,599 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { getCurrentComponentInstance } from "../runtime/component.js";
|
|
2
|
+
import { computeRank, matchSegments, parseSegments } from "./match.js";
|
|
3
|
+
import { requireAuth, requireGuest, requirePermission, requireRole } from "./policy.js";
|
|
4
|
+
import { buildRouteContext, buildRouteContextBase, deepFreeze, makeQuery, parseLocation } from "./route-context.js";
|
|
5
|
+
import { getExecutionModel } from "../runtime/execution-model.js";
|
|
6
|
+
import { getRenderContext } from "../ssr/context.js";
|
|
7
|
+
//#region src/router/route.ts
|
|
8
|
+
/**
|
|
9
|
+
* Route definition, registration, and matching.
|
|
10
|
+
*
|
|
11
|
+
* Primary public authoring:
|
|
12
|
+
* - `registerRoutes(() => { ... }, options?)`
|
|
13
|
+
* - `group(options, () => { ... })`
|
|
14
|
+
* - `route(path, Component, options?)`
|
|
15
|
+
* - `fallback(Component)`
|
|
16
|
+
* - `currentRoute()` for render-time access
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
/** Legacy flat route array — kept for resolver and route() accessor backward compat. */
|
|
20
|
+
const routes = [];
|
|
21
|
+
/** Normalized route records built by the declarative registration API. */
|
|
22
|
+
const records = [];
|
|
23
|
+
/** Active registration scope stack during module-load-time registration. */
|
|
24
|
+
const registrationScopeStack = [];
|
|
25
|
+
const registrationSessionStack = [];
|
|
26
|
+
const namespaces = /* @__PURE__ */ new Set();
|
|
27
|
+
let defaultRouteAuthOptions;
|
|
28
|
+
let activeClientRouteAuthOptions;
|
|
29
|
+
const HAS_ROUTES_KEY = Symbol.for("__ASKR_HAS_ROUTES__");
|
|
30
|
+
function setHasRoutes(value) {
|
|
31
|
+
try {
|
|
32
|
+
const g = globalThis;
|
|
33
|
+
g[HAS_ROUTES_KEY] = value;
|
|
34
|
+
} catch {}
|
|
35
|
+
}
|
|
36
|
+
setHasRoutes(false);
|
|
37
|
+
const routesByDepth = /* @__PURE__ */ new Map();
|
|
38
|
+
/**
|
|
39
|
+
* Parse route path depth
|
|
40
|
+
*/
|
|
41
|
+
function getDepth(path) {
|
|
42
|
+
const normalized = path.endsWith("/") && path !== "/" ? path.slice(0, -1) : path;
|
|
43
|
+
return normalized === "/" ? 0 : normalized.split("/").filter(Boolean).length;
|
|
44
|
+
}
|
|
45
|
+
/** Pre-parsed segments for an externally supplied Route object. */
|
|
46
|
+
const routeSegsCache = /* @__PURE__ */ new WeakMap();
|
|
47
|
+
/** Pre-computed rank for an externally supplied Route object. */
|
|
48
|
+
const routeRankCache = /* @__PURE__ */ new WeakMap();
|
|
49
|
+
/** A rank-descending sorted copy of an external readonly Route array. */
|
|
50
|
+
const sortedListCache = /* @__PURE__ */ new WeakMap();
|
|
51
|
+
function cachedSegs(r) {
|
|
52
|
+
let s = routeSegsCache.get(r);
|
|
53
|
+
if (!s) {
|
|
54
|
+
s = parseSegments(r.path);
|
|
55
|
+
routeSegsCache.set(r, s);
|
|
56
|
+
}
|
|
57
|
+
return s;
|
|
58
|
+
}
|
|
59
|
+
function cachedRank(r) {
|
|
60
|
+
let n = routeRankCache.get(r);
|
|
61
|
+
if (n === void 0) {
|
|
62
|
+
n = computeRank(cachedSegs(r));
|
|
63
|
+
routeRankCache.set(r, n);
|
|
64
|
+
}
|
|
65
|
+
return n;
|
|
66
|
+
}
|
|
67
|
+
function cachedSortedList(routeList) {
|
|
68
|
+
let sorted = sortedListCache.get(routeList);
|
|
69
|
+
if (!sorted) {
|
|
70
|
+
sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));
|
|
71
|
+
sortedListCache.set(routeList, sorted);
|
|
72
|
+
}
|
|
73
|
+
return sorted;
|
|
74
|
+
}
|
|
75
|
+
let serverLocation = null;
|
|
76
|
+
function setServerLocation(url) {
|
|
77
|
+
serverLocation = url;
|
|
78
|
+
}
|
|
79
|
+
function isPromise(value) {
|
|
80
|
+
return value instanceof Promise;
|
|
81
|
+
}
|
|
82
|
+
function computeMatchesFromRoutes(pathname, routesList) {
|
|
83
|
+
const matches = [];
|
|
84
|
+
const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
|
|
85
|
+
const urlParts = normalized === "/" ? [] : normalized.split("/").filter(Boolean);
|
|
86
|
+
for (const r of routesList) {
|
|
87
|
+
const params = matchSegments(urlParts, cachedSegs(r));
|
|
88
|
+
if (params !== null) matches.push({
|
|
89
|
+
pattern: r.path,
|
|
90
|
+
params,
|
|
91
|
+
name: r.name,
|
|
92
|
+
namespace: r.namespace,
|
|
93
|
+
rank: cachedRank(r)
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
matches.sort((a, b) => b.rank - a.rank);
|
|
97
|
+
return matches.map((m) => ({
|
|
98
|
+
path: m.pattern,
|
|
99
|
+
params: deepFreeze({ ...m.params }),
|
|
100
|
+
name: m.name,
|
|
101
|
+
namespace: m.namespace
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
function getActiveRoutes() {
|
|
105
|
+
return getRenderContext()?.routes ?? routes;
|
|
106
|
+
}
|
|
107
|
+
function getActiveRouteAuthOptions(override) {
|
|
108
|
+
if (override) return override;
|
|
109
|
+
return getRenderContext()?.routeAuth ?? activeClientRouteAuthOptions ?? defaultRouteAuthOptions;
|
|
110
|
+
}
|
|
111
|
+
function _setActiveRouteAuthOptions(auth) {
|
|
112
|
+
activeClientRouteAuthOptions = auth;
|
|
113
|
+
}
|
|
114
|
+
function getCurrentRegistrationSession() {
|
|
115
|
+
return registrationSessionStack[registrationSessionStack.length - 1] ?? { authConfigured: !!defaultRouteAuthOptions?.resolve };
|
|
116
|
+
}
|
|
117
|
+
function getCurrentAccessScopeState() {
|
|
118
|
+
return registrationScopeStack[registrationScopeStack.length - 1]?.state ?? {
|
|
119
|
+
guestOnly: false,
|
|
120
|
+
authenticated: false
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function getCurrentLayoutChain() {
|
|
124
|
+
const layoutChain = [];
|
|
125
|
+
for (const scope of registrationScopeStack) if (scope.layout) layoutChain.push({ component: scope.layout });
|
|
126
|
+
return layoutChain;
|
|
127
|
+
}
|
|
128
|
+
function getCurrentInheritedPolicies() {
|
|
129
|
+
const policies = [];
|
|
130
|
+
for (const scope of registrationScopeStack) if (scope.policies.length > 0) policies.push(...scope.policies);
|
|
131
|
+
return policies;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Prevent route registrations after the app has started.
|
|
135
|
+
* Enforced in production; tests may unlock explicitly.
|
|
136
|
+
*/
|
|
137
|
+
let registrationLocked = false;
|
|
138
|
+
function lockRouteRegistration() {
|
|
139
|
+
registrationLocked = true;
|
|
140
|
+
}
|
|
141
|
+
function validateRoutePath(path) {
|
|
142
|
+
if (!path.startsWith("/")) throw new Error(`Route path must begin with "/". Got: "${path}"`);
|
|
143
|
+
if (/:([^/{}]+)/.test(path)) {
|
|
144
|
+
const suggested = path.replace(/:([^/{}]+)/g, "{$1}");
|
|
145
|
+
throw new Error(`Route parameter syntax uses {name} interpolation, not :name. Use "${suggested}" instead of "${path}".`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function insertRecordSorted(record) {
|
|
149
|
+
let lo = 0;
|
|
150
|
+
let hi = records.length;
|
|
151
|
+
while (lo < hi) {
|
|
152
|
+
const mid = lo + hi >>> 1;
|
|
153
|
+
if (records[mid].rank >= record.rank) lo = mid + 1;
|
|
154
|
+
else hi = mid;
|
|
155
|
+
}
|
|
156
|
+
records.splice(lo, 0, record);
|
|
157
|
+
}
|
|
158
|
+
function addRouteToStores(routeObj) {
|
|
159
|
+
routes.push(routeObj);
|
|
160
|
+
setHasRoutes(true);
|
|
161
|
+
const depth = getDepth(routeObj.path);
|
|
162
|
+
let depthRoutes = routesByDepth.get(depth);
|
|
163
|
+
if (!depthRoutes) {
|
|
164
|
+
depthRoutes = [];
|
|
165
|
+
routesByDepth.set(depth, depthRoutes);
|
|
166
|
+
}
|
|
167
|
+
depthRoutes.push(routeObj);
|
|
168
|
+
if (routeObj.namespace) namespaces.add(routeObj.namespace);
|
|
169
|
+
}
|
|
170
|
+
/** Promises from in-flight lazy() imports, drained by createSPA / hydrateSPA. */
|
|
171
|
+
const pendingLazy = /* @__PURE__ */ new Set();
|
|
172
|
+
/**
|
|
173
|
+
* Snapshot the current in-flight lazy() imports.
|
|
174
|
+
* Boot uses this before clearing route state so manifest-based startup can
|
|
175
|
+
* still await chunks that were kicked off during route module evaluation.
|
|
176
|
+
*/
|
|
177
|
+
function _snapshotLazy() {
|
|
178
|
+
return [...pendingLazy];
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Declare a code-split route component. The `import()` fires immediately at
|
|
182
|
+
* module evaluation time (creating a bundler split point), and the resolved
|
|
183
|
+
* chunk is guaranteed to be available before the app mounts — so the renderer
|
|
184
|
+
* always receives a plain synchronous function.
|
|
185
|
+
*
|
|
186
|
+
* ```ts
|
|
187
|
+
* registerRoutes(() => {
|
|
188
|
+
* group({ layout: AppLayout }, () => {
|
|
189
|
+
* route('/', lazy(() => import('./pages/landing')));
|
|
190
|
+
* route('/dashboard', lazy(() => import('./pages/dashboard')));
|
|
191
|
+
* });
|
|
192
|
+
* });
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* The module must export the component as its **default** export:
|
|
196
|
+
* ```ts
|
|
197
|
+
* // pages/dashboard.tsx
|
|
198
|
+
* export default function DashboardPage() { … }
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
function lazy(factory) {
|
|
202
|
+
let resolved = null;
|
|
203
|
+
let loadError = null;
|
|
204
|
+
const promise = factory().then((mod) => {
|
|
205
|
+
resolved = typeof mod === "function" ? mod : mod.default;
|
|
206
|
+
pendingLazy.delete(promise);
|
|
207
|
+
}, (err) => {
|
|
208
|
+
loadError = err;
|
|
209
|
+
pendingLazy.delete(promise);
|
|
210
|
+
});
|
|
211
|
+
pendingLazy.add(promise);
|
|
212
|
+
return (params) => {
|
|
213
|
+
if (loadError) throw loadError;
|
|
214
|
+
if (!resolved) throw new Error("lazy() component used before it was resolved. Await createSPA() / hydrateSPA() to ensure all chunks load first.");
|
|
215
|
+
return resolved(params);
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Wait for all pending `lazy()` imports to settle.
|
|
220
|
+
* Called automatically by `createSPA` / `hydrateSPA` before mounting.
|
|
221
|
+
*/
|
|
222
|
+
function _drainLazy(additionalPending = []) {
|
|
223
|
+
const combined = new Set([...additionalPending, ...pendingLazy]);
|
|
224
|
+
if (combined.size === 0) return Promise.resolve();
|
|
225
|
+
return Promise.allSettled(combined).then(() => void 0);
|
|
226
|
+
}
|
|
227
|
+
function group(options, fn) {
|
|
228
|
+
pushGroupScope(options, fn);
|
|
229
|
+
}
|
|
230
|
+
function fallback(Component) {
|
|
231
|
+
if (!registrationScopeStack.every((scope) => scope.policies.length === 0 && !scope.state.guestOnly && !scope.state.authenticated)) throw new Error("fallback() can only be registered at the root scope. Use route(\"/*\", Component) if you need compatibility behavior.");
|
|
232
|
+
route("/*", Component);
|
|
233
|
+
}
|
|
234
|
+
function pushRegistrationScope(scope, fn) {
|
|
235
|
+
registrationScopeStack.push(scope);
|
|
236
|
+
try {
|
|
237
|
+
fn();
|
|
238
|
+
} finally {
|
|
239
|
+
registrationScopeStack.pop();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function pushGroupScope(options, fn) {
|
|
243
|
+
validateAccessMetadata(options, {
|
|
244
|
+
authConfigured: getCurrentRegistrationSession().authConfigured,
|
|
245
|
+
state: getCurrentAccessScopeState()
|
|
246
|
+
});
|
|
247
|
+
const policies = compileNodePolicies(options);
|
|
248
|
+
pushRegistrationScope({
|
|
249
|
+
layout: options.layout,
|
|
250
|
+
policies,
|
|
251
|
+
state: nextAccessScopeState(options, getCurrentAccessScopeState())
|
|
252
|
+
}, fn);
|
|
253
|
+
}
|
|
254
|
+
function hasBuiltInAuthMetadata(node) {
|
|
255
|
+
return node.auth !== void 0 || !!node.role || !!node.permission;
|
|
256
|
+
}
|
|
257
|
+
function validateSameNodeAccessMetadata(node) {
|
|
258
|
+
if (node.auth === "guest" && (!!node.role || !!node.permission)) throw new Error("Guest-only routes cannot be combined with role or permission requirements.");
|
|
259
|
+
}
|
|
260
|
+
function validateAccessMetadata(node, context) {
|
|
261
|
+
validateSameNodeAccessMetadata(node);
|
|
262
|
+
const requiresAuthenticated = node.auth === true || !!node.role || !!node.permission;
|
|
263
|
+
if (node.auth === "guest" && (context.state.authenticated || !!node.role || !!node.permission)) throw new Error("Guest-only routes cannot be combined with authenticated access requirements.");
|
|
264
|
+
if (context.state.guestOnly && requiresAuthenticated) throw new Error("Child routes cannot weaken a guest-only access scope with authenticated requirements.");
|
|
265
|
+
if (hasBuiltInAuthMetadata(node) && !context.authConfigured) throw new Error("Routes using `auth`, `role`, or `permission` require `auth.resolve` in registerRoutes(...).");
|
|
266
|
+
}
|
|
267
|
+
function nextAccessScopeState(node, state) {
|
|
268
|
+
const requiresAuthenticated = node.auth === true || !!node.role || !!node.permission;
|
|
269
|
+
return {
|
|
270
|
+
guestOnly: state.guestOnly || node.auth === "guest",
|
|
271
|
+
authenticated: state.authenticated || requiresAuthenticated
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function compileNodePolicies(node) {
|
|
275
|
+
validateSameNodeAccessMetadata(node);
|
|
276
|
+
const compiled = [];
|
|
277
|
+
if (node.auth === true) compiled.push(requireAuth());
|
|
278
|
+
else if (node.auth === "guest") compiled.push(requireGuest());
|
|
279
|
+
if (node.role) compiled.push(requireRole(node.role));
|
|
280
|
+
if (node.permission) compiled.push(requirePermission(node.permission));
|
|
281
|
+
if (node.policies?.length) compiled.push(...node.policies);
|
|
282
|
+
return compiled;
|
|
283
|
+
}
|
|
284
|
+
function normalizeRouteOptions(options) {
|
|
285
|
+
if (!options) return;
|
|
286
|
+
const loader = options.loader;
|
|
287
|
+
const policies = compileNodePolicies(options);
|
|
288
|
+
if (!loader && !options.entries && policies.length === 0 && !options.title && !options.namespace && options.auth === void 0 && !options.role && !options.permission) return;
|
|
289
|
+
return {
|
|
290
|
+
...loader ? { loader } : {},
|
|
291
|
+
...options.entries ? { entries: options.entries } : {},
|
|
292
|
+
...options.auth !== void 0 ? { auth: options.auth } : {},
|
|
293
|
+
...options.role ? { role: options.role } : {},
|
|
294
|
+
...options.permission ? { permission: options.permission } : {},
|
|
295
|
+
...policies.length > 0 ? { policies } : {},
|
|
296
|
+
...options.title ? { title: options.title } : {},
|
|
297
|
+
...options.namespace ? { namespace: options.namespace } : {}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function registerRoutes(definition, options = {}) {
|
|
301
|
+
defaultRouteAuthOptions = options.auth;
|
|
302
|
+
registrationSessionStack.push({ authConfigured: !!options.auth?.resolve });
|
|
303
|
+
try {
|
|
304
|
+
definition();
|
|
305
|
+
} finally {
|
|
306
|
+
registrationSessionStack.pop();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function readCurrentRouteSnapshot() {
|
|
310
|
+
const instance = getCurrentComponentInstance();
|
|
311
|
+
if (!instance) throw new Error("currentRoute() can only be called during component render execution. Call currentRoute() from inside your component function.");
|
|
312
|
+
let pathname = "/";
|
|
313
|
+
let search = "";
|
|
314
|
+
let hash = "";
|
|
315
|
+
const renderContext = getRenderContext();
|
|
316
|
+
if (instance.ssr && renderContext?.url) {
|
|
317
|
+
const parsed = parseLocation(renderContext.url);
|
|
318
|
+
pathname = parsed.pathname;
|
|
319
|
+
search = parsed.search;
|
|
320
|
+
hash = parsed.hash;
|
|
321
|
+
} else if (typeof window !== "undefined" && window.location) {
|
|
322
|
+
pathname = window.location.pathname || "/";
|
|
323
|
+
search = window.location.search || "";
|
|
324
|
+
hash = window.location.hash || "";
|
|
325
|
+
} else if (serverLocation) {
|
|
326
|
+
const parsed = parseLocation(serverLocation);
|
|
327
|
+
pathname = parsed.pathname;
|
|
328
|
+
search = parsed.search;
|
|
329
|
+
hash = parsed.hash;
|
|
330
|
+
}
|
|
331
|
+
const query = makeQuery(search);
|
|
332
|
+
const matches = computeMatchesFromRoutes(pathname, getActiveRoutes());
|
|
333
|
+
const instanceParams = instance.props;
|
|
334
|
+
const params = deepFreeze({ ...Object.keys(instanceParams).length > 0 ? instanceParams : matches[0]?.params ?? {} });
|
|
335
|
+
return Object.freeze({
|
|
336
|
+
path: pathname,
|
|
337
|
+
params,
|
|
338
|
+
query,
|
|
339
|
+
hash: hash || null,
|
|
340
|
+
matches: Object.freeze(matches)
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
function currentRoute() {
|
|
344
|
+
return readCurrentRouteSnapshot();
|
|
345
|
+
}
|
|
346
|
+
function route(path, Component, options) {
|
|
347
|
+
if (getExecutionModel() === "islands") throw new Error("Routes are not supported with islands. Use createSPA (client) or createSSR (server) instead.");
|
|
348
|
+
if (typeof path === "undefined") throw new Error("route() is only for route registration. Use currentRoute() inside components.");
|
|
349
|
+
const currentInst = getCurrentComponentInstance();
|
|
350
|
+
if (currentInst && currentInst.ssr) throw new Error("route() cannot be called during SSR rendering. Register routes at module load time instead.");
|
|
351
|
+
if (registrationLocked) throw new Error("Route registration is locked after app startup. Register routes at module load time before calling createSPA or createSSR.");
|
|
352
|
+
if (typeof Component !== "function") throw new Error("route(path, Component) requires a component function as the second argument. Passing JSX elements or VNodes directly is not supported.");
|
|
353
|
+
validateRoutePath(path);
|
|
354
|
+
validateAccessMetadata(options ?? {}, {
|
|
355
|
+
authConfigured: getCurrentRegistrationSession().authConfigured,
|
|
356
|
+
state: getCurrentAccessScopeState()
|
|
357
|
+
});
|
|
358
|
+
const chain = getCurrentLayoutChain();
|
|
359
|
+
const segments = parseSegments(path);
|
|
360
|
+
const rank = computeRank(segments);
|
|
361
|
+
const isFallback = path === "/*";
|
|
362
|
+
const comp = Component;
|
|
363
|
+
const normalizedOptions = normalizeRouteOptions(options);
|
|
364
|
+
const policies = [...getCurrentInheritedPolicies(), ...normalizedOptions?.policies ?? []];
|
|
365
|
+
const handler = (params) => {
|
|
366
|
+
let content = comp(params);
|
|
367
|
+
for (let i = chain.length - 1; i >= 0; i--) content = chain[i].component({ children: content });
|
|
368
|
+
return content;
|
|
369
|
+
};
|
|
370
|
+
insertRecordSorted({
|
|
371
|
+
path,
|
|
372
|
+
component: comp,
|
|
373
|
+
segments,
|
|
374
|
+
rank,
|
|
375
|
+
layoutChain: chain,
|
|
376
|
+
options: normalizedOptions ? {
|
|
377
|
+
...normalizedOptions,
|
|
378
|
+
...policies.length > 0 ? { policies } : {}
|
|
379
|
+
} : policies.length > 0 ? { policies } : {},
|
|
380
|
+
isFallback,
|
|
381
|
+
handler
|
|
382
|
+
});
|
|
383
|
+
addRouteToStores({
|
|
384
|
+
path,
|
|
385
|
+
handler,
|
|
386
|
+
namespace: normalizedOptions?.namespace ?? options?.namespace
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Return the normalized route manifest built from registered route definitions.
|
|
391
|
+
*
|
|
392
|
+
* Pass this to `createSPA`, `hydrateSPA`, or `renderToString` as the
|
|
393
|
+
* authoritative routing input:
|
|
394
|
+
*
|
|
395
|
+
* ```ts
|
|
396
|
+
* import { getManifest } from '@askrjs/askr/router';
|
|
397
|
+
* await createSPA({ root: '#app', manifest: getManifest() });
|
|
398
|
+
* ```
|
|
399
|
+
*/
|
|
400
|
+
function getManifest() {
|
|
401
|
+
return {
|
|
402
|
+
records: [...records],
|
|
403
|
+
...defaultRouteAuthOptions ? { auth: defaultRouteAuthOptions } : {}
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Internal: apply a pre-built manifest to the runtime stores without running
|
|
408
|
+
* route() again. Called by createSPA / hydrateSPA when a manifest is passed.
|
|
409
|
+
*/
|
|
410
|
+
function _applyManifest(manifest) {
|
|
411
|
+
defaultRouteAuthOptions = manifest.auth;
|
|
412
|
+
for (const record of manifest.records) {
|
|
413
|
+
records.push(record);
|
|
414
|
+
addRouteToStores({
|
|
415
|
+
path: record.path,
|
|
416
|
+
handler: record.handler,
|
|
417
|
+
namespace: record.options.namespace
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
records.sort((a, b) => b.rank - a.rank);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Get all registered routes (flat list, insertion order).
|
|
424
|
+
* Prefer `getManifest()` when metadata (loader, policies, entries) is needed.
|
|
425
|
+
*/
|
|
426
|
+
function getRoutes() {
|
|
427
|
+
return [...routes];
|
|
428
|
+
}
|
|
429
|
+
/** Get routes for a specific namespace. */
|
|
430
|
+
function getNamespaceRoutes(namespace) {
|
|
431
|
+
return routes.filter((r) => r.namespace === namespace);
|
|
432
|
+
}
|
|
433
|
+
/** Unload all routes from a namespace (for MFE unmounting). */
|
|
434
|
+
function unloadNamespace(namespace) {
|
|
435
|
+
const before = routes.length;
|
|
436
|
+
for (let i = routes.length - 1; i >= 0; i--) if (routes[i].namespace === namespace) {
|
|
437
|
+
const removed = routes[i];
|
|
438
|
+
routes.splice(i, 1);
|
|
439
|
+
const depth = getDepth(removed.path);
|
|
440
|
+
const depthRoutes = routesByDepth.get(depth);
|
|
441
|
+
if (depthRoutes) {
|
|
442
|
+
const idx = depthRoutes.indexOf(removed);
|
|
443
|
+
if (idx >= 0) depthRoutes.splice(idx, 1);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
for (let i = records.length - 1; i >= 0; i--) if (records[i].options.namespace === namespace) records.splice(i, 1);
|
|
447
|
+
namespaces.delete(namespace);
|
|
448
|
+
return before - routes.length;
|
|
449
|
+
}
|
|
450
|
+
/** Clear all registered routes and records (testing / boot reset). */
|
|
451
|
+
function clearRoutes() {
|
|
452
|
+
routes.length = 0;
|
|
453
|
+
records.length = 0;
|
|
454
|
+
namespaces.clear();
|
|
455
|
+
routesByDepth.clear();
|
|
456
|
+
registrationScopeStack.length = 0;
|
|
457
|
+
registrationSessionStack.length = 0;
|
|
458
|
+
registrationLocked = false;
|
|
459
|
+
defaultRouteAuthOptions = void 0;
|
|
460
|
+
activeClientRouteAuthOptions = void 0;
|
|
461
|
+
setHasRoutes(false);
|
|
462
|
+
pendingLazy.clear();
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Get all loaded namespaces (MFE identifiers)
|
|
466
|
+
*/
|
|
467
|
+
function getLoadedNamespaces() {
|
|
468
|
+
return Array.from(namespaces);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Resolve a path to a route handler.
|
|
472
|
+
*
|
|
473
|
+
* Hot path: walks the module-level `records[]` array which is kept sorted by
|
|
474
|
+
* rank descending at registration time — so the first `matchSegments` hit is
|
|
475
|
+
* always the most specific match. No per-call allocations for the common
|
|
476
|
+
* case of purely-static routes.
|
|
477
|
+
*/
|
|
478
|
+
function resolveRoute(pathname) {
|
|
479
|
+
const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
|
|
480
|
+
const urlParts = normalized === "/" ? [] : normalized.split("/").filter(Boolean);
|
|
481
|
+
for (const record of records) {
|
|
482
|
+
const params = matchSegments(urlParts, record.segments);
|
|
483
|
+
if (params !== null) return {
|
|
484
|
+
handler: record.handler,
|
|
485
|
+
params
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
function getMatchingRecord(target, routeRecords) {
|
|
491
|
+
const location = parseLocation(target);
|
|
492
|
+
const normalized = location.pathname.endsWith("/") && location.pathname !== "/" ? location.pathname.slice(0, -1) : location.pathname;
|
|
493
|
+
const urlParts = normalized === "/" ? [] : normalized.split("/").filter(Boolean);
|
|
494
|
+
for (const record of routeRecords) {
|
|
495
|
+
const params = matchSegments(urlParts, record.segments);
|
|
496
|
+
if (params !== null) return {
|
|
497
|
+
record,
|
|
498
|
+
params
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
function getRoutePolicies(options) {
|
|
504
|
+
if (!options) return [];
|
|
505
|
+
if (options.policies?.length) return options.policies;
|
|
506
|
+
return compileNodePolicies(options);
|
|
507
|
+
}
|
|
508
|
+
function getDefaultRouteMode() {
|
|
509
|
+
if (typeof window !== "undefined") return "spa";
|
|
510
|
+
return "ssr";
|
|
511
|
+
}
|
|
512
|
+
function buildRenderResult(record, params) {
|
|
513
|
+
return {
|
|
514
|
+
kind: "render",
|
|
515
|
+
handler: record.handler,
|
|
516
|
+
params
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
function continueRoutePolicies(policies, context, record, params, startIndex = 0) {
|
|
520
|
+
for (let index = startIndex; index < policies.length; index += 1) {
|
|
521
|
+
const policyResult = policies[index](context);
|
|
522
|
+
if (isPromise(policyResult)) return policyResult.then((next) => {
|
|
523
|
+
if (next.kind !== "allow") return next;
|
|
524
|
+
return continueRoutePolicies(policies, context, record, params, index + 1);
|
|
525
|
+
});
|
|
526
|
+
if (policyResult.kind !== "allow") return policyResult;
|
|
527
|
+
}
|
|
528
|
+
return buildRenderResult(record, params);
|
|
529
|
+
}
|
|
530
|
+
function resolveRouteRequest(target, options = {}) {
|
|
531
|
+
const match = getMatchingRecord(target, options.manifest?.records ?? records);
|
|
532
|
+
if (!match) return null;
|
|
533
|
+
const { record, params } = match;
|
|
534
|
+
const policies = getRoutePolicies(record.options);
|
|
535
|
+
if (policies.length === 0) return buildRenderResult(record, params);
|
|
536
|
+
const signal = options.signal ?? getRenderContext()?.signal ?? new AbortController().signal;
|
|
537
|
+
const mode = options.mode ?? getDefaultRouteMode();
|
|
538
|
+
const auth = getActiveRouteAuthOptions(options.auth ?? options.manifest?.auth);
|
|
539
|
+
const baseContext = buildRouteContextBase(target, params, {
|
|
540
|
+
mode,
|
|
541
|
+
signal
|
|
542
|
+
});
|
|
543
|
+
const finalize = (authState) => continueRoutePolicies(policies, buildRouteContext(target, params, {
|
|
544
|
+
mode,
|
|
545
|
+
signal,
|
|
546
|
+
auth,
|
|
547
|
+
session: authState.session,
|
|
548
|
+
user: authState.user
|
|
549
|
+
}), record, params);
|
|
550
|
+
if (!auth?.resolve) return finalize({
|
|
551
|
+
session: null,
|
|
552
|
+
user: null
|
|
553
|
+
});
|
|
554
|
+
const authState = auth.resolve(baseContext);
|
|
555
|
+
if (isPromise(authState)) return authState.then((next) => finalize(next));
|
|
556
|
+
return finalize(authState);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Resolve a path against an explicit route list (e.g. an SSR per-render
|
|
560
|
+
* context). When called with the global `routes` array this delegates to
|
|
561
|
+
* the faster `resolveRoute` which uses pre-sorted `records[]`.
|
|
562
|
+
*
|
|
563
|
+
* For externally supplied lists the function:
|
|
564
|
+
* 1. Builds a rank-sorted copy of the list on first call and caches it
|
|
565
|
+
* in a WeakMap so subsequent resolutions against the same list pay
|
|
566
|
+
* zero sort cost.
|
|
567
|
+
* 2. Uses pre-parsed `ParsedSegment[]` from a WeakMap cache so no string
|
|
568
|
+
* splitting or segment parsing occurs on the hot path.
|
|
569
|
+
* 3. Uses a running-best with an early-exit once the sorted list reaches
|
|
570
|
+
* a rank that cannot beat the current best match.
|
|
571
|
+
*/
|
|
572
|
+
function resolveRouteFromRoutes(pathname, routeList) {
|
|
573
|
+
if (routeList === routes) return resolveRoute(pathname);
|
|
574
|
+
const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
|
|
575
|
+
const urlParts = normalized === "/" ? [] : normalized.split("/").filter(Boolean);
|
|
576
|
+
const sorted = cachedSortedList(routeList);
|
|
577
|
+
let bestHandler = null;
|
|
578
|
+
let bestParams = {};
|
|
579
|
+
let bestRank = -Infinity;
|
|
580
|
+
for (const r of sorted) {
|
|
581
|
+
const rank = cachedRank(r);
|
|
582
|
+
if (rank < bestRank) break;
|
|
583
|
+
if (bestHandler !== null && rank === bestRank) continue;
|
|
584
|
+
const params = matchSegments(urlParts, cachedSegs(r));
|
|
585
|
+
if (params !== null) {
|
|
586
|
+
bestHandler = r.handler;
|
|
587
|
+
bestParams = params;
|
|
588
|
+
bestRank = rank;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
return bestHandler !== null ? {
|
|
592
|
+
handler: bestHandler,
|
|
593
|
+
params: bestParams
|
|
594
|
+
} : null;
|
|
595
|
+
}
|
|
596
|
+
//#endregion
|
|
597
|
+
export { _applyManifest, _drainLazy, _setActiveRouteAuthOptions, _snapshotLazy, clearRoutes, currentRoute, fallback, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, lockRouteRegistration, registerRoutes, resolveRoute, resolveRouteFromRoutes, resolveRouteRequest, route, setServerLocation, unloadNamespace };
|
|
598
|
+
|
|
599
|
+
//# sourceMappingURL=route.js.map
|