@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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
//#region src/router/policy.ts
|
|
2
|
+
const ROUTE_AUTH_OPTIONS = Symbol.for("__ASKR_ROUTE_AUTH_OPTIONS__");
|
|
3
|
+
function isPromise(value) {
|
|
4
|
+
return value instanceof Promise;
|
|
5
|
+
}
|
|
6
|
+
function allow() {
|
|
7
|
+
return { kind: "allow" };
|
|
8
|
+
}
|
|
9
|
+
function redirect(to, init = {}) {
|
|
10
|
+
return {
|
|
11
|
+
kind: "redirect",
|
|
12
|
+
to,
|
|
13
|
+
...init.status ? { status: init.status } : {},
|
|
14
|
+
...init.replace !== void 0 ? { replace: init.replace } : {}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function deny(status) {
|
|
18
|
+
return {
|
|
19
|
+
kind: "deny",
|
|
20
|
+
status
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function unauthorized() {
|
|
24
|
+
return deny(401);
|
|
25
|
+
}
|
|
26
|
+
function forbidden() {
|
|
27
|
+
return deny(403);
|
|
28
|
+
}
|
|
29
|
+
function notFound() {
|
|
30
|
+
return deny(404);
|
|
31
|
+
}
|
|
32
|
+
function withRouteAuthOptions(context, auth) {
|
|
33
|
+
const internal = context;
|
|
34
|
+
if (!auth) {
|
|
35
|
+
delete internal[ROUTE_AUTH_OPTIONS];
|
|
36
|
+
return context;
|
|
37
|
+
}
|
|
38
|
+
internal[ROUTE_AUTH_OPTIONS] = auth;
|
|
39
|
+
return context;
|
|
40
|
+
}
|
|
41
|
+
function getRouteAuthOptions(context) {
|
|
42
|
+
return context[ROUTE_AUTH_OPTIONS];
|
|
43
|
+
}
|
|
44
|
+
function assertRouteAuthOptions(context) {
|
|
45
|
+
const auth = getRouteAuthOptions(context);
|
|
46
|
+
if (!auth?.resolve) throw new Error("Built-in auth policies require router auth configuration. Provide `auth` to registerRoutes(...), createSPA(...), hydrateSPA(...), or SSR route resolution.");
|
|
47
|
+
return auth;
|
|
48
|
+
}
|
|
49
|
+
function resolvePathSetting(value, fallback, context) {
|
|
50
|
+
if (!value) return fallback;
|
|
51
|
+
if (typeof value === "function") return value(context);
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function appendNextTarget(path, href) {
|
|
55
|
+
const resolved = new URL(path, "http://localhost");
|
|
56
|
+
resolved.searchParams.set("next", href);
|
|
57
|
+
return `${resolved.pathname}${resolved.search}${resolved.hash}`;
|
|
58
|
+
}
|
|
59
|
+
function collectStringValues(value) {
|
|
60
|
+
if (typeof value === "string") return [value];
|
|
61
|
+
if (Array.isArray(value)) return value.filter((entry) => typeof entry === "string");
|
|
62
|
+
if (value instanceof Set) return Array.from(value).filter((entry) => typeof entry === "string");
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
function defaultHasRole(user, role) {
|
|
66
|
+
if (!user || typeof user !== "object") return false;
|
|
67
|
+
return collectStringValues(user.roles).includes(role);
|
|
68
|
+
}
|
|
69
|
+
function defaultHasPermission(user, permission) {
|
|
70
|
+
if (!user || typeof user !== "object") return false;
|
|
71
|
+
return collectStringValues(user.permissions).includes(permission);
|
|
72
|
+
}
|
|
73
|
+
function resolveUnauthenticatedRedirect(context) {
|
|
74
|
+
const loginPath = resolvePathSetting(assertRouteAuthOptions(context).loginPath, "/login", context);
|
|
75
|
+
if (isPromise(loginPath)) return loginPath.then((nextPath) => redirect(appendNextTarget(nextPath, context.href), { replace: context.mode === "spa" }));
|
|
76
|
+
return redirect(appendNextTarget(loginPath, context.href), { replace: context.mode === "spa" });
|
|
77
|
+
}
|
|
78
|
+
function resolveAuthenticatedRedirect(context) {
|
|
79
|
+
const target = resolvePathSetting(assertRouteAuthOptions(context).guestRedirectTo, "/", context);
|
|
80
|
+
if (isPromise(target)) return target.then((nextTarget) => redirect(nextTarget, { replace: true }));
|
|
81
|
+
return redirect(target, { replace: true });
|
|
82
|
+
}
|
|
83
|
+
function requireAuth() {
|
|
84
|
+
return (context) => {
|
|
85
|
+
if (context.session) return allow();
|
|
86
|
+
return resolveUnauthenticatedRedirect(context);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function requireGuest() {
|
|
90
|
+
return (context) => {
|
|
91
|
+
if (!context.session) return allow();
|
|
92
|
+
return resolveAuthenticatedRedirect(context);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function requireRole(role) {
|
|
96
|
+
return (context) => {
|
|
97
|
+
if (!context.user) return resolveUnauthenticatedRedirect(context);
|
|
98
|
+
const auth = assertRouteAuthOptions(context);
|
|
99
|
+
const hasRole = auth.hasRole ? auth.hasRole(context.user, role, context) : defaultHasRole(context.user, role);
|
|
100
|
+
if (isPromise(hasRole)) return hasRole.then((next) => next ? allow() : forbidden());
|
|
101
|
+
return hasRole ? allow() : forbidden();
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function requirePermission(permission) {
|
|
105
|
+
return (context) => {
|
|
106
|
+
if (!context.user) return resolveUnauthenticatedRedirect(context);
|
|
107
|
+
const auth = assertRouteAuthOptions(context);
|
|
108
|
+
const hasPermission = auth.hasPermission ? auth.hasPermission(context.user, permission, context) : defaultHasPermission(context.user, permission);
|
|
109
|
+
if (isPromise(hasPermission)) return hasPermission.then((next) => next ? allow() : forbidden());
|
|
110
|
+
return hasPermission ? allow() : forbidden();
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { allow, deny, forbidden, notFound, redirect, requireAuth, requireGuest, requirePermission, requireRole, unauthorized, withRouteAuthOptions };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","names":[],"sources":["../../src/router/policy.ts"],"sourcesContent":["import type {\n AccessDecision,\n AccessDenyStatus,\n AccessRedirectStatus,\n RouteAuthOptions,\n RouteContext,\n RoutePolicy,\n} from '../common/router';\n\nconst ROUTE_AUTH_OPTIONS = Symbol.for('__ASKR_ROUTE_AUTH_OPTIONS__');\n\ntype InternalRouteContext = RouteContext & {\n [ROUTE_AUTH_OPTIONS]?: RouteAuthOptions;\n};\n\ntype RoutePathResolver =\n | string\n | ((context: RouteContext) => string | Promise<string>);\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return value instanceof Promise;\n}\n\nexport function allow(): AccessDecision {\n return { kind: 'allow' };\n}\n\nexport function redirect(\n to: string,\n init: {\n status?: AccessRedirectStatus;\n replace?: boolean;\n } = {}\n): AccessDecision {\n return {\n kind: 'redirect',\n to,\n ...(init.status ? { status: init.status } : {}),\n ...(init.replace !== undefined ? { replace: init.replace } : {}),\n };\n}\n\nexport function deny(status: AccessDenyStatus): AccessDecision {\n return { kind: 'deny', status };\n}\n\nexport function unauthorized(): AccessDecision {\n return deny(401);\n}\n\nexport function forbidden(): AccessDecision {\n return deny(403);\n}\n\nexport function notFound(): AccessDecision {\n return deny(404);\n}\n\nexport function normalizeAccessDecision(\n result: AccessDecision\n): AccessDecision {\n return result;\n}\n\nexport function withRouteAuthOptions(\n context: RouteContext,\n auth: RouteAuthOptions | undefined\n): RouteContext {\n const internal = context as InternalRouteContext;\n\n if (!auth) {\n delete internal[ROUTE_AUTH_OPTIONS];\n return context;\n }\n\n internal[ROUTE_AUTH_OPTIONS] = auth;\n return context;\n}\n\nfunction getRouteAuthOptions(\n context: RouteContext\n): RouteAuthOptions | undefined {\n return (context as InternalRouteContext)[ROUTE_AUTH_OPTIONS];\n}\n\nfunction assertRouteAuthOptions(context: RouteContext): RouteAuthOptions {\n const auth = getRouteAuthOptions(context);\n if (!auth?.resolve) {\n throw new Error(\n 'Built-in auth policies require router auth configuration. ' +\n 'Provide `auth` to registerRoutes(...), createSPA(...), hydrateSPA(...), or SSR route resolution.'\n );\n }\n\n return auth;\n}\n\nfunction resolvePathSetting(\n value: RoutePathResolver | undefined,\n fallback: string,\n context: RouteContext\n): string | Promise<string> {\n if (!value) {\n return fallback;\n }\n\n if (typeof value === 'function') {\n return value(context);\n }\n\n return value;\n}\n\nfunction appendNextTarget(path: string, href: string): string {\n const resolved = new URL(path, 'http://localhost');\n resolved.searchParams.set('next', href);\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nfunction collectStringValues(value: unknown): string[] {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string');\n }\n\n if (value instanceof Set) {\n return Array.from(value).filter(\n (entry): entry is string => typeof entry === 'string'\n );\n }\n\n return [];\n}\n\nfunction defaultHasRole(user: unknown, role: string): boolean {\n if (!user || typeof user !== 'object') {\n return false;\n }\n\n return collectStringValues((user as { roles?: unknown }).roles).includes(\n role\n );\n}\n\nfunction defaultHasPermission(user: unknown, permission: string): boolean {\n if (!user || typeof user !== 'object') {\n return false;\n }\n\n return collectStringValues(\n (user as { permissions?: unknown }).permissions\n ).includes(permission);\n}\n\nfunction resolveUnauthenticatedRedirect(\n context: RouteContext\n): AccessDecision | Promise<AccessDecision> {\n const auth = assertRouteAuthOptions(context);\n const loginPath = resolvePathSetting(auth.loginPath, '/login', context);\n if (isPromise(loginPath)) {\n return loginPath.then((nextPath) =>\n redirect(appendNextTarget(nextPath, context.href), {\n replace: context.mode === 'spa',\n })\n );\n }\n\n return redirect(appendNextTarget(loginPath, context.href), {\n replace: context.mode === 'spa',\n });\n}\n\nfunction resolveAuthenticatedRedirect(\n context: RouteContext\n): AccessDecision | Promise<AccessDecision> {\n const auth = assertRouteAuthOptions(context);\n const target = resolvePathSetting(auth.guestRedirectTo, '/', context);\n if (isPromise(target)) {\n return target.then((nextTarget) =>\n redirect(nextTarget, {\n replace: true,\n })\n );\n }\n\n return redirect(target, {\n replace: true,\n });\n}\n\nexport function requireAuth(): RoutePolicy {\n return (context) => {\n if (context.session) {\n return allow();\n }\n\n return resolveUnauthenticatedRedirect(context);\n };\n}\n\nexport function requireGuest(): RoutePolicy {\n return (context) => {\n if (!context.session) {\n return allow();\n }\n\n return resolveAuthenticatedRedirect(context);\n };\n}\n\nexport function requireRole(role: string): RoutePolicy {\n return (context) => {\n if (!context.user) {\n return resolveUnauthenticatedRedirect(context);\n }\n\n const auth = assertRouteAuthOptions(context);\n const hasRole = auth.hasRole\n ? auth.hasRole(context.user, role, context)\n : defaultHasRole(context.user, role);\n\n if (isPromise(hasRole)) {\n return hasRole.then((next) => (next ? allow() : forbidden()));\n }\n\n return hasRole ? allow() : forbidden();\n };\n}\n\nexport function requirePermission(permission: string): RoutePolicy {\n return (context) => {\n if (!context.user) {\n return resolveUnauthenticatedRedirect(context);\n }\n\n const auth = assertRouteAuthOptions(context);\n const hasPermission = auth.hasPermission\n ? auth.hasPermission(context.user, permission, context)\n : defaultHasPermission(context.user, permission);\n\n if (isPromise(hasPermission)) {\n return hasPermission.then((next) => (next ? allow() : forbidden()));\n }\n\n return hasPermission ? allow() : forbidden();\n };\n}\n\nexport async function evaluateRoutePolicy(\n policy: RoutePolicy,\n context: RouteContext\n): Promise<AccessDecision> {\n const result = await policy(context);\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { withRouteAuthOptions } from "./policy.js";
|
|
2
|
+
//#region src/router/route-context.ts
|
|
3
|
+
function parseLocation(url) {
|
|
4
|
+
try {
|
|
5
|
+
const parsedUrl = new URL(url, "http://localhost");
|
|
6
|
+
return {
|
|
7
|
+
pathname: parsedUrl.pathname,
|
|
8
|
+
search: parsedUrl.search,
|
|
9
|
+
hash: parsedUrl.hash
|
|
10
|
+
};
|
|
11
|
+
} catch {
|
|
12
|
+
return {
|
|
13
|
+
pathname: "/",
|
|
14
|
+
search: "",
|
|
15
|
+
hash: ""
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function deepFreeze(obj) {
|
|
20
|
+
if (obj && typeof obj === "object" && !Object.isFrozen(obj)) {
|
|
21
|
+
Object.freeze(obj);
|
|
22
|
+
for (const key of Object.keys(obj)) {
|
|
23
|
+
const value = obj[key];
|
|
24
|
+
if (value && typeof value === "object") deepFreeze(value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
function makeQuery(search) {
|
|
30
|
+
const searchParams = new URLSearchParams(search || "");
|
|
31
|
+
const mapping = /* @__PURE__ */ new Map();
|
|
32
|
+
for (const [key, value] of searchParams.entries()) {
|
|
33
|
+
const existing = mapping.get(key);
|
|
34
|
+
if (existing) existing.push(value);
|
|
35
|
+
else mapping.set(key, [value]);
|
|
36
|
+
}
|
|
37
|
+
return deepFreeze({
|
|
38
|
+
get(key) {
|
|
39
|
+
const values = mapping.get(key);
|
|
40
|
+
return values ? values[0] : null;
|
|
41
|
+
},
|
|
42
|
+
getAll(key) {
|
|
43
|
+
const values = mapping.get(key);
|
|
44
|
+
return values ? [...values] : [];
|
|
45
|
+
},
|
|
46
|
+
has(key) {
|
|
47
|
+
return mapping.has(key);
|
|
48
|
+
},
|
|
49
|
+
toJSON() {
|
|
50
|
+
const output = {};
|
|
51
|
+
for (const [key, values] of mapping.entries()) output[key] = values.length > 1 ? [...values] : values[0];
|
|
52
|
+
return output;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function buildRouteContextBase(target, params, options) {
|
|
57
|
+
const parsed = parseLocation(target);
|
|
58
|
+
const href = `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
59
|
+
return {
|
|
60
|
+
mode: options.mode,
|
|
61
|
+
params,
|
|
62
|
+
pathname: parsed.pathname,
|
|
63
|
+
search: parsed.search,
|
|
64
|
+
hash: parsed.hash,
|
|
65
|
+
href,
|
|
66
|
+
signal: options.signal
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function buildRouteContext(target, params, options) {
|
|
70
|
+
return withRouteAuthOptions({
|
|
71
|
+
...buildRouteContextBase(target, params, options),
|
|
72
|
+
session: options.session ?? null,
|
|
73
|
+
user: options.user ?? null
|
|
74
|
+
}, options.auth);
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { buildRouteContext, buildRouteContextBase, deepFreeze, makeQuery, parseLocation };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=route-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-context.js","names":[],"sources":["../../src/router/route-context.ts"],"sourcesContent":["import { withRouteAuthOptions } from './policy';\n\nimport type {\n RouteAuthOptions,\n RouteContext,\n RouteQuery,\n} from '../common/router';\n\nexport function parseLocation(url: string): {\n pathname: string;\n search: string;\n hash: string;\n} {\n try {\n const parsedUrl = new URL(url, 'http://localhost');\n return {\n pathname: parsedUrl.pathname,\n search: parsedUrl.search,\n hash: parsedUrl.hash,\n };\n } catch {\n return { pathname: '/', search: '', hash: '' };\n }\n}\n\nexport function deepFreeze<T>(obj: T): T {\n if (obj && typeof obj === 'object' && !Object.isFrozen(obj)) {\n Object.freeze(obj as Record<string, unknown>);\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n const value = (obj as Record<string, unknown>)[key];\n if (value && typeof value === 'object') {\n deepFreeze(value);\n }\n }\n }\n\n return obj;\n}\n\nexport function makeQuery(search: string): RouteQuery {\n const searchParams = new URLSearchParams(search || '');\n const mapping = new Map<string, string[]>();\n\n for (const [key, value] of searchParams.entries()) {\n const existing = mapping.get(key);\n if (existing) {\n existing.push(value);\n } else {\n mapping.set(key, [value]);\n }\n }\n\n const query: RouteQuery = {\n get(key: string) {\n const values = mapping.get(key);\n return values ? values[0] : null;\n },\n getAll(key: string) {\n const values = mapping.get(key);\n return values ? [...values] : [];\n },\n has(key: string) {\n return mapping.has(key);\n },\n toJSON() {\n const output: Record<string, string | string[]> = {};\n for (const [key, values] of mapping.entries()) {\n output[key] = values.length > 1 ? [...values] : values[0];\n }\n return output;\n },\n };\n\n return deepFreeze(query);\n}\n\nexport function buildRouteContextBase(\n target: string,\n params: Record<string, string>,\n options: {\n mode: RouteContext['mode'];\n signal: AbortSignal;\n }\n): Omit<RouteContext, 'session' | 'user'> {\n const parsed = parseLocation(target);\n const href = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n\n return {\n mode: options.mode,\n params,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n href,\n signal: options.signal,\n };\n}\n\nexport function buildRouteContext(\n target: string,\n params: Record<string, string>,\n options: {\n mode: RouteContext['mode'];\n signal: AbortSignal;\n auth?: RouteAuthOptions;\n session?: unknown;\n user?: unknown;\n }\n): RouteContext {\n const context: RouteContext = {\n ...buildRouteContextBase(target, params, options),\n session: options.session ?? null,\n user: options.user ?? null,\n };\n\n return withRouteAuthOptions(context, options.auth);\n}\n"],"mappings":";;AAQA,SAAgB,cAAc,KAI5B;AACA,KAAI;EACF,MAAM,YAAY,IAAI,IAAI,KAAK,mBAAmB;AAClD,SAAO;GACL,UAAU,UAAU;GACpB,QAAQ,UAAU;GAClB,MAAM,UAAU;GACjB;SACK;AACN,SAAO;GAAE,UAAU;GAAK,QAAQ;GAAI,MAAM;GAAI;;;AAIlD,SAAgB,WAAc,KAAW;AACvC,KAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI,EAAE;AAC3D,SAAO,OAAO,IAA+B;AAC7C,OAAK,MAAM,OAAO,OAAO,KAAK,IAA+B,EAAE;GAC7D,MAAM,QAAS,IAAgC;AAC/C,OAAI,SAAS,OAAO,UAAU,SAC5B,YAAW,MAAM;;;AAKvB,QAAO;;AAGT,SAAgB,UAAU,QAA4B;CACpD,MAAM,eAAe,IAAI,gBAAgB,UAAU,GAAG;CACtD,MAAM,0BAAU,IAAI,KAAuB;AAE3C,MAAK,MAAM,CAAC,KAAK,UAAU,aAAa,SAAS,EAAE;EACjD,MAAM,WAAW,QAAQ,IAAI,IAAI;AACjC,MAAI,SACF,UAAS,KAAK,MAAM;MAEpB,SAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;;AAyB7B,QAAO,WAAW;EApBhB,IAAI,KAAa;GACf,MAAM,SAAS,QAAQ,IAAI,IAAI;AAC/B,UAAO,SAAS,OAAO,KAAK;;EAE9B,OAAO,KAAa;GAClB,MAAM,SAAS,QAAQ,IAAI,IAAI;AAC/B,UAAO,SAAS,CAAC,GAAG,OAAO,GAAG,EAAE;;EAElC,IAAI,KAAa;AACf,UAAO,QAAQ,IAAI,IAAI;;EAEzB,SAAS;GACP,MAAM,SAA4C,EAAE;AACpD,QAAK,MAAM,CAAC,KAAK,WAAW,QAAQ,SAAS,CAC3C,QAAO,OAAO,OAAO,SAAS,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO;AAEzD,UAAO;;EAIO,CAAM;;AAG1B,SAAgB,sBACd,QACA,QACA,SAIwC;CACxC,MAAM,SAAS,cAAc,OAAO;CACpC,MAAM,OAAO,GAAG,OAAO,WAAW,OAAO,SAAS,OAAO;AAEzD,QAAO;EACL,MAAM,QAAQ;EACd;EACA,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf,MAAM,OAAO;EACb;EACA,QAAQ,QAAQ;EACjB;;AAGH,SAAgB,kBACd,QACA,QACA,SAOc;AAOd,QAAO,qBAAqB;EAL1B,GAAG,sBAAsB,QAAQ,QAAQ,QAAQ;EACjD,SAAS,QAAQ,WAAW;EAC5B,MAAM,QAAQ,QAAQ;EAGI,EAAS,QAAQ,KAAK"}
|
package/dist/router/route.d.ts
CHANGED
|
@@ -1,53 +1,120 @@
|
|
|
1
|
+
import { AccessDecision, AccessDenyDecision, AccessRedirectDecision, GroupHelperOptions, LayoutScopeRecord, ParsedSegment, RegisterRoutesOptions, ResolvedRoute, Route, RouteAuthOptions, RouteComponent, RouteContext, RouteDefinition, RouteHandler, RouteManifest, RouteMatch, RouteOptions, RoutePolicy, RouteQuery, RouteRecord, RouteRenderResult, RouteRequestOptions, RouteRequestResult, RouteSnapshot } from "../common/router.js";
|
|
2
|
+
|
|
3
|
+
//#region src/router/route.d.ts
|
|
4
|
+
declare function setServerLocation(url: string | null): void;
|
|
5
|
+
declare function _setActiveRouteAuthOptions(auth: RouteAuthOptions | undefined): void;
|
|
6
|
+
declare function lockRouteRegistration(): void;
|
|
7
|
+
declare function _lockRouteRegistrationForTests(): void;
|
|
8
|
+
declare function _unlockRouteRegistrationForTests(): void;
|
|
1
9
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
10
|
+
* Snapshot the current in-flight lazy() imports.
|
|
11
|
+
* Boot uses this before clearing route state so manifest-based startup can
|
|
12
|
+
* still await chunks that were kicked off during route module evaluation.
|
|
13
|
+
*/
|
|
14
|
+
declare function _snapshotLazy(): Promise<unknown>[];
|
|
15
|
+
/**
|
|
16
|
+
* Declare a code-split route component. The `import()` fires immediately at
|
|
17
|
+
* module evaluation time (creating a bundler split point), and the resolved
|
|
18
|
+
* chunk is guaranteed to be available before the app mounts — so the renderer
|
|
19
|
+
* always receives a plain synchronous function.
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* registerRoutes(() => {
|
|
23
|
+
* group({ layout: AppLayout }, () => {
|
|
24
|
+
* route('/', lazy(() => import('./pages/landing')));
|
|
25
|
+
* route('/dashboard', lazy(() => import('./pages/dashboard')));
|
|
26
|
+
* });
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
4
29
|
*
|
|
5
|
-
*
|
|
30
|
+
* The module must export the component as its **default** export:
|
|
31
|
+
* ```ts
|
|
32
|
+
* // pages/dashboard.tsx
|
|
33
|
+
* export default function DashboardPage() { … }
|
|
34
|
+
* ```
|
|
6
35
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export declare function lockRouteRegistration(): void;
|
|
11
|
-
export declare function _lockRouteRegistrationForTests(): void;
|
|
12
|
-
export declare function _unlockRouteRegistrationForTests(): void;
|
|
13
|
-
export declare function route(): RouteSnapshot;
|
|
14
|
-
export declare function route(path: string, handler?: RouteHandler, namespace?: string): void;
|
|
36
|
+
declare function lazy(factory: () => Promise<{
|
|
37
|
+
default: RouteComponent;
|
|
38
|
+
} | RouteComponent>): RouteComponent;
|
|
15
39
|
/**
|
|
16
|
-
*
|
|
40
|
+
* Wait for all pending `lazy()` imports to settle.
|
|
41
|
+
* Called automatically by `createSPA` / `hydrateSPA` before mounting.
|
|
17
42
|
*/
|
|
18
|
-
|
|
43
|
+
declare function _drainLazy(additionalPending?: Iterable<Promise<unknown>>): Promise<void>;
|
|
44
|
+
declare function group(options: GroupHelperOptions, fn: RouteDefinition): void;
|
|
45
|
+
declare function fallback(Component: RouteComponent): void;
|
|
46
|
+
declare function registerRoutes(definition: RouteDefinition, options?: RegisterRoutesOptions): void;
|
|
47
|
+
declare function currentRoute(): RouteSnapshot;
|
|
19
48
|
/**
|
|
20
|
-
*
|
|
49
|
+
* Register a route.
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* route('/posts/{slug}', PostPage, {
|
|
53
|
+
* loader: ({ params }) => getPost(params.slug),
|
|
54
|
+
* entries: async () => getPosts().map(p => ({ slug: p.slug })),
|
|
55
|
+
* title: 'Post',
|
|
56
|
+
* policies:[requireAuth()],
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
21
59
|
*/
|
|
22
|
-
|
|
60
|
+
declare function route(path: string, Component: RouteComponent, options?: RouteOptions): void;
|
|
23
61
|
/**
|
|
24
|
-
*
|
|
62
|
+
* Return the normalized route manifest built from registered route definitions.
|
|
63
|
+
*
|
|
64
|
+
* Pass this to `createSPA`, `hydrateSPA`, or `renderToString` as the
|
|
65
|
+
* authoritative routing input:
|
|
66
|
+
*
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { getManifest } from '@askrjs/askr/router';
|
|
69
|
+
* await createSPA({ root: '#app', manifest: getManifest() });
|
|
70
|
+
* ```
|
|
25
71
|
*/
|
|
26
|
-
|
|
72
|
+
declare function getManifest(): RouteManifest;
|
|
27
73
|
/**
|
|
28
|
-
*
|
|
74
|
+
* Internal: apply a pre-built manifest to the runtime stores without running
|
|
75
|
+
* route() again. Called by createSPA / hydrateSPA when a manifest is passed.
|
|
29
76
|
*/
|
|
30
|
-
|
|
77
|
+
declare function _applyManifest(manifest: RouteManifest): void;
|
|
31
78
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* Note: `registerRouteTree` helper was removed; prefer explicit `route()` registrations.
|
|
79
|
+
* Get all registered routes (flat list, insertion order).
|
|
80
|
+
* Prefer `getManifest()` when metadata (loader, policies, entries) is needed.
|
|
35
81
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
82
|
+
declare function getRoutes(): Route[];
|
|
83
|
+
/** Get routes for a specific namespace. */
|
|
84
|
+
declare function getNamespaceRoutes(namespace: string): Route[];
|
|
85
|
+
/** Unload all routes from a namespace (for MFE unmounting). */
|
|
86
|
+
declare function unloadNamespace(namespace: string): number;
|
|
87
|
+
/** Clear all registered routes and records (testing / boot reset). */
|
|
88
|
+
declare function clearRoutes(): void;
|
|
43
89
|
/**
|
|
44
90
|
* Get all loaded namespaces (MFE identifiers)
|
|
45
91
|
*/
|
|
46
|
-
|
|
92
|
+
declare function getLoadedNamespaces(): string[];
|
|
47
93
|
/**
|
|
48
|
-
* Resolve a path to a route handler
|
|
49
|
-
*
|
|
94
|
+
* Resolve a path to a route handler.
|
|
95
|
+
*
|
|
96
|
+
* Hot path: walks the module-level `records[]` array which is kept sorted by
|
|
97
|
+
* rank descending at registration time — so the first `matchSegments` hit is
|
|
98
|
+
* always the most specific match. No per-call allocations for the common
|
|
99
|
+
* case of purely-static routes.
|
|
100
|
+
*/
|
|
101
|
+
declare function resolveRoute(pathname: string): ResolvedRoute | null;
|
|
102
|
+
declare function resolveRouteRequest(target: string, options?: RouteRequestOptions): RouteRequestResult | Promise<RouteRequestResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Resolve a path against an explicit route list (e.g. an SSR per-render
|
|
105
|
+
* context). When called with the global `routes` array this delegates to
|
|
106
|
+
* the faster `resolveRoute` which uses pre-sorted `records[]`.
|
|
107
|
+
*
|
|
108
|
+
* For externally supplied lists the function:
|
|
109
|
+
* 1. Builds a rank-sorted copy of the list on first call and caches it
|
|
110
|
+
* in a WeakMap so subsequent resolutions against the same list pay
|
|
111
|
+
* zero sort cost.
|
|
112
|
+
* 2. Uses pre-parsed `ParsedSegment[]` from a WeakMap cache so no string
|
|
113
|
+
* splitting or segment parsing occurs on the hot path.
|
|
114
|
+
* 3. Uses a running-best with an early-exit once the sorted list reaches
|
|
115
|
+
* a rank that cannot beat the current best match.
|
|
50
116
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
117
|
+
declare function resolveRouteFromRoutes(pathname: string, routeList: readonly Route[]): ResolvedRoute | null;
|
|
118
|
+
//#endregion
|
|
119
|
+
export { _applyManifest, _drainLazy, clearRoutes, currentRoute, fallback, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, registerRoutes, resolveRouteRequest, route, setServerLocation, unloadNamespace };
|
|
53
120
|
//# sourceMappingURL=route.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","
|
|
1
|
+
{"version":3,"file":"route.d.ts","names":[],"sources":["../../src/router/route.ts"],"mappings":";;;iBAiMgB,iBAAA,CAAkB,GAAA;AAAA,iBAuElB,0BAAA,CACd,IAAA,EAAM,gBAAA;AAAA,iBAwDQ,qBAAA,CAAA;AAAA,iBAIA,8BAAA,CAAA;AAAA,iBAIA,gCAAA,CAAA;AAJhB;;;;;AAAA,iBA6EgB,aAAA,CAAA,GAAiB,OAAA;;;;;AAAjC;;;;;AAyBA;;;;;;;;;;;;iBAAgB,IAAA,CACd,OAAA,QAAe,OAAA;EAAU,OAAA,EAAS,cAAA;AAAA,IAAmB,cAAA,IACpD,cAAA;;;AAmCH;;iBAAgB,UAAA,CACd,iBAAA,GAAmB,QAAA,CAAS,OAAA,aAC3B,OAAA;AAAA,iBASa,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,EAAA,EAAI,eAAA;AAAA,iBAKvC,QAAA,CAAS,SAAA,EAAW,cAAA;AAAA,iBAmLpB,cAAA,CACd,UAAA,EAAY,eAAA,EACZ,OAAA,GAAS,qBAAA;AAAA,iBAoEK,YAAA,CAAA,GAAgB,aAAA;;;;;;;;AA9PhC;;;;;iBA8QgB,KAAA,CACd,IAAA,UACA,SAAA,EAAW,cAAA,EACX,OAAA,GAAU,YAAA;;;;;AA5QZ;;;;;AAmLA;;iBAyMgB,WAAA,CAAA,GAAe,aAAA;;;;;iBAWf,cAAA,CAAe,QAAA,EAAU,aAAA;;;AA9IzC;;iBAoKgB,SAAA,CAAA,GAAa,KAAA;;iBAKb,kBAAA,CAAmB,SAAA,WAAoB,KAAA;AAzJvD;AAAA,iBA8JgB,eAAA,CAAgB,SAAA;;iBA6BhB,WAAA,CAAA;;;;iBAiBA,mBAAA,CAAA;;;;AAzFhB;;;;;iBAqGgB,YAAA,CAAa,QAAA,WAAmB,aAAA;AAAA,iBA0GhC,mBAAA,CACd,MAAA,UACA,OAAA,GAAS,mBAAA,GACR,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;;;;AAjLhC;;;;;AAKA;;;;;AAKA;iBA2OgB,sBAAA,CACd,QAAA,UACA,SAAA,WAAoB,KAAA,KACnB,aAAA"}
|