@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 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/renderer/utils.ts"],"sourcesContent":["/**\n * Shared utilities for the renderer module.\n * Consolidates common patterns to reduce code duplication.\n */\n\nimport { globalScheduler } from '../runtime/scheduler';\nimport { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ListenerEntry {\n handler: EventListener;\n original: EventListener;\n options?: boolean | AddEventListenerOptions;\n updateHandler?: (nextHandler: EventListener) => void;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Handler Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Handler pooling cache to avoid recreating wrapped handlers\n// Key: handler reference, Value: { wrapped: EventListener, flushAfter: boolean }\nconst handlerCache = new WeakMap<EventListener, Map<boolean, EventListener>>();\nlet cacheSize = 0;\nconst MAX_CACHE_SIZE = 1000;\n\n/**\n * Parse an event prop name (e.g., 'onClick') to its DOM event name (e.g., 'click')\n */\nexport function parseEventName(propName: string): string | null {\n if (!propName.startsWith('on') || propName.length <= 2) return null;\n return (\n propName.slice(2).charAt(0).toLowerCase() + propName.slice(3).toLowerCase()\n );\n}\n\n/**\n * Get default event listener options for passive events\n */\nexport function getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\n/**\n * Create a wrapped event handler that integrates with the scheduler\n * Uses caching to avoid recreating wrappers for the same handler\n */\nexport function createWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): EventListener {\n // Check cache first\n const cachedByFlush = handlerCache.get(handler);\n if (cachedByFlush) {\n const cached = cachedByFlush.get(flushAfter);\n if (cached) return cached;\n }\n\n const wrapped: EventListener = (event: Event) => {\n try {\n globalScheduler.runInHandlerScope(\n () => {\n try {\n handler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n // Cache the wrapped handler\n try {\n if (!handlerCache.has(handler)) {\n // Limit cache size to prevent memory leaks\n if (cacheSize >= MAX_CACHE_SIZE) {\n // Simple eviction - just don't cache new entries when full\n } else {\n cacheSize++;\n handlerCache.set(handler, new Map());\n }\n }\n handlerCache.get(handler)?.set(flushAfter, wrapped);\n } catch {\n // WeakMap can throw if handler is not a valid key\n }\n\n return wrapped;\n}\n\nexport function createMutableWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): {\n handler: EventListener;\n updateHandler: (nextHandler: EventListener) => void;\n} {\n let currentHandler = handler;\n\n const wrapped: EventListener = (event: Event) => {\n try {\n globalScheduler.runInHandlerScope(\n () => {\n try {\n currentHandler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n return {\n handler: wrapped,\n updateHandler(nextHandler: EventListener) {\n currentHandler = nextHandler;\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Prop/Attribute Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Props that should be skipped during attribute processing */\nexport function isSkippedProp(key: string): boolean {\n return key === 'children' || key === 'key' || key === 'ref';\n}\n\n/** Check if prop should be ignored for prop-change detection */\nexport function isIgnoredForPropChanges(key: string): boolean {\n if (key === 'children' || key === 'key') return true;\n if (key.startsWith('on') && key.length > 2) return true;\n if (key.startsWith('data-')) return true;\n return false;\n}\n\n/**\n * Check if an element's current attribute value differs from vnode value\n */\nexport function hasPropChanged(\n el: Element,\n key: string,\n value: unknown\n): boolean {\n try {\n if (key === 'class' || key === 'className') {\n return readElementClassName(el) !== String(value);\n }\n if (key === 'value' || key === 'checked') {\n return (el as HTMLElement & Record<string, unknown>)[key] !== value;\n }\n const attr = el.getAttribute(key);\n if (value === undefined || value === null || value === false) {\n return attr !== null;\n }\n return String(value) !== attr;\n } catch {\n return true;\n }\n}\n\nexport function isSVGDomElement(el: Element): el is SVGElement {\n return typeof SVGElement !== 'undefined' && el instanceof SVGElement;\n}\n\nexport function readElementClassName(el: Element): string {\n if (isSVGDomElement(el)) {\n return el.getAttribute('class') ?? '';\n }\n\n return (el as HTMLElement).className;\n}\n\nexport function writeElementClassName(el: Element, value: string): void {\n if (isSVGDomElement(el)) {\n if (value.length > 0) {\n el.setAttribute('class', value);\n } else {\n el.removeAttribute('class');\n }\n return;\n }\n\n (el as HTMLElement).className = value;\n}\n\nexport function tagNamesEqualIgnoreCase(a: string, b: string): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index += 1) {\n const aCode = a.charCodeAt(index);\n const bCode = b.charCodeAt(index);\n if (aCode === bCode) continue;\n\n const normalizedA = aCode >= 65 && aCode <= 90 ? aCode + 32 : aCode;\n const normalizedB = bCode >= 65 && bCode <= 90 ? bCode + 32 : bCode;\n if (normalizedA !== normalizedB) return false;\n }\n\n return true;\n}\n\n/**\n * Check if a vnode has non-trivial props (excluding events and data-*)\n */\nexport function hasNonTrivialProps(props: Record<string, unknown>): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n return true;\n }\n return false;\n}\n\n/**\n * Check for prop changes between vnode and existing element\n */\nexport function checkPropChanges(\n el: Element,\n props: Record<string, unknown>\n): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n return false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extract key from a vnode object\n */\nexport function extractKey(vnode: unknown): string | number | undefined {\n if (typeof vnode !== 'object' || vnode === null) return undefined;\n const obj = vnode as Record<string, unknown>;\n const rawKey =\n obj.key ?? (obj.props as Record<string, unknown> | undefined)?.key;\n if (rawKey === undefined || rawKey === null) return undefined;\n return typeof rawKey === 'symbol'\n ? String(rawKey)\n : (rawKey as string | number);\n}\n\n/**\n * Build a key map from element's children\n */\nexport function buildKeyMapFromChildren(\n parent: Element\n): Map<string | number, Element> {\n const map = new Map<string | number, Element>();\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n map.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, ch);\n }\n }\n return map;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Diagnostic Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Record DOM replace operation for diagnostics\n */\nexport function recordDOMReplace(source: string): void {\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(`__LAST_DOM_REPLACE_STACK_${source}`, new Error().stack);\n } catch {\n // ignore\n }\n}\n\n/**\n * Record fast-path stats for diagnostics\n */\nexport function recordFastPathStats(\n stats: Record<string, unknown>,\n counterName?: string\n): void {\n try {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n if (counterName) {\n incDevCounter(counterName);\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Conditionally log debug info for fast-path operations\n */\nexport function logFastPathDebug(\n message: string,\n indexOrData?: number | unknown,\n data?: unknown\n): void {\n const env = getRuntimeEnv();\n if (env.ASKR_FASTPATH_DEBUG === '1' || env.ASKR_FASTPATH_DEBUG === 'true') {\n if (data !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData, data);\n } else if (indexOrData !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData);\n } else {\n logger.warn(`[Askr][FASTPATH] ${message}`);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get current high-resolution timestamp\n */\nexport function now(): number {\n return typeof performance !== 'undefined' && performance.now\n ? performance.now()\n : Date.now();\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* This tier exists to make async data intent explicit in import paths.
|
|
5
|
-
*/
|
|
6
|
-
export { resource } from '../runtime/operations';
|
|
7
|
-
export type { ResourceResult as DataResult } from '../runtime/operations';
|
|
8
|
-
export { getSignal } from '../runtime/component';
|
|
9
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
import { getSignal } from "../runtime/component.js";
|
|
2
|
+
import { ResourceResult, capture, on, resource, stream, task, timer } from "../runtime/operations.js";
|
|
3
|
+
export { type ResourceResult, capture, getSignal, on, resource, stream, task, timer };
|
package/dist/resources/index.js
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { getSignal } from "../runtime/component.js";
|
|
2
|
+
import { capture, on, resource, stream, task, timer } from "../runtime/operations.js";
|
|
3
|
+
export { capture, getSignal, on, resource, stream, task, timer };
|
package/dist/router/index.d.ts
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { navigate
|
|
7
|
-
export { Link } from '../components/link';
|
|
8
|
-
export type { LinkProps } from '../components/link';
|
|
9
|
-
export { layout } from '../foundations/structures/layout';
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
import { AccessDecision, AccessDenyDecision, AccessRedirectDecision, GroupHelperOptions, LayoutScopeRecord, ParsedSegment, RegisterRoutesOptions, Route, RouteAuthMode, RouteAuthOptions, RouteAuthResolver, RouteAuthState, RouteComponent, RouteContext, RouteDefinition, RouteHandler, RouteManifest, RouteMatch, RouteMode, RouteOptions, RoutePolicy, RouteQuery, RouteRecord, RouteRenderResult, RouteRequestOptions, RouteRequestResult, RouteSnapshot } from "../common/router.js";
|
|
2
|
+
import { HistoryScrollBehavior, NavigateOptions, NavigationScrollBehavior, ScrollRestorationOptions, navigate } from "./navigate.js";
|
|
3
|
+
import { _applyManifest, _drainLazy, clearRoutes, currentRoute, fallback, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, registerRoutes, resolveRouteRequest, route, setServerLocation, unloadNamespace } from "./route.js";
|
|
4
|
+
import { allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized } from "./policy.js";
|
|
5
|
+
import { Link, LinkProps } from "../components/link.js";
|
|
6
|
+
export { type AccessDecision, type AccessDenyDecision, type AccessRedirectDecision, type GroupHelperOptions, type HistoryScrollBehavior, type LayoutScopeRecord, Link, type LinkProps, type NavigateOptions, type NavigationScrollBehavior, type ParsedSegment, type RegisterRoutesOptions, type Route, type RouteAuthMode, type RouteAuthOptions, type RouteAuthResolver, type RouteAuthState, type RouteComponent, type RouteContext, type RouteDefinition, type RouteHandler, type RouteManifest, type RouteMatch, type RouteMode, type RouteOptions, type RoutePolicy, type RouteQuery, type RouteRecord, type RouteRenderResult, type RouteRequestOptions, type RouteRequestResult, type RouteSnapshot, type ScrollRestorationOptions, _applyManifest, _drainLazy, allow, clearRoutes, currentRoute, deny, fallback, forbidden, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, navigate, notFound, redirect, registerRoutes, requireAuth, requirePermission, requireRole, resolveRouteRequest, route, setServerLocation, unauthorized, unloadNamespace };
|
package/dist/router/index.js
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized } from "./policy.js";
|
|
2
|
+
import { _applyManifest, _drainLazy, clearRoutes, currentRoute, fallback, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, registerRoutes, resolveRouteRequest, route, setServerLocation, unloadNamespace } from "./route.js";
|
|
3
|
+
import { navigate } from "./navigate.js";
|
|
4
|
+
import { Link } from "../components/link.js";
|
|
5
|
+
export { Link, _applyManifest, _drainLazy, allow, clearRoutes, currentRoute, deny, fallback, forbidden, getLoadedNamespaces, getManifest, getNamespaceRoutes, getRoutes, group, lazy, navigate, notFound, redirect, registerRoutes, requireAuth, requirePermission, requireRole, resolveRouteRequest, route, setServerLocation, unauthorized, unloadNamespace };
|
package/dist/router/match.js
CHANGED
|
@@ -1 +1,83 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/router/match.ts
|
|
2
|
+
/**
|
|
3
|
+
* Parse a route template path into typed segments.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]
|
|
7
|
+
* parseSegments('/*') // [{kind:'catchall',value:'*'}]
|
|
8
|
+
* parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]
|
|
9
|
+
*/
|
|
10
|
+
function parseSegments(path) {
|
|
11
|
+
const parts = (path.endsWith("/") && path !== "/" ? path.slice(0, -1) : path).split("/").filter(Boolean);
|
|
12
|
+
if (parts.length === 1 && parts[0] === "*") return [{
|
|
13
|
+
kind: "catchall",
|
|
14
|
+
value: "*"
|
|
15
|
+
}];
|
|
16
|
+
return parts.map((segment) => {
|
|
17
|
+
if (segment.startsWith("{") && segment.endsWith("}")) return {
|
|
18
|
+
kind: "param",
|
|
19
|
+
value: segment.slice(1, -1)
|
|
20
|
+
};
|
|
21
|
+
if (segment === "*") return {
|
|
22
|
+
kind: "wildcard",
|
|
23
|
+
value: "*"
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
kind: "static",
|
|
27
|
+
value: segment
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compute a numeric specificity rank from a parsed segment list.
|
|
33
|
+
*
|
|
34
|
+
* Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.
|
|
35
|
+
* Higher rank wins when multiple routes match the same path.
|
|
36
|
+
*/
|
|
37
|
+
function computeRank(segments) {
|
|
38
|
+
if (segments.length === 1 && segments[0].kind === "catchall") return -1;
|
|
39
|
+
let score = 0;
|
|
40
|
+
for (const seg of segments) if (seg.kind === "static") score += 3;
|
|
41
|
+
else if (seg.kind === "param") score += 2;
|
|
42
|
+
else if (seg.kind === "wildcard") score += 1;
|
|
43
|
+
return score;
|
|
44
|
+
}
|
|
45
|
+
/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */
|
|
46
|
+
const emptyParams = Object.freeze(Object.create(null));
|
|
47
|
+
Object.freeze({
|
|
48
|
+
matched: false,
|
|
49
|
+
params: emptyParams
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Match pre-split URL parts against pre-parsed route segments.
|
|
53
|
+
*
|
|
54
|
+
* This is the hot-path matcher used by `resolveRoute` and
|
|
55
|
+
* `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse
|
|
56
|
+
* `urlParts` across all route comparisons in a single resolution call.
|
|
57
|
+
*
|
|
58
|
+
* - Returns a params object (possibly the shared `{}`) on match.
|
|
59
|
+
* - Returns `null` on no match.
|
|
60
|
+
* - Params are allocated lazily — purely-static routes return the frozen
|
|
61
|
+
* empty sentinel without any heap allocation.
|
|
62
|
+
*/
|
|
63
|
+
function matchSegments(urlParts, segments) {
|
|
64
|
+
if (segments.length === 1 && segments[0].kind === "catchall") return { "*": urlParts.length === 0 ? "/" : urlParts.length === 1 ? urlParts[0] : "/" + urlParts.join("/") };
|
|
65
|
+
if (urlParts.length !== segments.length) return null;
|
|
66
|
+
let params = null;
|
|
67
|
+
for (let i = 0; i < segments.length; i++) {
|
|
68
|
+
const seg = segments[i];
|
|
69
|
+
const part = urlParts[i];
|
|
70
|
+
if (seg.kind === "static") {
|
|
71
|
+
if (seg.value !== part) return null;
|
|
72
|
+
} else {
|
|
73
|
+
if (params === null) params = {};
|
|
74
|
+
if (seg.kind === "param") params[seg.value] = part.includes("%") ? decodeURIComponent(part) : part;
|
|
75
|
+
else params["*"] = part;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return params ?? emptyParams;
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { computeRank, matchSegments, parseSegments };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.js","names":[],"sources":["../../src/router/match.ts"],"sourcesContent":["/**\n * Path matching, segment parsing, and specificity scoring.\n */\n\nimport type { ParsedSegment } from '../common/router';\n\n/**\n * Parse a route template path into typed segments.\n *\n * @example\n * parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]\n * parseSegments('/*') // [{kind:'catchall',value:'*'}]\n * parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]\n */\nexport function parseSegments(path: string): ParsedSegment[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n const parts = normalized.split('/').filter(Boolean);\n\n // Bare catch-all: /*\n if (parts.length === 1 && parts[0] === '*') {\n return [{ kind: 'catchall', value: '*' }];\n }\n\n return parts.map((segment): ParsedSegment => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n return { kind: 'param', value: segment.slice(1, -1) };\n }\n if (segment === '*') {\n return { kind: 'wildcard', value: '*' };\n }\n return { kind: 'static', value: segment };\n });\n}\n\n/**\n * Compute a numeric specificity rank from a parsed segment list.\n *\n * Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.\n * Higher rank wins when multiple routes match the same path.\n */\nexport function computeRank(segments: ParsedSegment[]): number {\n if (segments.length === 1 && segments[0].kind === 'catchall') return -1;\n let score = 0;\n for (const seg of segments) {\n if (seg.kind === 'static') score += 3;\n else if (seg.kind === 'param') score += 2;\n else if (seg.kind === 'wildcard') score += 1;\n // catchall contributes 0 per segment but is handled above\n }\n return score;\n}\n\n/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */\nconst emptyParams: Record<string, string> = Object.freeze(\n Object.create(null) as Record<string, string>\n);\n\n/** Returned for every failed match — avoids per-call allocation. */\nconst noMatch: MatchResult = Object.freeze({\n matched: false,\n params: emptyParams,\n});\n\n/**\n * Match pre-split URL parts against pre-parsed route segments.\n *\n * This is the hot-path matcher used by `resolveRoute` and\n * `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse\n * `urlParts` across all route comparisons in a single resolution call.\n *\n * - Returns a params object (possibly the shared `{}`) on match.\n * - Returns `null` on no match.\n * - Params are allocated lazily — purely-static routes return the frozen\n * empty sentinel without any heap allocation.\n */\nexport function matchSegments(\n urlParts: string[],\n segments: ParsedSegment[]\n): Record<string, string> | null {\n // catch-all /* — matches every URL at any depth\n if (segments.length === 1 && segments[0].kind === 'catchall') {\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n // non-catchall: part count must equal segment count\n if (urlParts.length !== segments.length) return null;\n\n // Walk segments; allocate the params object lazily on first capture\n let params: Record<string, string> | null = null;\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const part = urlParts[i];\n if (seg.kind === 'static') {\n if (seg.value !== part) return null;\n } else {\n if (params === null) params = {};\n if (seg.kind === 'param') {\n // Avoid decodeURIComponent when no percent-encoding is present\n params[seg.value] = part.includes('%')\n ? decodeURIComponent(part)\n : part;\n } else {\n // wildcard\n params['*'] = part;\n }\n }\n }\n return params ?? emptyParams;\n}\n\nexport interface MatchResult {\n matched: boolean;\n params: Record<string, string>;\n}\n\n/**\n * Match a path against a route pattern and extract params\n *\n * @example\n * match('/users/123', '/users/{id}')\n * // → { matched: true, params: { id: '123' } }\n *\n * match('/posts/hello-world/edit', '/posts/{slug}/{action}')\n * // → { matched: true, params: { slug: 'hello-world', action: 'edit' } }\n *\n * match('/users', '/posts/{id}')\n * // → { matched: false, params: {} }\n */\nexport function match(path: string, pattern: string): MatchResult {\n // Normalize trailing slashes\n const normalizedPath =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n const normalizedPattern =\n pattern.endsWith('/') && pattern !== '/' ? pattern.slice(0, -1) : pattern;\n\n // Split into segments\n const pathSegments = normalizedPath.split('/').filter(Boolean);\n const patternSegments = normalizedPattern.split('/').filter(Boolean);\n\n // Support catch-all route: /* matches any path at any depth\n if (patternSegments.length === 1 && patternSegments[0] === '*') {\n // For multi-segment paths, preserve the leading slash\n // For single-segment paths, return just the segment\n return {\n matched: true,\n params: {\n '*': pathSegments.length > 1 ? normalizedPath : pathSegments[0],\n },\n };\n }\n\n // Check if lengths match (wildcard segments still need to match one segment)\n if (pathSegments.length !== patternSegments.length) {\n return { matched: false, params: {} };\n }\n\n const params: Record<string, string> = {};\n\n // Match each segment\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const pathSegment = pathSegments[i];\n\n // Parameter: {paramName}\n if (patternSegment.startsWith('{') && patternSegment.endsWith('}')) {\n const paramName = patternSegment.slice(1, -1);\n params[paramName] = pathSegment.includes('%')\n ? decodeURIComponent(pathSegment)\n : pathSegment;\n } else if (patternSegment === '*') {\n // Wildcard: match single segment\n params['*'] = pathSegment;\n } else if (patternSegment !== pathSegment) {\n // Literal segment mismatch\n return noMatch;\n }\n }\n\n return { matched: true, params };\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,cAAc,MAA+B;CAI3D,MAAM,SAFJ,KAAK,SAAS,IAAI,IAAI,SAAS,MAAM,KAAK,MAAM,GAAG,GAAG,GAAG,MAElC,MAAM,IAAI,CAAC,OAAO,QAAQ;AAGnD,KAAI,MAAM,WAAW,KAAK,MAAM,OAAO,IACrC,QAAO,CAAC;EAAE,MAAM;EAAY,OAAO;EAAK,CAAC;AAG3C,QAAO,MAAM,KAAK,YAA2B;AAC3C,MAAI,QAAQ,WAAW,IAAI,IAAI,QAAQ,SAAS,IAAI,CAClD,QAAO;GAAE,MAAM;GAAS,OAAO,QAAQ,MAAM,GAAG,GAAG;GAAE;AAEvD,MAAI,YAAY,IACd,QAAO;GAAE,MAAM;GAAY,OAAO;GAAK;AAEzC,SAAO;GAAE,MAAM;GAAU,OAAO;GAAS;GACzC;;;;;;;;AASJ,SAAgB,YAAY,UAAmC;AAC7D,KAAI,SAAS,WAAW,KAAK,SAAS,GAAG,SAAS,WAAY,QAAO;CACrE,IAAI,QAAQ;AACZ,MAAK,MAAM,OAAO,SAChB,KAAI,IAAI,SAAS,SAAU,UAAS;UAC3B,IAAI,SAAS,QAAS,UAAS;UAC/B,IAAI,SAAS,WAAY,UAAS;AAG7C,QAAO;;;AAIT,MAAM,cAAsC,OAAO,OACjD,OAAO,OAAO,KAAK,CACpB;AAG4B,OAAO,OAAO;CACzC,SAAS;CACT,QAAQ;CACT,CAAC;;;;;;;;;;;;;AAcF,SAAgB,cACd,UACA,UAC+B;AAE/B,KAAI,SAAS,WAAW,KAAK,SAAS,GAAG,SAAS,WAChD,QAAO,EACL,KACE,SAAS,WAAW,IAChB,MACA,SAAS,WAAW,IAClB,SAAS,KACT,MAAM,SAAS,KAAK,IAAI,EACjC;AAIH,KAAI,SAAS,WAAW,SAAS,OAAQ,QAAO;CAGhD,IAAI,SAAwC;AAC5C,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,MAAM,SAAS;EACrB,MAAM,OAAO,SAAS;AACtB,MAAI,IAAI,SAAS,UACf;OAAI,IAAI,UAAU,KAAM,QAAO;SAC1B;AACL,OAAI,WAAW,KAAM,UAAS,EAAE;AAChC,OAAI,IAAI,SAAS,QAEf,QAAO,IAAI,SAAS,KAAK,SAAS,IAAI,GAClC,mBAAmB,KAAK,GACxB;OAGJ,QAAO,OAAO;;;AAIpB,QAAO,UAAU"}
|
|
@@ -1,20 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { ComponentInstance } from "../runtime/component.js";
|
|
2
|
+
|
|
3
|
+
//#region src/router/navigate.d.ts
|
|
4
|
+
type NavigationScrollBehavior = 'top' | 'preserve';
|
|
5
|
+
type HistoryScrollBehavior = 'restore' | 'top' | 'preserve';
|
|
6
|
+
type ScrollRestorationOptions = {
|
|
7
|
+
navigation?: NavigationScrollBehavior;
|
|
8
|
+
history?: HistoryScrollBehavior;
|
|
9
|
+
};
|
|
10
|
+
type NavigateOptions = {
|
|
11
|
+
history?: 'push' | 'replace';
|
|
12
|
+
scroll?: NavigationScrollBehavior;
|
|
13
|
+
};
|
|
14
|
+
declare function configureScrollRestoration(options?: boolean | ScrollRestorationOptions): void;
|
|
5
15
|
/** Register the current app instance (called by createSPA/hydrateSPA). */
|
|
6
|
-
|
|
16
|
+
declare function registerAppInstance(instance: ComponentInstance, path: string): void;
|
|
7
17
|
/**
|
|
8
18
|
* Navigate to a new path
|
|
9
19
|
* Updates URL, resolves route, and re-mounts app with new handler
|
|
10
20
|
*/
|
|
11
|
-
|
|
21
|
+
declare function navigate(path: string, options?: NavigateOptions): void;
|
|
12
22
|
/**
|
|
13
23
|
* Setup popstate listener for browser navigation
|
|
14
24
|
*/
|
|
15
|
-
|
|
25
|
+
declare function initializeNavigation(): void;
|
|
16
26
|
/**
|
|
17
27
|
* Cleanup navigation listeners
|
|
18
28
|
*/
|
|
19
|
-
|
|
29
|
+
declare function cleanupNavigation(): void;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { HistoryScrollBehavior, NavigateOptions, NavigationScrollBehavior, ScrollRestorationOptions, navigate };
|
|
20
32
|
//# sourceMappingURL=navigate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.d.ts","
|
|
1
|
+
{"version":3,"file":"navigate.d.ts","names":[],"sources":["../../src/router/navigate.ts"],"mappings":";;;KAyBY,wBAAA;AAAA,KACA,qBAAA;AAAA,KAEA,wBAAA;EACV,UAAA,GAAa,wBAAA;EACb,OAAA,GAAU,qBAAA;AAAA;AAAA,KAqBA,eAAA;EACV,OAAA;EACA,MAAA,GAAS,wBAAA;AAAA;AAAA,iBAsIK,0BAAA,CACd,OAAA,aAAoB,wBAAA;;iBA6ON,mBAAA,CACd,QAAA,EAAU,iBAAA,EACV,IAAA;;;;;iBAiBc,QAAA,CAAS,IAAA,UAAc,OAAA,GAAS,eAAA;;AAzYhD;;iBAqdgB,oBAAA,CAAA;;;;iBASA,iBAAA,CAAA"}
|
package/dist/router/navigate.js
CHANGED
|
@@ -1 +1,288 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { isDevelopmentEnvironment, isProductionEnvironment } from "../common/env.js";
|
|
2
|
+
import { logger } from "../dev/logger.js";
|
|
3
|
+
import { ELEMENT_TYPE, Fragment } from "../common/jsx.js";
|
|
4
|
+
import { mountComponent } from "../runtime/component.js";
|
|
5
|
+
import { lockRouteRegistration, resolveRoute, resolveRouteRequest } from "./route.js";
|
|
6
|
+
import "../jsx/index.js";
|
|
7
|
+
import { DefaultPortal } from "../foundations/structures/portal.js";
|
|
8
|
+
//#region src/router/navigate.ts
|
|
9
|
+
/**
|
|
10
|
+
* Client-side navigation with History API
|
|
11
|
+
*/
|
|
12
|
+
let currentInstance = null;
|
|
13
|
+
let currentPathname = "/";
|
|
14
|
+
let currentHref = "/";
|
|
15
|
+
const DEFAULT_SCROLL_RESTORATION = {
|
|
16
|
+
enabled: true,
|
|
17
|
+
navigation: "top",
|
|
18
|
+
history: "restore"
|
|
19
|
+
};
|
|
20
|
+
let scrollRestorationOptions = { ...DEFAULT_SCROLL_RESTORATION };
|
|
21
|
+
const scrollPositions = /* @__PURE__ */ new Map();
|
|
22
|
+
function getWindowHref() {
|
|
23
|
+
if (typeof window === "undefined") return currentHref;
|
|
24
|
+
return `${window.location.pathname}${window.location.search}${window.location.hash}`;
|
|
25
|
+
}
|
|
26
|
+
function normalizeScrollRestorationOptions(options) {
|
|
27
|
+
if (options === false) return {
|
|
28
|
+
enabled: false,
|
|
29
|
+
navigation: DEFAULT_SCROLL_RESTORATION.navigation,
|
|
30
|
+
history: DEFAULT_SCROLL_RESTORATION.history
|
|
31
|
+
};
|
|
32
|
+
if (options === true || options === void 0) return { ...DEFAULT_SCROLL_RESTORATION };
|
|
33
|
+
return {
|
|
34
|
+
enabled: true,
|
|
35
|
+
navigation: options.navigation ?? DEFAULT_SCROLL_RESTORATION.navigation,
|
|
36
|
+
history: options.history ?? DEFAULT_SCROLL_RESTORATION.history
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function readScrollPosition() {
|
|
40
|
+
if (typeof window === "undefined") return {
|
|
41
|
+
x: 0,
|
|
42
|
+
y: 0
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
x: typeof window.scrollX === "number" ? window.scrollX : typeof window.pageXOffset === "number" ? window.pageXOffset : 0,
|
|
46
|
+
y: typeof window.scrollY === "number" ? window.scrollY : typeof window.pageYOffset === "number" ? window.pageYOffset : 0
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function writeHistoryScrollPosition(href, position) {
|
|
50
|
+
if (typeof window === "undefined" || getWindowHref() !== href) return;
|
|
51
|
+
if (typeof window.history?.replaceState !== "function") return;
|
|
52
|
+
const state = window.history.state && typeof window.history.state === "object" ? window.history.state : {};
|
|
53
|
+
window.history.replaceState({
|
|
54
|
+
...state,
|
|
55
|
+
path: href,
|
|
56
|
+
scroll: position
|
|
57
|
+
}, "", href);
|
|
58
|
+
}
|
|
59
|
+
function saveScrollPosition(href) {
|
|
60
|
+
if (!scrollRestorationOptions.enabled || typeof window === "undefined") return;
|
|
61
|
+
const position = readScrollPosition();
|
|
62
|
+
scrollPositions.set(href, position);
|
|
63
|
+
writeHistoryScrollPosition(href, position);
|
|
64
|
+
}
|
|
65
|
+
function scrollToPosition(position) {
|
|
66
|
+
if (typeof window === "undefined" || typeof window.scrollTo !== "function") return;
|
|
67
|
+
window.scrollTo(position.x, position.y);
|
|
68
|
+
}
|
|
69
|
+
function applyNavigationScroll(behavior) {
|
|
70
|
+
if (!scrollRestorationOptions.enabled || behavior === "preserve") return;
|
|
71
|
+
scrollToPosition({
|
|
72
|
+
x: 0,
|
|
73
|
+
y: 0
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function applyHistoryScroll(href, state) {
|
|
77
|
+
if (!scrollRestorationOptions.enabled) return;
|
|
78
|
+
if (scrollRestorationOptions.history === "preserve") return;
|
|
79
|
+
if (scrollRestorationOptions.history === "top") {
|
|
80
|
+
scrollToPosition({
|
|
81
|
+
x: 0,
|
|
82
|
+
y: 0
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const fromState = state && typeof state === "object" && "scroll" in state ? state.scroll : void 0;
|
|
87
|
+
scrollToPosition((fromState && typeof fromState.x === "number" && typeof fromState.y === "number" ? {
|
|
88
|
+
x: fromState.x,
|
|
89
|
+
y: fromState.y
|
|
90
|
+
} : scrollPositions.get(href)) ?? {
|
|
91
|
+
x: 0,
|
|
92
|
+
y: 0
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function configureScrollRestoration(options) {
|
|
96
|
+
scrollRestorationOptions = normalizeScrollRestorationOptions(options);
|
|
97
|
+
if (typeof window === "undefined") return;
|
|
98
|
+
if ("scrollRestoration" in window.history) try {
|
|
99
|
+
window.history.scrollRestoration = scrollRestorationOptions.enabled ? "manual" : "auto";
|
|
100
|
+
} catch {}
|
|
101
|
+
}
|
|
102
|
+
function parseTargetUrl(path) {
|
|
103
|
+
const pathname = window.location.pathname || "/";
|
|
104
|
+
const search = window.location.search || "";
|
|
105
|
+
const hash = window.location.hash || "";
|
|
106
|
+
const href = typeof window.location.href === "string" ? window.location.href : "";
|
|
107
|
+
const base = href && href !== "about:blank" && !href.startsWith("about:") && !href.startsWith("data:") ? href : `http://localhost${pathname}${search}${hash}`;
|
|
108
|
+
return new URL(path, base);
|
|
109
|
+
}
|
|
110
|
+
function isRenderResult(result) {
|
|
111
|
+
return result !== null && result.kind === "render";
|
|
112
|
+
}
|
|
113
|
+
function isPromise(value) {
|
|
114
|
+
return value instanceof Promise;
|
|
115
|
+
}
|
|
116
|
+
function createDeniedResolvedRoute(status) {
|
|
117
|
+
return {
|
|
118
|
+
handler: () => ({
|
|
119
|
+
type: "div",
|
|
120
|
+
props: { "data-route-denied": String(status) },
|
|
121
|
+
children: [String(status)]
|
|
122
|
+
}),
|
|
123
|
+
params: {}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function bindResolvedRouteHandler(resolved) {
|
|
127
|
+
return () => resolved.handler(resolved.params);
|
|
128
|
+
}
|
|
129
|
+
function wrapRootRouteHandler(componentFn) {
|
|
130
|
+
const wrappedFn = (props, ctx) => {
|
|
131
|
+
const out = componentFn(props, ctx);
|
|
132
|
+
const portalVNode = {
|
|
133
|
+
$$typeof: ELEMENT_TYPE,
|
|
134
|
+
type: DefaultPortal,
|
|
135
|
+
props: {},
|
|
136
|
+
key: "__default_portal"
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
$$typeof: ELEMENT_TYPE,
|
|
140
|
+
type: Fragment,
|
|
141
|
+
props: { children: out === void 0 || out === null ? [portalVNode] : [out, portalVNode] }
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
Object.defineProperty(wrappedFn, "name", { value: componentFn.name || "Component" });
|
|
145
|
+
return wrappedFn;
|
|
146
|
+
}
|
|
147
|
+
function remountResolvedRoute(resolved, pathname, href) {
|
|
148
|
+
if (!currentInstance) return false;
|
|
149
|
+
currentInstance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));
|
|
150
|
+
currentInstance.props = {};
|
|
151
|
+
currentInstance.stateValues = [];
|
|
152
|
+
currentInstance.expectedStateIndices = [];
|
|
153
|
+
currentInstance.firstRenderComplete = false;
|
|
154
|
+
currentInstance.stateIndexCheck = -1;
|
|
155
|
+
currentInstance.evaluationGeneration++;
|
|
156
|
+
currentInstance.notifyUpdate = null;
|
|
157
|
+
currentInstance.mountOperations = [];
|
|
158
|
+
currentInstance._placeholder = void 0;
|
|
159
|
+
currentInstance.hasPendingUpdate = false;
|
|
160
|
+
currentInstance.abortController = null;
|
|
161
|
+
mountComponent(currentInstance);
|
|
162
|
+
currentPathname = pathname;
|
|
163
|
+
currentHref = href;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function rerenderResolvedRoute(pathname, href) {
|
|
167
|
+
if (!currentInstance) return false;
|
|
168
|
+
if (!resolveRoute(pathname)) return false;
|
|
169
|
+
currentPathname = pathname;
|
|
170
|
+
currentHref = href;
|
|
171
|
+
currentInstance._enqueueRun?.();
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
function resolveNavigationTarget(path) {
|
|
175
|
+
const target = parseTargetUrl(path);
|
|
176
|
+
const pathname = target.pathname;
|
|
177
|
+
const href = `${target.pathname}${target.search}${target.hash}`;
|
|
178
|
+
const resolved = resolveRouteRequest(href);
|
|
179
|
+
if (isPromise(resolved)) return resolved.then((next) => ({
|
|
180
|
+
href,
|
|
181
|
+
pathname,
|
|
182
|
+
resolved: next
|
|
183
|
+
}));
|
|
184
|
+
return {
|
|
185
|
+
href,
|
|
186
|
+
pathname,
|
|
187
|
+
resolved
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function applyNavigationTarget(path, options, target) {
|
|
191
|
+
const { href, pathname, resolved } = target;
|
|
192
|
+
const previousPathname = currentPathname;
|
|
193
|
+
saveScrollPosition(currentHref);
|
|
194
|
+
if (!resolved) {
|
|
195
|
+
if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${path}`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (resolved.kind === "redirect") {
|
|
199
|
+
const redirectTarget = parseTargetUrl(resolved.to);
|
|
200
|
+
const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;
|
|
201
|
+
if (redirectHref === href) {
|
|
202
|
+
if (isDevelopmentEnvironment()) logger.warn(`Navigation guard redirected to the same path: ${redirectHref}`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
navigate(redirectHref, { history: "replace" });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const nextResolved = resolved.kind === "deny" ? createDeniedResolvedRoute(resolved.status) : {
|
|
209
|
+
handler: resolved.handler,
|
|
210
|
+
params: resolved.params
|
|
211
|
+
};
|
|
212
|
+
const historyMethod = options.history === "replace" ? "replaceState" : "pushState";
|
|
213
|
+
window.history[historyMethod]({ path: href }, "", href);
|
|
214
|
+
if (currentInstance) {
|
|
215
|
+
if (pathname === currentPathname && isRenderResult(resolved)) {
|
|
216
|
+
rerenderResolvedRoute(pathname, href);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
remountResolvedRoute(nextResolved, pathname, href);
|
|
220
|
+
if (pathname !== previousPathname) applyNavigationScroll(options.scroll ?? scrollRestorationOptions.navigation);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** Register the current app instance (called by createSPA/hydrateSPA). */
|
|
224
|
+
function registerAppInstance(instance, path) {
|
|
225
|
+
currentInstance = instance;
|
|
226
|
+
currentPathname = path;
|
|
227
|
+
currentHref = getWindowHref();
|
|
228
|
+
saveScrollPosition(currentHref);
|
|
229
|
+
if (isProductionEnvironment()) lockRouteRegistration();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Navigate to a new path
|
|
233
|
+
* Updates URL, resolves route, and re-mounts app with new handler
|
|
234
|
+
*/
|
|
235
|
+
function navigate(path, options = {}) {
|
|
236
|
+
if (typeof window === "undefined") return;
|
|
237
|
+
const target = resolveNavigationTarget(path);
|
|
238
|
+
if (isPromise(target)) {
|
|
239
|
+
target.then((resolvedTarget) => applyNavigationTarget(path, options, resolvedTarget));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
applyNavigationTarget(path, options, target);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Handle browser back/forward buttons
|
|
246
|
+
*/
|
|
247
|
+
function handlePopState(_event) {
|
|
248
|
+
const previousHref = currentHref;
|
|
249
|
+
const pathname = window.location.pathname;
|
|
250
|
+
const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;
|
|
251
|
+
saveScrollPosition(previousHref);
|
|
252
|
+
if (!currentInstance) return;
|
|
253
|
+
const resolved = resolveRouteRequest(href);
|
|
254
|
+
const applyResolved = (resolved) => {
|
|
255
|
+
if (!resolved) {
|
|
256
|
+
if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${pathname}`);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (resolved.kind === "redirect") {
|
|
260
|
+
navigate(resolved.to, { history: "replace" });
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (pathname === currentPathname && isRenderResult(resolved)) {
|
|
264
|
+
rerenderResolvedRoute(pathname, href);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
remountResolvedRoute(resolved.kind === "deny" ? createDeniedResolvedRoute(resolved.status) : {
|
|
268
|
+
handler: resolved.handler,
|
|
269
|
+
params: resolved.params
|
|
270
|
+
}, pathname, href);
|
|
271
|
+
applyHistoryScroll(href, _event.state);
|
|
272
|
+
};
|
|
273
|
+
if (isPromise(resolved)) {
|
|
274
|
+
resolved.then((next) => applyResolved(next));
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
applyResolved(resolved);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Setup popstate listener for browser navigation
|
|
281
|
+
*/
|
|
282
|
+
function initializeNavigation() {
|
|
283
|
+
if (typeof window !== "undefined") window.addEventListener("popstate", handlePopState);
|
|
284
|
+
}
|
|
285
|
+
//#endregion
|
|
286
|
+
export { configureScrollRestoration, initializeNavigation, navigate, registerAppInstance };
|
|
287
|
+
|
|
288
|
+
//# sourceMappingURL=navigate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate.js","names":[],"sources":["../../src/router/navigate.ts"],"sourcesContent":["/**\n * Client-side navigation with History API\n */\n\nimport {\n resolveRoute,\n resolveRouteRequest,\n lockRouteRegistration,\n type ResolvedRoute,\n} from './route';\nimport { mountComponent, type ComponentInstance } from '../runtime/component';\nimport {\n isDevelopmentEnvironment,\n isProductionEnvironment,\n} from '../common/env';\nimport { logger } from '../dev/logger';\nimport type { RouteRenderResult, RouteRequestResult } from '../common/router';\nimport { Fragment, ELEMENT_TYPE } from '../jsx';\nimport { DefaultPortal } from '../foundations/structures/portal';\n\n// Global app state for navigation\nlet currentInstance: ComponentInstance | null = null;\nlet currentPathname = '/';\nlet currentHref = '/';\n\nexport type NavigationScrollBehavior = 'top' | 'preserve';\nexport type HistoryScrollBehavior = 'restore' | 'top' | 'preserve';\n\nexport type ScrollRestorationOptions = {\n navigation?: NavigationScrollBehavior;\n history?: HistoryScrollBehavior;\n};\n\ntype NormalizedScrollRestorationOptions = {\n enabled: boolean;\n navigation: NavigationScrollBehavior;\n history: HistoryScrollBehavior;\n};\n\nconst DEFAULT_SCROLL_RESTORATION: NormalizedScrollRestorationOptions = {\n enabled: true,\n navigation: 'top',\n history: 'restore',\n};\n\nlet scrollRestorationOptions: NormalizedScrollRestorationOptions = {\n ...DEFAULT_SCROLL_RESTORATION,\n};\n\nconst scrollPositions = new Map<string, { x: number; y: number }>();\n\nexport type NavigateOptions = {\n history?: 'push' | 'replace';\n scroll?: NavigationScrollBehavior;\n};\n\nfunction getWindowHref(): string {\n if (typeof window === 'undefined') {\n return currentHref;\n }\n\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nfunction normalizeScrollRestorationOptions(\n options?: boolean | ScrollRestorationOptions\n): NormalizedScrollRestorationOptions {\n if (options === false) {\n return {\n enabled: false,\n navigation: DEFAULT_SCROLL_RESTORATION.navigation,\n history: DEFAULT_SCROLL_RESTORATION.history,\n };\n }\n\n if (options === true || options === undefined) {\n return { ...DEFAULT_SCROLL_RESTORATION };\n }\n\n return {\n enabled: true,\n navigation: options.navigation ?? DEFAULT_SCROLL_RESTORATION.navigation,\n history: options.history ?? DEFAULT_SCROLL_RESTORATION.history,\n };\n}\n\nfunction readScrollPosition(): { x: number; y: number } {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 };\n }\n\n const x =\n typeof window.scrollX === 'number'\n ? window.scrollX\n : typeof window.pageXOffset === 'number'\n ? window.pageXOffset\n : 0;\n const y =\n typeof window.scrollY === 'number'\n ? window.scrollY\n : typeof window.pageYOffset === 'number'\n ? window.pageYOffset\n : 0;\n\n return { x, y };\n}\n\nfunction writeHistoryScrollPosition(\n href: string,\n position: { x: number; y: number }\n): void {\n if (typeof window === 'undefined' || getWindowHref() !== href) {\n return;\n }\n if (typeof window.history?.replaceState !== 'function') {\n return;\n }\n const state =\n window.history.state && typeof window.history.state === 'object'\n ? window.history.state\n : {};\n\n window.history.replaceState(\n {\n ...state,\n path: href,\n scroll: position,\n },\n '',\n href\n );\n}\n\nfunction saveScrollPosition(href: string): void {\n if (!scrollRestorationOptions.enabled || typeof window === 'undefined') {\n return;\n }\n\n const position = readScrollPosition();\n scrollPositions.set(href, position);\n writeHistoryScrollPosition(href, position);\n}\n\nfunction scrollToPosition(position: { x: number; y: number }): void {\n if (typeof window === 'undefined' || typeof window.scrollTo !== 'function') {\n return;\n }\n\n window.scrollTo(position.x, position.y);\n}\n\nfunction applyNavigationScroll(behavior: NavigationScrollBehavior): void {\n if (!scrollRestorationOptions.enabled || behavior === 'preserve') {\n return;\n }\n\n scrollToPosition({ x: 0, y: 0 });\n}\n\nfunction applyHistoryScroll(href: string, state: PopStateEvent['state']): void {\n if (!scrollRestorationOptions.enabled) {\n return;\n }\n\n if (scrollRestorationOptions.history === 'preserve') {\n return;\n }\n\n if (scrollRestorationOptions.history === 'top') {\n scrollToPosition({ x: 0, y: 0 });\n return;\n }\n\n const fromState =\n state && typeof state === 'object' && 'scroll' in state\n ? (state.scroll as { x?: unknown; y?: unknown })\n : undefined;\n const saved =\n fromState &&\n typeof fromState.x === 'number' &&\n typeof fromState.y === 'number'\n ? { x: fromState.x, y: fromState.y }\n : scrollPositions.get(href);\n\n scrollToPosition(saved ?? { x: 0, y: 0 });\n}\n\nexport function configureScrollRestoration(\n options?: boolean | ScrollRestorationOptions\n): void {\n scrollRestorationOptions = normalizeScrollRestorationOptions(options);\n\n if (typeof window === 'undefined') {\n return;\n }\n\n if ('scrollRestoration' in window.history) {\n try {\n window.history.scrollRestoration = scrollRestorationOptions.enabled\n ? 'manual'\n : 'auto';\n } catch {\n // Ignore environments that expose but do not allow setting scrollRestoration.\n }\n }\n}\n\nfunction parseTargetUrl(path: string): URL {\n const pathname = window.location.pathname || '/';\n const search = window.location.search || '';\n const hash = window.location.hash || '';\n const href =\n typeof window.location.href === 'string' ? window.location.href : '';\n const base =\n href &&\n href !== 'about:blank' &&\n !href.startsWith('about:') &&\n !href.startsWith('data:')\n ? href\n : `http://localhost${pathname}${search}${hash}`;\n\n return new URL(path, base);\n}\n\nfunction isRenderResult(\n result: RouteRequestResult\n): result is RouteRenderResult {\n return result !== null && result.kind === 'render';\n}\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return value instanceof Promise;\n}\n\nfunction createDeniedResolvedRoute(status: number): ResolvedRoute {\n return {\n handler: () => ({\n type: 'div',\n props: {\n 'data-route-denied': String(status),\n },\n children: [String(status)],\n }),\n params: {},\n };\n}\n\nfunction bindResolvedRouteHandler(\n resolved: ResolvedRoute\n): ComponentInstance['fn'] {\n return () =>\n resolved.handler(resolved.params) as ReturnType<ComponentInstance['fn']>;\n}\n\nfunction wrapRootRouteHandler(\n componentFn: ComponentInstance['fn']\n): ComponentInstance['fn'] {\n const wrappedFn: ComponentInstance['fn'] = (props, ctx) => {\n const out = componentFn(props, ctx);\n const portalVNode = {\n $$typeof: ELEMENT_TYPE,\n type: DefaultPortal,\n props: {},\n key: '__default_portal',\n } as unknown;\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: {\n children:\n out === undefined || out === null\n ? [portalVNode]\n : [out, portalVNode],\n },\n } as ReturnType<ComponentInstance['fn']>;\n };\n\n Object.defineProperty(wrappedFn, 'name', {\n value: componentFn.name || 'Component',\n });\n\n return wrappedFn;\n}\n\nfunction remountResolvedRoute(\n resolved: ResolvedRoute,\n pathname: string,\n href: string\n): boolean {\n if (!currentInstance) {\n return false;\n }\n\n // The route handler IS the component function\n // It takes params as props and renders the route\n currentInstance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));\n currentInstance.props = {};\n\n // Reset state to prevent leakage from previous route\n // Each route navigation starts completely fresh\n currentInstance.stateValues = [];\n currentInstance.expectedStateIndices = [];\n currentInstance.firstRenderComplete = false;\n currentInstance.stateIndexCheck = -1;\n // Increment generation to invalidate pending async evaluations from previous route\n currentInstance.evaluationGeneration++;\n currentInstance.notifyUpdate = null;\n currentInstance.mountOperations = [];\n currentInstance._placeholder = undefined;\n currentInstance.hasPendingUpdate = false;\n\n // Route-local async work should create a fresh abort controller lazily.\n currentInstance.abortController = null;\n\n // Re-execute component against the existing host so reconciliation can\n // preserve any shared layout DOM between sibling routes.\n mountComponent(currentInstance);\n currentPathname = pathname;\n currentHref = href;\n return true;\n}\n\nfunction rerenderResolvedRoute(pathname: string, href: string): boolean {\n if (!currentInstance) {\n return false;\n }\n\n const resolved = resolveRoute(pathname);\n if (!resolved) {\n return false;\n }\n\n currentPathname = pathname;\n currentHref = href;\n currentInstance._enqueueRun?.();\n return true;\n}\n\nfunction resolveNavigationTarget(path: string) {\n const target = parseTargetUrl(path);\n const pathname = target.pathname;\n const href = `${target.pathname}${target.search}${target.hash}`;\n const resolved = resolveRouteRequest(href);\n\n if (isPromise(resolved)) {\n return resolved.then((next) => ({\n href,\n pathname,\n resolved: next,\n }));\n }\n\n return {\n href,\n pathname,\n resolved,\n };\n}\n\nfunction applyNavigationTarget(\n path: string,\n options: NavigateOptions,\n target: {\n href: string;\n pathname: string;\n resolved: RouteRequestResult;\n }\n): void {\n const { href, pathname, resolved } = target;\n const previousPathname = currentPathname;\n\n saveScrollPosition(currentHref);\n\n if (!resolved) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${path}`);\n }\n return;\n }\n\n if (resolved.kind === 'redirect') {\n const redirectTarget = parseTargetUrl(resolved.to);\n const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;\n if (redirectHref === href) {\n if (isDevelopmentEnvironment()) {\n logger.warn(\n `Navigation guard redirected to the same path: ${redirectHref}`\n );\n }\n return;\n }\n\n navigate(redirectHref, { history: 'replace' });\n return;\n }\n\n const nextResolved =\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n };\n\n const historyMethod =\n options.history === 'replace' ? 'replaceState' : 'pushState';\n window.history[historyMethod]({ path: href }, '', href);\n\n if (currentInstance) {\n if (pathname === currentPathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(pathname, href);\n return;\n }\n\n remountResolvedRoute(nextResolved, pathname, href);\n if (pathname !== previousPathname) {\n applyNavigationScroll(\n options.scroll ?? scrollRestorationOptions.navigation\n );\n }\n }\n}\n\n/** Register the current app instance (called by createSPA/hydrateSPA). */\nexport function registerAppInstance(\n instance: ComponentInstance,\n path: string\n): void {\n currentInstance = instance;\n currentPathname = path;\n currentHref = getWindowHref();\n saveScrollPosition(currentHref);\n // Lock further route registrations after the app has started — but allow tests to register routes.\n // Enforce only in production to avoid breaking test infra which registers routes dynamically.\n if (isProductionEnvironment()) {\n lockRouteRegistration();\n }\n}\n\n/**\n * Navigate to a new path\n * Updates URL, resolves route, and re-mounts app with new handler\n */\nexport function navigate(path: string, options: NavigateOptions = {}): void {\n if (typeof window === 'undefined') {\n // SSR context\n return;\n }\n\n const target = resolveNavigationTarget(path);\n if (isPromise(target)) {\n void target.then((resolvedTarget) =>\n applyNavigationTarget(path, options, resolvedTarget)\n );\n return;\n }\n\n applyNavigationTarget(path, options, target);\n}\n\n/**\n * Handle browser back/forward buttons\n */\nfunction handlePopState(_event: PopStateEvent): void {\n const previousHref = currentHref;\n const pathname = window.location.pathname;\n const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n\n saveScrollPosition(previousHref);\n\n if (!currentInstance) {\n return;\n }\n\n const resolved = resolveRouteRequest(href);\n\n const applyResolved = (resolved: RouteRequestResult) => {\n if (!resolved) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${pathname}`);\n }\n return;\n }\n\n if (resolved.kind === 'redirect') {\n navigate(resolved.to, { history: 'replace' });\n return;\n }\n\n if (pathname === currentPathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(pathname, href);\n return;\n }\n\n remountResolvedRoute(\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n },\n pathname,\n href\n );\n\n applyHistoryScroll(href, _event.state);\n };\n\n if (isPromise(resolved)) {\n void resolved.then((next) => applyResolved(next));\n return;\n }\n\n applyResolved(resolved);\n}\n\n/**\n * Setup popstate listener for browser navigation\n */\nexport function initializeNavigation(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', handlePopState);\n }\n}\n\n/**\n * Cleanup navigation listeners\n */\nexport function cleanupNavigation(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', handlePopState);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AccessDecision, AccessDenyStatus, AccessRedirectStatus, RouteAuthOptions, RouteContext, RoutePolicy } from "../common/router.js";
|
|
2
|
+
|
|
3
|
+
//#region src/router/policy.d.ts
|
|
4
|
+
declare function allow(): AccessDecision;
|
|
5
|
+
declare function redirect(to: string, init?: {
|
|
6
|
+
status?: AccessRedirectStatus;
|
|
7
|
+
replace?: boolean;
|
|
8
|
+
}): AccessDecision;
|
|
9
|
+
declare function deny(status: AccessDenyStatus): AccessDecision;
|
|
10
|
+
declare function unauthorized(): AccessDecision;
|
|
11
|
+
declare function forbidden(): AccessDecision;
|
|
12
|
+
declare function notFound(): AccessDecision;
|
|
13
|
+
declare function normalizeAccessDecision(result: AccessDecision): AccessDecision;
|
|
14
|
+
declare function withRouteAuthOptions(context: RouteContext, auth: RouteAuthOptions | undefined): RouteContext;
|
|
15
|
+
declare function requireAuth(): RoutePolicy;
|
|
16
|
+
declare function requireGuest(): RoutePolicy;
|
|
17
|
+
declare function requireRole(role: string): RoutePolicy;
|
|
18
|
+
declare function requirePermission(permission: string): RoutePolicy;
|
|
19
|
+
declare function evaluateRoutePolicy(policy: RoutePolicy, context: RouteContext): Promise<AccessDecision>;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized };
|
|
22
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","names":[],"sources":["../../src/router/policy.ts"],"mappings":";;;iBAuBgB,KAAA,CAAA,GAAS,cAAA;AAAA,iBAIT,QAAA,CACd,EAAA,UACA,IAAA;EACE,MAAA,GAAS,oBAAA;EACT,OAAA;AAAA,IAED,cAAA;AAAA,iBASa,IAAA,CAAK,MAAA,EAAQ,gBAAA,GAAmB,cAAA;AAAA,iBAIhC,YAAA,CAAA,GAAgB,cAAA;AAAA,iBAIhB,SAAA,CAAA,GAAa,cAAA;AAAA,iBAIb,QAAA,CAAA,GAAY,cAAA;AAAA,iBAIZ,uBAAA,CACd,MAAA,EAAQ,cAAA,GACP,cAAA;AAAA,iBAIa,oBAAA,CACd,OAAA,EAAS,YAAA,EACT,IAAA,EAAM,gBAAA,eACL,YAAA;AAAA,iBA8Ha,WAAA,CAAA,GAAe,WAAA;AAAA,iBAUf,YAAA,CAAA,GAAgB,WAAA;AAAA,iBAUhB,WAAA,CAAY,IAAA,WAAe,WAAA;AAAA,iBAmB3B,iBAAA,CAAkB,UAAA,WAAqB,WAAA;AAAA,iBAmBjC,mBAAA,CACpB,MAAA,EAAQ,WAAA,EACR,OAAA,EAAS,YAAA,GACR,OAAA,CAAQ,cAAA"}
|