@askrjs/askr 0.0.48 → 0.0.49
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/benchmark.js +6 -6
- package/dist/benchmark.js.map +1 -1
- package/dist/boot/hydration.js +140 -0
- package/dist/boot/hydration.js.map +1 -0
- package/dist/boot/index.d.ts +3 -56
- package/dist/boot/index.d.ts.map +1 -1
- package/dist/boot/index.js +62 -410
- package/dist/boot/index.js.map +1 -1
- package/dist/boot/root-lifecycle.d.ts +15 -0
- package/dist/boot/root-lifecycle.d.ts.map +1 -0
- package/dist/boot/root-lifecycle.js +205 -0
- package/dist/boot/root-lifecycle.js.map +1 -0
- package/dist/boot/route-startup.js +45 -0
- package/dist/boot/route-startup.js.map +1 -0
- package/dist/boot/types.d.ts +62 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/common/component.d.ts +3 -1
- package/dist/common/component.d.ts.map +1 -1
- package/dist/common/jsx.d.ts +1 -1
- package/dist/common/jsx.d.ts.map +1 -1
- package/dist/common/jsx.js.map +1 -1
- package/dist/common/props.d.ts +1 -1
- package/dist/common/render-context.js +55 -0
- package/dist/common/render-context.js.map +1 -0
- package/dist/common/router.d.ts +5 -1
- package/dist/common/router.d.ts.map +1 -1
- package/dist/common/ssr.d.ts +1 -1
- package/dist/common/ssr.js.map +1 -1
- package/dist/common/vnode.d.ts +5 -4
- package/dist/common/vnode.d.ts.map +1 -1
- package/dist/common/vnode.js.map +1 -1
- package/dist/components/error-boundary.d.ts +1 -1
- package/dist/components/error-boundary.js +2 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/control/for.js +2 -1
- package/dist/control/for.js.map +1 -1
- package/dist/data/data-runtime.d.ts +28 -0
- package/dist/data/data-runtime.d.ts.map +1 -0
- package/dist/data/data-runtime.js +114 -0
- package/dist/data/data-runtime.js.map +1 -0
- package/dist/data/index.d.ts +6 -142
- package/dist/data/index.js +5 -539
- package/dist/data/invalidation.d.ts +9 -0
- package/dist/data/invalidation.d.ts.map +1 -0
- package/dist/data/invalidation.js +27 -0
- package/dist/data/invalidation.js.map +1 -0
- package/dist/data/mutation-cell.d.ts +28 -0
- package/dist/data/mutation-cell.d.ts.map +1 -0
- package/dist/data/mutation-cell.js +132 -0
- package/dist/data/mutation-cell.js.map +1 -0
- package/dist/data/query-cell.d.ts +46 -0
- package/dist/data/query-cell.d.ts.map +1 -0
- package/dist/data/query-cell.js +290 -0
- package/dist/data/query-cell.js.map +1 -0
- package/dist/data/query-key.js +42 -0
- package/dist/data/query-key.js.map +1 -0
- package/dist/data/shared.js +20 -0
- package/dist/data/shared.js.map +1 -0
- package/dist/data/types.d.ts +161 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/foundations/icon/icon.d.ts.map +1 -1
- package/dist/foundations/icon/icon.js.map +1 -1
- package/dist/foundations/structures/portal.d.ts +1 -1
- package/dist/foundations/structures/portal.d.ts.map +1 -1
- package/dist/foundations/structures/portal.js +2 -1
- package/dist/foundations/structures/portal.js.map +1 -1
- package/dist/fx/fx.d.ts +1 -1
- package/dist/fx/fx.js +5 -4
- package/dist/fx/fx.js.map +1 -1
- package/dist/fx/timing.d.ts.map +1 -1
- package/dist/fx/timing.js +10 -6
- package/dist/fx/timing.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx/index.d.ts +2 -1
- package/dist/jsx/index.js +3 -2
- package/dist/jsx/types.d.ts +2 -0
- package/dist/jsx/types.js +2 -1
- package/dist/jsx-runtime2.d.ts +2 -1
- package/dist/jsx-runtime2.js +3 -2
- package/dist/renderer/attributes.js +231 -0
- package/dist/renderer/attributes.js.map +1 -0
- package/dist/renderer/boundaries.js +266 -0
- package/dist/renderer/boundaries.js.map +1 -0
- package/dist/renderer/child-shape.js +85 -0
- package/dist/renderer/child-shape.js.map +1 -0
- package/dist/renderer/children.js +3 -2
- package/dist/renderer/children.js.map +1 -1
- package/dist/renderer/cleanup.js +2 -1
- package/dist/renderer/cleanup.js.map +1 -1
- package/dist/renderer/component-host-cleanup.js +68 -0
- package/dist/renderer/component-host-cleanup.js.map +1 -0
- package/dist/renderer/component-host-instances.js +65 -0
- package/dist/renderer/component-host-instances.js.map +1 -0
- package/dist/renderer/component-host.js +247 -0
- package/dist/renderer/component-host.js.map +1 -0
- package/dist/renderer/dom-host.js +13 -0
- package/dist/renderer/dom-host.js.map +1 -0
- package/dist/renderer/dom-internal.js +185 -0
- package/dist/renderer/dom-internal.js.map +1 -0
- package/dist/renderer/dom.js +9 -2356
- package/dist/renderer/element-children.js +279 -0
- package/dist/renderer/element-children.js.map +1 -0
- package/dist/renderer/env.js +2 -1
- package/dist/renderer/error-boundary-dom.js +29 -0
- package/dist/renderer/error-boundary-dom.js.map +1 -0
- package/dist/renderer/evaluate-dom-range.js +85 -0
- package/dist/renderer/evaluate-dom-range.js.map +1 -0
- package/dist/renderer/evaluate-reconcile.js +281 -0
- package/dist/renderer/evaluate-reconcile.js.map +1 -0
- package/dist/renderer/evaluate.js +13 -399
- package/dist/renderer/evaluate.js.map +1 -1
- package/dist/renderer/fastpath.js +6 -5
- package/dist/renderer/fastpath.js.map +1 -1
- package/dist/renderer/for-commit-dom-map.js +83 -0
- package/dist/renderer/for-commit-dom-map.js.map +1 -0
- package/dist/renderer/for-commit-removal.js +36 -0
- package/dist/renderer/for-commit-removal.js.map +1 -0
- package/dist/renderer/for-commit-reorder.js +89 -0
- package/dist/renderer/for-commit-reorder.js.map +1 -0
- package/dist/renderer/for-commit.js +6 -188
- package/dist/renderer/for-commit.js.map +1 -1
- package/dist/renderer/index.js +28 -16
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/keyed-children.js +32 -0
- package/dist/renderer/keyed-children.js.map +1 -0
- package/dist/renderer/keyed.js +2 -15
- package/dist/renderer/keyed.js.map +1 -1
- package/dist/renderer/namespaces.js +23 -0
- package/dist/renderer/namespaces.js.map +1 -0
- package/dist/renderer/prop-bindings.js +280 -0
- package/dist/renderer/prop-bindings.js.map +1 -0
- package/dist/renderer/reactive-child-dom.js +133 -0
- package/dist/renderer/reactive-child-dom.js.map +1 -0
- package/dist/renderer/reactive-child-sources.js +184 -0
- package/dist/renderer/reactive-child-sources.js.map +1 -0
- package/dist/renderer/reactive-children.js +294 -0
- package/dist/renderer/reactive-children.js.map +1 -0
- package/dist/renderer/reconcile-commit.js +38 -0
- package/dist/renderer/reconcile-commit.js.map +1 -0
- package/dist/renderer/reconcile-fastpaths.js +106 -0
- package/dist/renderer/reconcile-fastpaths.js.map +1 -0
- package/dist/renderer/reconcile-resolution.js +187 -0
- package/dist/renderer/reconcile-resolution.js.map +1 -0
- package/dist/renderer/reconcile.js +9 -371
- package/dist/renderer/reconcile.js.map +1 -1
- package/dist/renderer/retained-element-rollback.js +276 -0
- package/dist/renderer/retained-element-rollback.js.map +1 -0
- package/dist/renderer/stable-patch.js +82 -0
- package/dist/renderer/stable-patch.js.map +1 -0
- package/dist/renderer/static-reuse.js +96 -0
- package/dist/renderer/static-reuse.js.map +1 -0
- package/dist/renderer/types.js +2 -1
- package/dist/renderer/utils.js +4 -4
- package/dist/renderer/utils.js.map +1 -1
- package/dist/resources/index.d.ts +3 -2
- package/dist/resources/index.js +5 -2
- package/dist/router/access.js +36 -0
- package/dist/router/access.js.map +1 -0
- package/dist/router/activity.d.ts +10 -0
- package/dist/router/activity.d.ts.map +1 -0
- package/dist/router/activity.js +89 -0
- package/dist/router/activity.js.map +1 -0
- package/dist/router/authoring.d.ts +22 -0
- package/dist/router/authoring.d.ts.map +1 -0
- package/dist/router/authoring.js +198 -0
- package/dist/router/authoring.js.map +1 -0
- package/dist/router/index.d.ts +12 -4
- package/dist/router/index.js +10 -3
- package/dist/router/internal-types.d.ts +31 -0
- package/dist/router/internal-types.d.ts.map +1 -0
- package/dist/router/lazy.d.ts +19 -0
- package/dist/router/lazy.d.ts.map +1 -0
- package/dist/router/lazy.js +52 -0
- package/dist/router/lazy.js.map +1 -0
- package/dist/router/manifest.d.ts +10 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +49 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/navigate.d.ts +4 -51
- package/dist/router/navigate.d.ts.map +1 -1
- package/dist/router/navigate.js +16 -459
- package/dist/router/navigate.js.map +1 -1
- package/dist/router/navigation-registry.d.ts +32 -0
- package/dist/router/navigation-registry.d.ts.map +1 -0
- package/dist/router/navigation-registry.js +105 -0
- package/dist/router/navigation-registry.js.map +1 -0
- package/dist/router/navigation-scroll.d.ts +14 -0
- package/dist/router/navigation-scroll.d.ts.map +1 -0
- package/dist/router/navigation-scroll.js +93 -0
- package/dist/router/navigation-scroll.js.map +1 -0
- package/dist/router/navigation-targets.d.ts +31 -0
- package/dist/router/navigation-targets.d.ts.map +1 -0
- package/dist/router/navigation-targets.js +253 -0
- package/dist/router/navigation-targets.js.map +1 -0
- package/dist/router/policy.d.ts +7 -1
- package/dist/router/policy.d.ts.map +1 -1
- package/dist/router/policy.js +27 -9
- package/dist/router/policy.js.map +1 -1
- package/dist/router/rendering.d.ts +10 -0
- package/dist/router/rendering.d.ts.map +1 -0
- package/dist/router/rendering.js +45 -0
- package/dist/router/rendering.js.map +1 -0
- package/dist/router/resolution.d.ts +17 -0
- package/dist/router/resolution.d.ts.map +1 -0
- package/dist/router/resolution.js +253 -0
- package/dist/router/resolution.js.map +1 -0
- package/dist/router/route-query.d.ts +17 -0
- package/dist/router/route-query.d.ts.map +1 -0
- package/dist/router/route-query.js +47 -0
- package/dist/router/route-query.js.map +1 -0
- package/dist/router/route.d.ts +8 -149
- package/dist/router/route.js +8 -854
- package/dist/router/store.d.ts +50 -0
- package/dist/router/store.d.ts.map +1 -0
- package/dist/router/store.js +171 -0
- package/dist/router/store.js.map +1 -0
- package/dist/runtime/access.js +45 -0
- package/dist/runtime/access.js.map +1 -0
- package/dist/runtime/child-scope.d.ts +1 -1
- package/dist/runtime/child-scope.js +4 -1
- package/dist/runtime/child-scope.js.map +1 -1
- package/dist/runtime/component-cleanup.d.ts +16 -0
- package/dist/runtime/component-cleanup.d.ts.map +1 -0
- package/dist/runtime/component-cleanup.js +70 -0
- package/dist/runtime/component-cleanup.js.map +1 -0
- package/dist/runtime/component-commit.js +165 -0
- package/dist/runtime/component-commit.js.map +1 -0
- package/dist/runtime/component-contracts.js +5 -0
- package/dist/runtime/component-facade.d.ts +5 -0
- package/dist/runtime/component-facade.js +4 -0
- package/dist/runtime/component-internal.d.ts +100 -0
- package/dist/runtime/component-internal.d.ts.map +1 -0
- package/dist/runtime/component-internal.js +219 -0
- package/dist/runtime/component-internal.js.map +1 -0
- package/dist/runtime/component-lifecycle.d.ts +49 -0
- package/dist/runtime/component-lifecycle.d.ts.map +1 -0
- package/dist/runtime/component-lifecycle.js +176 -0
- package/dist/runtime/component-lifecycle.js.map +1 -0
- package/dist/runtime/component-scope.d.ts +55 -0
- package/dist/runtime/component-scope.d.ts.map +1 -0
- package/dist/runtime/component-scope.js +154 -0
- package/dist/runtime/component-scope.js.map +1 -0
- package/dist/runtime/component.d.ts +4 -152
- package/dist/runtime/component.js +4 -692
- package/dist/runtime/context.d.ts +1 -1
- package/dist/runtime/context.js +6 -4
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/control.d.ts +3 -3
- package/dist/runtime/control.js +2 -1
- package/dist/runtime/control.js.map +1 -1
- package/dist/runtime/derive.d.ts.map +1 -1
- package/dist/runtime/derive.js +6 -5
- package/dist/runtime/derive.js.map +1 -1
- package/dist/runtime/effect.d.ts +1 -1
- package/dist/runtime/effect.d.ts.map +1 -1
- package/dist/runtime/effect.js +2 -2
- package/dist/runtime/effect.js.map +1 -1
- package/dist/runtime/events.js +3 -3
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/fastlane.js +13 -27
- package/dist/runtime/fastlane.js.map +1 -1
- package/dist/runtime/for-bench.d.ts +1 -1
- package/dist/runtime/for-bench.js +1 -4
- package/dist/runtime/for-bench.js.map +1 -1
- package/dist/runtime/for-internal.d.ts +43 -0
- package/dist/runtime/for-internal.d.ts.map +1 -0
- package/dist/runtime/for-internal.js +98 -0
- package/dist/runtime/for-internal.js.map +1 -0
- package/dist/runtime/for-reconcile.d.ts +8 -0
- package/dist/runtime/for-reconcile.d.ts.map +1 -0
- package/dist/runtime/for-reconcile.js +389 -0
- package/dist/runtime/for-reconcile.js.map +1 -0
- package/dist/runtime/for-scopes.d.ts +26 -0
- package/dist/runtime/for-scopes.d.ts.map +1 -0
- package/dist/runtime/for-scopes.js +160 -0
- package/dist/runtime/for-scopes.js.map +1 -0
- package/dist/runtime/for-signals.d.ts +30 -0
- package/dist/runtime/for-signals.d.ts.map +1 -0
- package/dist/runtime/for-signals.js +139 -0
- package/dist/runtime/for-signals.js.map +1 -0
- package/dist/runtime/for.d.ts +4 -66
- package/dist/runtime/for.js +5 -773
- package/dist/runtime/lifecycle-operations.d.ts +31 -0
- package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
- package/dist/runtime/lifecycle-operations.js +195 -0
- package/dist/runtime/lifecycle-operations.js.map +1 -0
- package/dist/runtime/operations.d.ts +3 -40
- package/dist/runtime/operations.js +2 -357
- package/dist/runtime/readable.d.ts +2 -3
- package/dist/runtime/readable.d.ts.map +1 -1
- package/dist/runtime/readable.js +6 -5
- package/dist/runtime/readable.js.map +1 -1
- package/dist/runtime/resource-cell.js +2 -2
- package/dist/runtime/resource-cell.js.map +1 -1
- package/dist/runtime/resource-operation.d.ts +13 -0
- package/dist/runtime/resource-operation.d.ts.map +1 -0
- package/dist/runtime/resource-operation.js +170 -0
- package/dist/runtime/resource-operation.js.map +1 -0
- package/dist/runtime/runtime.d.ts +42 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +59 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +5 -1
- package/dist/runtime/scheduler.d.ts.map +1 -1
- package/dist/runtime/scheduler.js +17 -17
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/selector.js +4 -3
- package/dist/runtime/selector.js.map +1 -1
- package/dist/runtime/snapshot-source.d.ts +1 -1
- package/dist/runtime/snapshot-source.js +1 -1
- package/dist/runtime/state.js +2 -1
- package/dist/runtime/state.js.map +1 -1
- package/dist/ssg/batch-render.js +2 -1
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.d.ts +9 -3
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +12 -99
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/generation-plan.js +70 -0
- package/dist/ssg/generation-plan.js.map +1 -0
- package/dist/ssg/incremental-manifest.js +1 -1
- package/dist/ssg/static-routes.js +101 -0
- package/dist/ssg/static-routes.js.map +1 -0
- package/dist/ssg/types.d.ts +15 -7
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssr/boundaries.js +113 -0
- package/dist/ssr/boundaries.js.map +1 -0
- package/dist/ssr/component-runtime.js +111 -0
- package/dist/ssr/component-runtime.js.map +1 -0
- package/dist/ssr/context.d.ts +3 -1
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/context.js +9 -2
- package/dist/ssr/context.js.map +1 -1
- package/dist/ssr/errors.d.ts +2 -0
- package/dist/ssr/errors.js +11 -1
- package/dist/ssr/errors.js.map +1 -1
- package/dist/ssr/escape.js +3 -3
- package/dist/ssr/escape.js.map +1 -1
- package/dist/ssr/hydration-data.js +10 -0
- package/dist/ssr/hydration-data.js.map +1 -0
- package/dist/ssr/hydration-verify.d.ts +12 -0
- package/dist/ssr/hydration-verify.d.ts.map +1 -0
- package/dist/ssr/hydration-verify.js +144 -0
- package/dist/ssr/hydration-verify.js.map +1 -0
- package/dist/ssr/index-internal.d.ts +15 -0
- package/dist/ssr/index-internal.d.ts.map +1 -0
- package/dist/ssr/index-internal.js +19 -0
- package/dist/ssr/index-internal.js.map +1 -0
- package/dist/ssr/index.d.ts +5 -57
- package/dist/ssr/index.js +3 -738
- package/dist/ssr/render-keys.js +9 -32
- package/dist/ssr/render-keys.js.map +1 -1
- package/dist/ssr/render-resolved.d.ts +1 -1
- package/dist/ssr/render-resolved.d.ts.map +1 -1
- package/dist/ssr/render-resolved.js +4 -2
- package/dist/ssr/render-resolved.js.map +1 -1
- package/dist/ssr/render-sync.d.ts +21 -0
- package/dist/ssr/render-sync.d.ts.map +1 -0
- package/dist/ssr/render-sync.js +275 -0
- package/dist/ssr/render-sync.js.map +1 -0
- package/dist/ssr/route-policy-resolution.js +77 -0
- package/dist/ssr/route-policy-resolution.js.map +1 -0
- package/dist/ssr/route-render.d.ts +77 -0
- package/dist/ssr/route-render.d.ts.map +1 -0
- package/dist/ssr/route-render.js +119 -0
- package/dist/ssr/route-render.js.map +1 -0
- package/dist/ssr/sink.d.ts +26 -0
- package/dist/ssr/sink.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +1 -0
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/verify-hydration.js.map +1 -1
- package/dist/testing/index.d.ts +1 -2
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js.map +0 -1
- package/dist/renderer/dom.js.map +0 -1
- package/dist/router/route.d.ts.map +0 -1
- package/dist/router/route.js.map +0 -1
- package/dist/runtime/component.d.ts.map +0 -1
- package/dist/runtime/component.js.map +0 -1
- package/dist/runtime/for.d.ts.map +0 -1
- package/dist/runtime/for.js.map +0 -1
- package/dist/runtime/operations.d.ts.map +0 -1
- package/dist/runtime/operations.js.map +0 -1
- package/dist/runtime/ssr-bridge.js +0 -24
- package/dist/runtime/ssr-bridge.js.map +0 -1
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { isProductionEnvironment } from "../common/env.js";
|
|
2
|
+
import { lockRouteRegistration } from "./store.js";
|
|
3
|
+
import { computeRouteActivityMatches } from "./resolution.js";
|
|
4
|
+
import { syncCurrentRouteSnapshot } from "./activity.js";
|
|
5
|
+
import "./route.js";
|
|
6
|
+
//#region src/router/navigation-registry.ts
|
|
7
|
+
let currentInstance = null;
|
|
8
|
+
let currentPathname = "/";
|
|
9
|
+
let currentHref = "/";
|
|
10
|
+
let navigationRegistryHost = null;
|
|
11
|
+
const registeredApps = [];
|
|
12
|
+
function configureNavigationRegistryHost(host) {
|
|
13
|
+
navigationRegistryHost = host;
|
|
14
|
+
}
|
|
15
|
+
function getCurrentPathname() {
|
|
16
|
+
return currentPathname;
|
|
17
|
+
}
|
|
18
|
+
function getCurrentHref() {
|
|
19
|
+
return currentHref;
|
|
20
|
+
}
|
|
21
|
+
function setCurrentRouteLocation(pathname, href) {
|
|
22
|
+
currentPathname = pathname;
|
|
23
|
+
currentHref = href;
|
|
24
|
+
}
|
|
25
|
+
function getWindowHref() {
|
|
26
|
+
if (typeof window === "undefined") return currentHref;
|
|
27
|
+
return `${window.location.pathname}${window.location.search}${window.location.hash}`;
|
|
28
|
+
}
|
|
29
|
+
function parseTargetUrl(path) {
|
|
30
|
+
const pathname = window.location.pathname || "/";
|
|
31
|
+
const search = window.location.search || "";
|
|
32
|
+
const hash = window.location.hash || "";
|
|
33
|
+
const href = typeof window.location.href === "string" ? window.location.href : "";
|
|
34
|
+
const base = href && href !== "about:blank" && !href.startsWith("about:") && !href.startsWith("data:") ? href : `http://localhost${pathname}${search}${hash}`;
|
|
35
|
+
return new URL(path, base);
|
|
36
|
+
}
|
|
37
|
+
function getRegisteredAppsSnapshot() {
|
|
38
|
+
return [...registeredApps];
|
|
39
|
+
}
|
|
40
|
+
function hasRegisteredApps() {
|
|
41
|
+
return registeredApps.length > 0;
|
|
42
|
+
}
|
|
43
|
+
function syncAppRegistrationLocation(app, pathname, href) {
|
|
44
|
+
app.pathname = pathname;
|
|
45
|
+
app.href = href;
|
|
46
|
+
}
|
|
47
|
+
function collectRouteActivityMatches(pathname, apps = registeredApps) {
|
|
48
|
+
const matches = [];
|
|
49
|
+
const seenPaths = /* @__PURE__ */ new Set();
|
|
50
|
+
for (const app of apps) {
|
|
51
|
+
const appMatches = computeRouteActivityMatches(pathname, {
|
|
52
|
+
manifest: app.manifest,
|
|
53
|
+
routes: app.routes
|
|
54
|
+
});
|
|
55
|
+
for (const match of appMatches) {
|
|
56
|
+
if (seenPaths.has(match.path)) continue;
|
|
57
|
+
seenPaths.add(match.path);
|
|
58
|
+
matches.push(match);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return matches;
|
|
62
|
+
}
|
|
63
|
+
function syncRegisteredRouteSnapshot() {
|
|
64
|
+
if (typeof window === "undefined") return;
|
|
65
|
+
const pathname = window.location.pathname || "/";
|
|
66
|
+
syncCurrentRouteSnapshot(pathname, window.location.search || "", window.location.hash || "", collectRouteActivityMatches(pathname));
|
|
67
|
+
}
|
|
68
|
+
function registerAppInstance(instance, path, source = {}) {
|
|
69
|
+
const existingIndex = registeredApps.findIndex((app) => app.instance === instance);
|
|
70
|
+
const registration = {
|
|
71
|
+
instance,
|
|
72
|
+
pathname: path,
|
|
73
|
+
href: getWindowHref(),
|
|
74
|
+
...source
|
|
75
|
+
};
|
|
76
|
+
if (existingIndex >= 0) registeredApps[existingIndex] = registration;
|
|
77
|
+
else registeredApps.push(registration);
|
|
78
|
+
currentInstance = instance;
|
|
79
|
+
currentPathname = path;
|
|
80
|
+
currentHref = getWindowHref();
|
|
81
|
+
syncRegisteredRouteSnapshot();
|
|
82
|
+
if (isProductionEnvironment()) lockRouteRegistration();
|
|
83
|
+
}
|
|
84
|
+
function unregisterAppInstance(instance) {
|
|
85
|
+
const existingIndex = registeredApps.findIndex((app) => app.instance === instance);
|
|
86
|
+
if (existingIndex >= 0) registeredApps.splice(existingIndex, 1);
|
|
87
|
+
syncRegisteredRouteSnapshot();
|
|
88
|
+
if (currentInstance !== instance) return;
|
|
89
|
+
const nextApp = registeredApps.length > 0 ? registeredApps[registeredApps.length - 1] : null;
|
|
90
|
+
currentInstance = nextApp?.instance ?? null;
|
|
91
|
+
if (nextApp) {
|
|
92
|
+
currentPathname = nextApp.pathname;
|
|
93
|
+
currentHref = nextApp.href;
|
|
94
|
+
syncRegisteredRouteSnapshot();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
navigationRegistryHost?.cancelRouteRequests();
|
|
98
|
+
currentPathname = "/";
|
|
99
|
+
currentHref = "/";
|
|
100
|
+
if (typeof window === "undefined") syncCurrentRouteSnapshot("/", "", "", []);
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { configureNavigationRegistryHost, getCurrentHref, getCurrentPathname, getRegisteredAppsSnapshot, getWindowHref, hasRegisteredApps, parseTargetUrl, registerAppInstance, setCurrentRouteLocation, syncAppRegistrationLocation, syncRegisteredRouteSnapshot, unregisterAppInstance };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=navigation-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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/component';\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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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/router/navigation-scroll.d.ts
|
|
2
|
+
type NavigationScrollBehavior = 'top' | 'preserve';
|
|
3
|
+
type HistoryScrollBehavior = 'restore' | 'top' | 'preserve';
|
|
4
|
+
type ScrollRestorationOptions = {
|
|
5
|
+
navigation?: NavigationScrollBehavior;
|
|
6
|
+
history?: HistoryScrollBehavior;
|
|
7
|
+
};
|
|
8
|
+
declare function saveScrollPosition(href: string): void;
|
|
9
|
+
declare function applyNavigationScroll(behavior?: NavigationScrollBehavior): void;
|
|
10
|
+
declare function applyHistoryScroll(href: string, state: PopStateEvent['state']): void;
|
|
11
|
+
declare function configureScrollRestoration(options?: boolean | ScrollRestorationOptions): void;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { HistoryScrollBehavior, NavigationScrollBehavior, ScrollRestorationOptions };
|
|
14
|
+
//# sourceMappingURL=navigation-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//#region src/router/navigation-scroll.ts
|
|
2
|
+
const DEFAULT_SCROLL_RESTORATION = {
|
|
3
|
+
enabled: true,
|
|
4
|
+
navigation: "top",
|
|
5
|
+
history: "restore"
|
|
6
|
+
};
|
|
7
|
+
let scrollRestorationOptions = { ...DEFAULT_SCROLL_RESTORATION };
|
|
8
|
+
const scrollPositions = /* @__PURE__ */ new Map();
|
|
9
|
+
function getWindowHref() {
|
|
10
|
+
if (typeof window === "undefined") return "/";
|
|
11
|
+
return `${window.location.pathname}${window.location.search}${window.location.hash}`;
|
|
12
|
+
}
|
|
13
|
+
function normalizeScrollRestorationOptions(options) {
|
|
14
|
+
if (options === false) return {
|
|
15
|
+
enabled: false,
|
|
16
|
+
navigation: DEFAULT_SCROLL_RESTORATION.navigation,
|
|
17
|
+
history: DEFAULT_SCROLL_RESTORATION.history
|
|
18
|
+
};
|
|
19
|
+
if (options === true || options === void 0) return { ...DEFAULT_SCROLL_RESTORATION };
|
|
20
|
+
return {
|
|
21
|
+
enabled: true,
|
|
22
|
+
navigation: options.navigation ?? DEFAULT_SCROLL_RESTORATION.navigation,
|
|
23
|
+
history: options.history ?? DEFAULT_SCROLL_RESTORATION.history
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function readScrollPosition() {
|
|
27
|
+
if (typeof window === "undefined") return {
|
|
28
|
+
x: 0,
|
|
29
|
+
y: 0
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
x: typeof window.scrollX === "number" ? window.scrollX : typeof window.pageXOffset === "number" ? window.pageXOffset : 0,
|
|
33
|
+
y: typeof window.scrollY === "number" ? window.scrollY : typeof window.pageYOffset === "number" ? window.pageYOffset : 0
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function writeHistoryScrollPosition(href, position) {
|
|
37
|
+
if (typeof window === "undefined" || getWindowHref() !== href) return;
|
|
38
|
+
if (typeof window.history?.replaceState !== "function") return;
|
|
39
|
+
const state = window.history.state && typeof window.history.state === "object" ? window.history.state : {};
|
|
40
|
+
window.history.replaceState({
|
|
41
|
+
...state,
|
|
42
|
+
path: href,
|
|
43
|
+
scroll: position
|
|
44
|
+
}, "", href);
|
|
45
|
+
}
|
|
46
|
+
function saveScrollPosition(href) {
|
|
47
|
+
if (!scrollRestorationOptions.enabled || typeof window === "undefined") return;
|
|
48
|
+
const position = readScrollPosition();
|
|
49
|
+
scrollPositions.set(href, position);
|
|
50
|
+
writeHistoryScrollPosition(href, position);
|
|
51
|
+
}
|
|
52
|
+
function scrollToPosition(position) {
|
|
53
|
+
if (typeof window === "undefined" || typeof window.scrollTo !== "function") return;
|
|
54
|
+
window.scrollTo(position.x, position.y);
|
|
55
|
+
}
|
|
56
|
+
function applyNavigationScroll(behavior) {
|
|
57
|
+
const nextBehavior = behavior ?? scrollRestorationOptions.navigation;
|
|
58
|
+
if (!scrollRestorationOptions.enabled || nextBehavior === "preserve") return;
|
|
59
|
+
scrollToPosition({
|
|
60
|
+
x: 0,
|
|
61
|
+
y: 0
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function applyHistoryScroll(href, state) {
|
|
65
|
+
if (!scrollRestorationOptions.enabled) return;
|
|
66
|
+
if (scrollRestorationOptions.history === "preserve") return;
|
|
67
|
+
if (scrollRestorationOptions.history === "top") {
|
|
68
|
+
scrollToPosition({
|
|
69
|
+
x: 0,
|
|
70
|
+
y: 0
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const fromState = state && typeof state === "object" && "scroll" in state ? state.scroll : void 0;
|
|
75
|
+
scrollToPosition((fromState && typeof fromState.x === "number" && typeof fromState.y === "number" ? {
|
|
76
|
+
x: fromState.x,
|
|
77
|
+
y: fromState.y
|
|
78
|
+
} : scrollPositions.get(href)) ?? {
|
|
79
|
+
x: 0,
|
|
80
|
+
y: 0
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function configureScrollRestoration(options) {
|
|
84
|
+
scrollRestorationOptions = normalizeScrollRestorationOptions(options);
|
|
85
|
+
if (typeof window === "undefined") return;
|
|
86
|
+
if ("scrollRestoration" in window.history) try {
|
|
87
|
+
window.history.scrollRestoration = scrollRestorationOptions.enabled ? "manual" : "auto";
|
|
88
|
+
} catch {}
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { applyHistoryScroll, applyNavigationScroll, configureScrollRestoration, saveScrollPosition };
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=navigation-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { RouteRequestResult } from "../common/router.js";
|
|
2
|
+
import { NavigationScrollBehavior } from "./navigation-scroll.js";
|
|
3
|
+
import { AppRegistration } from "./navigation-registry.js";
|
|
4
|
+
|
|
5
|
+
//#region src/router/navigation-targets.d.ts
|
|
6
|
+
type NavigateOptions = {
|
|
7
|
+
history?: 'push' | 'replace';
|
|
8
|
+
replace?: boolean;
|
|
9
|
+
scroll?: NavigationScrollBehavior;
|
|
10
|
+
};
|
|
11
|
+
type NavigationRedirectState = {
|
|
12
|
+
redirects: number;
|
|
13
|
+
visited: Set<string>;
|
|
14
|
+
};
|
|
15
|
+
type AppNavigationTarget = {
|
|
16
|
+
app: AppRegistration;
|
|
17
|
+
resolved: RouteRequestResult;
|
|
18
|
+
};
|
|
19
|
+
declare function beginRouteRequest(): {
|
|
20
|
+
id: number;
|
|
21
|
+
signal: AbortSignal;
|
|
22
|
+
};
|
|
23
|
+
declare function isStaleRouteRequest(requestId: number): boolean;
|
|
24
|
+
declare function cancelRouteRequests(): void;
|
|
25
|
+
declare function getRedirectHistoryMode(replace: boolean | undefined): 'push' | 'replace';
|
|
26
|
+
declare function resolveNavigationTargetsForApps(pathname: string, href: string, signal: AbortSignal): AppNavigationTarget[] | Promise<AppNavigationTarget[]>;
|
|
27
|
+
declare function applyNavigationTargets(path: string, options: NavigateOptions, redirectState: NavigationRedirectState, pathname: string, href: string, targets: AppNavigationTarget[], navigateWithRedirectState: (path: string, options: NavigateOptions, redirectState: NavigationRedirectState) => void): void;
|
|
28
|
+
declare function applyPopStateNavigationTargets(requestId: number, pathname: string, href: string, state: unknown, targets: AppNavigationTarget[], navigate: (path: string, options: NavigateOptions) => void): void;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { AppNavigationTarget, NavigateOptions, NavigationRedirectState };
|
|
31
|
+
//# sourceMappingURL=navigation-targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-targets.d.ts","names":[],"sources":["../../src/router/navigation-targets.ts"],"mappings":";;;;;KAqCY,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"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { isDevelopmentEnvironment } from "../common/env.js";
|
|
2
|
+
import { logger } from "../dev/logger.js";
|
|
3
|
+
import { ELEMENT_TYPE, Fragment } from "../common/jsx.js";
|
|
4
|
+
import { cleanupComponent } from "../runtime/component-cleanup.js";
|
|
5
|
+
import { isPromiseLike } from "../common/promise.js";
|
|
6
|
+
import { mountComponent } from "../runtime/component-internal.js";
|
|
7
|
+
import "../runtime/component.js";
|
|
8
|
+
import { cleanupInstancesUnder } from "../renderer/cleanup.js";
|
|
9
|
+
import { applyHistoryScroll, applyNavigationScroll, saveScrollPosition } from "./navigation-scroll.js";
|
|
10
|
+
import { resolveRouteFromRoutes, resolveRouteRequest } from "./resolution.js";
|
|
11
|
+
import "./route.js";
|
|
12
|
+
import { getCurrentHref, getCurrentPathname, getRegisteredAppsSnapshot, parseTargetUrl, setCurrentRouteLocation, syncAppRegistrationLocation, syncRegisteredRouteSnapshot } from "./navigation-registry.js";
|
|
13
|
+
import { DefaultPortal, clearDefaultPortalForInstance } from "../foundations/structures/portal.js";
|
|
14
|
+
import "../jsx/index.js";
|
|
15
|
+
//#region src/router/navigation-targets.ts
|
|
16
|
+
const MAX_NAVIGATION_REDIRECTS = 20;
|
|
17
|
+
let activeRouteRequestId = 0;
|
|
18
|
+
let activeRouteRequestController = null;
|
|
19
|
+
function beginRouteRequest() {
|
|
20
|
+
activeRouteRequestId += 1;
|
|
21
|
+
activeRouteRequestController?.abort();
|
|
22
|
+
activeRouteRequestController = new AbortController();
|
|
23
|
+
return {
|
|
24
|
+
id: activeRouteRequestId,
|
|
25
|
+
signal: activeRouteRequestController.signal
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function isStaleRouteRequest(requestId) {
|
|
29
|
+
return requestId !== activeRouteRequestId;
|
|
30
|
+
}
|
|
31
|
+
function cancelRouteRequests() {
|
|
32
|
+
activeRouteRequestId += 1;
|
|
33
|
+
activeRouteRequestController?.abort();
|
|
34
|
+
activeRouteRequestController = null;
|
|
35
|
+
}
|
|
36
|
+
function isRenderResult(result) {
|
|
37
|
+
return result !== null && result.kind === "render";
|
|
38
|
+
}
|
|
39
|
+
function getRedirectHistoryMode(replace) {
|
|
40
|
+
return replace === false ? "push" : "replace";
|
|
41
|
+
}
|
|
42
|
+
function getNavigationHistoryMode(options) {
|
|
43
|
+
if (options.history) return options.history;
|
|
44
|
+
return options.replace ? "replace" : "push";
|
|
45
|
+
}
|
|
46
|
+
function createDeniedResolvedRoute(status) {
|
|
47
|
+
return {
|
|
48
|
+
handler: () => ({
|
|
49
|
+
type: "div",
|
|
50
|
+
props: { "data-route-denied": String(status) },
|
|
51
|
+
children: [String(status)]
|
|
52
|
+
}),
|
|
53
|
+
params: {}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function bindResolvedRouteHandler(resolved) {
|
|
57
|
+
return () => resolved.handler(resolved.params);
|
|
58
|
+
}
|
|
59
|
+
function wrapRootRouteHandler(componentFn) {
|
|
60
|
+
const wrappedFn = (props, ctx) => {
|
|
61
|
+
const out = componentFn(props, ctx);
|
|
62
|
+
if (isPromiseLike(out)) throw new Error("Async components are not supported. Components must return synchronously.");
|
|
63
|
+
const portalVNode = {
|
|
64
|
+
$$typeof: ELEMENT_TYPE,
|
|
65
|
+
type: DefaultPortal,
|
|
66
|
+
props: {},
|
|
67
|
+
key: "__default_portal"
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
$$typeof: ELEMENT_TYPE,
|
|
71
|
+
type: Fragment,
|
|
72
|
+
props: { children: out === void 0 || out === null ? [portalVNode] : [out, portalVNode] }
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
Object.defineProperty(wrappedFn, "name", { value: componentFn.name || "Component" });
|
|
76
|
+
return wrappedFn;
|
|
77
|
+
}
|
|
78
|
+
function cleanupRouteOwnership(instance) {
|
|
79
|
+
const cleanupErrors = [];
|
|
80
|
+
const children = instance.target ? Array.from(instance.target.childNodes) : [];
|
|
81
|
+
for (const child of children) try {
|
|
82
|
+
cleanupInstancesUnder(child, { strict: instance.cleanupStrict });
|
|
83
|
+
} catch (error) {
|
|
84
|
+
cleanupErrors.push(error);
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
cleanupComponent(instance);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
cleanupErrors.push(error);
|
|
90
|
+
}
|
|
91
|
+
if (cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, "Route cleanup failed");
|
|
92
|
+
}
|
|
93
|
+
function remountResolvedRoute(instance, resolved, pathname, href) {
|
|
94
|
+
clearDefaultPortalForInstance(instance);
|
|
95
|
+
cleanupRouteOwnership(instance);
|
|
96
|
+
instance.fn = wrapRootRouteHandler(bindResolvedRouteHandler(resolved));
|
|
97
|
+
instance.props = {};
|
|
98
|
+
instance.stateValues = [];
|
|
99
|
+
instance.expectedStateIndices = [];
|
|
100
|
+
instance.firstRenderComplete = false;
|
|
101
|
+
instance.stateIndexCheck = -1;
|
|
102
|
+
instance.evaluationGeneration++;
|
|
103
|
+
instance.notifyUpdate = null;
|
|
104
|
+
instance.mountOperations = [];
|
|
105
|
+
instance.commitOperations = [];
|
|
106
|
+
instance.lifecycleSlots = [];
|
|
107
|
+
instance.cleanupFns = [];
|
|
108
|
+
instance._placeholder = void 0;
|
|
109
|
+
instance.hasPendingUpdate = false;
|
|
110
|
+
instance._currentRenderToken = void 0;
|
|
111
|
+
instance.lastRenderToken = 0;
|
|
112
|
+
instance._pendingReadSources = void 0;
|
|
113
|
+
instance._lastReadSources = void 0;
|
|
114
|
+
instance.abortController = null;
|
|
115
|
+
mountComponent(instance);
|
|
116
|
+
setCurrentRouteLocation(pathname, href);
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
function rerenderResolvedRoute(instance, pathname, href) {
|
|
120
|
+
setCurrentRouteLocation(pathname, href);
|
|
121
|
+
instance._enqueueRun?.();
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
function resolveAppRouteRequest(app, pathname, href, signal) {
|
|
125
|
+
if (app.manifest) return resolveRouteRequest(href, {
|
|
126
|
+
manifest: app.manifest,
|
|
127
|
+
auth: app.auth,
|
|
128
|
+
signal
|
|
129
|
+
});
|
|
130
|
+
if (app.routes) {
|
|
131
|
+
const resolved = resolveRouteFromRoutes(pathname, app.routes);
|
|
132
|
+
if (!resolved) return null;
|
|
133
|
+
return {
|
|
134
|
+
kind: "render",
|
|
135
|
+
handler: resolved.handler,
|
|
136
|
+
params: resolved.params
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return resolveRouteRequest(href, {
|
|
140
|
+
auth: app.auth,
|
|
141
|
+
signal
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function resolveNavigationTargetsForApps(pathname, href, signal) {
|
|
145
|
+
const apps = getRegisteredAppsSnapshot();
|
|
146
|
+
if (apps.length === 1) {
|
|
147
|
+
const app = apps[0];
|
|
148
|
+
const resolved = resolveAppRouteRequest(app, pathname, href, signal);
|
|
149
|
+
if (isPromiseLike(resolved)) return Promise.resolve(resolved).then((next) => [{
|
|
150
|
+
app,
|
|
151
|
+
resolved: next
|
|
152
|
+
}]);
|
|
153
|
+
return [{
|
|
154
|
+
app,
|
|
155
|
+
resolved
|
|
156
|
+
}];
|
|
157
|
+
}
|
|
158
|
+
const syncTargets = [];
|
|
159
|
+
const pendingTargets = [];
|
|
160
|
+
for (const app of apps) {
|
|
161
|
+
const resolved = resolveAppRouteRequest(app, pathname, href, signal);
|
|
162
|
+
if (isPromiseLike(resolved)) {
|
|
163
|
+
pendingTargets.push(Promise.resolve(resolved).then((next) => ({
|
|
164
|
+
app,
|
|
165
|
+
resolved: next
|
|
166
|
+
})));
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
syncTargets.push({
|
|
170
|
+
app,
|
|
171
|
+
resolved
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (pendingTargets.length === 0) return syncTargets;
|
|
175
|
+
return Promise.all([...syncTargets.map((target) => Promise.resolve(target)), ...pendingTargets]);
|
|
176
|
+
}
|
|
177
|
+
function applyNavigationTargets(path, options, redirectState, pathname, href, targets, navigateWithRedirectState) {
|
|
178
|
+
const previousPathname = getCurrentPathname();
|
|
179
|
+
for (const target of targets) {
|
|
180
|
+
const resolved = target.resolved;
|
|
181
|
+
if (!resolved || resolved.kind !== "redirect") continue;
|
|
182
|
+
const redirectTarget = parseTargetUrl(resolved.to);
|
|
183
|
+
const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;
|
|
184
|
+
if (redirectHref === href) {
|
|
185
|
+
if (isDevelopmentEnvironment()) logger.warn(`Navigation guard redirected to the same path: ${redirectHref}`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (redirectState.visited.has(redirectHref)) throw new Error(`[Askr] Navigation redirect cycle detected at ${redirectHref}.`);
|
|
189
|
+
if (redirectState.redirects >= MAX_NAVIGATION_REDIRECTS) throw new Error(`[Askr] Navigation redirect limit exceeded (${MAX_NAVIGATION_REDIRECTS}).`);
|
|
190
|
+
redirectState.visited.add(redirectHref);
|
|
191
|
+
redirectState.redirects++;
|
|
192
|
+
navigateWithRedirectState(redirectHref, { history: getRedirectHistoryMode(resolved.replace) }, redirectState);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const matchedTargets = targets.filter((target) => target.resolved !== null);
|
|
196
|
+
if (matchedTargets.length === 0) {
|
|
197
|
+
if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${path}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
saveScrollPosition(getCurrentHref());
|
|
201
|
+
const historyMethod = getNavigationHistoryMode(options) === "replace" ? "replaceState" : "pushState";
|
|
202
|
+
window.history[historyMethod]({ path: href }, "", href);
|
|
203
|
+
syncRegisteredRouteSnapshot();
|
|
204
|
+
for (const target of matchedTargets) {
|
|
205
|
+
const resolved = target.resolved;
|
|
206
|
+
if (resolved.kind === "redirect") continue;
|
|
207
|
+
if (pathname === target.app.pathname && isRenderResult(resolved)) {
|
|
208
|
+
rerenderResolvedRoute(target.app.instance, pathname, href);
|
|
209
|
+
syncAppRegistrationLocation(target.app, pathname, href);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
remountResolvedRoute(target.app.instance, resolved.kind === "deny" ? createDeniedResolvedRoute(resolved.status) : {
|
|
213
|
+
handler: resolved.handler,
|
|
214
|
+
params: resolved.params
|
|
215
|
+
}, pathname, href);
|
|
216
|
+
syncAppRegistrationLocation(target.app, pathname, href);
|
|
217
|
+
}
|
|
218
|
+
if (pathname !== previousPathname) applyNavigationScroll(options.scroll);
|
|
219
|
+
}
|
|
220
|
+
function applyPopStateNavigationTargets(requestId, pathname, href, state, targets, navigate) {
|
|
221
|
+
if (isStaleRouteRequest(requestId)) return;
|
|
222
|
+
const matchedTargets = targets.filter((target) => target.resolved !== null);
|
|
223
|
+
if (matchedTargets.length === 0) {
|
|
224
|
+
if (isDevelopmentEnvironment()) logger.warn(`No route found for path: ${pathname}`);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
for (const target of matchedTargets) {
|
|
228
|
+
const resolved = target.resolved;
|
|
229
|
+
if (resolved.kind !== "redirect") continue;
|
|
230
|
+
navigate(resolved.to, { history: getRedirectHistoryMode(resolved.replace) });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
syncRegisteredRouteSnapshot();
|
|
234
|
+
for (const target of matchedTargets) {
|
|
235
|
+
const resolved = target.resolved;
|
|
236
|
+
if (pathname === target.app.pathname && isRenderResult(resolved)) {
|
|
237
|
+
rerenderResolvedRoute(target.app.instance, pathname, href);
|
|
238
|
+
syncAppRegistrationLocation(target.app, pathname, href);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (resolved.kind === "redirect") continue;
|
|
242
|
+
remountResolvedRoute(target.app.instance, resolved.kind === "deny" ? createDeniedResolvedRoute(resolved.status) : {
|
|
243
|
+
handler: resolved.handler,
|
|
244
|
+
params: resolved.params
|
|
245
|
+
}, pathname, href);
|
|
246
|
+
syncAppRegistrationLocation(target.app, pathname, href);
|
|
247
|
+
}
|
|
248
|
+
applyHistoryScroll(href, state);
|
|
249
|
+
}
|
|
250
|
+
//#endregion
|
|
251
|
+
export { applyNavigationTargets, applyPopStateNavigationTargets, beginRouteRequest, cancelRouteRequests, getRedirectHistoryMode, isStaleRouteRequest, resolveNavigationTargetsForApps };
|
|
252
|
+
|
|
253
|
+
//# sourceMappingURL=navigation-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 {\n DefaultPortal,\n clearDefaultPortalForInstance,\n} from '../foundations/structures/portal';\nimport { ELEMENT_TYPE, Fragment } from '../jsx';\nimport { logger } from '../dev/logger';\nimport { cleanupInstancesUnder } from '../renderer/cleanup';\nimport {\n cleanupComponent,\n mountComponent,\n type ComponentInstance,\n} from '../runtime/component';\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: {},\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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"}
|
package/dist/router/policy.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { AccessAllowDecision, AccessDecision, AccessDenyDecision, AccessDenyStatus, AccessRedirectDecision, AccessRedirectStatus, RouteAuthOptions, RouteContext, RoutePolicy } from "../common/router.js";
|
|
2
2
|
|
|
3
3
|
//#region src/router/policy.d.ts
|
|
4
|
+
type BuiltInRoutePolicyKind = 'auth' | 'guest' | 'role' | 'permission';
|
|
5
|
+
interface BuiltInRoutePolicyMetadata {
|
|
6
|
+
kind: BuiltInRoutePolicyKind;
|
|
7
|
+
value?: string;
|
|
8
|
+
}
|
|
4
9
|
declare function allow(): AccessAllowDecision;
|
|
5
10
|
declare function redirect(to: string, init?: {
|
|
6
11
|
status?: AccessRedirectStatus;
|
|
@@ -12,11 +17,12 @@ declare function forbidden(): AccessDenyDecision;
|
|
|
12
17
|
declare function notFound(): AccessDenyDecision;
|
|
13
18
|
declare function normalizeAccessDecision(result: AccessDecision): AccessDecision;
|
|
14
19
|
declare function withRouteAuthOptions(context: RouteContext, auth: RouteAuthOptions | undefined): RouteContext;
|
|
20
|
+
declare function _getBuiltInRoutePolicy(policy: RoutePolicy): BuiltInRoutePolicyMetadata | null;
|
|
15
21
|
declare function requireAuth(): RoutePolicy;
|
|
16
22
|
declare function requireGuest(): RoutePolicy;
|
|
17
23
|
declare function requireRole(role: string): RoutePolicy;
|
|
18
24
|
declare function requirePermission(permission: string): RoutePolicy;
|
|
19
25
|
declare function evaluateRoutePolicy(policy: RoutePolicy, context: RouteContext): Promise<AccessDecision>;
|
|
20
26
|
//#endregion
|
|
21
|
-
export { allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized };
|
|
27
|
+
export { BuiltInRoutePolicyKind, BuiltInRoutePolicyMetadata, allow, deny, forbidden, notFound, redirect, requireAuth, requirePermission, requireRole, unauthorized };
|
|
22
28
|
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","names":[],"sources":["../../src/router/policy.ts"],"mappings":";;;
|
|
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"}
|