@askrjs/askr 0.0.51 → 0.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bench/components/benchmark-row.d.ts +2 -2
- package/dist/bench/components/benchmark-row.js +0 -2
- package/dist/bench/components/benchmark-table.js +0 -2
- package/dist/benchmark.d.ts +1 -2
- package/dist/benchmark.js +2 -4
- package/dist/bin/askr-ssg.d.ts +1 -2
- package/dist/bin/askr-ssg.js +21 -6
- package/dist/boot/hydration.js +10 -11
- package/dist/boot/index.d.ts +1 -2
- package/dist/boot/index.js +20 -11
- package/dist/boot/root-lifecycle.d.ts +6 -3
- package/dist/boot/root-lifecycle.js +14 -10
- package/dist/boot/route-startup.js +13 -4
- package/dist/boot/types.d.ts +1 -2
- package/dist/common/attr-names.js +0 -2
- package/dist/common/component.d.ts +1 -2
- package/dist/common/control.d.ts +1 -2
- package/dist/common/control.js +0 -2
- package/dist/common/dom-range.d.ts +13 -0
- package/dist/common/env.js +1 -7
- package/dist/common/error-boundary.d.ts +1 -2
- package/dist/common/invariant.js +0 -2
- package/dist/common/jsx.d.ts +1 -2
- package/dist/common/jsx.js +0 -2
- package/dist/common/logger.js +0 -2
- package/dist/common/promise.js +0 -2
- package/dist/common/props.d.ts +1 -2
- package/dist/common/render-context.js +0 -2
- package/dist/common/route-activity.js +0 -2
- package/dist/common/router-internal.js +0 -2
- package/dist/common/router.d.ts +1 -2
- package/dist/common/ssr-errors.d.ts +1 -2
- package/dist/common/ssr-errors.js +0 -2
- package/dist/common/ssr.d.ts +1 -2
- package/dist/common/ssr.js +0 -2
- package/dist/common/vnode.d.ts +1 -2
- package/dist/common/vnode.js +0 -2
- package/dist/components/error-boundary.d.ts +1 -2
- package/dist/components/error-boundary.js +0 -2
- package/dist/components/link.d.ts +2 -2
- package/dist/components/link.js +0 -2
- package/dist/control/case.d.ts +1 -2
- package/dist/control/case.js +0 -2
- package/dist/control/for.d.ts +1 -2
- package/dist/control/for.js +0 -2
- package/dist/control/shared.d.ts +1 -2
- package/dist/control/shared.js +0 -2
- package/dist/control/show.d.ts +1 -2
- package/dist/control/show.js +0 -2
- package/dist/data/data-runtime.d.ts +1 -2
- package/dist/data/data-runtime.js +3 -5
- package/dist/data/invalidation-listeners.js +0 -2
- package/dist/data/invalidation.d.ts +1 -2
- package/dist/data/invalidation.js +0 -2
- package/dist/data/mutation-cell.d.ts +1 -2
- package/dist/data/mutation-cell.js +6 -5
- package/dist/data/query-cell.d.ts +3 -2
- package/dist/data/query-cell.js +43 -9
- package/dist/data/query-key.js +0 -2
- package/dist/data/shared.js +2 -3
- package/dist/data/types.d.ts +1 -2
- package/dist/foundations/icon/icon.d.ts +1 -2
- package/dist/foundations/icon/icon.js +0 -2
- package/dist/foundations/icon/icon.types.d.ts +1 -2
- package/dist/foundations/interactions/dismissable.d.ts +1 -2
- package/dist/foundations/interactions/dismissable.js +0 -2
- package/dist/foundations/interactions/focusable.d.ts +1 -2
- package/dist/foundations/interactions/focusable.js +0 -2
- package/dist/foundations/interactions/hoverable.d.ts +1 -2
- package/dist/foundations/interactions/hoverable.js +0 -2
- package/dist/foundations/interactions/interaction-policy.d.ts +1 -2
- package/dist/foundations/interactions/interaction-policy.js +0 -2
- package/dist/foundations/interactions/pressable.d.ts +1 -2
- package/dist/foundations/interactions/pressable.js +0 -2
- package/dist/foundations/interactions/roving-focus.d.ts +1 -2
- package/dist/foundations/interactions/roving-focus.js +0 -2
- package/dist/foundations/state/controllable.d.ts +1 -2
- package/dist/foundations/state/controllable.js +0 -2
- package/dist/foundations/structures/collection.d.ts +1 -2
- package/dist/foundations/structures/collection.js +0 -2
- package/dist/foundations/structures/layer.d.ts +1 -2
- package/dist/foundations/structures/layer.js +0 -2
- package/dist/foundations/structures/layout.d.ts +1 -2
- package/dist/foundations/structures/layout.js +0 -2
- package/dist/foundations/structures/presence.d.ts +1 -2
- package/dist/foundations/structures/presence.js +0 -2
- package/dist/foundations/structures/slot.d.ts +1 -2
- package/dist/foundations/structures/slot.js +0 -2
- package/dist/foundations/utilities/aria.d.ts +1 -2
- package/dist/foundations/utilities/aria.js +0 -2
- package/dist/foundations/utilities/compose-handlers.d.ts +1 -2
- package/dist/foundations/utilities/compose-handlers.js +0 -2
- package/dist/foundations/utilities/compose-ref.d.ts +1 -2
- package/dist/foundations/utilities/compose-ref.js +0 -2
- package/dist/foundations/utilities/event-types.d.ts +1 -2
- package/dist/foundations/utilities/merge-props.d.ts +1 -2
- package/dist/foundations/utilities/merge-props.js +0 -2
- package/dist/foundations/utilities/use-id.d.ts +1 -2
- package/dist/foundations/utilities/use-id.js +0 -2
- package/dist/fx/fx.d.ts +1 -2
- package/dist/fx/fx.js +0 -2
- package/dist/fx/noop.js +0 -2
- package/dist/fx/timing.d.ts +1 -2
- package/dist/fx/timing.js +0 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -2
- package/dist/jsx/types.d.ts +1 -2
- package/dist/jsx/utils.d.ts +1 -2
- package/dist/jsx/utils.js +0 -2
- package/dist/jsx-dev-runtime.d.ts +16 -2
- package/dist/jsx-dev-runtime.js +3 -12
- package/dist/jsx-runtime.d.ts +16 -2
- package/dist/jsx-runtime.js +15 -24
- package/dist/jsx-runtime2.d.ts +1 -1
- package/dist/renderer/attributes.js +28 -6
- package/dist/renderer/boundaries.js +48 -172
- package/dist/renderer/boundary-materialization.js +72 -0
- package/dist/renderer/boundary-range-adoption.js +76 -0
- package/dist/renderer/boundary-range-sync.js +101 -0
- package/dist/renderer/boundary-state.js +50 -0
- package/dist/renderer/child-shape.js +0 -2
- package/dist/renderer/children-fastpath.js +3 -3
- package/dist/renderer/children.js +0 -2
- package/dist/renderer/cleanup.js +70 -13
- package/dist/renderer/component-host-cleanup.js +123 -48
- package/dist/renderer/component-host-instances.js +59 -8
- package/dist/renderer/component-host-replacement.js +105 -0
- package/dist/renderer/component-host-results.js +138 -0
- package/dist/renderer/component-host.js +94 -169
- package/dist/renderer/dom-host.js +0 -2
- package/dist/renderer/dom-internal.js +110 -53
- package/dist/renderer/dom-range.js +161 -0
- package/dist/renderer/dom.js +5 -4
- package/dist/renderer/element-children.js +112 -32
- package/dist/renderer/error-boundary-dom.js +19 -11
- package/dist/renderer/evaluate-dom-range.js +3 -4
- package/dist/renderer/evaluate-reconcile.js +12 -37
- package/dist/renderer/evaluate.js +14 -3
- package/dist/renderer/fastpath.js +4 -12
- package/dist/renderer/for-commit-dom-map.js +6 -18
- package/dist/renderer/for-commit-removal.js +7 -16
- package/dist/renderer/for-commit-reorder.js +0 -2
- package/dist/renderer/for-commit.js +172 -44
- package/dist/renderer/hydration-boundaries.js +60 -0
- package/dist/renderer/hydration-listener-transaction.js +49 -0
- package/dist/renderer/index.js +8 -7
- package/dist/renderer/intrinsic-blueprint-analysis.js +202 -0
- package/dist/renderer/intrinsic-blueprint-bindings.js +152 -0
- package/dist/renderer/intrinsic-blueprint-materialization.js +100 -0
- package/dist/renderer/intrinsic-blueprint.js +30 -0
- package/dist/renderer/intrinsic-hydration-adoption.js +66 -0
- package/dist/renderer/keyed-children.js +3 -9
- package/dist/renderer/keyed.js +10 -10
- package/dist/renderer/namespaces.js +0 -2
- package/dist/renderer/prop-bindings.js +56 -21
- package/dist/renderer/reactive-child-dom.js +10 -4
- package/dist/renderer/reactive-child-sources.js +0 -2
- package/dist/renderer/reactive-children.js +29 -20
- package/dist/renderer/reconcile-commit.js +0 -2
- package/dist/renderer/reconcile-fastpaths.js +4 -11
- package/dist/renderer/reconcile-resolution.js +31 -55
- package/dist/renderer/reconcile.js +0 -2
- package/dist/renderer/retained-element-rollback.js +159 -148
- package/dist/renderer/stable-patch.js +3 -4
- package/dist/renderer/static-reuse.js +0 -2
- package/dist/renderer/utils.js +18 -9
- package/dist/router/access.js +0 -2
- package/dist/router/activity.d.ts +1 -2
- package/dist/router/activity.js +0 -2
- package/dist/router/authoring.d.ts +1 -2
- package/dist/router/authoring.js +0 -2
- package/dist/router/internal-types.d.ts +1 -2
- package/dist/router/lazy.d.ts +1 -2
- package/dist/router/lazy.js +0 -2
- package/dist/router/manifest.d.ts +1 -2
- package/dist/router/manifest.js +0 -2
- package/dist/router/match.js +0 -2
- package/dist/router/navigate.d.ts +1 -2
- package/dist/router/navigate.js +4 -7
- package/dist/router/navigation-registry.d.ts +1 -2
- package/dist/router/navigation-registry.js +0 -2
- package/dist/router/navigation-scroll.d.ts +1 -2
- package/dist/router/navigation-scroll.js +0 -2
- package/dist/router/navigation-targets.d.ts +3 -4
- package/dist/router/navigation-targets.js +419 -40
- package/dist/router/policy.d.ts +1 -2
- package/dist/router/policy.js +0 -2
- package/dist/router/rendering.d.ts +1 -2
- package/dist/router/rendering.js +4 -3
- package/dist/router/resolution.d.ts +1 -2
- package/dist/router/resolution.js +0 -2
- package/dist/router/route-context.js +0 -2
- package/dist/router/route-matching.d.ts +1 -2
- package/dist/router/route-matching.js +0 -2
- package/dist/router/route-query.d.ts +1 -2
- package/dist/router/route-query.js +1 -3
- package/dist/router/store.d.ts +1 -2
- package/dist/router/store.js +0 -2
- package/dist/runtime/access.d.ts +1 -2
- package/dist/runtime/access.js +0 -2
- package/dist/runtime/child-scope.d.ts +21 -2
- package/dist/runtime/child-scope.js +101 -54
- package/dist/runtime/component-cleanup.d.ts +1 -2
- package/dist/runtime/component-cleanup.js +2 -4
- package/dist/runtime/component-commit.js +25 -23
- package/dist/runtime/component-facade.js +5 -3
- package/dist/runtime/component-internal.d.ts +11 -6
- package/dist/runtime/component-internal.js +63 -45
- package/dist/runtime/component-lifecycle.d.ts +2 -41
- package/dist/runtime/component-lifecycle.js +6 -149
- package/dist/runtime/component-scope.d.ts +3 -4
- package/dist/runtime/component-scope.js +27 -8
- package/dist/runtime/component.js +4 -3
- package/dist/runtime/context.d.ts +5 -2
- package/dist/runtime/context.js +29 -3
- package/dist/runtime/control.d.ts +22 -3
- package/dist/runtime/control.js +168 -55
- package/dist/runtime/derive.d.ts +1 -2
- package/dist/runtime/derive.js +0 -2
- package/dist/runtime/dev-namespace.d.ts +5 -6
- package/dist/runtime/dev-namespace.js +32 -25
- package/dist/runtime/effect.d.ts +8 -5
- package/dist/runtime/effect.js +158 -75
- package/dist/runtime/error-boundary.d.ts +1 -2
- package/dist/runtime/error-boundary.js +0 -2
- package/dist/runtime/events.d.ts +3 -3
- package/dist/runtime/events.js +66 -69
- package/dist/runtime/execution-model.d.ts +1 -2
- package/dist/runtime/execution-model.js +0 -2
- package/dist/runtime/fastlane.d.ts +1 -2
- package/dist/runtime/fastlane.js +0 -2
- package/dist/runtime/for-bench.d.ts +1 -2
- package/dist/runtime/for-bench.js +9 -167
- package/dist/runtime/for-internal.d.ts +68 -5
- package/dist/runtime/for-internal.js +201 -14
- package/dist/runtime/for-reconcile.d.ts +1 -2
- package/dist/runtime/for-reconcile.js +76 -23
- package/dist/runtime/for-scopes.d.ts +5 -5
- package/dist/runtime/for-scopes.js +168 -48
- package/dist/runtime/for-signals.d.ts +13 -4
- package/dist/runtime/for-signals.js +155 -81
- package/dist/runtime/for-types.d.ts +1 -2
- package/dist/runtime/for.d.ts +2 -2
- package/dist/runtime/for.js +3 -3
- package/dist/runtime/index.d.ts +5 -5
- package/dist/runtime/index.js +12 -10
- package/dist/runtime/lifecycle-batch.d.ts +59 -0
- package/dist/runtime/lifecycle-batch.js +178 -0
- package/dist/runtime/lifecycle-operation-settlement.d.ts +5 -0
- package/dist/runtime/lifecycle-operation-settlement.js +51 -0
- package/dist/runtime/lifecycle-operations.d.ts +1 -2
- package/dist/runtime/lifecycle-operations.js +5 -6
- package/dist/runtime/perf-metrics.d.ts +8 -7
- package/dist/runtime/perf-metrics.js +4 -68
- package/dist/runtime/portal.d.ts +1 -2
- package/dist/runtime/portal.js +103 -11
- package/dist/runtime/readable.d.ts +9 -4
- package/dist/runtime/readable.js +41 -17
- package/dist/runtime/resource-cell.js +2 -4
- package/dist/runtime/resource-operation.d.ts +1 -2
- package/dist/runtime/resource-operation.js +37 -34
- package/dist/runtime/runtime.d.ts +1 -2
- package/dist/runtime/runtime.js +0 -2
- package/dist/runtime/scheduler.d.ts +1 -2
- package/dist/runtime/scheduler.js +8 -11
- package/dist/runtime/selector-store.js +0 -2
- package/dist/runtime/selector.d.ts +1 -2
- package/dist/runtime/selector.js +3 -11
- package/dist/runtime/snapshot-source.d.ts +1 -2
- package/dist/runtime/snapshot-source.js +0 -2
- package/dist/runtime/state.d.ts +1 -2
- package/dist/runtime/state.js +1 -3
- package/dist/ssg/batch-render.js +0 -2
- package/dist/ssg/create-static-gen.d.ts +4 -2
- package/dist/ssg/create-static-gen.js +65 -14
- package/dist/ssg/generate-metadata.js +0 -2
- package/dist/ssg/generation-plan.js +0 -2
- package/dist/ssg/incremental-manifest.js +1 -3
- package/dist/ssg/resolve-ssg-data.js +0 -2
- package/dist/ssg/route-utils.js +0 -2
- package/dist/ssg/static-routes.js +0 -2
- package/dist/ssg/types.d.ts +2 -3
- package/dist/ssg/write-static-files.js +16 -12
- package/dist/ssr/attrs.js +0 -2
- package/dist/ssr/boundaries.js +16 -5
- package/dist/ssr/component-runtime.js +1 -27
- package/dist/ssr/context.d.ts +1 -2
- package/dist/ssr/context.js +0 -2
- package/dist/ssr/errors.d.ts +1 -2
- package/dist/ssr/errors.js +0 -2
- package/dist/ssr/escape.js +0 -2
- package/dist/ssr/hydration-data.js +0 -2
- package/dist/ssr/hydration-verify.d.ts +1 -2
- package/dist/ssr/hydration-verify.js +34 -7
- package/dist/ssr/index-internal.d.ts +1 -2
- package/dist/ssr/index-internal.js +0 -2
- package/dist/ssr/render-keys.js +0 -2
- package/dist/ssr/render-resolved.d.ts +1 -2
- package/dist/ssr/render-resolved.js +0 -2
- package/dist/ssr/render-sync.d.ts +1 -2
- package/dist/ssr/render-sync.js +27 -19
- package/dist/ssr/route-policy-resolution.js +0 -2
- package/dist/ssr/route-render.d.ts +1 -2
- package/dist/ssr/route-render.js +0 -2
- package/dist/ssr/sink.d.ts +1 -2
- package/dist/ssr/sink.js +0 -2
- package/dist/ssr/types.d.ts +1 -2
- package/dist/ssr/verify-hydration.js +0 -2
- package/dist/testing/index.d.ts +1 -2
- package/dist/testing/index.js +0 -2
- package/package.json +57 -44
- package/dist/bench/components/benchmark-row.d.ts.map +0 -1
- package/dist/bench/components/benchmark-row.js.map +0 -1
- package/dist/bench/components/benchmark-table.js.map +0 -1
- package/dist/benchmark.d.ts.map +0 -1
- package/dist/benchmark.js.map +0 -1
- package/dist/bin/askr-ssg.d.ts.map +0 -1
- package/dist/bin/askr-ssg.js.map +0 -1
- package/dist/boot/hydration.js.map +0 -1
- package/dist/boot/index.d.ts.map +0 -1
- package/dist/boot/index.js.map +0 -1
- package/dist/boot/root-lifecycle.d.ts.map +0 -1
- package/dist/boot/root-lifecycle.js.map +0 -1
- package/dist/boot/route-startup.js.map +0 -1
- package/dist/boot/types.d.ts.map +0 -1
- package/dist/common/attr-names.js.map +0 -1
- package/dist/common/component.d.ts.map +0 -1
- package/dist/common/control.d.ts.map +0 -1
- package/dist/common/control.js.map +0 -1
- package/dist/common/env.js.map +0 -1
- package/dist/common/error-boundary.d.ts.map +0 -1
- package/dist/common/invariant.js.map +0 -1
- package/dist/common/jsx.d.ts.map +0 -1
- package/dist/common/jsx.js.map +0 -1
- package/dist/common/logger.js.map +0 -1
- package/dist/common/promise.js.map +0 -1
- package/dist/common/props.d.ts.map +0 -1
- package/dist/common/render-context.js.map +0 -1
- package/dist/common/route-activity.js.map +0 -1
- package/dist/common/router-internal.js.map +0 -1
- package/dist/common/router.d.ts.map +0 -1
- package/dist/common/ssr-errors.d.ts.map +0 -1
- package/dist/common/ssr-errors.js.map +0 -1
- package/dist/common/ssr.d.ts.map +0 -1
- package/dist/common/ssr.js.map +0 -1
- package/dist/common/vnode.d.ts.map +0 -1
- package/dist/common/vnode.js.map +0 -1
- package/dist/components/error-boundary.d.ts.map +0 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/link.d.ts.map +0 -1
- package/dist/components/link.js.map +0 -1
- package/dist/control/case.d.ts.map +0 -1
- package/dist/control/case.js.map +0 -1
- package/dist/control/for.d.ts.map +0 -1
- package/dist/control/for.js.map +0 -1
- package/dist/control/shared.d.ts.map +0 -1
- package/dist/control/shared.js.map +0 -1
- package/dist/control/show.d.ts.map +0 -1
- package/dist/control/show.js.map +0 -1
- package/dist/data/data-runtime.d.ts.map +0 -1
- package/dist/data/data-runtime.js.map +0 -1
- package/dist/data/invalidation-listeners.js.map +0 -1
- package/dist/data/invalidation.d.ts.map +0 -1
- package/dist/data/invalidation.js.map +0 -1
- package/dist/data/mutation-cell.d.ts.map +0 -1
- package/dist/data/mutation-cell.js.map +0 -1
- package/dist/data/query-cell.d.ts.map +0 -1
- package/dist/data/query-cell.js.map +0 -1
- package/dist/data/query-key.js.map +0 -1
- package/dist/data/shared.js.map +0 -1
- package/dist/data/types.d.ts.map +0 -1
- package/dist/foundations/icon/icon.d.ts.map +0 -1
- package/dist/foundations/icon/icon.js.map +0 -1
- package/dist/foundations/icon/icon.types.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
- package/dist/foundations/interactions/dismissable.js.map +0 -1
- package/dist/foundations/interactions/focusable.d.ts.map +0 -1
- package/dist/foundations/interactions/focusable.js.map +0 -1
- package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
- package/dist/foundations/interactions/hoverable.js.map +0 -1
- package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
- package/dist/foundations/interactions/interaction-policy.js.map +0 -1
- package/dist/foundations/interactions/pressable.d.ts.map +0 -1
- package/dist/foundations/interactions/pressable.js.map +0 -1
- package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
- package/dist/foundations/interactions/roving-focus.js.map +0 -1
- package/dist/foundations/state/controllable.d.ts.map +0 -1
- package/dist/foundations/state/controllable.js.map +0 -1
- package/dist/foundations/structures/collection.d.ts.map +0 -1
- package/dist/foundations/structures/collection.js.map +0 -1
- package/dist/foundations/structures/layer.d.ts.map +0 -1
- package/dist/foundations/structures/layer.js.map +0 -1
- package/dist/foundations/structures/layout.d.ts.map +0 -1
- package/dist/foundations/structures/layout.js.map +0 -1
- package/dist/foundations/structures/presence.d.ts.map +0 -1
- package/dist/foundations/structures/presence.js.map +0 -1
- package/dist/foundations/structures/slot.d.ts.map +0 -1
- package/dist/foundations/structures/slot.js.map +0 -1
- package/dist/foundations/utilities/aria.d.ts.map +0 -1
- package/dist/foundations/utilities/aria.js.map +0 -1
- package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-handlers.js.map +0 -1
- package/dist/foundations/utilities/compose-ref.d.ts.map +0 -1
- package/dist/foundations/utilities/compose-ref.js.map +0 -1
- package/dist/foundations/utilities/event-types.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
- package/dist/foundations/utilities/merge-props.js.map +0 -1
- package/dist/foundations/utilities/use-id.d.ts.map +0 -1
- package/dist/foundations/utilities/use-id.js.map +0 -1
- package/dist/fx/fx.d.ts.map +0 -1
- package/dist/fx/fx.js.map +0 -1
- package/dist/fx/noop.js.map +0 -1
- package/dist/fx/timing.d.ts.map +0 -1
- package/dist/fx/timing.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsx/types.d.ts.map +0 -1
- package/dist/jsx/utils.d.ts.map +0 -1
- package/dist/jsx/utils.js.map +0 -1
- package/dist/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx-dev-runtime.js.map +0 -1
- package/dist/jsx-runtime.d.ts.map +0 -1
- package/dist/jsx-runtime.js.map +0 -1
- package/dist/renderer/attributes.js.map +0 -1
- package/dist/renderer/boundaries.js.map +0 -1
- package/dist/renderer/child-shape.js.map +0 -1
- package/dist/renderer/children-fastpath.js.map +0 -1
- package/dist/renderer/children.js.map +0 -1
- package/dist/renderer/cleanup.js.map +0 -1
- package/dist/renderer/component-host-cleanup.js.map +0 -1
- package/dist/renderer/component-host-instances.js.map +0 -1
- package/dist/renderer/component-host.js.map +0 -1
- package/dist/renderer/dom-host.js.map +0 -1
- package/dist/renderer/dom-internal.js.map +0 -1
- package/dist/renderer/element-children.js.map +0 -1
- package/dist/renderer/error-boundary-dom.js.map +0 -1
- package/dist/renderer/evaluate-dom-range.js.map +0 -1
- package/dist/renderer/evaluate-reconcile.js.map +0 -1
- package/dist/renderer/evaluate.js.map +0 -1
- package/dist/renderer/fastpath.js.map +0 -1
- package/dist/renderer/for-commit-dom-map.js.map +0 -1
- package/dist/renderer/for-commit-removal.js.map +0 -1
- package/dist/renderer/for-commit-reorder.js.map +0 -1
- package/dist/renderer/for-commit.js.map +0 -1
- package/dist/renderer/index.js.map +0 -1
- package/dist/renderer/keyed-children.js.map +0 -1
- package/dist/renderer/keyed.js.map +0 -1
- package/dist/renderer/namespaces.js.map +0 -1
- package/dist/renderer/prop-bindings.js.map +0 -1
- package/dist/renderer/reactive-child-dom.js.map +0 -1
- package/dist/renderer/reactive-child-sources.js.map +0 -1
- package/dist/renderer/reactive-children.js.map +0 -1
- package/dist/renderer/reconcile-commit.js.map +0 -1
- package/dist/renderer/reconcile-fastpaths.js.map +0 -1
- package/dist/renderer/reconcile-resolution.js.map +0 -1
- package/dist/renderer/reconcile.js.map +0 -1
- package/dist/renderer/retained-element-rollback.js.map +0 -1
- package/dist/renderer/stable-patch.js.map +0 -1
- package/dist/renderer/static-reuse.js.map +0 -1
- package/dist/renderer/utils.js.map +0 -1
- package/dist/router/access.js.map +0 -1
- package/dist/router/activity.d.ts.map +0 -1
- package/dist/router/activity.js.map +0 -1
- package/dist/router/authoring.d.ts.map +0 -1
- package/dist/router/authoring.js.map +0 -1
- package/dist/router/internal-types.d.ts.map +0 -1
- package/dist/router/lazy.d.ts.map +0 -1
- package/dist/router/lazy.js.map +0 -1
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match.js.map +0 -1
- package/dist/router/navigate.d.ts.map +0 -1
- package/dist/router/navigate.js.map +0 -1
- package/dist/router/navigation-registry.d.ts.map +0 -1
- package/dist/router/navigation-registry.js.map +0 -1
- package/dist/router/navigation-scroll.d.ts.map +0 -1
- package/dist/router/navigation-scroll.js.map +0 -1
- package/dist/router/navigation-targets.d.ts.map +0 -1
- package/dist/router/navigation-targets.js.map +0 -1
- package/dist/router/policy.d.ts.map +0 -1
- package/dist/router/policy.js.map +0 -1
- package/dist/router/rendering.d.ts.map +0 -1
- package/dist/router/rendering.js.map +0 -1
- package/dist/router/resolution.d.ts.map +0 -1
- package/dist/router/resolution.js.map +0 -1
- package/dist/router/route-context.js.map +0 -1
- package/dist/router/route-matching.d.ts.map +0 -1
- package/dist/router/route-matching.js.map +0 -1
- package/dist/router/route-query.d.ts.map +0 -1
- package/dist/router/route-query.js.map +0 -1
- package/dist/router/store.d.ts.map +0 -1
- package/dist/router/store.js.map +0 -1
- package/dist/runtime/access.d.ts.map +0 -1
- package/dist/runtime/access.js.map +0 -1
- package/dist/runtime/child-scope.d.ts.map +0 -1
- package/dist/runtime/child-scope.js.map +0 -1
- package/dist/runtime/component-cleanup.d.ts.map +0 -1
- package/dist/runtime/component-cleanup.js.map +0 -1
- package/dist/runtime/component-commit.js.map +0 -1
- package/dist/runtime/component-internal.d.ts.map +0 -1
- package/dist/runtime/component-internal.js.map +0 -1
- package/dist/runtime/component-lifecycle.d.ts.map +0 -1
- package/dist/runtime/component-lifecycle.js.map +0 -1
- package/dist/runtime/component-scope.d.ts.map +0 -1
- package/dist/runtime/component-scope.js.map +0 -1
- package/dist/runtime/context.d.ts.map +0 -1
- package/dist/runtime/context.js.map +0 -1
- package/dist/runtime/control.d.ts.map +0 -1
- package/dist/runtime/control.js.map +0 -1
- package/dist/runtime/derive.d.ts.map +0 -1
- package/dist/runtime/derive.js.map +0 -1
- package/dist/runtime/dev-namespace.d.ts.map +0 -1
- package/dist/runtime/dev-namespace.js.map +0 -1
- package/dist/runtime/effect.d.ts.map +0 -1
- package/dist/runtime/effect.js.map +0 -1
- package/dist/runtime/error-boundary.d.ts.map +0 -1
- package/dist/runtime/error-boundary.js.map +0 -1
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/events.js.map +0 -1
- package/dist/runtime/execution-model.d.ts.map +0 -1
- package/dist/runtime/execution-model.js.map +0 -1
- package/dist/runtime/fastlane.d.ts.map +0 -1
- package/dist/runtime/fastlane.js.map +0 -1
- package/dist/runtime/for-bench.d.ts.map +0 -1
- package/dist/runtime/for-bench.js.map +0 -1
- package/dist/runtime/for-internal.d.ts.map +0 -1
- package/dist/runtime/for-internal.js.map +0 -1
- package/dist/runtime/for-reconcile.d.ts.map +0 -1
- package/dist/runtime/for-reconcile.js.map +0 -1
- package/dist/runtime/for-scopes.d.ts.map +0 -1
- package/dist/runtime/for-scopes.js.map +0 -1
- package/dist/runtime/for-signals.d.ts.map +0 -1
- package/dist/runtime/for-signals.js.map +0 -1
- package/dist/runtime/for-types.d.ts.map +0 -1
- package/dist/runtime/lifecycle-operations.d.ts.map +0 -1
- package/dist/runtime/lifecycle-operations.js.map +0 -1
- package/dist/runtime/perf-metrics.d.ts.map +0 -1
- package/dist/runtime/perf-metrics.js.map +0 -1
- package/dist/runtime/portal.d.ts.map +0 -1
- package/dist/runtime/portal.js.map +0 -1
- package/dist/runtime/readable.d.ts.map +0 -1
- package/dist/runtime/readable.js.map +0 -1
- package/dist/runtime/resource-cell.js.map +0 -1
- package/dist/runtime/resource-operation.d.ts.map +0 -1
- package/dist/runtime/resource-operation.js.map +0 -1
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/scheduler.d.ts.map +0 -1
- package/dist/runtime/scheduler.js.map +0 -1
- package/dist/runtime/selector-store.js.map +0 -1
- package/dist/runtime/selector.d.ts.map +0 -1
- package/dist/runtime/selector.js.map +0 -1
- package/dist/runtime/snapshot-source.d.ts.map +0 -1
- package/dist/runtime/snapshot-source.js.map +0 -1
- package/dist/runtime/state.d.ts.map +0 -1
- package/dist/runtime/state.js.map +0 -1
- package/dist/ssg/batch-render.js.map +0 -1
- package/dist/ssg/create-static-gen.d.ts.map +0 -1
- package/dist/ssg/create-static-gen.js.map +0 -1
- package/dist/ssg/generate-metadata.js.map +0 -1
- package/dist/ssg/generation-plan.js.map +0 -1
- package/dist/ssg/incremental-manifest.js.map +0 -1
- package/dist/ssg/resolve-ssg-data.js.map +0 -1
- package/dist/ssg/route-utils.js.map +0 -1
- package/dist/ssg/static-routes.js.map +0 -1
- package/dist/ssg/types.d.ts.map +0 -1
- package/dist/ssg/write-static-files.js.map +0 -1
- package/dist/ssr/attrs.js.map +0 -1
- package/dist/ssr/boundaries.js.map +0 -1
- package/dist/ssr/component-runtime.js.map +0 -1
- package/dist/ssr/context.d.ts.map +0 -1
- package/dist/ssr/context.js.map +0 -1
- package/dist/ssr/errors.d.ts.map +0 -1
- package/dist/ssr/errors.js.map +0 -1
- package/dist/ssr/escape.js.map +0 -1
- package/dist/ssr/hydration-data.js.map +0 -1
- package/dist/ssr/hydration-verify.d.ts.map +0 -1
- package/dist/ssr/hydration-verify.js.map +0 -1
- package/dist/ssr/index-internal.d.ts.map +0 -1
- package/dist/ssr/index-internal.js.map +0 -1
- package/dist/ssr/render-keys.js.map +0 -1
- package/dist/ssr/render-resolved.d.ts.map +0 -1
- package/dist/ssr/render-resolved.js.map +0 -1
- package/dist/ssr/render-sync.d.ts.map +0 -1
- package/dist/ssr/render-sync.js.map +0 -1
- package/dist/ssr/route-policy-resolution.js.map +0 -1
- package/dist/ssr/route-render.d.ts.map +0 -1
- package/dist/ssr/route-render.js.map +0 -1
- package/dist/ssr/sink.d.ts.map +0 -1
- package/dist/ssr/sink.js.map +0 -1
- package/dist/ssr/types.d.ts.map +0 -1
- package/dist/ssr/verify-hydration.js.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reactive-children.js","names":[],"sources":["../../src/renderer/reactive-children.ts"],"sourcesContent":["import { logger } from '../common/logger';\nimport {\n createChildScope,\n disposeChildScope,\n rerenderChildScope,\n type ChildScope,\n} from '../runtime';\nimport { getCurrentInstance } from '../runtime';\nimport { incDevCounter } from '../runtime';\nimport {\n createFineGrainedEffect,\n type FineGrainedEffectHandle,\n} from '../runtime';\nimport {\n elementReactivePropsCleanup,\n REACTIVE_CHILDREN_KEY,\n teardownNodeSubtree,\n type ReactivePropCleanupEntry,\n} from './cleanup';\nimport { getRuntimeEnv } from './env';\nimport { getParentNamespace } from './namespaces';\nimport type { VNode } from './types';\nimport {\n commitReactiveChildBoundaryEntryNodes,\n createReactiveChildBoundaryHost,\n disposeReactiveChildBoundaryNodes,\n materializeReactiveChildBoundaryNodes,\n syncReactiveChildExpectedNodes,\n syncReactiveChildSequenceNodes,\n syncReactiveScalarTextNodes,\n type ReactiveChildBoundarySequenceEntry,\n type ReactiveChildDOMHost,\n} from './reactive-child-dom';\nimport {\n areReactiveChildBoundarySequenceSourcesEqual,\n areReactiveScalarChildSourcesEqual,\n canUpdateReactiveChildBoundarySequenceSource,\n collectReactiveChildValuesAsVNodes,\n getReactiveChildBoundarySequenceSource,\n getReactiveScalarChildSource,\n getSingleReactiveChildBoundarySource,\n normalizeOwnedReactiveTextValue,\n normalizeReactiveChildBoundaryVNode,\n normalizeReactiveScalarSequenceValues,\n type ReactiveChildBoundarySequenceSource,\n type ReactiveScalarChildSource,\n} from './reactive-child-sources';\n\nexport type { ReactiveChildDOMHost } from './reactive-child-dom';\n\nlet reactiveChildScopeId = 0;\n\nfunction getOrCreateElementReactiveCleanupMap(\n el: Element\n): Map<string, ReactivePropCleanupEntry> {\n let cleanupMap = elementReactivePropsCleanup.get(el);\n if (!cleanupMap) {\n cleanupMap = new Map();\n elementReactivePropsCleanup.set(el, cleanupMap);\n }\n\n return cleanupMap;\n}\n\nexport function trySyncScalarChildSequenceInPlace(\n el: Element,\n children: unknown[],\n host: ReactiveChildDOMHost\n): boolean {\n const normalized = normalizeReactiveScalarSequenceValues(children);\n if (!normalized) {\n return false;\n }\n\n if (el.childNodes.length !== normalized.length) {\n return false;\n }\n\n for (let index = 0; index < el.childNodes.length; index += 1) {\n if (el.childNodes[index]?.nodeType !== Node.TEXT_NODE) {\n return false;\n }\n }\n\n syncReactiveScalarTextNodes(el, children, normalized, host);\n return true;\n}\n\nfunction setupReactiveScalarChild(\n el: Element,\n source: ReactiveScalarChildSource,\n host: ReactiveChildDOMHost\n): {\n cleanup: () => void;\n updateFn: (nextSource: ReactiveScalarChildSource) => void;\n} {\n let currentSource = source;\n\n if (source.length === 1 && source[0]?.kind === 'dynamic') {\n let ownedTextNode =\n el.childNodes.length === 1 && el.firstChild?.nodeType === Node.TEXT_NODE\n ? (el.firstChild as Text)\n : null;\n\n let effectHandle: FineGrainedEffectHandle<string> | null =\n createFineGrainedEffect({\n lane: 'reactive',\n compute: () => {\n const currentSlot = currentSource[0];\n if (!currentSlot || currentSlot.kind !== 'dynamic') {\n throw new Error(\n '[Askr] Direct reactive text bindings require a single dynamic slot.'\n );\n }\n\n const rawValue = currentSlot.compute();\n const normalized = normalizeOwnedReactiveTextValue(rawValue);\n return normalized ?? (rawValue as string);\n },\n commit: (value) => {\n const normalized = normalizeOwnedReactiveTextValue(value);\n\n if (normalized === null) {\n ownedTextNode = null;\n host.updateElementChildren(\n el,\n value as unknown as VNode | VNode[] | undefined\n );\n return;\n }\n\n if (\n !ownedTextNode ||\n el.childNodes.length !== 1 ||\n el.firstChild !== ownedTextNode\n ) {\n host.updateElementChildren(el, normalized);\n ownedTextNode =\n el.childNodes.length === 1 &&\n el.firstChild?.nodeType === Node.TEXT_NODE\n ? (el.firstChild as Text)\n : null;\n }\n\n if (!ownedTextNode) {\n return;\n }\n\n if (ownedTextNode.data !== normalized) {\n ownedTextNode.data = normalized;\n incDevCounter('textNodeWrites');\n }\n },\n onError: (err) => {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive child update failed:', err);\n }\n },\n });\n\n return {\n cleanup: () => {\n effectHandle?.cleanup();\n effectHandle = null;\n },\n updateFn: (nextSource: ReactiveScalarChildSource) => {\n if (!effectHandle) {\n return;\n }\n\n currentSource = nextSource;\n effectHandle.updateCompute(() => {\n const currentSlot = currentSource[0];\n if (!currentSlot || currentSlot.kind !== 'dynamic') {\n throw new Error(\n '[Askr] Direct reactive text bindings require a single dynamic slot.'\n );\n }\n\n const rawValue = currentSlot.compute();\n const normalized = normalizeOwnedReactiveTextValue(rawValue);\n return normalized ?? (rawValue as string);\n });\n },\n };\n }\n\n let effectHandle: FineGrainedEffectHandle<unknown> | null =\n createFineGrainedEffect({\n lane: 'reactive',\n compute: () =>\n currentSource.map((slot) =>\n slot.kind === 'static' ? slot.value : slot.compute()\n ),\n commit: (values) => {\n if (!Array.isArray(values)) {\n throw new Error(\n '[Askr] Reactive scalar children must evaluate to a slot array.'\n );\n }\n\n const normalized = normalizeReactiveScalarSequenceValues(values);\n if (normalized) {\n syncReactiveScalarTextNodes(el, values, normalized, host);\n return;\n }\n\n const nextChildren: VNode[] = [];\n collectReactiveChildValuesAsVNodes(values, nextChildren);\n\n const boundaryHost = createReactiveChildBoundaryHost(el);\n for (let node = el.firstChild; node; ) {\n const next = node.nextSibling;\n boundaryHost.appendChild(node);\n node = next;\n }\n\n host.updateElementChildren(boundaryHost, nextChildren);\n syncReactiveChildExpectedNodes(el, Array.from(boundaryHost.childNodes));\n },\n equals: (previousValue, nextValue) => {\n if (!Array.isArray(previousValue) || !Array.isArray(nextValue)) {\n return false;\n }\n\n const previousNormalized =\n normalizeReactiveScalarSequenceValues(previousValue);\n const nextNormalized = normalizeReactiveScalarSequenceValues(nextValue);\n\n if (!previousNormalized || !nextNormalized) {\n return false;\n }\n\n if (previousNormalized.length !== nextNormalized.length) {\n return false;\n }\n\n for (let index = 0; index < previousNormalized.length; index += 1) {\n if (previousNormalized[index] !== nextNormalized[index]) {\n return false;\n }\n }\n\n return true;\n },\n onError: (err) => {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive child update failed:', err);\n }\n },\n });\n\n return {\n cleanup: () => {\n effectHandle?.cleanup();\n effectHandle = null;\n },\n updateFn: (nextSource: ReactiveScalarChildSource) => {\n if (!effectHandle) {\n return;\n }\n\n currentSource = nextSource;\n effectHandle.updateCompute(() =>\n currentSource.map((slot) =>\n slot.kind === 'static' ? slot.value : slot.compute()\n )\n );\n },\n };\n}\n\nfunction setupReactiveChildBoundary(\n el: Element,\n childFn: () => VNode,\n host: ReactiveChildDOMHost\n): { cleanup: () => void; updateFn: (nextValue: unknown) => void } {\n let currentChildFn = childFn;\n const parentInstance = getCurrentInstance();\n const entry: { scope: ChildScope; nodes: Node[] } = {\n scope: createChildScope(\n parentInstance,\n `__reactive-child__:${(reactiveChildScopeId += 1)}`,\n () => {\n const expectedNodes = commitReactiveChildBoundaryEntryNodes(\n el,\n entry,\n host\n );\n syncReactiveChildExpectedNodes(el, expectedNodes);\n }\n ),\n nodes: [],\n };\n\n entry.scope.render(() =>\n normalizeReactiveChildBoundaryVNode(currentChildFn())\n );\n syncReactiveChildExpectedNodes(\n el,\n commitReactiveChildBoundaryEntryNodes(el, entry, host)\n );\n\n return {\n cleanup: () => {\n const dom = entry.scope.dom;\n const nodes = entry.nodes;\n disposeChildScope(entry.scope);\n entry.nodes = [];\n\n if (nodes.length > 0) {\n disposeReactiveChildBoundaryNodes(nodes);\n return;\n }\n\n if (dom?.parentNode === el) {\n teardownNodeSubtree(dom);\n el.removeChild(dom);\n }\n },\n updateFn: (nextValue: unknown) => {\n currentChildFn = nextValue as () => VNode;\n rerenderChildScope(entry.scope);\n const expectedNodes = commitReactiveChildBoundaryEntryNodes(\n el,\n entry,\n host\n );\n syncReactiveChildExpectedNodes(el, expectedNodes);\n },\n };\n}\n\nfunction setupReactiveChildBoundarySequence(\n el: Element,\n source: ReactiveChildBoundarySequenceSource,\n host: ReactiveChildDOMHost\n): { cleanup: () => void; updateFn: (nextValue: unknown) => void } {\n let currentSource = source;\n const parentInstance = getCurrentInstance();\n const entries: ReactiveChildBoundarySequenceEntry[] = [];\n const dynamicEntries: Array<{\n index: number;\n entry: Extract<ReactiveChildBoundarySequenceEntry, { kind: 'dynamic' }>;\n }> = [];\n\n if (!currentSource.some((slot) => slot.kind === 'dynamic')) {\n throw new Error(\n '[Askr] Reactive child boundary sequence requires at least one dynamic slot.'\n );\n }\n\n const syncSequence = () => {\n syncReactiveChildSequenceNodes(el, entries, host);\n };\n\n const parentNamespace = getParentNamespace(el);\n\n for (let index = 0; index < currentSource.length; index += 1) {\n const slot = currentSource[index];\n if (!slot) {\n continue;\n }\n\n if (slot.kind === 'static-text') {\n entries.push({\n kind: 'static',\n nodes: [document.createTextNode(slot.value)],\n });\n continue;\n }\n\n if (slot.kind === 'static-node') {\n entries.push({\n kind: 'static',\n nodes: materializeReactiveChildBoundaryNodes(\n slot.value,\n parentNamespace,\n host\n ),\n });\n continue;\n }\n\n const scope = createChildScope(\n parentInstance,\n `__reactive-child-seq__:${(reactiveChildScopeId += 1)}`,\n syncSequence\n );\n\n const dynamicEntry: Extract<\n ReactiveChildBoundarySequenceEntry,\n { kind: 'dynamic' }\n > = {\n kind: 'dynamic',\n scope,\n nodes: [],\n };\n entries.push(dynamicEntry);\n dynamicEntries.push({ index, entry: dynamicEntry });\n }\n\n for (const dynamicEntry of dynamicEntries) {\n dynamicEntry.entry.scope.render(() =>\n normalizeReactiveChildBoundaryVNode(\n (\n currentSource[dynamicEntry.index] as {\n kind: 'dynamic';\n compute: () => VNode;\n }\n ).compute()\n )\n );\n }\n\n syncSequence();\n\n return {\n cleanup: () => {\n for (const dynamicEntry of dynamicEntries) {\n const dom = dynamicEntry.entry.scope.dom;\n const nodes = dynamicEntry.entry.nodes;\n disposeChildScope(dynamicEntry.entry.scope);\n\n if (nodes.length > 0) {\n disposeReactiveChildBoundaryNodes(nodes);\n continue;\n }\n\n if (dom?.parentNode === el) {\n teardownNodeSubtree(dom);\n el.removeChild(dom);\n }\n }\n\n for (const entry of entries) {\n if (entry.kind === 'static') {\n disposeReactiveChildBoundaryNodes(entry.nodes);\n }\n }\n },\n updateFn: (nextValue: unknown) => {\n currentSource = nextValue as ReactiveChildBoundarySequenceSource;\n for (const dynamicEntry of dynamicEntries) {\n rerenderChildScope(dynamicEntry.entry.scope);\n }\n syncSequence();\n },\n };\n}\n\nexport function syncReactiveScalarChild(\n el: Element,\n children: unknown,\n host: ReactiveChildDOMHost\n): boolean {\n const reactiveChildSource = getReactiveScalarChildSource(children);\n const reactiveChildBoundary = getSingleReactiveChildBoundarySource(children);\n const reactiveChildBoundarySequence =\n getReactiveChildBoundarySequenceSource(children);\n const existingReactiveEntry = elementReactivePropsCleanup\n .get(el)\n ?.get(REACTIVE_CHILDREN_KEY);\n\n if (\n !reactiveChildSource &&\n !reactiveChildBoundary &&\n !reactiveChildBoundarySequence\n ) {\n if (existingReactiveEntry) {\n existingReactiveEntry.cleanup();\n const cleanupMap = elementReactivePropsCleanup.get(el);\n cleanupMap?.delete(REACTIVE_CHILDREN_KEY);\n if (cleanupMap && cleanupMap.size === 0) {\n elementReactivePropsCleanup.delete(el);\n }\n }\n\n return false;\n }\n\n if (reactiveChildSource && !reactiveChildBoundarySequence) {\n if (\n existingReactiveEntry &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n areReactiveScalarChildSourcesEqual(\n existingReactiveEntry.fnRef,\n reactiveChildSource\n )\n ) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n Array.isArray(existingReactiveEntry.fnRef)\n ) {\n existingReactiveEntry.updateFn(reactiveChildSource);\n existingReactiveEntry.fnRef = reactiveChildSource;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n try {\n const reactive = setupReactiveScalarChild(el, reactiveChildSource, host);\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: (nextValue) => {\n reactive.updateFn(nextValue as ReactiveScalarChildSource);\n },\n fnRef: reactiveChildSource,\n });\n return true;\n } catch (error) {\n if (!reactiveChildBoundary && !reactiveChildBoundarySequence) {\n throw error;\n }\n }\n }\n\n if (reactiveChildBoundarySequence) {\n if (\n existingReactiveEntry &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n areReactiveChildBoundarySequenceSourcesEqual(\n existingReactiveEntry.fnRef,\n reactiveChildBoundarySequence\n )\n ) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n canUpdateReactiveChildBoundarySequenceSource(\n existingReactiveEntry.fnRef,\n reactiveChildBoundarySequence\n )\n ) {\n existingReactiveEntry.updateFn(reactiveChildBoundarySequence);\n existingReactiveEntry.fnRef = reactiveChildBoundarySequence;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n const reactive = setupReactiveChildBoundarySequence(\n el,\n reactiveChildBoundarySequence,\n host\n );\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: reactive.updateFn,\n fnRef: reactiveChildBoundarySequence,\n });\n return true;\n }\n\n if (existingReactiveEntry?.fnRef === reactiveChildBoundary) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n !Array.isArray(existingReactiveEntry.fnRef)\n ) {\n existingReactiveEntry.updateFn(reactiveChildBoundary);\n existingReactiveEntry.fnRef = reactiveChildBoundary;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n if (!reactiveChildBoundary) {\n return false;\n }\n\n const reactive = setupReactiveChildBoundary(el, reactiveChildBoundary, host);\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: reactive.updateFn,\n fnRef: reactiveChildBoundary,\n });\n return true;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-commit.js","names":[],"sources":["../../src/renderer/reconcile-commit.ts"],"sourcesContent":["import { teardownNodeSubtree } from './cleanup';\nimport { recordDOMReplace } from './utils';\n\nexport function commitReconciliation(\n parent: Element,\n finalNodes: Node[]\n): void {\n try {\n const finalSet = new Set<Node>(finalNodes);\n\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (!finalSet.has(n)) {\n teardownNodeSubtree(n);\n parent.removeChild(n);\n }\n n = next;\n }\n\n for (let i = 0; i < finalNodes.length; i++) {\n const desiredNode = finalNodes[i];\n const anchor = parent.childNodes[i] ?? null;\n if (desiredNode !== anchor) {\n parent.insertBefore(desiredNode, anchor);\n }\n }\n } catch {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n }\n\n try {\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n } catch {\n // Ignore fallback cleanup failures.\n }\n\n recordDOMReplace('reconcile');\n parent.replaceChildren(fragment);\n return;\n }\n}\n"],"mappings":";;;AAGA,SAAgB,qBACd,QACA,YACM;CACN,IAAI;EACF,MAAM,WAAW,IAAI,IAAU,UAAU;EAEzC,KAAK,IAAI,IAAI,OAAO,YAAY,IAAK;GACnC,MAAM,OAAO,EAAE;GACf,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;IACpB,oBAAoB,CAAC;IACrB,OAAO,YAAY,CAAC;GACtB;GACA,IAAI;EACN;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,MAAM,cAAc,WAAW;GAC/B,MAAM,SAAS,OAAO,WAAW,MAAM;GACvC,IAAI,gBAAgB,QAClB,OAAO,aAAa,aAAa,MAAM;EAE3C;CACF,QAAQ;EACN,MAAM,WAAW,SAAS,uBAAuB;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KACrC,SAAS,YAAY,WAAW,EAAE;EAGpC,IAAI;GACF,KAAK,IAAI,IAAI,OAAO,YAAY,IAAK;IACnC,MAAM,OAAO,EAAE;IACf,oBAAoB,CAAC;IACrB,IAAI;GACN;EACF,QAAQ,CAER;EAEA,iBAAiB,WAAW;EAC5B,OAAO,gBAAgB,QAAQ;EAC/B;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-fastpaths.js","names":[],"sources":["../../src/renderer/reconcile-fastpaths.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { performBulkPositionalKeyedTextUpdate } from './children';\nimport { getRuntimeEnv } from './env';\nimport { applyRendererFastPath } from './fastpath';\nimport { keyedElements, planKeyedReorderFastPath } from './keyed';\nimport type { KeyedVnode } from './keyed-children';\nimport {\n canReuseIntrinsicElementInNamespace,\n getParentNamespace,\n} from './namespaces';\nimport { checkPropChanges, recordFastPathStats } from './utils';\n\ntype VnodeObj = VNode & { type?: unknown; props?: Record<string, unknown> };\n\nexport function tryFastPaths(\n parent: Element,\n newChildren: VNode[],\n keyedVnodes: KeyedVnode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> | null {\n try {\n const forcedResult = tryForcedPositionalBulkUpdate(\n parent,\n newChildren,\n keyedVnodes\n );\n if (forcedResult) {\n return forcedResult;\n }\n\n const rendererResult = tryRendererFastPath(\n parent,\n keyedVnodes,\n newChildren.length,\n oldKeyMap\n );\n if (rendererResult) {\n return rendererResult;\n }\n\n const positionalResult = tryPositionalBulkUpdate(parent, keyedVnodes);\n if (positionalResult) {\n return positionalResult;\n }\n } catch {\n // Fall through to full reconciliation.\n }\n\n return null;\n}\n\nfunction tryRendererFastPath(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n totalChildren: number,\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> | null {\n const decision = planKeyedReorderFastPath(\n parent,\n keyedVnodes,\n totalChildren,\n oldKeyMap\n );\n\n if (decision.useFastPath) {\n try {\n const map = applyRendererFastPath(parent, keyedVnodes, oldKeyMap);\n if (map) {\n keyedElements.set(parent, map);\n return map;\n }\n } catch {\n // Fall through.\n }\n }\n\n return null;\n}\n\nfunction tryForcedPositionalBulkUpdate(\n parent: Element,\n newChildren: VNode[],\n keyedVnodes: KeyedVnode[]\n): Map<string | number, Element> | null {\n if (getRuntimeEnv().ASKR_FORCE_BULK_POSREUSE !== '1') return null;\n if (keyedVnodes.length === 0 || keyedVnodes.length !== newChildren.length) {\n return null;\n }\n\n try {\n const stats = performBulkPositionalKeyedTextUpdate(parent, keyedVnodes);\n recordFastPathStats(stats, 'bulkKeyedPositionalForced');\n\n rebuildKeyedMap(parent);\n return keyedElements.get(parent) as Map<string | number, Element>;\n } catch {\n return null;\n }\n}\n\nfunction tryPositionalBulkUpdate(\n parent: Element,\n keyedVnodes: KeyedVnode[]\n): Map<string | number, Element> | null {\n const total = keyedVnodes.length;\n if (total < 10) return null;\n\n if (parent.children.length !== total) {\n return null;\n }\n\n const parentNamespace = getParentNamespace(parent);\n const matchCount = countPositionalMatches(\n parent,\n keyedVnodes,\n parentNamespace\n );\n const matchFraction = matchCount / total;\n\n if (keyedVnodes.length > 0) {\n if (matchCount !== total && matchFraction >= 0.1) {\n return null;\n }\n } else if (matchFraction < 0.9) {\n return null;\n }\n\n if (hasPositionalPropChanges(parent, keyedVnodes)) {\n return null;\n }\n\n try {\n const stats = performBulkPositionalKeyedTextUpdate(parent, keyedVnodes);\n recordFastPathStats(stats, 'bulkKeyedPositionalHits');\n\n rebuildKeyedMap(parent);\n return keyedElements.get(parent) as Map<string | number, Element>;\n } catch {\n return null;\n }\n}\n\nfunction countPositionalMatches(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n parentNamespace: string | undefined\n): number {\n let matchCount = 0;\n\n try {\n for (let i = 0; i < keyedVnodes.length; i++) {\n const vnode = keyedVnodes[i].vnode as VnodeObj;\n const expectedKey = keyedVnodes[i].key;\n\n if (!vnode || typeof vnode !== 'object' || typeof vnode.type !== 'string')\n continue;\n\n const el = parent.children[i] as Element | undefined;\n if (!el) continue;\n\n if (\n canReuseIntrinsicElementInNamespace(el, vnode.type, parentNamespace)\n ) {\n const actualKey = el.getAttribute('data-key');\n const keyMatches =\n actualKey === String(expectedKey) ||\n (actualKey !== null &&\n !Number.isNaN(Number(actualKey)) &&\n Number(actualKey) === expectedKey);\n\n if (keyMatches) {\n matchCount++;\n }\n }\n }\n } catch {\n // Ignore.\n }\n\n return matchCount;\n}\n\nfunction hasPositionalPropChanges(\n parent: Element,\n keyedVnodes: KeyedVnode[]\n): boolean {\n try {\n for (let i = 0; i < keyedVnodes.length; i++) {\n const vnode = keyedVnodes[i].vnode as VnodeObj;\n const el = parent.children[i] as Element | undefined;\n if (!el || !vnode || typeof vnode !== 'object') continue;\n\n if (checkPropChanges(el, vnode.props || {})) {\n return true;\n }\n }\n } catch {\n return true;\n }\n\n return false;\n}\n\nfunction rebuildKeyedMap(parent: Element): void {\n try {\n const map = new Map<string | number, Element>();\n for (let el = parent.firstElementChild; el; el = el.nextElementSibling) {\n const k = el.getAttribute('data-key');\n if (k !== null) {\n map.set(k, el);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, el);\n }\n }\n keyedElements.set(parent, map);\n } catch {\n // Ignore.\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-resolution.js","names":[],"sources":["../../src/renderer/reconcile-resolution.ts"],"sourcesContent":["import { __FOR_BOUNDARY__ } from '../common/vnode';\nimport type { Props } from '../common/props';\nimport type { ComponentFunction } from '../runtime';\nimport {\n evaluateCaseState,\n evaluateShowState,\n type ControlBoundaryState,\n} from '../runtime';\nimport { evaluateForState } from '../runtime';\nimport { getRendererDOMHost, type ElementWithContext } from './dom-host';\nimport {\n canReuseIntrinsicElementInNamespace,\n getParentNamespace,\n} from './namespaces';\nimport type { DOMElement, VNode } from './types';\nimport { extractKey } from './utils';\n\ntype VnodeObj = VNode & { type?: unknown; props?: Record<string, unknown> };\ntype ComponentVNode = DOMElement & { type: ComponentFunction };\n\nexport function createOldElResolver(\n parent: Element,\n oldKeyMap: Map<string | number, Element> | undefined,\n usedOldEls: WeakSet<Node>\n): (k: string | number) => Element | undefined {\n return (k: string | number) => {\n if (!oldKeyMap) return undefined;\n\n const direct = oldKeyMap.get(k);\n if (direct && !usedOldEls.has(direct)) {\n usedOldEls.add(direct);\n return direct;\n }\n\n const s = String(k);\n const byString = oldKeyMap.get(s);\n if (byString && !usedOldEls.has(byString)) {\n usedOldEls.add(byString);\n return byString;\n }\n\n const n = Number(s);\n if (!Number.isNaN(n)) {\n const byNum = oldKeyMap.get(n);\n if (byNum && !usedOldEls.has(byNum)) {\n usedOldEls.add(byNum);\n return byNum;\n }\n }\n\n return scanForElementByKey(parent, k, s, usedOldEls);\n };\n}\n\nfunction scanForElementByKey(\n parent: Element,\n k: string | number,\n keyStr: string,\n usedOldEls: WeakSet<Node>\n): Element | undefined {\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n if (usedOldEls.has(ch)) continue;\n const attr = ch.getAttribute('data-key');\n if (attr === keyStr) {\n usedOldEls.add(ch);\n return ch;\n }\n if (attr !== null) {\n const numAttr = Number(attr);\n if (!Number.isNaN(numAttr) && numAttr === (k as number)) {\n usedOldEls.add(ch);\n return ch;\n }\n }\n }\n } catch {\n // Ignore.\n }\n return undefined;\n}\n\nexport function reconcileSingleChild(\n child: VNode,\n index: number,\n parent: Element,\n resolveOldElOnce: (k: string | number) => Element | undefined,\n resolveUnkeyedOnce: () => Element | undefined,\n usedOldEls: WeakSet<Node>,\n newKeyMap: Map<string | number, Element>\n): Node | null {\n const resolvedControlBoundary = prepareControlBoundaryResolution(child);\n if (resolvedControlBoundary !== null) {\n if (resolvedControlBoundary.remount) {\n return getRendererDOMHost().createDOMNode(\n resolvedControlBoundary.vnode,\n getParentNamespace(parent)\n );\n }\n\n return reconcileSingleChild(\n resolvedControlBoundary.vnode,\n index,\n parent,\n resolveOldElOnce,\n resolveUnkeyedOnce,\n usedOldEls,\n newKeyMap\n );\n }\n\n const key = extractKey(child);\n\n if (key !== undefined) {\n return reconcileKeyedChild(child, key, parent, resolveOldElOnce, newKeyMap);\n }\n\n return reconcileUnkeyedChild(\n child,\n index,\n parent,\n resolveUnkeyedOnce,\n usedOldEls\n );\n}\n\nfunction reconcileKeyedChild(\n child: VNode,\n key: string | number,\n parent: Element,\n resolveOldElOnce: (k: string | number) => Element | undefined,\n newKeyMap: Map<string | number, Element>\n): Node | null {\n const el = resolveOldElOnce(key);\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n if (el && el.parentElement === parent) {\n try {\n const childObj = child as VnodeObj;\n if (\n childObj &&\n typeof childObj === 'object' &&\n typeof childObj.type === 'string'\n ) {\n if (\n canReuseIntrinsicElementInNamespace(\n el,\n childObj.type,\n parentNamespace\n )\n ) {\n domHost.updateElementFromVnode(el, child);\n newKeyMap.set(key, el);\n return el;\n }\n }\n if (isComponentVNode(child)) {\n const synced = domHost.syncComponentElement(\n el,\n child as unknown as ElementWithContext,\n child.type,\n ((child.props ?? {}) as Props) || {},\n parentNamespace\n );\n if (synced) {\n if (synced instanceof Element) newKeyMap.set(key, synced);\n return synced;\n }\n }\n } catch {\n // Fall through to replacement.\n }\n }\n\n const dom = domHost.createDOMNode(child, parentNamespace);\n if (dom) {\n if (dom instanceof Element) newKeyMap.set(key, dom);\n return dom;\n }\n\n return null;\n}\n\nfunction reconcileUnkeyedChild(\n child: VNode,\n index: number,\n parent: Element,\n resolveUnkeyedOnce: () => Element | undefined,\n usedOldEls: WeakSet<Node>\n): Node | null {\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n try {\n const existing = parent.childNodes[index] as Node | undefined;\n\n if (typeof child === 'string' || typeof child === 'number') {\n if (existing && existing.nodeType === 3) {\n (existing as Text).data = String(child);\n usedOldEls.add(existing);\n return existing;\n }\n return domHost.createDOMNode(child, parentNamespace);\n }\n\n if (existing instanceof Element) {\n const synced = trySyncComponentChild(\n existing,\n child,\n usedOldEls,\n parentNamespace\n );\n if (synced) return synced;\n }\n\n if (\n existing instanceof Element &&\n canReuseElement(existing, child, parentNamespace)\n ) {\n domHost.updateElementFromVnode(existing, child);\n usedOldEls.add(existing);\n return existing;\n }\n\n const avail = resolveUnkeyedOnce();\n if (avail) {\n const reuseResult = tryReuseElement(\n avail,\n child,\n usedOldEls,\n parentNamespace\n );\n if (reuseResult) return reuseResult;\n }\n } catch {\n // Fall through to create new.\n }\n\n return domHost.createDOMNode(child, parentNamespace);\n}\n\nfunction isComponentVNode(child: VNode): child is ComponentVNode {\n return (\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as VnodeObj).type === 'function'\n );\n}\n\nfunction isControlBoundaryVNode(child: VNode): child is DOMElement {\n return (\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n (child as VnodeObj).type === __FOR_BOUNDARY__\n );\n}\n\nfunction prepareControlBoundaryResolution(child: VNode): {\n remount: boolean;\n vnode: VNode | null;\n} | null {\n if (!isControlBoundaryVNode(child)) {\n return null;\n }\n\n const controlState = child._controlState ?? child._forState;\n if (!controlState) {\n return null;\n }\n if (controlState.kind === 'for') {\n const childrenVNodes = evaluateControlBoundaryChildren(controlState);\n return childrenVNodes.length === 1\n ? { remount: false, vnode: childrenVNodes[0] ?? null }\n : null;\n }\n\n const previousActiveKey = controlState.activeKey;\n const childrenVNodes = evaluateControlBoundaryChildren(controlState);\n\n return {\n remount:\n previousActiveKey !== null &&\n controlState.activeKey !== previousActiveKey,\n vnode: childrenVNodes[0] ?? null,\n };\n}\n\nfunction evaluateControlBoundaryChildren(\n controlState: ControlBoundaryState\n): VNode[] {\n if (controlState.kind === 'for') {\n return evaluateForState(controlState);\n }\n\n if (controlState.kind === 'show') {\n return evaluateShowState(controlState);\n }\n\n return evaluateCaseState(controlState);\n}\n\nfunction trySyncComponentChild(\n existing: Element,\n child: VNode,\n usedOldEls: WeakSet<Node>,\n parentNamespace: string | undefined\n): Node | null {\n if (!isComponentVNode(child)) return null;\n\n const synced = getRendererDOMHost().syncComponentElement(\n existing,\n child as unknown as ElementWithContext,\n child.type,\n ((child.props ?? {}) as Props) || {},\n parentNamespace\n );\n if (!synced) return null;\n\n usedOldEls.add(existing);\n usedOldEls.add(synced);\n return synced;\n}\n\nfunction canReuseElement(\n existing: Element | undefined,\n child: VNode,\n parentNamespace: string | undefined\n): boolean {\n if (!existing) return false;\n if (typeof child !== 'object' || child === null || !('type' in child))\n return false;\n\n const childObj = child as VnodeObj;\n const existingKey = existing.getAttribute('data-key');\n const hasNoKey = existingKey === null || existingKey === undefined;\n\n return (\n hasNoKey &&\n typeof childObj.type === 'string' &&\n canReuseIntrinsicElementInNamespace(\n existing,\n childObj.type,\n parentNamespace\n )\n );\n}\n\nexport function collectUnkeyedElements(parent: Element): Element[] {\n const elements: Element[] = [];\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n if (ch.getAttribute('data-key') === null) elements.push(ch);\n }\n return elements;\n}\n\nfunction tryReuseElement(\n avail: Element,\n child: VNode,\n usedOldEls: WeakSet<Node>,\n parentNamespace: string | undefined\n): Node | null {\n if (typeof child === 'string' || typeof child === 'number') {\n return null;\n }\n\n const synced = trySyncComponentChild(\n avail,\n child,\n usedOldEls,\n parentNamespace\n );\n if (synced) {\n return synced;\n }\n\n if (typeof child === 'object' && child !== null && 'type' in child) {\n const childObj = child as VnodeObj;\n if (\n typeof childObj.type === 'string' &&\n canReuseIntrinsicElementInNamespace(avail, childObj.type, parentNamespace)\n ) {\n getRendererDOMHost().updateElementFromVnode(avail, child);\n usedOldEls.add(avail);\n return avail;\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.js","names":[],"sources":["../../src/renderer/reconcile.ts"],"sourcesContent":["/**\n * RENDERER & RECONCILIATION INVARIANTS (LOCKED)\n *\n * 1. DOM order derives only from current vnode order.\n * 2. VNode identity is not vnode stability.\n * 3. Keyed reconciliation is element-only.\n * 4. Primitive children map to text nodes.\n * 5. Fast paths must prove eligibility and fall back cleanly.\n * 6. Cleanup is position-independent.\n * 7. For-boundaries and keyed lists obey the same ordering rules.\n */\n\nimport type { VNode } from './types';\nimport { keyedElements } from './keyed';\nimport { buildDOMKeyMap, extractKeyedVnodes } from './keyed-children';\nimport { commitReconciliation } from './reconcile-commit';\nimport { tryFastPaths } from './reconcile-fastpaths';\nimport {\n collectUnkeyedElements,\n createOldElResolver,\n reconcileSingleChild,\n} from './reconcile-resolution';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\nexport function reconcileKeyedChildren(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> {\n const keyedVnodes = extractKeyedVnodes(newChildren);\n const ensuredOldKeyMap = oldKeyMap || buildDOMKeyMap(parent);\n\n const fastPathResult = tryFastPaths(\n parent,\n newChildren,\n keyedVnodes,\n ensuredOldKeyMap\n );\n if (fastPathResult) {\n return fastPathResult;\n }\n\n return performFullReconciliation(parent, newChildren, ensuredOldKeyMap);\n}\n\nfunction performFullReconciliation(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> {\n const newKeyMap = new Map<string | number, Element>();\n const finalNodes: Node[] = [];\n const usedOldEls = new WeakSet<Node>();\n\n const resolveOldElOnce = createOldElResolver(parent, oldKeyMap, usedOldEls);\n const unkeyedEls = collectUnkeyedElements(parent);\n let unkeyedIndex = 0;\n const resolveUnkeyedOnce = (): Element | undefined => {\n while (unkeyedIndex < unkeyedEls.length) {\n const candidate = unkeyedEls[unkeyedIndex++];\n if (!usedOldEls.has(candidate)) return candidate;\n }\n return undefined;\n };\n\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i];\n const node = reconcileSingleChild(\n child,\n i,\n parent,\n resolveOldElOnce,\n resolveUnkeyedOnce,\n usedOldEls,\n newKeyMap\n );\n if (node) finalNodes.push(node);\n }\n\n if (typeof document === 'undefined') return newKeyMap;\n\n commitReconciliation(parent, finalNodes);\n keyedElements.delete(parent);\n\n return newKeyMap;\n}\n"],"mappings":";;;;;AAyBA,SAAgB,uBACd,QACA,aACA,WAC+B;CAC/B,MAAM,cAAc,mBAAmB,WAAW;CAClD,MAAM,mBAAmB,aAAa,eAAe,MAAM;CAE3D,MAAM,iBAAiB,aACrB,QACA,aACA,aACA,gBACF;CACA,IAAI,gBACF,OAAO;CAGT,OAAO,0BAA0B,QAAQ,aAAa,gBAAgB;AACxE;AAEA,SAAS,0BACP,QACA,aACA,WAC+B;CAC/B,MAAM,4BAAY,IAAI,IAA8B;CACpD,MAAM,aAAqB,CAAC;CAC5B,MAAM,6BAAa,IAAI,QAAc;CAErC,MAAM,mBAAmB,oBAAoB,QAAQ,WAAW,UAAU;CAC1E,MAAM,aAAa,uBAAuB,MAAM;CAChD,IAAI,eAAe;CACnB,MAAM,2BAAgD;EACpD,OAAO,eAAe,WAAW,QAAQ;GACvC,MAAM,YAAY,WAAW;GAC7B,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,OAAO;EACzC;CAEF;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;EAC1B,MAAM,OAAO,qBACX,OACA,GACA,QACA,kBACA,oBACA,YACA,SACF;EACA,IAAI,MAAM,WAAW,KAAK,IAAI;CAChC;CAEA,IAAI,OAAO,aAAa,aAAa,OAAO;CAE5C,qBAAqB,QAAQ,UAAU;CACvC,cAAc,OAAO,MAAM;CAE3B,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retained-element-rollback.js","names":[],"sources":["../../src/renderer/retained-element-rollback.ts"],"sourcesContent":["import { logger } from '../common/logger';\nimport {\n addDelegatedListener,\n getDelegatedHandlersForElement,\n removeDelegatedListener,\n updateDelegatedListener,\n} from '../runtime';\nimport {\n elementListeners,\n elementReactivePropsCleanup,\n elementRefs,\n type ListenerMapEntry,\n type ReactivePropCleanupEntry,\n} from './cleanup';\nimport { keyedElements } from './keyed';\n\ninterface AttributeSnapshot {\n element: Element;\n attributes: Array<[string, string]>;\n}\n\ninterface ChildNodesSnapshot {\n element: Element;\n childNodes: Node[];\n}\n\ninterface FormControlSnapshot {\n element: Element;\n value?: string;\n checked?: boolean;\n}\n\ninterface DelegatedListenerEntrySnapshot {\n eventName: string;\n handler: EventListener;\n original: EventListener;\n options?: AddEventListenerOptions;\n}\n\ninterface DelegatedListenerSnapshot {\n element: Element;\n entries: DelegatedListenerEntrySnapshot[];\n}\n\ninterface ListenerEntrySnapshot {\n listenerKey: string;\n entry: ListenerMapEntry;\n}\n\ninterface ListenerSnapshot {\n element: Element;\n entries: ListenerEntrySnapshot[];\n}\n\ninterface RefSnapshot {\n element: Element;\n ref: unknown;\n}\n\ninterface ReactivePropEntrySnapshot {\n propName: string;\n entry: ReactivePropCleanupEntry;\n}\n\ninterface ReactivePropsSnapshot {\n element: Element;\n entries: ReactivePropEntrySnapshot[];\n}\n\ninterface TextSnapshot {\n node: Text;\n data: string;\n}\n\nexport interface RetainedElementSnapshot {\n attributes: AttributeSnapshot[];\n childNodes: ChildNodesSnapshot[];\n delegatedListeners: DelegatedListenerSnapshot[];\n formControls: FormControlSnapshot[];\n keyedMap: Map<string | number, Element> | undefined;\n listeners: ListenerSnapshot[];\n reactiveProps: ReactivePropsSnapshot[];\n refs: RefSnapshot[];\n textNodes: TextSnapshot[];\n}\n\nfunction collectElementSubtree(root: Element): Element[] {\n const elements = [root];\n const descendants = root.querySelectorAll('*');\n for (let index = 0; index < descendants.length; index += 1) {\n elements.push(descendants[index]);\n }\n return elements;\n}\n\nfunction collectTextSnapshots(root: Element): TextSnapshot[] {\n const snapshots: TextSnapshot[] = [];\n const stack = Array.from(root.childNodes).reverse();\n\n while (stack.length > 0) {\n const node = stack.pop()!;\n if (node.nodeType === 3) {\n snapshots.push({ node: node as Text, data: (node as Text).data });\n continue;\n }\n\n for (let child = node.lastChild; child; child = child.previousSibling) {\n stack.push(child);\n }\n }\n\n return snapshots;\n}\n\nfunction getFormControlSnapshot(element: Element): FormControlSnapshot | null {\n const control = element as Element & {\n value?: unknown;\n checked?: unknown;\n };\n const snapshot: FormControlSnapshot = { element };\n\n if ('value' in control) {\n snapshot.value = String(control.value ?? '');\n }\n\n if ('checked' in control) {\n snapshot.checked = Boolean(control.checked);\n }\n\n return snapshot.value !== undefined || snapshot.checked !== undefined\n ? snapshot\n : null;\n}\n\nfunction cloneListenerEntry(entry: ListenerMapEntry): ListenerMapEntry {\n return {\n handler: entry.handler,\n original: entry.original,\n eventName: entry.eventName,\n options: entry.options,\n isDelegated: entry.isDelegated,\n updateHandler: entry.updateHandler,\n };\n}\n\nfunction cloneReactivePropEntry(\n entry: ReactivePropCleanupEntry\n): ReactivePropCleanupEntry {\n return {\n cleanup: entry.cleanup,\n fnRef: entry.fnRef,\n restoreFn: entry.restoreFn,\n updateFn: entry.updateFn,\n };\n}\n\nexport function snapshotRetainedElement(\n element: Element\n): RetainedElementSnapshot {\n const elements = collectElementSubtree(element);\n const attributes: AttributeSnapshot[] = [];\n const childNodes: ChildNodesSnapshot[] = [];\n const delegatedListeners: DelegatedListenerSnapshot[] = [];\n const formControls: FormControlSnapshot[] = [];\n const listeners: ListenerSnapshot[] = [];\n const reactiveProps: ReactivePropsSnapshot[] = [];\n const refs: RefSnapshot[] = [];\n\n for (const currentElement of elements) {\n attributes.push({\n element: currentElement,\n attributes: Array.from(currentElement.attributes, (attribute) => [\n attribute.name,\n attribute.value,\n ]),\n });\n childNodes.push({\n element: currentElement,\n childNodes: Array.from(currentElement.childNodes),\n });\n\n const formControl = getFormControlSnapshot(currentElement);\n if (formControl) {\n formControls.push(formControl);\n }\n\n const listenerMap = elementListeners.get(currentElement);\n listeners.push({\n element: currentElement,\n entries: listenerMap\n ? Array.from(listenerMap, ([listenerKey, entry]) => ({\n listenerKey,\n entry: cloneListenerEntry(entry),\n }))\n : [],\n });\n\n const delegatedHandlerMap = getDelegatedHandlersForElement(currentElement);\n delegatedListeners.push({\n element: currentElement,\n entries: delegatedHandlerMap\n ? Array.from(delegatedHandlerMap, ([eventName, entry]) => ({\n eventName,\n handler: entry.handler,\n original: entry.original,\n options: entry.options,\n }))\n : [],\n });\n\n const reactivePropMap = elementReactivePropsCleanup.get(currentElement);\n reactiveProps.push({\n element: currentElement,\n entries: reactivePropMap\n ? Array.from(reactivePropMap, ([propName, entry]) => ({\n propName,\n entry: cloneReactivePropEntry(entry),\n }))\n : [],\n });\n\n refs.push({\n element: currentElement,\n ref: elementRefs.get(currentElement),\n });\n }\n\n const keyedMap = keyedElements.get(element);\n\n return {\n attributes,\n childNodes,\n delegatedListeners,\n formControls,\n keyedMap: keyedMap ? new Map(keyedMap) : undefined,\n listeners,\n reactiveProps,\n refs,\n textNodes: collectTextSnapshots(element),\n };\n}\n\nfunction sameChildOrder(element: Element, childNodes: Node[]): boolean {\n if (element.childNodes.length !== childNodes.length) {\n return false;\n }\n\n for (let index = 0; index < childNodes.length; index += 1) {\n if (element.childNodes[index] !== childNodes[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction restoreAttributes(snapshot: RetainedElementSnapshot): void {\n for (const { element, attributes } of snapshot.attributes) {\n const expectedNames = new Set(attributes.map(([name]) => name));\n\n for (const attribute of Array.from(element.attributes)) {\n if (!expectedNames.has(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n }\n\n for (const [name, value] of attributes) {\n if (element.getAttribute(name) !== value) {\n element.setAttribute(name, value);\n }\n }\n }\n}\n\nfunction restoreFormControls(snapshot: RetainedElementSnapshot): void {\n for (const { element, value, checked } of snapshot.formControls) {\n const control = element as Element & {\n value?: string;\n checked?: boolean;\n };\n\n if (value !== undefined && 'value' in control) {\n control.value = value;\n }\n\n if (checked !== undefined && 'checked' in control) {\n control.checked = checked;\n }\n }\n}\n\nfunction applyRefValue<T>(ref: unknown, value: T | null): void {\n if (!ref) {\n return;\n }\n\n try {\n if (typeof ref === 'function') {\n (ref as (value: T | null) => void)(value);\n return;\n }\n\n if (Object.isExtensible(ref)) {\n (ref as { current: T | null }).current = value;\n }\n } catch {\n // Rollback must preserve the original render error.\n }\n}\n\nfunction restoreRefs(snapshot: RetainedElementSnapshot): void {\n for (const { element, ref } of snapshot.refs) {\n const currentRef = elementRefs.get(element);\n\n if (currentRef !== ref) {\n applyRefValue(currentRef, null);\n }\n\n if (ref) {\n applyRefValue(ref, element);\n elementRefs.set(element, ref);\n } else {\n elementRefs.delete(element);\n }\n }\n}\n\nfunction removeDirectListener(element: Element, entry: ListenerMapEntry): void {\n if (entry.isDelegated) {\n return;\n }\n\n if (entry.options !== undefined) {\n element.removeEventListener(entry.eventName, entry.handler, entry.options);\n } else {\n element.removeEventListener(entry.eventName, entry.handler);\n }\n}\n\nfunction addDirectListener(element: Element, entry: ListenerMapEntry): void {\n if (entry.isDelegated) {\n return;\n }\n\n if (entry.options !== undefined) {\n element.addEventListener(entry.eventName, entry.handler, entry.options);\n } else {\n element.addEventListener(entry.eventName, entry.handler);\n }\n}\n\nfunction restoreListeners(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.listeners) {\n const expectedKeys = new Set(entries.map(({ listenerKey }) => listenerKey));\n let currentMap = elementListeners.get(element);\n\n if (currentMap) {\n for (const [listenerKey, entry] of Array.from(currentMap)) {\n if (!expectedKeys.has(listenerKey)) {\n removeDirectListener(element, entry);\n currentMap.delete(listenerKey);\n }\n }\n }\n\n if (entries.length === 0) {\n if (currentMap?.size === 0) {\n elementListeners.delete(element);\n }\n continue;\n }\n\n if (!currentMap) {\n currentMap = new Map();\n elementListeners.set(element, currentMap);\n }\n\n for (const { listenerKey, entry } of entries) {\n const currentEntry = currentMap.get(listenerKey);\n\n entry.updateHandler?.(entry.original);\n\n if (currentEntry && currentEntry.handler !== entry.handler) {\n removeDirectListener(element, currentEntry);\n }\n\n if (!currentEntry || currentEntry.handler !== entry.handler) {\n addDirectListener(element, entry);\n } else {\n currentEntry.updateHandler?.(entry.original);\n }\n\n currentMap.set(listenerKey, cloneListenerEntry(entry));\n }\n }\n}\n\nfunction restoreDelegatedListeners(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.delegatedListeners) {\n const expectedEventNames = new Set(\n entries.map(({ eventName }) => eventName)\n );\n const currentMap = getDelegatedHandlersForElement(element);\n\n if (currentMap) {\n for (const eventName of currentMap.keys()) {\n if (!expectedEventNames.has(eventName)) {\n removeDelegatedListener(element, eventName);\n }\n }\n }\n\n for (const { eventName, handler, original, options } of entries) {\n if (\n !updateDelegatedListener(element, eventName, handler, original, options)\n ) {\n addDelegatedListener(element, eventName, handler, original, options);\n }\n }\n }\n}\n\nfunction restoreReactiveProps(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.reactiveProps) {\n const expectedPropNames = new Set(entries.map(({ propName }) => propName));\n let currentMap = elementReactivePropsCleanup.get(element);\n\n if (currentMap) {\n for (const [propName, entry] of Array.from(currentMap)) {\n if (!expectedPropNames.has(propName)) {\n entry.cleanup();\n currentMap.delete(propName);\n }\n }\n }\n\n if (entries.length === 0) {\n if (currentMap?.size === 0) {\n elementReactivePropsCleanup.delete(element);\n }\n continue;\n }\n\n if (!currentMap) {\n currentMap = new Map();\n elementReactivePropsCleanup.set(element, currentMap);\n }\n\n for (const { propName, entry } of entries) {\n const currentEntry = currentMap.get(propName);\n\n if (currentEntry) {\n currentEntry.updateFn?.(entry.fnRef);\n currentEntry.fnRef = entry.fnRef;\n currentMap.set(propName, currentEntry);\n continue;\n }\n\n currentMap.set(\n propName,\n entry.restoreFn?.(entry.fnRef) ?? cloneReactivePropEntry(entry)\n );\n }\n }\n}\n\nfunction restoreChildNodes(\n snapshot: RetainedElementSnapshot,\n cleanupRangeNode: (node: Node) => void\n): void {\n for (const { element, childNodes } of snapshot.childNodes) {\n const expectedChildren = new Set(childNodes);\n\n for (const child of Array.from(element.childNodes)) {\n if (!expectedChildren.has(child)) {\n cleanupRangeNode(child);\n }\n }\n }\n\n for (const { element, childNodes } of snapshot.childNodes) {\n if (!sameChildOrder(element, childNodes)) {\n element.replaceChildren(...childNodes);\n }\n }\n}\n\nfunction restoreTextNodes(snapshot: RetainedElementSnapshot): void {\n for (const { node, data } of snapshot.textNodes) {\n if (node.data !== data) {\n node.data = data;\n }\n }\n}\n\nfunction restoreKeyedMap(\n element: Element,\n snapshot: RetainedElementSnapshot\n): void {\n if (snapshot.keyedMap) {\n keyedElements.set(element, new Map(snapshot.keyedMap));\n } else {\n keyedElements.delete(element);\n }\n}\n\nexport function restoreRetainedElement(\n element: Element,\n snapshot: RetainedElementSnapshot,\n cleanupRangeNode: (node: Node) => void\n): void {\n restoreChildNodes(snapshot, cleanupRangeNode);\n restoreReactiveProps(snapshot);\n restoreAttributes(snapshot);\n restoreTextNodes(snapshot);\n restoreFormControls(snapshot);\n restoreRefs(snapshot);\n restoreListeners(snapshot);\n restoreDelegatedListeners(snapshot);\n restoreKeyedMap(element, snapshot);\n}\n\nexport function runRetainedElementUpdate(\n element: Element,\n cleanupRangeNode: (node: Node) => void,\n update: () => void,\n onError?: () => void\n): void {\n const snapshot = snapshotRetainedElement(element);\n\n try {\n update();\n } catch (err) {\n onError?.();\n\n try {\n restoreRetainedElement(element, snapshot, cleanupRangeNode);\n } catch (rollbackError) {\n logger.warn('[Askr] retained element rollback failed:', rollbackError);\n }\n\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stable-patch.js","names":[],"sources":["../../src/renderer/stable-patch.ts"],"sourcesContent":["import { isPromiseLike } from '../common/promise';\nimport {\n captureInlineRenderSnapshot,\n getCurrentInstance,\n renderComponentInline,\n warnUnusedStateReads,\n type ComponentFunction,\n} from '../runtime';\nimport {\n getCurrentContextFrame,\n getVNodeContextFrame,\n withContext,\n} from '../runtime';\nimport { incDevCounter } from '../runtime';\nimport { recordBenchEvent } from '../runtime';\nimport {\n findHostInstanceByType,\n inheritComponentCleanupStrict,\n inheritComponentKey,\n isRouteRootComponentVNode,\n resolveNestedComponentResult,\n} from './component-host';\nimport { getRendererDOMHost, type InstanceHostElement } from './dom-host';\nimport { _isDOMElement, type DOMElement, type VNode } from './types';\nimport { tagNamesEqualIgnoreCase } from './utils';\n\nfunction normalizeStableIntrinsicChildren(\n children: VNode | VNode[] | undefined\n): VNode[] {\n if (children === null || children === undefined || children === false) {\n return [];\n }\n\n return Array.isArray(children) ? children : [children];\n}\n\nfunction getStableIntrinsicChildren(vnode: DOMElement): VNode[] {\n return normalizeStableIntrinsicChildren(\n (vnode.props?.children as VNode | VNode[] | undefined) ?? vnode.children\n );\n}\n\nfunction patchStableIntrinsicText(domNode: Node, nextVNode: VNode): boolean {\n if (\n domNode.nodeType !== 3 ||\n (typeof nextVNode !== 'string' && typeof nextVNode !== 'number')\n ) {\n return false;\n }\n\n const nextText = String(nextVNode);\n const textNode = domNode as Text;\n if (textNode.data !== nextText) {\n recordBenchEvent('domTextSet');\n textNode.data = nextText;\n }\n\n return true;\n}\n\nfunction patchStableIntrinsicElement(\n dom: Element,\n nextVNode: DOMElement\n): boolean {\n if (\n typeof nextVNode.type !== 'string' ||\n !tagNamesEqualIgnoreCase(dom.tagName, nextVNode.type)\n ) {\n return false;\n }\n\n getRendererDOMHost().updateElementFromVnode(dom, nextVNode, false);\n\n const nextChildren = getStableIntrinsicChildren(nextVNode);\n if (dom.childNodes.length !== nextChildren.length) {\n return false;\n }\n\n for (let index = 0; index < nextChildren.length; index += 1) {\n const nextChild = nextChildren[index];\n\n const currentChildNode = dom.childNodes[index];\n if (!currentChildNode) {\n return false;\n }\n\n if (patchStableIntrinsicText(currentChildNode, nextChild)) {\n continue;\n }\n\n if (\n currentChildNode instanceof Element &&\n _isDOMElement(nextChild) &&\n typeof nextChild.type === 'string' &&\n patchStableIntrinsicElement(currentChildNode, nextChild)\n ) {\n continue;\n }\n\n return false;\n }\n\n return true;\n}\n\nfunction resolveStableIntrinsicPatchVNode(\n dom: Element,\n vnode: VNode\n): DOMElement | null {\n if (!_isDOMElement(vnode)) {\n return null;\n }\n\n if (typeof vnode.type === 'string') {\n return tagNamesEqualIgnoreCase(dom.tagName, vnode.type) ? vnode : null;\n }\n\n if (typeof vnode.type !== 'function') {\n return null;\n }\n\n const host = dom as InstanceHostElement;\n const existingInstance = findHostInstanceByType(\n host,\n vnode.type as ComponentFunction\n );\n if (\n !existingInstance ||\n existingInstance.fn !== vnode.type ||\n host.__ASKR_WRAPPER_HOST\n ) {\n return null;\n }\n\n const snapshot =\n getVNodeContextFrame(vnode) ||\n getCurrentContextFrame() ||\n existingInstance.ownerFrame ||\n null;\n\n captureInlineRenderSnapshot(existingInstance);\n\n existingInstance.props =\n (((vnode as DOMElement).props ?? {}) as Record<string, unknown>) || {};\n existingInstance.isRoot = isRouteRootComponentVNode(vnode);\n existingInstance.portalScope =\n getCurrentInstance()?.portalScope ?? existingInstance.portalScope;\n inheritComponentCleanupStrict(existingInstance);\n\n if (snapshot) {\n existingInstance.ownerFrame = snapshot;\n }\n\n const result = withContext(snapshot, () =>\n renderComponentInline(existingInstance)\n );\n if (isPromiseLike(result)) {\n throw new Error(\n 'Async components are not supported. Components must return synchronously.'\n );\n }\n\n const resolvedResult = resolveNestedComponentResult(\n result,\n snapshot ?? null,\n existingInstance\n );\n if (\n _isDOMElement(resolvedResult) &&\n typeof resolvedResult.type === 'string' &&\n tagNamesEqualIgnoreCase(dom.tagName, resolvedResult.type)\n ) {\n return inheritComponentKey(resolvedResult, vnode as DOMElement);\n }\n\n return null;\n}\n\nexport function tryPatchStableForDirtyItem(scope: {\n dom?: Node;\n vnode?: VNode;\n}): boolean {\n incDevCounter('stableForPatchAttempt');\n if (!(scope.dom instanceof Element) || scope.vnode === undefined) {\n return false;\n }\n\n const nextIntrinsic = resolveStableIntrinsicPatchVNode(\n scope.dom,\n scope.vnode\n );\n if (!nextIntrinsic) {\n return false;\n }\n\n const didPatch = patchStableIntrinsicElement(scope.dom, nextIntrinsic);\n\n const existingInstance = (scope.dom as InstanceHostElement).__ASKR_INSTANCE;\n if (didPatch && existingInstance) {\n warnUnusedStateReads(existingInstance);\n }\n\n if (didPatch) {\n incDevCounter('stableForPatchHit');\n }\n\n return didPatch;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static-reuse.js","names":[],"sources":["../../src/renderer/static-reuse.ts"],"sourcesContent":["/**\n * Static subtree reuse checks for intrinsic DOM children.\n */\n\nimport { Fragment } from '../jsx/jsx-runtime';\nimport { hasMatchingStaticProps } from './attributes';\nimport { _isDOMElement, type DOMElement } from './types';\nimport { tagNamesEqualIgnoreCase } from './utils';\n\nfunction isFragmentVNode(node: unknown): node is DOMElement {\n return (\n _isDOMElement(node) &&\n typeof (node as DOMElement).type === 'symbol' &&\n ((node as DOMElement).type === Fragment ||\n String((node as DOMElement).type) === 'Symbol(askr.fragment)')\n );\n}\n\nfunction upperCommonTagName(tag: string): string | null {\n switch (tag) {\n case 'div':\n return 'DIV';\n case 'span':\n return 'SPAN';\n case 'p':\n return 'P';\n case 'a':\n return 'A';\n case 'button':\n return 'BUTTON';\n case 'input':\n return 'INPUT';\n case 'ul':\n return 'UL';\n case 'ol':\n return 'OL';\n case 'li':\n return 'LI';\n default:\n return null;\n }\n}\n\nexport function tagsEqualIgnoreCase(\n elementTagName: string,\n vnodeType: string\n): boolean {\n const upperCommon = upperCommonTagName(vnodeType);\n if (upperCommon !== null && elementTagName === upperCommon) return true;\n return tagNamesEqualIgnoreCase(elementTagName, vnodeType);\n}\n\ntype StaticChildSlot =\n | { kind: 'text'; value: string }\n | { kind: 'element'; value: DOMElement };\n\nconst STATIC_CHILD_SLOTS_CACHE = Symbol.for('__askrStaticChildSlots');\nlet staticChildSlotsCacheEnabled = true;\n\ninterface StaticChildSlotsCacheNode {\n [STATIC_CHILD_SLOTS_CACHE]?: StaticChildSlot[] | null;\n}\n\nexport function setStaticChildSlotsCacheEnabled(enabled: boolean): void {\n staticChildSlotsCacheEnabled = enabled;\n}\n\nfunction collectStaticChildSlots(\n children: unknown,\n slots: StaticChildSlot[]\n): boolean {\n if (isFragmentVNode(children)) {\n const fragmentChildren = children.props?.children ?? children.children;\n return collectStaticChildSlots(fragmentChildren, slots);\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n if (!collectStaticChildSlots(child, slots)) {\n return false;\n }\n }\n return true;\n }\n\n if (children === null || children === undefined || children === false) {\n return true;\n }\n\n if (typeof children === 'string' || typeof children === 'number') {\n slots.push({ kind: 'text', value: String(children) });\n return true;\n }\n\n if (\n _isDOMElement(children) &&\n typeof (children as DOMElement).type === 'string'\n ) {\n slots.push({ kind: 'element', value: children as DOMElement });\n return true;\n }\n\n return false;\n}\n\nfunction getStaticChildSlots(vnode: DOMElement): StaticChildSlot[] | null {\n if (staticChildSlotsCacheEnabled) {\n const cacheNode = vnode as DOMElement & StaticChildSlotsCacheNode;\n const cached = cacheNode[STATIC_CHILD_SLOTS_CACHE];\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const slots: StaticChildSlot[] = [];\n const staticSlots = collectStaticChildSlots(\n (vnode.props?.children ?? vnode.children) as unknown,\n slots\n )\n ? slots\n : null;\n if (staticChildSlotsCacheEnabled) {\n const cacheNode = vnode as DOMElement & StaticChildSlotsCacheNode;\n if (Object.isExtensible(vnode)) {\n cacheNode[STATIC_CHILD_SLOTS_CACHE] = staticSlots;\n }\n }\n return staticSlots;\n}\n\nexport function canReuseStaticSubtree(el: Element, vnode: DOMElement): boolean {\n if (\n typeof vnode.type !== 'string' ||\n !tagsEqualIgnoreCase(el.tagName, vnode.type)\n ) {\n return false;\n }\n\n const props = (vnode.props || {}) as Record<string, unknown>;\n if (!hasMatchingStaticProps(el, props, vnode.type)) {\n return false;\n }\n\n const slots = getStaticChildSlots(vnode);\n if (!slots) {\n return false;\n }\n\n if (el.childNodes.length !== slots.length) {\n return false;\n }\n\n for (let index = 0; index < slots.length; index += 1) {\n const slot = slots[index];\n const current = el.childNodes[index];\n if (!current) {\n return false;\n }\n\n if (slot.kind === 'text') {\n if (current.nodeType !== 3 || (current as Text).data !== slot.value) {\n return false;\n }\n continue;\n }\n\n if (!(current instanceof Element)) {\n return false;\n }\n\n if (!canReuseStaticSubtree(current, slot.value)) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAS,gBAAgB,MAAmC;CAC1D,OACE,cAAc,IAAI,KAClB,OAAQ,KAAoB,SAAS,aACnC,KAAoB,SAAS,YAC7B,OAAQ,KAAoB,IAAI,MAAM;AAE5C;AAEA,SAAS,mBAAmB,KAA4B;CACtD,QAAQ,KAAR;EACE,KAAK,OACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBACd,gBACA,WACS;CACT,MAAM,cAAc,mBAAmB,SAAS;CAChD,IAAI,gBAAgB,QAAQ,mBAAmB,aAAa,OAAO;CACnE,OAAO,wBAAwB,gBAAgB,SAAS;AAC1D;AAMA,MAAM,2BAA2B,OAAO,IAAI,wBAAwB;AACpE,IAAI,+BAA+B;AAMnC,SAAgB,gCAAgC,SAAwB;CACtE,+BAA+B;AACjC;AAEA,SAAS,wBACP,UACA,OACS;CACT,IAAI,gBAAgB,QAAQ,GAE1B,OAAO,wBADkB,SAAS,OAAO,YAAY,SAAS,UACb,KAAK;CAGxD,IAAI,MAAM,QAAQ,QAAQ,GAAG;EAC3B,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,wBAAwB,OAAO,KAAK,GACvC,OAAO;EAGX,OAAO;CACT;CAEA,IAAI,aAAa,QAAQ,aAAa,UAAa,aAAa,OAC9D,OAAO;CAGT,IAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU;EAChE,MAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,OAAO,QAAQ;EAAE,CAAC;EACpD,OAAO;CACT;CAEA,IACE,cAAc,QAAQ,KACtB,OAAQ,SAAwB,SAAS,UACzC;EACA,MAAM,KAAK;GAAE,MAAM;GAAW,OAAO;EAAuB,CAAC;EAC7D,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,oBAAoB,OAA6C;CACxE,IAAI,8BAA8B;EAEhC,MAAM,SAAS,MAAU;EACzB,IAAI,WAAW,QACb,OAAO;CAEX;CAEA,MAAM,QAA2B,CAAC;CAClC,MAAM,cAAc,wBACjB,MAAM,OAAO,YAAY,MAAM,UAChC,KACF,IACI,QACA;CACJ,IAAI,8BAA8B;EAChC,MAAM,YAAY;EAClB,IAAI,OAAO,aAAa,KAAK,GAC3B,UAAU,4BAA4B;CAE1C;CACA,OAAO;AACT;AAEA,SAAgB,sBAAsB,IAAa,OAA4B;CAC7E,IACE,OAAO,MAAM,SAAS,YACtB,CAAC,oBAAoB,GAAG,SAAS,MAAM,IAAI,GAE3C,OAAO;CAIT,IAAI,CAAC,uBAAuB,IADb,MAAM,SAAS,CAAC,GACQ,MAAM,IAAI,GAC/C,OAAO;CAGT,MAAM,QAAQ,oBAAoB,KAAK;CACvC,IAAI,CAAC,OACH,OAAO;CAGT,IAAI,GAAG,WAAW,WAAW,MAAM,QACjC,OAAO;CAGT,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU,GAAG,WAAW;EAC9B,IAAI,CAAC,SACH,OAAO;EAGT,IAAI,KAAK,SAAS,QAAQ;GACxB,IAAI,QAAQ,aAAa,KAAM,QAAiB,SAAS,KAAK,OAC5D,OAAO;GAET;EACF;EAEA,IAAI,EAAE,mBAAmB,UACvB,OAAO;EAGT,IAAI,CAAC,sBAAsB,SAAS,KAAK,KAAK,GAC5C,OAAO;CAEX;CAEA,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../src/renderer/utils.ts"],"sourcesContent":["/**\n * Shared utilities for the renderer module.\n * Consolidates common patterns to reduce code duplication.\n */\n\nimport { runRuntimeHandlerScope } from '../runtime';\nimport { logger } from '../common/logger';\nimport { getPublicAttributeName } from '../common/attr-names';\nimport { getRuntimeEnv } from './env';\nimport { setDevValue, incDevCounter } from '../runtime';\n\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n// Keep direct replaceChildren(...nodes) commits below a conservative argument\n// count until browser benchmarks prove larger spreads are safe.\nexport const DIRECT_REPLACE_CHILDREN_SPREAD_LIMIT = 4096;\n\nexport function canUseDirectReplaceChildrenSpread(count: number): boolean {\n return count <= DIRECT_REPLACE_CHILDREN_SPREAD_LIMIT;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ListenerEntry {\n handler: EventListener;\n original: EventListener;\n eventName: string;\n options?: boolean | AddEventListenerOptions;\n updateHandler?: (nextHandler: EventListener) => void;\n}\n\nexport interface ParsedEventProp {\n eventName: string;\n capture: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Handler Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Handler pooling cache to avoid recreating wrapped handlers\n// Key: handler reference, Value: { wrapped: EventListener, flushAfter: boolean }\nconst handlerCache = new WeakMap<EventListener, Map<boolean, EventListener>>();\nlet cacheSize = 0;\nconst MAX_CACHE_SIZE = 1000;\n\n/**\n * Parse an event prop name (e.g., 'onClick') to its DOM event name (e.g., 'click')\n */\nexport function parseEventName(propName: string): string | null {\n return parseEventProp(propName)?.eventName ?? null;\n}\n\nexport function parseEventProp(propName: string): ParsedEventProp | null {\n if (!propName.startsWith('on') || propName.length <= 2) return null;\n const capture =\n propName.endsWith('Capture') && propName.length > 'onCapture'.length;\n const normalizedPropName = capture\n ? propName.slice(0, -'Capture'.length)\n : propName;\n\n return normalizedPropName.length <= 2\n ? null\n : {\n eventName:\n normalizedPropName.slice(2).charAt(0).toLowerCase() +\n normalizedPropName.slice(3).toLowerCase(),\n capture,\n };\n}\n\nexport function getEventListenerKey(\n eventName: string,\n capture = false\n): string {\n return capture ? `${eventName}:capture` : eventName;\n}\n\nexport function getEventListenerOptions(\n eventName: string,\n capture = false\n): AddEventListenerOptions | undefined {\n const passiveOptions = getPassiveOptions(eventName);\n if (!capture) {\n return passiveOptions;\n }\n\n return passiveOptions\n ? { ...passiveOptions, capture: true }\n : { capture: true };\n}\n\n/**\n * Get default event listener options for passive events\n */\nexport function getPassiveOptions(\n eventName: string\n): AddEventListenerOptions | undefined {\n if (\n eventName === 'wheel' ||\n eventName === 'scroll' ||\n eventName.startsWith('touch')\n ) {\n return { passive: true };\n }\n return undefined;\n}\n\n/**\n * Create a wrapped event handler that integrates with the scheduler\n * Uses caching to avoid recreating wrappers for the same handler\n */\nexport function createWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): EventListener {\n // Check cache first\n const cachedByFlush = handlerCache.get(handler);\n if (cachedByFlush) {\n const cached = cachedByFlush.get(flushAfter);\n if (cached) return cached;\n }\n\n const wrapped: EventListener = (event: Event) => {\n try {\n runRuntimeHandlerScope(\n () => {\n try {\n handler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n // Cache the wrapped handler\n try {\n if (!handlerCache.has(handler)) {\n // Limit cache size to prevent memory leaks\n if (cacheSize >= MAX_CACHE_SIZE) {\n // Simple eviction - just don't cache new entries when full\n } else {\n cacheSize++;\n handlerCache.set(handler, new Map());\n }\n }\n handlerCache.get(handler)?.set(flushAfter, wrapped);\n } catch {\n // WeakMap can throw if handler is not a valid key\n }\n\n return wrapped;\n}\n\nexport function createMutableWrappedHandler(\n handler: EventListener,\n flushAfter = false\n): {\n handler: EventListener;\n updateHandler: (nextHandler: EventListener) => void;\n} {\n let currentHandler = handler;\n\n const wrapped: EventListener = (event: Event) => {\n try {\n runRuntimeHandlerScope(\n () => {\n try {\n currentHandler(event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n }\n },\n flushAfter ? 'sync' : 'defer'\n );\n } catch (err) {\n if (flushAfter) {\n queueMicrotask(() => {\n throw err;\n });\n } else {\n logger.error('[Askr] Event handler error:', err);\n }\n }\n };\n\n return {\n handler: wrapped,\n updateHandler(nextHandler: EventListener) {\n currentHandler = nextHandler;\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Prop/Attribute Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Props that should be skipped during attribute processing */\nexport function isSkippedProp(key: string): boolean {\n return key === 'children' || key === 'key' || key === 'ref';\n}\n\n/** Check if prop should be ignored for prop-change detection */\nexport function isIgnoredForPropChanges(key: string): boolean {\n if (key === 'children' || key === 'key') return true;\n if (key.startsWith('on') && key.length > 2) return true;\n if (key.startsWith('data-')) return true;\n return false;\n}\n\n/**\n * Check if an element's current attribute value differs from vnode value\n */\nexport function hasPropChanged(\n el: Element,\n key: string,\n value: unknown\n): boolean {\n try {\n if (key === 'class' || key === 'className') {\n return readElementClassName(el) !== String(value);\n }\n if (key === 'value' || key === 'checked') {\n return (el as HTMLElement & Record<string, unknown>)[key] !== value;\n }\n const attr = el.getAttribute(getRenderedAttributeName(el, key));\n if (value === undefined || value === null || value === false) {\n return attr !== null;\n }\n return String(value) !== attr;\n } catch {\n return true;\n }\n}\n\nexport function isSVGDomElement(el: Element): el is SVGElement {\n return typeof SVGElement !== 'undefined' && el instanceof SVGElement;\n}\n\nexport function getRenderedAttributeName(\n el: Element,\n propName: string\n): string {\n const attributeName = getPublicAttributeName(propName);\n\n return el.namespaceURI === SVG_NAMESPACE\n ? attributeName\n : attributeName.toLowerCase();\n}\n\nexport function setRenderedAttribute(\n el: Element,\n propName: string,\n value: string\n): void {\n el.setAttribute(getRenderedAttributeName(el, propName), value);\n}\n\nexport function removeRenderedAttribute(el: Element, propName: string): void {\n el.removeAttribute(getRenderedAttributeName(el, propName));\n}\n\nexport function readElementClassName(el: Element): string {\n if (isSVGDomElement(el)) {\n return el.getAttribute('class') ?? '';\n }\n\n return (el as HTMLElement).className;\n}\n\nexport function writeElementClassName(el: Element, value: string): void {\n if (isSVGDomElement(el)) {\n if (value.length > 0) {\n el.setAttribute('class', value);\n } else {\n el.removeAttribute('class');\n }\n return;\n }\n\n (el as HTMLElement).className = value;\n}\n\nexport function tagNamesEqualIgnoreCase(a: string, b: string): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index += 1) {\n const aCode = a.charCodeAt(index);\n const bCode = b.charCodeAt(index);\n if (aCode === bCode) continue;\n\n const normalizedA = aCode >= 65 && aCode <= 90 ? aCode + 32 : aCode;\n const normalizedB = bCode >= 65 && bCode <= 90 ? bCode + 32 : bCode;\n if (normalizedA !== normalizedB) return false;\n }\n\n return true;\n}\n\n/**\n * Check if a vnode has non-trivial props (excluding events and data-*)\n */\nexport function hasNonTrivialProps(props: Record<string, unknown>): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n return true;\n }\n return false;\n}\n\n/**\n * Check for prop changes between vnode and existing element\n */\nexport function checkPropChanges(\n el: Element,\n props: Record<string, unknown>\n): boolean {\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n return false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extract key from a vnode object\n */\nexport function extractKey(vnode: unknown): string | number | undefined {\n if (typeof vnode !== 'object' || vnode === null) return undefined;\n const obj = vnode as Record<string, unknown>;\n const rawKey =\n obj.key ?? (obj.props as Record<string, unknown> | undefined)?.key;\n if (rawKey === undefined || rawKey === null) return undefined;\n return typeof rawKey === 'symbol'\n ? String(rawKey)\n : (rawKey as string | number);\n}\n\n/**\n * Build a key map from element's children\n */\nexport function buildKeyMapFromChildren(\n parent: Element\n): Map<string | number, Element> {\n const map = new Map<string | number, Element>();\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n map.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, ch);\n }\n }\n return map;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Diagnostic Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Record DOM replace operation for diagnostics\n */\nexport function recordDOMReplace(source: string): void {\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(`__LAST_DOM_REPLACE_STACK_${source}`, new Error().stack);\n } catch {\n // ignore\n }\n}\n\n/**\n * Record fast-path stats for diagnostics\n */\nexport function recordFastPathStats(\n stats: Record<string, unknown>,\n counterName?: string\n): void {\n try {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n if (counterName) {\n incDevCounter(counterName);\n }\n } catch {\n // ignore\n }\n}\n\n/**\n * Conditionally log debug info for fast-path operations\n */\nexport function logFastPathDebug(\n message: string,\n indexOrData?: number | unknown,\n data?: unknown\n): void {\n const env = getRuntimeEnv();\n if (env.ASKR_FASTPATH_DEBUG === '1' || env.ASKR_FASTPATH_DEBUG === 'true') {\n if (data !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData, data);\n } else if (indexOrData !== undefined) {\n logger.warn(`[Askr][FASTPATH] ${message}`, indexOrData);\n } else {\n logger.warn(`[Askr][FASTPATH] ${message}`);\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Performance Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get current high-resolution timestamp\n */\nexport function now(): number {\n return typeof performance !== 'undefined' && performance.now\n ? performance.now()\n : Date.now();\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"access.js","names":[],"sources":["../../src/router/access.ts"],"sourcesContent":["import type {\n GroupHelperOptions,\n RouteOptions,\n RoutePolicy,\n} from '../common/router';\nimport {\n requireAuth,\n requireGuest,\n requirePermission,\n requireRole,\n} from './policy';\nimport type { AccessScopeState } from './internal-types';\n\nfunction hasBuiltInAuthMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>\n): boolean {\n return node.auth !== undefined || !!node.role || !!node.permission;\n}\n\nfunction validateSameNodeAccessMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>\n): void {\n if (node.auth === 'guest' && (!!node.role || !!node.permission)) {\n throw new Error(\n 'Guest-only routes cannot be combined with role or permission requirements.'\n );\n }\n}\n\nexport function validateAccessMetadata(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>,\n context: {\n authConfigured: boolean;\n state: AccessScopeState;\n }\n): void {\n validateSameNodeAccessMetadata(node);\n\n const requiresAuthenticated =\n node.auth === true || !!node.role || !!node.permission;\n\n if (\n node.auth === 'guest' &&\n (context.state.authenticated || !!node.role || !!node.permission)\n ) {\n throw new Error(\n 'Guest-only routes cannot be combined with authenticated access requirements.'\n );\n }\n\n if (context.state.guestOnly && requiresAuthenticated) {\n throw new Error(\n 'Child routes cannot weaken a guest-only access scope with authenticated requirements.'\n );\n }\n\n if (hasBuiltInAuthMetadata(node) && !context.authConfigured) {\n throw new Error(\n 'Routes using `auth`, `role`, or `permission` require `auth.resolve` in registerRoutes(...).'\n );\n }\n}\n\nexport function nextAccessScopeState(\n node: Pick<GroupHelperOptions | RouteOptions, 'auth' | 'role' | 'permission'>,\n state: AccessScopeState\n): AccessScopeState {\n const requiresAuthenticated =\n node.auth === true || !!node.role || !!node.permission;\n\n return {\n guestOnly: state.guestOnly || node.auth === 'guest',\n authenticated: state.authenticated || requiresAuthenticated,\n };\n}\n\nexport function compileNodePolicies(\n node: Pick<\n RouteOptions | GroupHelperOptions,\n 'auth' | 'role' | 'permission' | 'policies'\n >\n): RoutePolicy[] {\n validateSameNodeAccessMetadata(node);\n\n const compiled: RoutePolicy[] = [];\n\n if (node.auth === true) {\n compiled.push(requireAuth());\n } else if (node.auth === 'guest') {\n compiled.push(requireGuest());\n }\n\n if (node.role) {\n compiled.push(requireRole(node.role));\n }\n\n if (node.permission) {\n compiled.push(requirePermission(node.permission));\n }\n\n if (node.policies?.length) {\n compiled.push(...node.policies);\n }\n\n return compiled;\n}\n"],"mappings":";;AAaA,SAAS,uBACP,MACS;CACT,OAAO,KAAK,SAAS,UAAa,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;AAC1D;AAEA,SAAS,+BACP,MACM;CACN,IAAI,KAAK,SAAS,YAAY,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,aAClD,MAAM,IAAI,MACR,4EACF;AAEJ;AAEA,SAAgB,uBACd,MACA,SAIM;CACN,+BAA+B,IAAI;CAEnC,MAAM,wBACJ,KAAK,SAAS,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;CAE9C,IACE,KAAK,SAAS,YACb,QAAQ,MAAM,iBAAiB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,aAEtD,MAAM,IAAI,MACR,8EACF;CAGF,IAAI,QAAQ,MAAM,aAAa,uBAC7B,MAAM,IAAI,MACR,uFACF;CAGF,IAAI,uBAAuB,IAAI,KAAK,CAAC,QAAQ,gBAC3C,MAAM,IAAI,MACR,6FACF;AAEJ;AAEA,SAAgB,qBACd,MACA,OACkB;CAClB,MAAM,wBACJ,KAAK,SAAS,QAAQ,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;CAE9C,OAAO;EACL,WAAW,MAAM,aAAa,KAAK,SAAS;EAC5C,eAAe,MAAM,iBAAiB;CACxC;AACF;AAEA,SAAgB,oBACd,MAIe;CACf,+BAA+B,IAAI;CAEnC,MAAM,WAA0B,CAAC;CAEjC,IAAI,KAAK,SAAS,MAChB,SAAS,KAAK,YAAY,CAAC;MACtB,IAAI,KAAK,SAAS,SACvB,SAAS,KAAK,aAAa,CAAC;CAG9B,IAAI,KAAK,MACP,SAAS,KAAK,YAAY,KAAK,IAAI,CAAC;CAGtC,IAAI,KAAK,YACP,SAAS,KAAK,kBAAkB,KAAK,UAAU,CAAC;CAGlD,IAAI,KAAK,UAAU,QACjB,SAAS,KAAK,GAAG,KAAK,QAAQ;CAGhC,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","names":[],"sources":["../../src/router/activity.ts"],"mappings":";;;iBAyBgB,iBAAA,CAAkB,GAAkB;AAAA,iBA0FpC,iBAAA,CACd,WAAuC;AAAA,iBAsDzB,YAAA,iBACE,WAAA,GAAc,WAAA,KAC3B,aAAA,CAAc,OAAA;AAAA,iBAiBH,wBAAA,CACd,QAAA,UACA,MAAA,UACA,IAAA,UACA,eAAA,YAA2B,UAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","names":[],"sources":["../../src/router/activity.ts"],"sourcesContent":["import type { RouteMatch, RouteParams, RouteSnapshot } from '../common/router';\nimport { syncRouteActivitySnapshot } from '../common/route-activity';\nimport { getActiveRenderContext } from '../common/render-context';\nimport { getCurrentComponentInstance } from '../runtime';\nimport {\n markReadableDerivedSubscribersDirty,\n markReactivePropsDirtySource,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from '../runtime';\nimport { deepFreeze, makeQuery, parseLocation } from './route-context';\nimport { computeMatchesFromRoutes } from './resolution';\nimport { getActiveRoutes } from './store';\n\nlet currentRouteSnapshot = buildRouteSnapshot('/', '', '');\n\nconst currentRouteSource = (() =>\n currentRouteSnapshot) as ReadableSource<RouteSnapshot> &\n (() => RouteSnapshot);\n\ncurrentRouteSource._readers = new Map();\n\nlet serverLocation: string | null = null;\n\nexport function setServerLocation(url: string | null): void {\n serverLocation = url;\n if (url) {\n const parsed = parseLocation(url);\n syncRouteActivitySnapshot(\n parsed.pathname,\n computeMatchesFromRoutes(parsed.pathname, getActiveRoutes())\n );\n return;\n }\n\n syncRouteActivitySnapshot(\n currentRouteSnapshot.path,\n currentRouteSnapshot.matches\n );\n}\n\nfunction buildRouteSnapshot(\n pathname: string,\n search: string,\n hash: string\n): RouteSnapshot {\n const query = makeQuery(search);\n const matches = computeMatchesFromRoutes(pathname, getActiveRoutes());\n\n return Object.freeze({\n path: pathname,\n params: deepFreeze({ ...matches[0]?.params }),\n query,\n hash: hash || null,\n matches: Object.freeze(matches),\n });\n}\n\nfunction setCurrentRouteSnapshot(\n pathname: string,\n search: string,\n hash: string,\n activityMatches?: readonly RouteMatch[]\n): void {\n currentRouteSnapshot = buildRouteSnapshot(pathname, search, hash);\n syncRouteActivitySnapshot(\n pathname,\n activityMatches ?? currentRouteSnapshot.matches\n );\n\n const instance = getCurrentComponentInstance();\n markReadableDerivedSubscribersDirty(currentRouteSource);\n markReactivePropsDirtySource(currentRouteSource);\n notifyReadableReaders(currentRouteSource, instance);\n}\n\nfunction normalizeRouteActivityPath(path: string): string {\n const parsed = parseLocation(path);\n const pathname = parsed.pathname || '/';\n const absolutePathname = pathname.startsWith('/') ? pathname : `/${pathname}`;\n return absolutePathname.endsWith('/') && absolutePathname !== '/'\n ? absolutePathname.slice(0, -1)\n : absolutePathname;\n}\n\nfunction readCurrentRouteLocation(): {\n pathname: string;\n search: string;\n hash: string;\n} {\n const renderContext = getActiveRenderContext();\n if (renderContext?.url) {\n return parseLocation(renderContext.url);\n }\n\n if (typeof window !== 'undefined' && window.location) {\n return {\n pathname: window.location.pathname || '/',\n search: window.location.search || '',\n hash: window.location.hash || '',\n };\n }\n\n if (serverLocation) {\n return parseLocation(serverLocation);\n }\n\n return {\n pathname: currentRouteSnapshot.path,\n search: '',\n hash: currentRouteSnapshot.hash ?? '',\n };\n}\n\nexport function isRoutePathActive(\n pathOrPaths: string | readonly string[]\n): boolean {\n const candidates = new Set(\n (Array.isArray(pathOrPaths) ? pathOrPaths : [pathOrPaths]).map(\n normalizeRouteActivityPath\n )\n );\n\n const activePath = normalizeRouteActivityPath(\n readCurrentRouteLocation().pathname\n );\n if (candidates.has(activePath)) {\n return true;\n }\n\n const matches = computeMatchesFromRoutes(activePath, getActiveRoutes());\n return matches.some((match) =>\n candidates.has(normalizeRouteActivityPath(match.path))\n );\n}\n\nfunction readCurrentRouteSnapshot<\n TParams extends RouteParams = RouteParams,\n>(): RouteSnapshot<TParams> {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n 'currentRoute() can only be called during component render execution. ' +\n 'Call currentRoute() from inside your component function.'\n );\n }\n\n const { pathname, search, hash } = readCurrentRouteLocation();\n\n const query = makeQuery(search);\n const matches = computeMatchesFromRoutes(pathname, getActiveRoutes());\n const instanceParams = instance.props as Record<string, string>;\n const routeParams =\n Object.keys(instanceParams).length > 0\n ? instanceParams\n : (matches[0]?.params ?? {});\n const params = deepFreeze({\n ...routeParams,\n });\n\n return Object.freeze({\n path: pathname,\n params,\n query,\n hash: hash || null,\n matches: Object.freeze(matches),\n }) as RouteSnapshot<TParams>;\n}\n\nexport function currentRoute<\n TParams extends RouteParams = RouteParams,\n>(): RouteSnapshot<TParams> {\n const instance = getCurrentComponentInstance();\n if (!instance) {\n throw new Error(\n 'currentRoute() can only be called during component render execution. ' +\n 'Call currentRoute() from inside your component function.'\n );\n }\n\n if (typeof window === 'undefined' || instance.ssr) {\n return readCurrentRouteSnapshot<TParams>();\n }\n\n recordReadableRead(currentRouteSource);\n return readCurrentRouteSnapshot<TParams>();\n}\n\nexport function syncCurrentRouteSnapshot(\n pathname: string,\n search: string,\n hash: string,\n activityMatches?: readonly RouteMatch[]\n): void {\n setCurrentRouteSnapshot(pathname, search, hash, activityMatches);\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAI,uBAAuB,mBAAmB,KAAK,IAAI,EAAE;AAEzD,MAAM,4BACJ;AAGF,mBAAmB,2BAAW,IAAI,IAAI;AAEtC,IAAI,iBAAgC;AAEpC,SAAgB,kBAAkB,KAA0B;CAC1D,iBAAiB;CACjB,IAAI,KAAK;EACP,MAAM,SAAS,cAAc,GAAG;EAChC,0BACE,OAAO,UACP,yBAAyB,OAAO,UAAU,gBAAgB,CAAC,CAC7D;EACA;CACF;CAEA,0BACE,qBAAqB,MACrB,qBAAqB,OACvB;AACF;AAEA,SAAS,mBACP,UACA,QACA,MACe;CACf,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,yBAAyB,UAAU,gBAAgB,CAAC;CAEpE,OAAO,OAAO,OAAO;EACnB,MAAM;EACN,QAAQ,WAAW,EAAE,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC;EAC5C;EACA,MAAM,QAAQ;EACd,SAAS,OAAO,OAAO,OAAO;CAChC,CAAC;AACH;AAEA,SAAS,wBACP,UACA,QACA,MACA,iBACM;CACN,uBAAuB,mBAAmB,UAAU,QAAQ,IAAI;CAChE,0BACE,UACA,mBAAmB,qBAAqB,OAC1C;CAEA,MAAM,WAAW,4BAA4B;CAC7C,oCAAoC,kBAAkB;CACtD,6BAA6B,kBAAkB;CAC/C,sBAAsB,oBAAoB,QAAQ;AACpD;AAWA,SAAS,2BAIP;CACA,MAAM,gBAAgB,uBAAuB;CAC7C,IAAI,eAAe,KACjB,OAAO,cAAc,cAAc,GAAG;CAGxC,IAAI,OAAO,WAAW,eAAe,OAAO,UAC1C,OAAO;EACL,UAAU,OAAO,SAAS,YAAY;EACtC,QAAQ,OAAO,SAAS,UAAU;EAClC,MAAM,OAAO,SAAS,QAAQ;CAChC;CAGF,IAAI,gBACF,OAAO,cAAc,cAAc;CAGrC,OAAO;EACL,UAAU,qBAAqB;EAC/B,QAAQ;EACR,MAAM,qBAAqB,QAAQ;CACrC;AACF;AAwBA,SAAS,2BAEmB;CAC1B,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,+HAEF;CAGF,MAAM,EAAE,UAAU,QAAQ,SAAS,yBAAyB;CAE5D,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,yBAAyB,UAAU,gBAAgB,CAAC;CACpE,MAAM,iBAAiB,SAAS;CAKhC,MAAM,SAAS,WAAW,EACxB,GAJA,OAAO,KAAK,cAAc,CAAC,CAAC,SAAS,IACjC,iBACC,QAAQ,EAAE,EAAE,UAAU,CAAC,EAG9B,CAAC;CAED,OAAO,OAAO,OAAO;EACnB,MAAM;EACN;EACA;EACA,MAAM,QAAQ;EACd,SAAS,OAAO,OAAO,OAAO;CAChC,CAAC;AACH;AAEA,SAAgB,eAEY;CAC1B,MAAM,WAAW,4BAA4B;CAC7C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,+HAEF;CAGF,IAAI,OAAO,WAAW,eAAe,SAAS,KAC5C,OAAO,yBAAkC;CAG3C,mBAAmB,kBAAkB;CACrC,OAAO,yBAAkC;AAC3C;AAEA,SAAgB,yBACd,UACA,QACA,MACA,iBACM;CACN,wBAAwB,UAAU,QAAQ,MAAM,eAAe;AACjE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authoring.d.ts","names":[],"sources":["../../src/router/authoring.ts"],"mappings":";;;;KAsCK,mBAAA,oBAAuC,iBAAA,IAC1C,UAAA,CAAW,UAAA,yBAAmC,UAAA,CAAW,UAAA;AAAA,KAEtD,gCAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,UAAA,GACA,eAAA,CAAgB,IAAA,UAAc,mBAAA,CAAoB,UAAA,IAChD,UAAA;AAAA,KAGH,gCAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,UAAA,GACA,mBAAA,CAAoB,UAAA,UAAoB,MAAA,OAC9B,eAAA,CAAgB,IAAA,aAGxB,UAAA;AAAA,KAGH,wBAAA,yCAEgB,iBAAA,IACjB,IAAA,wBACA,gCAAA,CAAiC,IAAA,EAAM,UAAA,IACvC,gCAAA,CAAiC,IAAA,EAAM,UAAA;AAAA,KAEtC,wBAAA,yCAEgB,iBAAA,IAEnB,UAAA,CAAW,UAAA,eACP,YAAA,CAAa,eAAA,CAAgB,IAAA,KAC7B,mBAAA,CAAoB,UAAA,UAAoB,WAAA,GACtC,YAAA,CAAa,mBAAA,CAAoB,UAAA,KACjC,YAAA,CAAa,eAAA,CAAgB,IAAA;AAAA,iBAmSrB,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,EAAA,EAAI,eAAe;AAAA,iBAKtD,IAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,OAAA,EAAS,iBAAA,EACT,EAAA,EAAI,eAAA;AAAA,iBAEU,IAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,OAAA,EAAS,iBAAA,EACT,EAAA,EAAI,eAAA;AAAA,iBA2BU,KAAA,CAAM,SAAA,EAAW,cAAA,EAAgB,OAAA,GAAU,YAAY;AAAA,iBAavD,QAAA,CAAS,SAAyB,EAAd,cAAc;AAAA,iBAmClC,cAAA,CACd,UAAA,EAAY,eAAA,EACZ,OAAA,GAAS,qBAA0B;AAAA,iBAWrB,KAAA,6BACd,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,cAAA,CAAe,eAAA,CAAgB,KAAA,IAC1C,OAAA,GAAU,YAAA,CAAa,eAAA,CAAgB,KAAA;AAAA,iBAEzB,KAAA,gDAEK,iBAAA,EAEnB,IAAA,EAAM,KAAA,EACN,SAAA,EAAW,wBAAA,CAAyB,KAAA,EAAO,UAAA,GAC3C,OAAA,GAAU,wBAAA,CAAyB,KAAA,EAAO,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authoring.js","names":[],"sources":["../../src/router/authoring.ts"],"sourcesContent":["import type {\n GroupHelperOptions,\n PageHelperOptions,\n RegisterRoutesOptions,\n RouteComponent,\n RouteDefinition,\n RouteOptions,\n RouteParams,\n RoutePathParams,\n} from '../common/router';\nimport { getCurrentComponentInstance } from '../runtime';\nimport { getExecutionModel } from '../runtime';\nimport { computeRank, normalizeRouteSegmentName, parseSegments } from './match';\nimport {\n compileNodePolicies,\n nextAccessScopeState,\n validateAccessMetadata,\n} from './access';\nimport type { AnyRouteComponent, InternalRouteRecord } from './internal-types';\nimport { createRouteHandler } from './rendering';\nimport {\n addRouteToStores,\n assertRouteRegistrationUnlocked,\n getCurrentAccessScopeState,\n getCurrentInheritedPolicies,\n getCurrentLayoutChain,\n getCurrentPageChain,\n getCurrentPageScope,\n getCurrentPathPrefix,\n getCurrentRegistrationSession,\n getCurrentScopeKind,\n hasActivePageScope,\n insertRecordSorted,\n pushRegistrationScope,\n pushRegistrationSession,\n setDefaultRouteAuthOptions,\n} from './store';\n\ntype RouteComponentParam<TComponent extends AnyRouteComponent> =\n Parameters<TComponent> extends [] ? unknown : Parameters<TComponent>[0];\n\ntype CompatibleAbsoluteRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? TComponent\n : RoutePathParams<Path> extends RouteComponentParam<TComponent>\n ? TComponent\n : never;\n\ntype CompatibleRelativeRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? TComponent\n : RouteComponentParam<TComponent> extends Record<\n keyof RoutePathParams<Path>,\n string\n >\n ? TComponent\n : never;\n\ntype CompatibleRouteComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> = Path extends `/${string}`\n ? CompatibleAbsoluteRouteComponent<Path, TComponent>\n : CompatibleRelativeRouteComponent<Path, TComponent>;\n\ntype RouteOptionsForComponent<\n Path extends string,\n TComponent extends AnyRouteComponent,\n> =\n Parameters<TComponent> extends []\n ? RouteOptions<RoutePathParams<Path>>\n : RouteComponentParam<TComponent> extends RouteParams\n ? RouteOptions<RouteComponentParam<TComponent>>\n : RouteOptions<RoutePathParams<Path>>;\n\nfunction validateRoutePath(path: string): void {\n if (!path.startsWith('/')) {\n throw new Error(`Route path must begin with \"/\". Got: \"${path}\"`);\n }\n if (/\\/{2,}/.test(path)) {\n throw new Error('Route path cannot contain consecutive slashes.');\n }\n if (/:([^/{}]+)/.test(path)) {\n const suggested = path.replace(/:([^/{}]+)/g, '{$1}');\n throw new Error(\n `Route parameter syntax uses {name} interpolation, not :name. ` +\n `Use \"${suggested}\" instead of \"${path}\".`\n );\n }\n\n const segments = path.split('/').filter(Boolean);\n const seenParamNames = new Set<string>();\n\n for (let index = 0; index < segments.length; index++) {\n const segment = segments[index];\n if (segment === '*') {\n continue;\n }\n\n const hasOpenBrace = segment.includes('{');\n const hasCloseBrace = segment.includes('}');\n\n if (!hasOpenBrace && !hasCloseBrace) {\n continue;\n }\n\n if (!(segment.startsWith('{') && segment.endsWith('}'))) {\n throw new Error(\n 'Route parameter segments must use complete {name} interpolation.'\n );\n }\n\n const rawParamName = normalizeRouteSegmentName(segment.slice(1, -1));\n const isSplat = rawParamName.startsWith('*');\n const paramName = isSplat\n ? normalizeRouteSegmentName(rawParamName.slice(1))\n : rawParamName;\n\n if (!paramName) {\n throw new Error(\n isSplat\n ? 'Route splat parameter name cannot be empty.'\n : 'Route parameter name cannot be empty.'\n );\n }\n\n if (isSplat && paramName === '*') {\n throw new Error('Route named splat parameter name cannot be \"*\".');\n }\n\n if (isSplat && index !== segments.length - 1) {\n throw new Error(\n 'Route named splat parameters must be the final segment.'\n );\n }\n\n if (seenParamNames.has(paramName)) {\n throw new Error(\n `Route path cannot reuse duplicate parameter name \"${paramName}\".`\n );\n }\n\n seenParamNames.add(paramName);\n }\n}\n\nfunction normalizeAbsoluteRoutePath(path: string): string {\n if (!path || path === '/') {\n return '/';\n }\n\n const normalized = path.endsWith('/') ? path.slice(0, -1) : path;\n return normalized || '/';\n}\n\nfunction joinRoutePaths(prefix: string, path: string): string {\n const normalizedPrefix = normalizeAbsoluteRoutePath(prefix || '/');\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n\n if (!normalizedPath) {\n return normalizedPrefix;\n }\n\n return normalizedPrefix === '/'\n ? `/${normalizedPath}`\n : `${normalizedPrefix}/${normalizedPath}`;\n}\n\nfunction resolvePageScopePath(path: string): string {\n if (!path) {\n throw new Error('page(path, Component, fn) requires a non-empty path.');\n }\n\n if (path.startsWith('/')) {\n validateRoutePath(path);\n return normalizeAbsoluteRoutePath(path);\n }\n\n return joinRoutePaths(getCurrentPathPrefix(), path);\n}\n\nfunction resolveIndexPath(): string {\n return normalizeAbsoluteRoutePath(getCurrentPathPrefix() || '/');\n}\n\nfunction resolveRouteRegistrationPath(path: string): string {\n if (path.startsWith('/')) {\n if (hasActivePageScope()) {\n throw new Error(\n 'Child route paths inside page() must be relative. ' +\n `Use \"${path.slice(1)}\" instead of \"${path}\".`\n );\n }\n\n validateRoutePath(path);\n return normalizeAbsoluteRoutePath(path);\n }\n\n const prefix = getCurrentPathPrefix();\n\n if (!prefix) {\n throw new Error(`Route path must begin with \"/\". Got: \"${path}\"`);\n }\n\n return joinRoutePaths(prefix, path);\n}\n\nfunction pushGroupScope(\n options: GroupHelperOptions,\n fn: RouteDefinition\n): void {\n const session = getCurrentRegistrationSession();\n validateAccessMetadata(options, {\n authConfigured: session.authConfigured,\n state: getCurrentAccessScopeState(),\n });\n const policies = compileNodePolicies(options);\n\n pushRegistrationScope(\n {\n kind: 'group',\n pathPrefix: getCurrentPathPrefix(),\n layout: options.layout,\n policies,\n state: nextAccessScopeState(options, getCurrentAccessScopeState()),\n },\n fn\n );\n}\n\nfunction pushPageScope(\n path: string,\n Component: RouteComponent,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void {\n if (hasActivePageScope()) {\n throw new Error(\n 'page() cannot be nested inside another page(). ' +\n 'Use route() for child leaves or group() for inherited behavior inside the existing page scope.'\n );\n }\n\n const session = getCurrentRegistrationSession();\n validateAccessMetadata(options, {\n authConfigured: session.authConfigured,\n state: getCurrentAccessScopeState(),\n });\n\n const policies = compileNodePolicies(options);\n\n pushRegistrationScope(\n {\n kind: 'page',\n pathPrefix: resolvePageScopePath(path),\n page: Component,\n hasIndex: false,\n policies,\n state: nextAccessScopeState(options, getCurrentAccessScopeState()),\n },\n fn\n );\n}\n\nfunction normalizeRouteOptions(\n options: RouteOptions | undefined\n): RouteOptions | undefined {\n if (!options) {\n return undefined;\n }\n\n const loader = options.loader;\n const policies = compileNodePolicies(options);\n\n if (\n !loader &&\n !options.entries &&\n policies.length === 0 &&\n !options.title &&\n !options.namespace &&\n options.auth === undefined &&\n !options.role &&\n !options.permission\n ) {\n return undefined;\n }\n\n return {\n ...(loader ? { loader } : {}),\n ...(options.entries ? { entries: options.entries } : {}),\n ...(options.auth !== undefined ? { auth: options.auth } : {}),\n ...(options.role ? { role: options.role } : {}),\n ...(options.permission ? { permission: options.permission } : {}),\n ...(policies.length > 0 ? { policies } : {}),\n ...(options.title ? { title: options.title } : {}),\n ...(options.namespace ? { namespace: options.namespace } : {}),\n };\n}\n\nfunction registerRouteAtResolvedPath(\n path: string,\n Component: RouteComponent,\n options?: RouteOptions,\n metadata?: {\n isFallback?: boolean;\n fallbackPrefix?: string;\n }\n): void {\n validateRoutePath(path);\n\n validateAccessMetadata(options ?? {}, {\n authConfigured: getCurrentRegistrationSession().authConfigured,\n state: getCurrentAccessScopeState(),\n });\n\n const chain = getCurrentLayoutChain();\n const pageChain = getCurrentPageChain();\n const segments = parseSegments(path);\n const rank = computeRank(segments);\n const isFallback = metadata?.isFallback ?? path === '/*';\n const comp = Component;\n const normalizedOptions = normalizeRouteOptions(options);\n const policies = [\n ...getCurrentInheritedPolicies(),\n ...(normalizedOptions?.policies ?? []),\n ];\n\n const handler = createRouteHandler(comp, pageChain, chain);\n const renderHandler = createRouteHandler(comp, pageChain, chain, true);\n\n const record: InternalRouteRecord = {\n path,\n component: comp,\n segments,\n rank,\n layoutChain: chain,\n pageChain,\n options: normalizedOptions\n ? {\n ...normalizedOptions,\n ...(policies.length > 0 ? { policies } : {}),\n }\n : policies.length > 0\n ? { policies }\n : {},\n isFallback,\n handler,\n renderHandler,\n ...(metadata?.fallbackPrefix\n ? { fallbackPrefix: metadata.fallbackPrefix }\n : {}),\n };\n\n insertRecordSorted(record);\n addRouteToStores({\n path,\n handler,\n namespace: normalizedOptions?.namespace ?? options?.namespace,\n ...(metadata?.fallbackPrefix\n ? { fallbackPrefix: metadata.fallbackPrefix }\n : {}),\n });\n}\n\nexport function group(options: GroupHelperOptions, fn: RouteDefinition): void;\nexport function group(options: GroupHelperOptions, fn: RouteDefinition): void {\n pushGroupScope(options, fn);\n}\n\nexport function page<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n fn: RouteDefinition\n): void;\nexport function page<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n fn: RouteDefinition\n): void;\nexport function page<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void;\nexport function page<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n options: PageHelperOptions,\n fn: RouteDefinition\n): void;\nexport function page(\n path: string,\n Component: RouteComponent,\n optionsOrFn: PageHelperOptions | RouteDefinition,\n maybeFn?: RouteDefinition\n): void {\n const options =\n typeof optionsOrFn === 'function' ? ({} as PageHelperOptions) : optionsOrFn;\n const fn = typeof optionsOrFn === 'function' ? optionsOrFn : maybeFn;\n\n if (typeof Component !== 'function') {\n throw new Error(\n 'page(path, Component, fn) requires a component function as the second argument.'\n );\n }\n\n if (typeof fn !== 'function') {\n throw new Error(\n 'page(path, Component, fn) requires a route definition callback as the final argument.'\n );\n }\n\n pushPageScope(path, Component, options, fn);\n}\n\nexport function index(Component: RouteComponent, options?: RouteOptions): void {\n const pageScope = getCurrentPageScope();\n if (pageScope?.hasIndex) {\n throw new Error('page() cannot declare multiple index routes.');\n }\n\n if (pageScope) {\n pageScope.hasIndex = true;\n }\n\n registerRouteAtResolvedPath(resolveIndexPath(), Component, options);\n}\n\nexport function fallback(Component: RouteComponent): void {\n if (hasActivePageScope()) {\n if (getCurrentScopeKind() !== 'page') {\n throw new Error(\n 'fallback() inside page() must be declared directly in the page scope, not inside nested group().'\n );\n }\n\n registerRouteAtResolvedPath(\n `${getCurrentPathPrefix()}/*`,\n Component,\n undefined,\n { isFallback: true, fallbackPrefix: getCurrentPathPrefix() }\n );\n return;\n }\n\n const allowsRootFallback =\n getCurrentInheritedPolicies().length === 0 &&\n !getCurrentAccessScopeState().guestOnly &&\n !getCurrentAccessScopeState().authenticated;\n\n if (!allowsRootFallback) {\n throw new Error(\n 'fallback() can only be registered at the root scope. ' +\n 'Use route(\"/*\", Component) if you need compatibility behavior.'\n );\n }\n\n registerRouteAtResolvedPath('/*', Component, undefined, {\n isFallback: true,\n fallbackPrefix: '/',\n });\n}\n\nexport function registerRoutes(\n definition: RouteDefinition,\n options: RegisterRoutesOptions = {}\n): void {\n setDefaultRouteAuthOptions(options.auth);\n pushRegistrationSession(\n {\n authConfigured: !!options.auth?.resolve,\n },\n definition\n );\n}\n\nexport function route<const TPath extends string>(\n path: TPath,\n Component: RouteComponent<RoutePathParams<TPath>>,\n options?: RouteOptions<RoutePathParams<TPath>>\n): void;\nexport function route<\n const TPath extends string,\n TComponent extends AnyRouteComponent,\n>(\n path: TPath,\n Component: CompatibleRouteComponent<TPath, TComponent>,\n options?: RouteOptionsForComponent<TPath, TComponent>\n): void;\nexport function route(\n path: string,\n Component: RouteComponent,\n options?: RouteOptions\n): void {\n if (typeof path === 'undefined') {\n throw new Error(\n 'route() is only for route registration. Use currentRoute() inside components.'\n );\n }\n\n if (getExecutionModel() === 'islands') {\n throw new Error(\n 'Routes are not supported with islands. Use createSPA (client) or createSSR (server) instead.'\n );\n }\n\n const currentInst = getCurrentComponentInstance();\n if (currentInst && currentInst.ssr) {\n throw new Error(\n 'route() cannot be called during SSR rendering. Register routes at module load time instead.'\n );\n }\n\n assertRouteRegistrationUnlocked();\n\n if (typeof Component !== 'function') {\n throw new Error(\n 'route(path, Component) requires a component function as the second argument. ' +\n 'Passing JSX elements or VNodes directly is not supported.'\n );\n }\n\n registerRouteAtResolvedPath(\n resolveRouteRegistrationPath(path),\n Component,\n options\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal-types.d.ts","names":[],"sources":["../../src/router/internal-types.ts"],"mappings":";;;;KAUY,iBAAA,OAAwB,IAAA,YAAgB,eAAe;AAAA,KAEvD,aAAA,GAAgB,KAAK;EAC/B,cAAc;AAAA;AAAA,KAGJ,mBAAA,GAAsB,WAAA;EAChC,cAAA;EACA,aAAA,GAAgB,YAAY;AAAA;AAAA,KAGlB,gBAAA;EACV,SAAA;EACA,aAAa;AAAA;AAAA,KAGH,iBAAA;EACV,IAAA;EACA,UAAA;EACA,MAAA,GAAS,iBAAA;EACT,IAAA,GAAO,eAAA;EACP,QAAA;EACA,QAAA,WAAmB,WAAA;EACnB,KAAA,EAAO,gBAAA;AAAA;AAAA,KAGG,mBAAA;EACV,cAAc;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.d.ts","names":[],"sources":["../../src/router/lazy.ts"],"mappings":";;;;iBAYgB,IAAA,oBAAwB,iBAAA,EACtC,OAAA,QAAe,OAAA;EAAU,OAAA,EAAS,UAAA;AAAA,IAAe,UAAA,IAChD,UAAA;AAAA,iBA+Ba,aAAA,IAAiB,OAAO;AAAA,iBAIxB,wBAAA,CAAyB,MAAA;EACvC,QAAA,GAAW,aAAA;EACX,QAAA,GAAW,aAAA;AAAA,IACT,OAAA;AAAA,iBAmBY,UAAA,CACd,iBAAA,GAAmB,QAAA,CAAS,OAAA,aAC3B,OAAA;AAAA,iBASa,wBAAA,CACd,QAAA,EAAU,aAAA,EACV,QAAA,EAAU,aAAA,EACV,WAAA,EAAa,OAAA;AAAA,iBAUC,gBAAA;AAAA,iBAIA,kBAAA,CAAmB,WAAwC,WAAlB,OAAO"}
|
package/dist/router/lazy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/router/lazy.ts"],"sourcesContent":["import type {\n RouteManifest,\n RouteParams,\n RouteRegistry,\n RouteComponent,\n} from '../common/router';\nimport type { AnyRouteComponent } from './internal-types';\n\nconst pendingLazy = new Set<Promise<unknown>>();\nconst registryLazyImports = new WeakMap<RouteRegistry, Promise<unknown>[]>();\nconst manifestLazyImports = new WeakMap<RouteManifest, Promise<unknown>[]>();\n\nexport function lazy<TComponent extends AnyRouteComponent>(\n factory: () => Promise<{ default: TComponent } | TComponent>\n): TComponent {\n let resolved: TComponent | null = null;\n let loadError: unknown = null;\n\n const promise = factory().then(\n (mod) => {\n resolved =\n typeof mod === 'function'\n ? mod\n : (mod as { default: TComponent }).default;\n pendingLazy.delete(promise);\n },\n (err: unknown) => {\n loadError = err;\n pendingLazy.delete(promise);\n }\n );\n pendingLazy.add(promise);\n\n return ((params: RouteParams) => {\n if (loadError) throw loadError as Error;\n if (!resolved) {\n throw new Error(\n 'lazy() component used before it was resolved. ' +\n 'Await createSPA() / hydrateSPA() to ensure all chunks load first.'\n );\n }\n return (resolved as RouteComponent<RouteParams>)(params);\n }) as TComponent;\n}\n\nexport function _snapshotLazy(): Promise<unknown>[] {\n return [...pendingLazy];\n}\n\nexport function _snapshotRouteSourceLazy(source: {\n registry?: RouteRegistry;\n manifest?: RouteManifest;\n}): Promise<unknown>[] {\n const imports = new Set<Promise<unknown>>();\n\n if (source.registry) {\n for (const lazyImport of registryLazyImports.get(source.registry) ?? []) {\n imports.add(lazyImport);\n }\n }\n\n const manifest = source.manifest ?? source.registry?.manifest;\n if (manifest) {\n for (const lazyImport of manifestLazyImports.get(manifest) ?? []) {\n imports.add(lazyImport);\n }\n }\n\n return [...imports];\n}\n\nexport function _drainLazy(\n additionalPending: Iterable<Promise<unknown>> = []\n): Promise<void> {\n const combined = new Set<Promise<unknown>>([\n ...additionalPending,\n ...pendingLazy,\n ]);\n if (combined.size === 0) return Promise.resolve();\n return Promise.allSettled(combined).then(() => undefined);\n}\n\nexport function associateRouteSourceLazy(\n registry: RouteRegistry,\n manifest: RouteManifest,\n lazyImports: Promise<unknown>[]\n): void {\n if (lazyImports.length === 0) {\n return;\n }\n\n registryLazyImports.set(registry, lazyImports);\n manifestLazyImports.set(manifest, lazyImports);\n}\n\nexport function clearPendingLazy(): void {\n pendingLazy.clear();\n}\n\nexport function restorePendingLazy(lazyImports: readonly Promise<unknown>[]) {\n pendingLazy.clear();\n for (const lazyImport of lazyImports) {\n pendingLazy.add(lazyImport);\n }\n}\n"],"mappings":";AAQA,MAAM,8BAAc,IAAI,IAAsB;AAC9C,MAAM,sCAAsB,IAAI,QAA2C;AAC3E,MAAM,sCAAsB,IAAI,QAA2C;AAE3E,SAAgB,KACd,SACY;CACZ,IAAI,WAA8B;CAClC,IAAI,YAAqB;CAEzB,MAAM,UAAU,QAAQ,CAAC,CAAC,MACvB,QAAQ;EACP,WACE,OAAO,QAAQ,aACX,MACC,IAAgC;EACvC,YAAY,OAAO,OAAO;CAC5B,IACC,QAAiB;EAChB,YAAY;EACZ,YAAY,OAAO,OAAO;CAC5B,CACF;CACA,YAAY,IAAI,OAAO;CAEvB,SAAS,WAAwB;EAC/B,IAAI,WAAW,MAAM;EACrB,IAAI,CAAC,UACH,MAAM,IAAI,MACR,iHAEF;EAEF,OAAQ,SAAyC,MAAM;CACzD;AACF;AAEA,SAAgB,gBAAoC;CAClD,OAAO,CAAC,GAAG,WAAW;AACxB;AAEA,SAAgB,yBAAyB,QAGlB;CACrB,MAAM,0BAAU,IAAI,IAAsB;CAE1C,IAAI,OAAO,UACT,KAAK,MAAM,cAAc,oBAAoB,IAAI,OAAO,QAAQ,KAAK,CAAC,GACpE,QAAQ,IAAI,UAAU;CAI1B,MAAM,WAAW,OAAO,YAAY,OAAO,UAAU;CACrD,IAAI,UACF,KAAK,MAAM,cAAc,oBAAoB,IAAI,QAAQ,KAAK,CAAC,GAC7D,QAAQ,IAAI,UAAU;CAI1B,OAAO,CAAC,GAAG,OAAO;AACpB;AAEA,SAAgB,WACd,oBAAgD,CAAC,GAClC;CACf,MAAM,2BAAW,IAAI,IAAsB,CACzC,GAAG,mBACH,GAAG,WACL,CAAC;CACD,IAAI,SAAS,SAAS,GAAG,OAAO,QAAQ,QAAQ;CAChD,OAAO,QAAQ,WAAW,QAAQ,CAAC,CAAC,WAAW,MAAS;AAC1D;AAEA,SAAgB,yBACd,UACA,UACA,aACM;CACN,IAAI,YAAY,WAAW,GACzB;CAGF,oBAAoB,IAAI,UAAU,WAAW;CAC7C,oBAAoB,IAAI,UAAU,WAAW;AAC/C;AAEA,SAAgB,mBAAyB;CACvC,YAAY,MAAM;AACpB;AAEA,SAAgB,mBAAmB,aAA0C;CAC3E,YAAY,MAAM;CAClB,KAAK,MAAM,cAAc,aACvB,YAAY,IAAI,UAAU;AAE9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","names":[],"sources":["../../src/router/manifest.ts"],"mappings":";;;iBA0BgB,WAAA,IAAe,aAAa;AAAA,iBAQ5B,cAAA,CAAe,QAAuB,EAAb,aAAa;AAAA,iBAkBtC,WAAA;AAAA,iBAKA,mBAAA,CACd,UAAA,EAAY,eAAA,EACZ,OAAA,GAAS,qBAAA,GACR,aAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","names":[],"sources":["../../src/router/manifest.ts"],"sourcesContent":["import type {\n RegisterRoutesOptions,\n RouteManifest,\n RouteRegistry,\n RouteDefinition,\n} from '../common/router';\nimport { registerRoutes } from './authoring';\nimport {\n addRouteToStores,\n clearRouteState,\n getDefaultRouteAuthOptions,\n getRouteRecords,\n getRoutes,\n insertRecordSorted,\n restoreRouteState,\n setDefaultRouteAuthOptions,\n snapshotRouteState,\n} from './store';\nimport type { InternalRouteRecord } from './internal-types';\nimport {\n _snapshotLazy,\n associateRouteSourceLazy,\n clearPendingLazy,\n restorePendingLazy,\n} from './lazy';\n\nexport function getManifest(): RouteManifest {\n const auth = getDefaultRouteAuthOptions();\n return {\n records: [...getRouteRecords()],\n ...(auth ? { auth } : {}),\n };\n}\n\nexport function _applyManifest(manifest: RouteManifest): void {\n setDefaultRouteAuthOptions(manifest.auth);\n for (const record of manifest.records) {\n insertRecordSorted(record as InternalRouteRecord);\n addRouteToStores({\n path: record.path,\n handler: record.handler,\n namespace: record.options.namespace,\n ...('fallbackPrefix' in record &&\n typeof (record as InternalRouteRecord).fallbackPrefix === 'string'\n ? {\n fallbackPrefix: (record as InternalRouteRecord).fallbackPrefix,\n }\n : {}),\n });\n }\n}\n\nexport function clearRoutes(): void {\n clearRouteState();\n clearPendingLazy();\n}\n\nexport function createRouteRegistry(\n definition: RouteDefinition,\n options: RegisterRoutesOptions = {}\n): RouteRegistry {\n const previous = snapshotRouteState();\n const previousLazy = _snapshotLazy();\n clearRoutes();\n\n try {\n registerRoutes(definition, options);\n const manifest = getManifest();\n const registry = Object.freeze({\n manifest,\n routes: getRoutes(),\n });\n const lazyImports = _snapshotLazy();\n associateRouteSourceLazy(registry, manifest, lazyImports);\n\n return registry;\n } finally {\n restoreRouteState(previous);\n restorePendingLazy(previousLazy);\n }\n}\n"],"mappings":";;;;AA0BA,SAAgB,cAA6B;CAC3C,MAAM,OAAO,2BAA2B;CACxC,OAAO;EACL,SAAS,CAAC,GAAG,gBAAgB,CAAC;EAC9B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CACzB;AACF;AAEA,SAAgB,eAAe,UAA+B;CAC5D,2BAA2B,SAAS,IAAI;CACxC,KAAK,MAAM,UAAU,SAAS,SAAS;EACrC,mBAAmB,MAA6B;EAChD,iBAAiB;GACf,MAAM,OAAO;GACb,SAAS,OAAO;GAChB,WAAW,OAAO,QAAQ;GAC1B,GAAI,oBAAoB,UACxB,OAAQ,OAA+B,mBAAmB,WACtD,EACE,gBAAiB,OAA+B,eAClD,IACA,CAAC;EACP,CAAC;CACH;AACF;AAEA,SAAgB,cAAoB;CAClC,gBAAgB;CAChB,iBAAiB;AACnB;AAEA,SAAgB,oBACd,YACA,UAAiC,CAAC,GACnB;CACf,MAAM,WAAW,mBAAmB;CACpC,MAAM,eAAe,cAAc;CACnC,YAAY;CAEZ,IAAI;EACF,eAAe,YAAY,OAAO;EAClC,MAAM,WAAW,YAAY;EAC7B,MAAM,WAAW,OAAO,OAAO;GAC7B;GACA,QAAQ,UAAU;EACpB,CAAC;EAED,yBAAyB,UAAU,UADf,cACyB,CAAW;EAExD,OAAO;CACT,UAAU;EACR,kBAAkB,QAAQ;EAC1B,mBAAmB,YAAY;CACjC;AACF"}
|
package/dist/router/match.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","names":[],"sources":["../../src/router/match.ts"],"sourcesContent":["/**\n * Path matching, segment parsing, and specificity scoring.\n */\n\nimport type { ParsedSegment } from '../common/router';\n\nexport function splitPathSegments(path: string): string[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n if (!normalized || normalized === '/') {\n return [];\n }\n\n const withoutLeadingSlash = normalized.startsWith('/')\n ? normalized.slice(1)\n : normalized;\n\n return withoutLeadingSlash.length === 0 ? [] : withoutLeadingSlash.split('/');\n}\n\nexport function normalizeRouteSegmentName(value: string): string {\n return value.trim();\n}\n\n/**\n * Parse a route template path into typed segments.\n *\n * @example\n * parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]\n * parseSegments('/*') // [{kind:'catchall',value:'*'}]\n * parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]\n * parseSegments('/files/{*path}') // [{kind:'static',value:'files'},{kind:'splat',value:'path'}]\n */\nexport function parseSegments(path: string): ParsedSegment[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n const parts = normalized.split('/').filter(Boolean);\n\n // Bare catch-all: /*\n if (parts.length === 1 && parts[0] === '*') {\n return [{ kind: 'catchall', value: '*' }];\n }\n\n return parts.map((segment): ParsedSegment => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n const value = normalizeRouteSegmentName(segment.slice(1, -1));\n if (value.startsWith('*')) {\n return {\n kind: 'splat',\n value: normalizeRouteSegmentName(value.slice(1)),\n };\n }\n return { kind: 'param', value };\n }\n if (segment === '*') {\n return { kind: 'wildcard', value: '*' };\n }\n return { kind: 'static', value: segment };\n });\n}\n\n/**\n * Compute a numeric specificity rank from a parsed segment list.\n *\n * Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.\n * Higher rank wins when multiple routes match the same path.\n */\nexport function computeRank(segments: ParsedSegment[]): number {\n if (segments.length === 1 && segments[0].kind === 'catchall') return -1;\n let score = 0;\n for (const seg of segments) {\n if (seg.kind === 'static') score += 3;\n else if (seg.kind === 'param') score += 2;\n else if (seg.kind === 'wildcard') score += 1;\n else if (seg.kind === 'splat') score -= 0.5;\n // catchall contributes 0 per segment but is handled above\n }\n return score;\n}\n\n/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */\nconst emptyParams: Record<string, string> = Object.freeze(\n Object.create(null) as Record<string, string>\n);\n\n/** Returned for every failed match — avoids per-call allocation. */\nconst noMatch: MatchResult = Object.freeze({\n matched: false,\n params: emptyParams,\n});\n\nfunction decodeRouteParam(part: string): string {\n if (!part.includes('%')) {\n return part;\n }\n\n try {\n return decodeURIComponent(part);\n } catch {\n return part;\n }\n}\n\n/**\n * Match pre-split URL parts against pre-parsed route segments.\n *\n * This is the hot-path matcher used by `resolveRoute` and\n * `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse\n * `urlParts` across all route comparisons in a single resolution call.\n *\n * - Returns a params object (possibly the shared `{}`) on match.\n * - Returns `null` on no match.\n * - Params are allocated lazily — purely-static routes return the frozen\n * empty sentinel without any heap allocation.\n */\nexport function matchSegments(\n urlParts: string[],\n segments: ParsedSegment[]\n): Record<string, string> | null {\n // catch-all /* — matches every URL at any depth\n if (segments.length === 1 && segments[0].kind === 'catchall') {\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n const splatIndex = segments.findIndex((segment) => segment.kind === 'splat');\n if (splatIndex !== -1) {\n if (splatIndex !== segments.length - 1) {\n return null;\n }\n if (urlParts.length < splatIndex) {\n return null;\n }\n } else if (urlParts.length !== segments.length) {\n return null;\n }\n\n // non-catchall: part count must equal segment count\n\n // Walk segments; allocate the params object lazily on first capture\n let params: Record<string, string> | null = null;\n\n const normalizeCapturedSplatParts = (parts: string[]): string[] => {\n let start = 0;\n while (start < parts.length && parts[start] === '') {\n start += 1;\n }\n\n return start === 0 ? parts : parts.slice(start);\n };\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const part = urlParts[i];\n if (seg.kind === 'static') {\n if (seg.value !== part) return null;\n } else if (seg.kind === 'splat') {\n if (params === null) params = {};\n params[seg.value] = normalizeCapturedSplatParts(\n urlParts.slice(i).map(decodeRouteParam)\n ).join('/');\n return params;\n } else {\n if (params === null) params = {};\n if (seg.kind === 'param') {\n params[seg.value] = decodeRouteParam(part);\n } else {\n // wildcard\n params['*'] = part;\n }\n }\n }\n return params ?? emptyParams;\n}\n\nexport interface MatchResult {\n matched: boolean;\n params: Record<string, string>;\n}\n\n/**\n * Match a path against a route pattern and extract params\n *\n * @example\n * match('/users/123', '/users/{id}')\n * // → { matched: true, params: { id: '123' } }\n *\n * match('/posts/hello-world/edit', '/posts/{slug}/{action}')\n * // → { matched: true, params: { slug: 'hello-world', action: 'edit' } }\n *\n * match('/users', '/posts/{id}')\n * // → { matched: false, params: {} }\n */\nexport function match(path: string, pattern: string): MatchResult {\n // Normalize trailing slashes\n const normalizedPath =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n const normalizedPattern =\n pattern.endsWith('/') && pattern !== '/' ? pattern.slice(0, -1) : pattern;\n\n const pathSegments = splitPathSegments(normalizedPath);\n const patternSegments = parseSegments(normalizedPattern);\n const params = matchSegments(pathSegments, patternSegments);\n\n return params === null ? noMatch : { matched: true, params };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.d.ts","names":[],"sources":["../../src/router/navigate.ts"],"mappings":";;;;;iBAmDgB,QAAA,CAAS,IAAA,UAAc,OAAA,GAAS,eAAoB;AAAA,iBAyHpD,oBAAA;AAAA,iBASA,iBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigate.js","names":[],"sources":["../../src/router/navigate.ts"],"sourcesContent":["/**\n * Client-side navigation with History API\n */\n\nimport { isPromiseLike } from '../common/promise';\nimport { logger } from '../common/logger';\nimport { saveScrollPosition } from './navigation-scroll';\nimport {\n configureNavigationRegistryHost,\n getCurrentHref,\n hasRegisteredApps,\n parseTargetUrl,\n} from './navigation-registry';\nimport {\n applyNavigationTargets,\n applyPopStateNavigationTargets,\n beginRouteRequest,\n cancelRouteRequests,\n isStaleRouteRequest,\n resolveNavigationTargetsForApps,\n type AppNavigationTarget,\n type NavigateOptions,\n type NavigationRedirectState,\n} from './navigation-targets';\n\nexport { configureScrollRestoration } from './navigation-scroll';\nexport type {\n HistoryScrollBehavior,\n NavigationScrollBehavior,\n ScrollRestorationOptions,\n} from './navigation-scroll';\nexport {\n registerAppInstance,\n unregisterAppInstance,\n} from './navigation-registry';\nexport { updateRouteQuery } from './route-query';\nexport type {\n RouteQueryParamInput,\n RouteQueryParamValue,\n RouteQueryUpdater,\n RouteQueryUpdates,\n UpdateRouteQueryOptions,\n} from './route-query';\nexport type { NavigateOptions };\n\nlet navigationInitialized = false;\n\nconfigureNavigationRegistryHost({\n cancelRouteRequests,\n});\n\nexport function navigate(path: string, options: NavigateOptions = {}): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const initialTarget = parseTargetUrl(path);\n navigateWithRedirectState(path, options, {\n redirects: 0,\n visited: new Set([\n `${initialTarget.pathname}${initialTarget.search}${initialTarget.hash}`,\n ]),\n });\n}\n\nfunction navigateWithRedirectState(\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState\n): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const request = beginRouteRequest();\n\n const target = parseTargetUrl(path);\n const pathname = target.pathname;\n const href = `${target.pathname}${target.search}${target.hash}`;\n const resolvedTargets = resolveNavigationTargetsForApps(\n pathname,\n href,\n request.signal\n );\n\n if (isPromiseLike(resolvedTargets)) {\n void Promise.resolve(resolvedTargets).then(\n (targets) => {\n if (isStaleRouteRequest(request.id)) {\n return;\n }\n\n try {\n applyNavigationTargets(\n path,\n options,\n redirectState,\n pathname,\n href,\n targets,\n navigateWithRedirectState\n );\n } catch (error) {\n logger.error('[Askr] navigation failed:', error);\n }\n },\n (error) => {\n logger.error('[Askr] navigation failed:', error);\n }\n );\n return;\n }\n\n applyNavigationTargets(\n path,\n options,\n redirectState,\n pathname,\n href,\n resolvedTargets,\n navigateWithRedirectState\n );\n}\n\nfunction handlePopState(event: PopStateEvent): void {\n const request = beginRouteRequest();\n const previousHref = getCurrentHref();\n const pathname = window.location.pathname;\n const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n\n saveScrollPosition(previousHref);\n\n if (!hasRegisteredApps()) {\n return;\n }\n\n const applyResolved = (targets: AppNavigationTarget[]) => {\n try {\n applyPopStateNavigationTargets(\n request.id,\n pathname,\n href,\n event.state,\n targets,\n navigate\n );\n } catch (error) {\n logger.error('[Askr] popstate navigation failed:', error);\n }\n };\n\n const resolvedTargets = resolveNavigationTargetsForApps(\n pathname,\n href,\n request.signal\n );\n\n if (isPromiseLike<AppNavigationTarget[]>(resolvedTargets)) {\n void Promise.resolve(resolvedTargets).then(\n (next) => {\n applyResolved(next);\n },\n (error) => {\n logger.error('[Askr] popstate navigation failed:', error);\n }\n );\n return;\n }\n\n applyResolved(resolvedTargets);\n}\n\nexport function initializeNavigation(): void {\n if (typeof window === 'undefined' || navigationInitialized) {\n return;\n }\n\n navigationInitialized = true;\n window.addEventListener('popstate', handlePopState);\n}\n\nexport function cleanupNavigation(): void {\n cancelRouteRequests();\n\n if (typeof window === 'undefined' || !navigationInitialized) {\n return;\n }\n\n navigationInitialized = false;\n window.removeEventListener('popstate', handlePopState);\n}\n"],"mappings":";;;;;;;;;;AA6CA,IAAI,wBAAwB;AAE5B,gCAAgC,EAC9B,oBACF,CAAC;AAED,SAAgB,SAAS,MAAc,UAA2B,CAAC,GAAS;CAC1E,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,gBAAgB,eAAe,IAAI;CACzC,0BAA0B,MAAM,SAAS;EACvC,WAAW;EACX,yBAAS,IAAI,IAAI,CACf,GAAG,cAAc,WAAW,cAAc,SAAS,cAAc,MACnE,CAAC;CACH,CAAC;AACH;AAEA,SAAS,0BACP,MACA,SACA,eACM;CACN,IAAI,OAAO,WAAW,aACpB;CAGF,MAAM,UAAU,kBAAkB;CAElC,MAAM,SAAS,eAAe,IAAI;CAClC,MAAM,WAAW,OAAO;CACxB,MAAM,OAAO,GAAG,OAAO,WAAW,OAAO,SAAS,OAAO;CACzD,MAAM,kBAAkB,gCACtB,UACA,MACA,QAAQ,MACV;CAEA,IAAI,cAAc,eAAe,GAAG;EAClC,AAAK,QAAQ,QAAQ,eAAe,CAAC,CAAC,MACnC,YAAY;GACX,IAAI,oBAAoB,QAAQ,EAAE,GAChC;GAGF,IAAI;IACF,uBACE,MACA,SACA,eACA,UACA,MACA,SACA,yBACF;GACF,SAAS,OAAO;IACd,OAAO,MAAM,6BAA6B,KAAK;GACjD;EACF,IACC,UAAU;GACT,OAAO,MAAM,6BAA6B,KAAK;EACjD,CACF;EACA;CACF;CAEA,uBACE,MACA,SACA,eACA,UACA,MACA,iBACA,yBACF;AACF;AAEA,SAAS,eAAe,OAA4B;CAClD,MAAM,UAAU,kBAAkB;CAClC,MAAM,eAAe,eAAe;CACpC,MAAM,WAAW,OAAO,SAAS;CACjC,MAAM,OAAO,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;CAEpF,mBAAmB,YAAY;CAE/B,IAAI,CAAC,kBAAkB,GACrB;CAGF,MAAM,iBAAiB,YAAmC;EACxD,IAAI;GACF,+BACE,QAAQ,IACR,UACA,MACA,MAAM,OACN,SACA,QACF;EACF,SAAS,OAAO;GACd,OAAO,MAAM,sCAAsC,KAAK;EAC1D;CACF;CAEA,MAAM,kBAAkB,gCACtB,UACA,MACA,QAAQ,MACV;CAEA,IAAI,cAAqC,eAAe,GAAG;EACzD,AAAK,QAAQ,QAAQ,eAAe,CAAC,CAAC,MACnC,SAAS;GACR,cAAc,IAAI;EACpB,IACC,UAAU;GACT,OAAO,MAAM,sCAAsC,KAAK;EAC1D,CACF;EACA;CACF;CAEA,cAAc,eAAe;AAC/B;AAEA,SAAgB,uBAA6B;CAC3C,IAAI,OAAO,WAAW,eAAe,uBACnC;CAGF,wBAAwB;CACxB,OAAO,iBAAiB,YAAY,cAAc;AACpD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-registry.d.ts","names":[],"sources":["../../src/router/navigation-registry.ts"],"mappings":";;;;KASY,mBAAA;EACV,QAAA,GAAW,aAAA;EACX,MAAA,YAAkB,KAAA;EAClB,IAAA,GAAO,gBAAA;AAAA;AAAA,KAGG,eAAA,GAAkB,mBAAA;EAC5B,QAAA,EAAU,iBAAiB;EAC3B,QAAA;EACA,IAAA;AAAA;AAAA,KAGG,sBAAA;EACH,mBAAmB;AAAA;AAAA,iBAUL,+BAAA,CACd,IAA4B,EAAtB,sBAAsB;AAAA,iBAKd,kBAAA;AAAA,iBAIA,cAAA;AAAA,iBAIA,uBAAA,CAAwB,QAAA,UAAkB,IAAY;AAAA,iBAKtD,aAAA;AAAA,iBAQA,cAAA,CAAe,IAAA,WAAe,GAAG;AAAA,iBAiBjC,yBAAA,IAA6B,eAAe;AAAA,iBAI5C,iBAAA;AAAA,iBAIA,2BAAA,CACd,GAAA,EAAK,eAAe,EACpB,QAAA,UACA,IAAA;AAAA,iBA+Bc,2BAAA;AAAA,iBAcA,mBAAA,CACd,QAAA,EAAU,iBAAA,EACV,IAAA,UACA,MAAA,GAAQ,mBAAwB;AAAA,iBA0BlB,qBAAA,CAAsB,QAA2B,EAAjB,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-registry.js","names":[],"sources":["../../src/router/navigation-registry.ts"],"sourcesContent":["import type { Route, RouteAuthOptions, RouteManifest } from '../common/router';\nimport { isProductionEnvironment } from '../common/env';\nimport type { ComponentInstance } from '../runtime';\nimport {\n computeRouteActivityMatches,\n lockRouteRegistration,\n syncCurrentRouteSnapshot,\n} from './route';\n\nexport type AppNavigationSource = {\n manifest?: RouteManifest;\n routes?: readonly Route[];\n auth?: RouteAuthOptions;\n};\n\nexport type AppRegistration = AppNavigationSource & {\n instance: ComponentInstance;\n pathname: string;\n href: string;\n};\n\ntype NavigationRegistryHost = {\n cancelRouteRequests(): void;\n};\n\nlet currentInstance: ComponentInstance | null = null;\nlet currentPathname = '/';\nlet currentHref = '/';\nlet navigationRegistryHost: NavigationRegistryHost | null = null;\n\nconst registeredApps: AppRegistration[] = [];\n\nexport function configureNavigationRegistryHost(\n host: NavigationRegistryHost\n): void {\n navigationRegistryHost = host;\n}\n\nexport function getCurrentPathname(): string {\n return currentPathname;\n}\n\nexport function getCurrentHref(): string {\n return currentHref;\n}\n\nexport function setCurrentRouteLocation(pathname: string, href: string): void {\n currentPathname = pathname;\n currentHref = href;\n}\n\nexport function getWindowHref(): string {\n if (typeof window === 'undefined') {\n return currentHref;\n }\n\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nexport function parseTargetUrl(path: string): URL {\n const pathname = window.location.pathname || '/';\n const search = window.location.search || '';\n const hash = window.location.hash || '';\n const href =\n typeof window.location.href === 'string' ? window.location.href : '';\n const base =\n href &&\n href !== 'about:blank' &&\n !href.startsWith('about:') &&\n !href.startsWith('data:')\n ? href\n : `http://localhost${pathname}${search}${hash}`;\n\n return new URL(path, base);\n}\n\nexport function getRegisteredAppsSnapshot(): AppRegistration[] {\n return [...registeredApps];\n}\n\nexport function hasRegisteredApps(): boolean {\n return registeredApps.length > 0;\n}\n\nexport function syncAppRegistrationLocation(\n app: AppRegistration,\n pathname: string,\n href: string\n): void {\n app.pathname = pathname;\n app.href = href;\n}\n\nfunction collectRouteActivityMatches(\n pathname: string,\n apps: readonly AppRegistration[] = registeredApps\n) {\n const matches: ReturnType<typeof computeRouteActivityMatches> = [];\n const seenPaths = new Set<string>();\n\n for (const app of apps) {\n const appMatches = computeRouteActivityMatches(pathname, {\n manifest: app.manifest,\n routes: app.routes,\n });\n\n for (const match of appMatches) {\n if (seenPaths.has(match.path)) {\n continue;\n }\n seenPaths.add(match.path);\n matches.push(match);\n }\n }\n\n return matches;\n}\n\nexport function syncRegisteredRouteSnapshot(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const pathname = window.location.pathname || '/';\n syncCurrentRouteSnapshot(\n pathname,\n window.location.search || '',\n window.location.hash || '',\n collectRouteActivityMatches(pathname)\n );\n}\n\nexport function registerAppInstance(\n instance: ComponentInstance,\n path: string,\n source: AppNavigationSource = {}\n): void {\n const existingIndex = registeredApps.findIndex(\n (app) => app.instance === instance\n );\n const registration: AppRegistration = {\n instance,\n pathname: path,\n href: getWindowHref(),\n ...source,\n };\n if (existingIndex >= 0) {\n registeredApps[existingIndex] = registration;\n } else {\n registeredApps.push(registration);\n }\n\n currentInstance = instance;\n currentPathname = path;\n currentHref = getWindowHref();\n syncRegisteredRouteSnapshot();\n if (isProductionEnvironment()) {\n lockRouteRegistration();\n }\n}\n\nexport function unregisterAppInstance(instance: ComponentInstance): void {\n const existingIndex = registeredApps.findIndex(\n (app) => app.instance === instance\n );\n if (existingIndex >= 0) {\n registeredApps.splice(existingIndex, 1);\n }\n syncRegisteredRouteSnapshot();\n\n if (currentInstance !== instance) {\n return;\n }\n\n const nextApp =\n registeredApps.length > 0\n ? registeredApps[registeredApps.length - 1]!\n : null;\n currentInstance = nextApp?.instance ?? null;\n if (nextApp) {\n currentPathname = nextApp.pathname;\n currentHref = nextApp.href;\n syncRegisteredRouteSnapshot();\n return;\n }\n\n navigationRegistryHost?.cancelRouteRequests();\n currentPathname = '/';\n currentHref = '/';\n if (typeof window === 'undefined') {\n syncCurrentRouteSnapshot('/', '', '', []);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-scroll.d.ts","names":[],"sources":["../../src/router/navigation-scroll.ts"],"mappings":";KAAY,wBAAA;AAAA,KACA,qBAAA;AAAA,KAEA,wBAAA;EACV,UAAA,GAAa,wBAAA;EACb,OAAA,GAAU,qBAAqB;AAAA;AAAA,iBAkGjB,kBAAA,CAAmB,IAAY;AAAA,iBAkB/B,qBAAA,CACd,QAAmC,GAAxB,wBAAwB;AAAA,iBAUrB,kBAAA,CACd,IAAA,UACA,KAAA,EAAO,aAAa;AAAA,iBA6BN,0BAAA,CACd,OAA4C,aAAxB,wBAAwB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-scroll.js","names":[],"sources":["../../src/router/navigation-scroll.ts"],"sourcesContent":["export type NavigationScrollBehavior = 'top' | 'preserve';\nexport type HistoryScrollBehavior = 'restore' | 'top' | 'preserve';\n\nexport type ScrollRestorationOptions = {\n navigation?: NavigationScrollBehavior;\n history?: HistoryScrollBehavior;\n};\n\ntype NormalizedScrollRestorationOptions = {\n enabled: boolean;\n navigation: NavigationScrollBehavior;\n history: HistoryScrollBehavior;\n};\n\nconst DEFAULT_SCROLL_RESTORATION: NormalizedScrollRestorationOptions = {\n enabled: true,\n navigation: 'top',\n history: 'restore',\n};\n\nlet scrollRestorationOptions: NormalizedScrollRestorationOptions = {\n ...DEFAULT_SCROLL_RESTORATION,\n};\n\nconst scrollPositions = new Map<string, { x: number; y: number }>();\n\nfunction getWindowHref(): string {\n if (typeof window === 'undefined') {\n return '/';\n }\n\n return `${window.location.pathname}${window.location.search}${window.location.hash}`;\n}\n\nfunction normalizeScrollRestorationOptions(\n options?: boolean | ScrollRestorationOptions\n): NormalizedScrollRestorationOptions {\n if (options === false) {\n return {\n enabled: false,\n navigation: DEFAULT_SCROLL_RESTORATION.navigation,\n history: DEFAULT_SCROLL_RESTORATION.history,\n };\n }\n\n if (options === true || options === undefined) {\n return { ...DEFAULT_SCROLL_RESTORATION };\n }\n\n return {\n enabled: true,\n navigation: options.navigation ?? DEFAULT_SCROLL_RESTORATION.navigation,\n history: options.history ?? DEFAULT_SCROLL_RESTORATION.history,\n };\n}\n\nfunction readScrollPosition(): { x: number; y: number } {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 };\n }\n\n const x =\n typeof window.scrollX === 'number'\n ? window.scrollX\n : typeof window.pageXOffset === 'number'\n ? window.pageXOffset\n : 0;\n const y =\n typeof window.scrollY === 'number'\n ? window.scrollY\n : typeof window.pageYOffset === 'number'\n ? window.pageYOffset\n : 0;\n\n return { x, y };\n}\n\nfunction writeHistoryScrollPosition(\n href: string,\n position: { x: number; y: number }\n): void {\n if (typeof window === 'undefined' || getWindowHref() !== href) {\n return;\n }\n if (typeof window.history?.replaceState !== 'function') {\n return;\n }\n const state =\n window.history.state && typeof window.history.state === 'object'\n ? window.history.state\n : {};\n\n window.history.replaceState(\n {\n ...state,\n path: href,\n scroll: position,\n },\n '',\n href\n );\n}\n\nexport function saveScrollPosition(href: string): void {\n if (!scrollRestorationOptions.enabled || typeof window === 'undefined') {\n return;\n }\n\n const position = readScrollPosition();\n scrollPositions.set(href, position);\n writeHistoryScrollPosition(href, position);\n}\n\nfunction scrollToPosition(position: { x: number; y: number }): void {\n if (typeof window === 'undefined' || typeof window.scrollTo !== 'function') {\n return;\n }\n\n window.scrollTo(position.x, position.y);\n}\n\nexport function applyNavigationScroll(\n behavior?: NavigationScrollBehavior\n): void {\n const nextBehavior = behavior ?? scrollRestorationOptions.navigation;\n if (!scrollRestorationOptions.enabled || nextBehavior === 'preserve') {\n return;\n }\n\n scrollToPosition({ x: 0, y: 0 });\n}\n\nexport function applyHistoryScroll(\n href: string,\n state: PopStateEvent['state']\n): void {\n if (!scrollRestorationOptions.enabled) {\n return;\n }\n\n if (scrollRestorationOptions.history === 'preserve') {\n return;\n }\n\n if (scrollRestorationOptions.history === 'top') {\n scrollToPosition({ x: 0, y: 0 });\n return;\n }\n\n const fromState =\n state && typeof state === 'object' && 'scroll' in state\n ? (state.scroll as { x?: unknown; y?: unknown })\n : undefined;\n const saved =\n fromState &&\n typeof fromState.x === 'number' &&\n typeof fromState.y === 'number'\n ? { x: fromState.x, y: fromState.y }\n : scrollPositions.get(href);\n\n scrollToPosition(saved ?? { x: 0, y: 0 });\n}\n\nexport function configureScrollRestoration(\n options?: boolean | ScrollRestorationOptions\n): void {\n scrollRestorationOptions = normalizeScrollRestorationOptions(options);\n\n if (typeof window === 'undefined') {\n return;\n }\n\n if ('scrollRestoration' in window.history) {\n try {\n window.history.scrollRestoration = scrollRestorationOptions.enabled\n ? 'manual'\n : 'auto';\n } catch {\n // Ignore environments that expose but do not allow setting scrollRestoration.\n }\n }\n}\n"],"mappings":";AAcA,MAAM,6BAAiE;CACrE,SAAS;CACT,YAAY;CACZ,SAAS;AACX;AAEA,IAAI,2BAA+D,EACjE,GAAG,2BACL;AAEA,MAAM,kCAAkB,IAAI,IAAsC;AAElE,SAAS,gBAAwB;CAC/B,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,OAAO,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;AAChF;AAEA,SAAS,kCACP,SACoC;CACpC,IAAI,YAAY,OACd,OAAO;EACL,SAAS;EACT,YAAY,2BAA2B;EACvC,SAAS,2BAA2B;CACtC;CAGF,IAAI,YAAY,QAAQ,YAAY,QAClC,OAAO,EAAE,GAAG,2BAA2B;CAGzC,OAAO;EACL,SAAS;EACT,YAAY,QAAQ,cAAc,2BAA2B;EAC7D,SAAS,QAAQ,WAAW,2BAA2B;CACzD;AACF;AAEA,SAAS,qBAA+C;CACtD,IAAI,OAAO,WAAW,aACpB,OAAO;EAAE,GAAG;EAAG,GAAG;CAAE;CAgBtB,OAAO;EAAE,GAZP,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,OAAO,OAAO,gBAAgB,WAC5B,OAAO,cACP;EAQI,GANV,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,OAAO,OAAO,gBAAgB,WAC5B,OAAO,cACP;CAEM;AAChB;AAEA,SAAS,2BACP,MACA,UACM;CACN,IAAI,OAAO,WAAW,eAAe,cAAc,MAAM,MACvD;CAEF,IAAI,OAAO,OAAO,SAAS,iBAAiB,YAC1C;CAEF,MAAM,QACJ,OAAO,QAAQ,SAAS,OAAO,OAAO,QAAQ,UAAU,WACpD,OAAO,QAAQ,QACf,CAAC;CAEP,OAAO,QAAQ,aACb;EACE,GAAG;EACH,MAAM;EACN,QAAQ;CACV,GACA,IACA,IACF;AACF;AAEA,SAAgB,mBAAmB,MAAoB;CACrD,IAAI,CAAC,yBAAyB,WAAW,OAAO,WAAW,aACzD;CAGF,MAAM,WAAW,mBAAmB;CACpC,gBAAgB,IAAI,MAAM,QAAQ;CAClC,2BAA2B,MAAM,QAAQ;AAC3C;AAEA,SAAS,iBAAiB,UAA0C;CAClE,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa,YAC9D;CAGF,OAAO,SAAS,SAAS,GAAG,SAAS,CAAC;AACxC;AAEA,SAAgB,sBACd,UACM;CACN,MAAM,eAAe,YAAY,yBAAyB;CAC1D,IAAI,CAAC,yBAAyB,WAAW,iBAAiB,YACxD;CAGF,iBAAiB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;AACjC;AAEA,SAAgB,mBACd,MACA,OACM;CACN,IAAI,CAAC,yBAAyB,SAC5B;CAGF,IAAI,yBAAyB,YAAY,YACvC;CAGF,IAAI,yBAAyB,YAAY,OAAO;EAC9C,iBAAiB;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC;EAC/B;CACF;CAEA,MAAM,YACJ,SAAS,OAAO,UAAU,YAAY,YAAY,QAC7C,MAAM,SACP;CAQN,kBANE,aACA,OAAO,UAAU,MAAM,YACvB,OAAO,UAAU,MAAM,WACnB;EAAE,GAAG,UAAU;EAAG,GAAG,UAAU;CAAE,IACjC,gBAAgB,IAAI,IAAI,MAEJ;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;AAC1C;AAEA,SAAgB,2BACd,SACM;CACN,2BAA2B,kCAAkC,OAAO;CAEpE,IAAI,OAAO,WAAW,aACpB;CAGF,IAAI,uBAAuB,OAAO,SAChC,IAAI;EACF,OAAO,QAAQ,oBAAoB,yBAAyB,UACxD,WACA;CACN,QAAQ,CAER;AAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-targets.d.ts","names":[],"sources":["../../src/router/navigation-targets.ts"],"mappings":";;;;;KAkCY,eAAA;EACV,OAAA;EACA,OAAA;EACA,MAAA,GAAS,wBAAwB;AAAA;AAAA,KAGvB,uBAAA;EACV,SAAA;EACA,OAAA,EAAS,GAAG;AAAA;AAAA,KAGF,mBAAA;EACV,GAAA,EAAK,eAAA;EACL,QAAA,EAAU,kBAAkB;AAAA;AAAA,iBAQd,iBAAA;EAAuB,EAAA;EAAY,MAAA,EAAQ,WAAW;AAAA;AAAA,iBAWtD,mBAAA,CAAoB,SAAiB;AAAA,iBAIrC,mBAAA;AAAA,iBAYA,sBAAA,CACd,OAA4B;AAAA,iBA+Kd,+BAAA,CACd,QAAA,UACA,IAAA,UACA,MAAA,EAAQ,WAAA,GACP,mBAAA,KAAwB,OAAA,CAAQ,mBAAA;AAAA,iBAgDnB,sBAAA,CACd,IAAA,UACA,OAAA,EAAS,eAAA,EACT,aAAA,EAAe,uBAAA,EACf,QAAA,UACA,IAAA,UACA,OAAA,EAAS,mBAAA,IACT,yBAAA,GACE,IAAA,UACA,OAAA,EAAS,eAAA,EACT,aAAA,EAAe,uBAAA;AAAA,iBA6FH,8BAAA,CACd,SAAA,UACA,QAAA,UACA,IAAA,UACA,KAAA,WACA,OAAA,EAAS,mBAAA,IACT,QAAA,GAAW,IAAA,UAAc,OAAA,EAAS,eAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-targets.js","names":[],"sources":["../../src/router/navigation-targets.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport { isPromiseLike } from '../common/promise';\nimport type { RouteRenderResult, RouteRequestResult } from '../common/router';\nimport { cleanupInstancesUnder } from '../renderer';\nimport { DefaultPortal, clearDefaultPortalForInstance } from '../runtime';\nimport { ELEMENT_TYPE, Fragment } from '../jsx';\nimport { logger } from '../common/logger';\nimport {\n cleanupComponent,\n mountComponent,\n type ComponentInstance,\n} from '../runtime';\nimport {\n applyHistoryScroll,\n applyNavigationScroll,\n saveScrollPosition,\n type NavigationScrollBehavior,\n} from './navigation-scroll';\nimport {\n getCurrentHref,\n getCurrentPathname,\n getRegisteredAppsSnapshot,\n parseTargetUrl,\n setCurrentRouteLocation,\n syncAppRegistrationLocation,\n syncRegisteredRouteSnapshot,\n type AppRegistration,\n} from './navigation-registry';\nimport {\n resolveRouteFromRoutes,\n resolveRouteRequest,\n type ResolvedRoute,\n} from './route';\n\nexport type NavigateOptions = {\n history?: 'push' | 'replace';\n replace?: boolean;\n scroll?: NavigationScrollBehavior;\n};\n\nexport type NavigationRedirectState = {\n redirects: number;\n visited: Set<string>;\n};\n\nexport type AppNavigationTarget = {\n app: AppRegistration;\n resolved: RouteRequestResult;\n};\n\nconst MAX_NAVIGATION_REDIRECTS = 20;\n\nlet activeRouteRequestId = 0;\nlet activeRouteRequestController: AbortController | null = null;\n\nexport function beginRouteRequest(): { id: number; signal: AbortSignal } {\n activeRouteRequestId += 1;\n activeRouteRequestController?.abort();\n activeRouteRequestController = new AbortController();\n\n return {\n id: activeRouteRequestId,\n signal: activeRouteRequestController.signal,\n };\n}\n\nexport function isStaleRouteRequest(requestId: number): boolean {\n return requestId !== activeRouteRequestId;\n}\n\nexport function cancelRouteRequests(): void {\n activeRouteRequestId += 1;\n activeRouteRequestController?.abort();\n activeRouteRequestController = null;\n}\n\nfunction isRenderResult(\n result: RouteRequestResult\n): result is RouteRenderResult {\n return result !== null && result.kind === 'render';\n}\n\nexport function getRedirectHistoryMode(\n replace: boolean | undefined\n): 'push' | 'replace' {\n return replace === false ? 'push' : 'replace';\n}\n\nfunction getNavigationHistoryMode(\n options: NavigateOptions\n): 'push' | 'replace' {\n if (options.history) {\n return options.history;\n }\n\n return options.replace ? 'replace' : 'push';\n}\n\nfunction createDeniedResolvedRoute(status: number): ResolvedRoute {\n return {\n handler: () => ({\n type: 'div',\n props: {\n 'data-route-denied': String(status),\n },\n children: [String(status)],\n }),\n params: {},\n };\n}\n\nfunction bindResolvedRouteHandler(\n resolved: ResolvedRoute\n): ComponentInstance['fn'] {\n return () =>\n resolved.handler(resolved.params) as ReturnType<ComponentInstance['fn']>;\n}\n\nfunction wrapRootRouteHandler(\n componentFn: ComponentInstance['fn']\n): ComponentInstance['fn'] {\n const wrappedFn: ComponentInstance['fn'] = (props, ctx) => {\n const out = componentFn(props, ctx);\n if (isPromiseLike(out)) {\n throw new Error(\n 'Async components are not supported. Components must return synchronously.'\n );\n }\n const portalVNode = {\n $$typeof: ELEMENT_TYPE,\n type: DefaultPortal,\n props: { __askrAutoDefaultPortal: true },\n key: '__default_portal',\n } as unknown;\n\n return {\n $$typeof: ELEMENT_TYPE,\n type: Fragment,\n props: {\n children:\n out === undefined || out === null\n ? [portalVNode]\n : [out, portalVNode],\n },\n } as ReturnType<ComponentInstance['fn']>;\n };\n\n Object.defineProperty(wrappedFn, 'name', {\n value: componentFn.name || 'Component',\n });\n\n return wrappedFn;\n}\n\nfunction cleanupRouteOwnership(instance: ComponentInstance): void {\n const cleanupErrors: unknown[] = [];\n const children = instance.target\n ? Array.from(instance.target.childNodes)\n : [];\n\n for (const child of children) {\n try {\n cleanupInstancesUnder(child, { strict: instance.cleanupStrict });\n } catch (error) {\n cleanupErrors.push(error);\n }\n }\n\n try {\n cleanupComponent(instance);\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(cleanupErrors, 'Route cleanup failed');\n }\n}\n\nfunction remountResolvedRoute(\n instance: ComponentInstance,\n resolved: ResolvedRoute,\n pathname: string,\n href: string\n): boolean {\n clearDefaultPortalForInstance(instance);\n cleanupRouteOwnership(instance);\n\n instance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));\n instance.props = {};\n\n instance.stateValues = [];\n instance.expectedStateIndices = [];\n instance.firstRenderComplete = false;\n instance.stateIndexCheck = -1;\n instance.evaluationGeneration++;\n instance.notifyUpdate = null;\n instance.mountOperations = [];\n instance.commitOperations = [];\n instance.lifecycleSlots = [];\n instance.cleanupFns = [];\n instance._placeholder = undefined;\n instance.hasPendingUpdate = false;\n instance._currentRenderToken = undefined;\n instance.lastRenderToken = 0;\n instance._pendingReadSources = undefined;\n instance._lastReadSources = undefined;\n\n instance.abortController = null;\n\n mountComponent(instance);\n setCurrentRouteLocation(pathname, href);\n return true;\n}\n\nfunction rerenderResolvedRoute(\n instance: ComponentInstance,\n pathname: string,\n href: string\n): boolean {\n setCurrentRouteLocation(pathname, href);\n instance._enqueueRun?.();\n return true;\n}\n\nfunction resolveAppRouteRequest(\n app: AppRegistration,\n pathname: string,\n href: string,\n signal: AbortSignal\n): RouteRequestResult | Promise<RouteRequestResult> {\n if (app.manifest) {\n return resolveRouteRequest(href, {\n manifest: app.manifest,\n auth: app.auth,\n signal,\n });\n }\n\n if (app.routes) {\n const resolved = resolveRouteFromRoutes(pathname, app.routes);\n if (!resolved) {\n return null;\n }\n\n return {\n kind: 'render',\n handler: resolved.handler,\n params: resolved.params,\n };\n }\n\n return resolveRouteRequest(href, {\n auth: app.auth,\n signal,\n });\n}\n\nexport function resolveNavigationTargetsForApps(\n pathname: string,\n href: string,\n signal: AbortSignal\n): AppNavigationTarget[] | Promise<AppNavigationTarget[]> {\n const apps = getRegisteredAppsSnapshot();\n\n if (apps.length === 1) {\n const app = apps[0]!;\n const resolved = resolveAppRouteRequest(app, pathname, href, signal);\n if (isPromiseLike<RouteRequestResult>(resolved)) {\n return Promise.resolve(resolved).then((next) => [\n {\n app,\n resolved: next,\n },\n ]);\n }\n\n return [\n {\n app,\n resolved,\n },\n ];\n }\n\n const syncTargets: AppNavigationTarget[] = [];\n const pendingTargets: Array<Promise<AppNavigationTarget>> = [];\n\n for (const app of apps) {\n const resolved = resolveAppRouteRequest(app, pathname, href, signal);\n if (isPromiseLike<RouteRequestResult>(resolved)) {\n pendingTargets.push(\n Promise.resolve(resolved).then((next) => ({ app, resolved: next }))\n );\n continue;\n }\n\n syncTargets.push({ app, resolved });\n }\n\n if (pendingTargets.length === 0) {\n return syncTargets;\n }\n\n return Promise.all([\n ...syncTargets.map((target) => Promise.resolve(target)),\n ...pendingTargets,\n ]);\n}\n\nexport function applyNavigationTargets(\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState,\n pathname: string,\n href: string,\n targets: AppNavigationTarget[],\n navigateWithRedirectState: (\n path: string,\n options: NavigateOptions,\n redirectState: NavigationRedirectState\n ) => void\n): void {\n const previousPathname = getCurrentPathname();\n\n for (const target of targets) {\n const resolved = target.resolved;\n if (!resolved || resolved.kind !== 'redirect') {\n continue;\n }\n\n const redirectTarget = parseTargetUrl(resolved.to);\n const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;\n if (redirectHref === href) {\n if (isDevelopmentEnvironment()) {\n logger.warn(\n `Navigation guard redirected to the same path: ${redirectHref}`\n );\n }\n return;\n }\n\n if (redirectState.visited.has(redirectHref)) {\n throw new Error(\n `[Askr] Navigation redirect cycle detected at ${redirectHref}.`\n );\n }\n if (redirectState.redirects >= MAX_NAVIGATION_REDIRECTS) {\n throw new Error(\n `[Askr] Navigation redirect limit exceeded (${MAX_NAVIGATION_REDIRECTS}).`\n );\n }\n\n redirectState.visited.add(redirectHref);\n redirectState.redirects++;\n navigateWithRedirectState(\n redirectHref,\n {\n history: getRedirectHistoryMode(resolved.replace),\n },\n redirectState\n );\n return;\n }\n\n const matchedTargets = targets.filter((target) => target.resolved !== null);\n if (matchedTargets.length === 0) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${path}`);\n }\n return;\n }\n\n saveScrollPosition(getCurrentHref());\n\n const historyMethod =\n getNavigationHistoryMode(options) === 'replace'\n ? 'replaceState'\n : 'pushState';\n window.history[historyMethod]({ path: href }, '', href);\n syncRegisteredRouteSnapshot();\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (resolved.kind === 'redirect') {\n continue;\n }\n\n if (pathname === target.app.pathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(target.app.instance, pathname, href);\n syncAppRegistrationLocation(target.app, pathname, href);\n continue;\n }\n\n remountResolvedRoute(\n target.app.instance,\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n },\n pathname,\n href\n );\n syncAppRegistrationLocation(target.app, pathname, href);\n }\n\n if (pathname !== previousPathname) {\n applyNavigationScroll(options.scroll);\n }\n}\n\nexport function applyPopStateNavigationTargets(\n requestId: number,\n pathname: string,\n href: string,\n state: unknown,\n targets: AppNavigationTarget[],\n navigate: (path: string, options: NavigateOptions) => void\n): void {\n if (isStaleRouteRequest(requestId)) {\n return;\n }\n\n const matchedTargets = targets.filter((target) => target.resolved !== null);\n if (matchedTargets.length === 0) {\n if (isDevelopmentEnvironment()) {\n logger.warn(`No route found for path: ${pathname}`);\n }\n return;\n }\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (resolved.kind !== 'redirect') {\n continue;\n }\n\n navigate(resolved.to, {\n history: getRedirectHistoryMode(resolved.replace),\n });\n return;\n }\n\n syncRegisteredRouteSnapshot();\n\n for (const target of matchedTargets) {\n const resolved = target.resolved!;\n if (pathname === target.app.pathname && isRenderResult(resolved)) {\n rerenderResolvedRoute(target.app.instance, pathname, href);\n syncAppRegistrationLocation(target.app, pathname, href);\n continue;\n }\n\n if (resolved.kind === 'redirect') {\n continue;\n }\n\n remountResolvedRoute(\n target.app.instance,\n resolved.kind === 'deny'\n ? createDeniedResolvedRoute(resolved.status)\n : {\n handler: resolved.handler,\n params: resolved.params,\n },\n pathname,\n href\n );\n syncAppRegistrationLocation(target.app, pathname, href);\n }\n\n applyHistoryScroll(href, state);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","names":[],"sources":["../../src/router/policy.ts"],"mappings":";;;KAoBY,sBAAA;AAAA,UAEK,0BAAA;EACf,IAAA,EAAM,sBAAsB;EAC5B,KAAA;AAAA;AAAA,iBAWc,KAAA,IAAS,mBAAmB;AAAA,iBAI5B,QAAA,CACd,EAAA,UACA,IAAA;EACE,MAAA,GAAS,oBAAA;EACT,OAAA;AAAA,IAED,sBAAsB;AAAA,iBAST,IAAA,CAAK,MAAA,EAAQ,gBAAA,GAAmB,kBAAkB;AAAA,iBAIlD,YAAA,IAAgB,kBAAkB;AAAA,iBAIlC,SAAA,IAAa,kBAAkB;AAAA,iBAI/B,QAAA,IAAY,kBAAkB;AAAA,iBAI9B,uBAAA,CACd,MAAA,EAAQ,cAAA,GACP,cAAc;AAAA,iBAID,oBAAA,CACd,OAAA,EAAS,YAAA,EACT,IAAA,EAAM,gBAAA,eACL,YAAA;AAAA,iBA0Ca,sBAAA,CACd,MAAA,EAAQ,WAAA,GACP,0BAA0B;AAAA,iBAoGb,WAAA,IAAe,WAAW;AAAA,iBAa1B,YAAA,IAAgB,WAAW;AAAA,iBAa3B,WAAA,CAAY,IAAA,WAAe,WAAW;AAAA,iBAwBtC,iBAAA,CAAkB,UAAA,WAAqB,WAAW;AAAA,iBAwB5C,mBAAA,CACpB,MAAA,EAAQ,WAAA,EACR,OAAA,EAAS,YAAA,GACR,OAAA,CAAQ,cAAA"}
|