@askrjs/askr 0.0.48 → 0.0.50
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 +6 -2
- 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 +3 -1
- package/dist/jsx/types.d.ts.map +1 -1
- package/dist/jsx/types.js +2 -1
- package/dist/jsx-dev-runtime.d.ts +2 -2
- package/dist/jsx-dev-runtime.d.ts.map +1 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +2 -2
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/jsx-runtime2.d.ts +3 -2
- 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
package/dist/ssr/render-keys.js
CHANGED
|
@@ -1,39 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/ssr/render-keys.ts
|
|
3
|
-
let hydrationRenderData = null;
|
|
4
|
-
let hydrationKeyCounter = 0;
|
|
5
|
-
function getCurrentRenderData() {
|
|
6
|
-
return getRenderContext()?.renderData ?? hydrationRenderData;
|
|
7
|
-
}
|
|
8
|
-
function getNextKey() {
|
|
9
|
-
const ctx = getRenderContext();
|
|
10
|
-
if (ctx) return `r:${ctx.keyCounter++}`;
|
|
11
|
-
if (hydrationRenderData) return `r:${hydrationKeyCounter++}`;
|
|
12
|
-
return `r:0`;
|
|
13
|
-
}
|
|
14
|
-
function startHydrationRenderPhase(data) {
|
|
15
|
-
hydrationRenderData = data;
|
|
16
|
-
hydrationKeyCounter = 0;
|
|
17
|
-
}
|
|
18
|
-
function stopHydrationRenderPhase() {
|
|
19
|
-
hydrationRenderData = null;
|
|
20
|
-
hydrationKeyCounter = 0;
|
|
21
|
-
}
|
|
1
|
+
import { startRenderPhase as startRenderPhase$1, stopRenderPhase as stopRenderPhase$1 } from "../common/render-context.js";
|
|
22
2
|
function startRenderPhase(data) {
|
|
23
|
-
|
|
24
|
-
if (ctx) {
|
|
25
|
-
ctx.renderData = data ?? null;
|
|
26
|
-
ctx.keyCounter = 0;
|
|
27
|
-
}
|
|
3
|
+
startRenderPhase$1(data);
|
|
28
4
|
}
|
|
29
5
|
function stopRenderPhase() {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
6
|
+
stopRenderPhase$1();
|
|
7
|
+
}
|
|
8
|
+
const PREPASS_REMOVED_MSG = "SSR collection/prepass is removed: SSR is strictly synchronous";
|
|
9
|
+
/** @deprecated SSR prepass has been removed */
|
|
10
|
+
async function resolvePlan(_plan) {
|
|
11
|
+
throw new Error(`${PREPASS_REMOVED_MSG}; async resource plans are not supported`);
|
|
35
12
|
}
|
|
36
13
|
//#endregion
|
|
37
|
-
export {
|
|
14
|
+
export { resolvePlan, startRenderPhase, stopRenderPhase };
|
|
38
15
|
|
|
39
16
|
//# sourceMappingURL=render-keys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-keys.js","names":[],"sources":["../../src/ssr/render-keys.ts"],"sourcesContent":["/**\n * SSR Data Management\n *\n * Manages render-phase keying for deterministic SSR data lookup.\n * All state is stored in the per-render context for concurrency safety.\n */\n\nimport type { SSRRoute } from './index';\nimport {
|
|
1
|
+
{"version":3,"file":"render-keys.js","names":["getCommonCurrentRenderData"],"sources":["../../src/ssr/render-keys.ts"],"sourcesContent":["/**\n * SSR Data Management\n *\n * Manages render-phase keying for deterministic SSR data lookup.\n * All state is stored in the per-render context for concurrency safety.\n */\n\nimport type { SSRRoute } from './index';\nimport {\n getCurrentRenderData as getCommonCurrentRenderData,\n getNextRenderKey,\n resetRenderKeyCounter,\n startHydrationRenderPhase as startCommonHydrationRenderPhase,\n startRenderPhase as startCommonRenderPhase,\n stopHydrationRenderPhase as stopCommonHydrationRenderPhase,\n stopRenderPhase as stopCommonRenderPhase,\n} from '../common/render-context';\n\nexport type ResourceDescriptor = {\n key: string;\n fn: (opts: { signal?: AbortSignal }) => Promise<unknown> | unknown;\n deps: unknown[];\n index: number;\n};\n\nexport type ResourcePlan = {\n resources: ResourceDescriptor[]; // declarative manifest in stable order\n};\n\nexport function getCurrentRenderData(): Record<string, unknown> | null {\n return getCommonCurrentRenderData();\n}\n\nexport function resetKeyCounter() {\n resetRenderKeyCounter();\n}\n\nexport function getNextKey(): string {\n return getNextRenderKey();\n}\n\nexport function startHydrationRenderPhase(data: Record<string, unknown>) {\n startCommonHydrationRenderPhase(data);\n}\n\nexport function stopHydrationRenderPhase() {\n stopCommonHydrationRenderPhase();\n}\n\nexport function startRenderPhase(data: Record<string, unknown> | null) {\n startCommonRenderPhase(data);\n}\n\nexport function stopRenderPhase() {\n stopCommonRenderPhase();\n}\n\n// --- Deprecated APIs (throw descriptive errors) ---\n\nconst PREPASS_REMOVED_MSG =\n 'SSR collection/prepass is removed: SSR is strictly synchronous';\n\n/** @deprecated SSR prepass has been removed */\nexport function startCollection(): never {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call startCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function stopCollection(): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; do not call stopCollection()`);\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function registerResourceIntent(\n _fn: ResourceDescriptor['fn'],\n _deps: unknown[]\n): string {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; resource() no longer registers intents for prepass`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport async function resolvePlan(\n _plan: ResourcePlan\n): Promise<Record<string, unknown>> {\n throw new Error(\n `${PREPASS_REMOVED_MSG}; async resource plans are not supported`\n );\n}\n\n/** @deprecated SSR prepass has been removed */\nexport function collectResources(_opts: {\n url: string;\n routes: SSRRoute[];\n}): ResourcePlan {\n throw new Error(`${PREPASS_REMOVED_MSG}; collectResources is disabled`);\n}\n\n/** @deprecated Alias for resolvePlan */\nexport const resolveResources = resolvePlan;\n"],"mappings":";AAiDA,SAAgB,iBAAiB,MAAsC;CACrE,mBAAuB,IAAI;AAC7B;AAEA,SAAgB,kBAAkB;CAChC,kBAAsB;AACxB;AAIA,MAAM,sBACJ;;AAuBF,eAAsB,YACpB,OACkC;CAClC,MAAM,IAAI,MACR,GAAG,oBAAoB,yCACzB;AACF"}
|
|
@@ -3,7 +3,7 @@ import { RouteHandler } from "../common/router.js";
|
|
|
3
3
|
//#region src/ssr/render-resolved.d.ts
|
|
4
4
|
declare function renderResolvedToStringSync(opts: {
|
|
5
5
|
url: string;
|
|
6
|
-
routes:
|
|
6
|
+
routes: ReadonlyArray<{
|
|
7
7
|
path: string;
|
|
8
8
|
handler: RouteHandler;
|
|
9
9
|
namespace?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-resolved.d.ts","names":[],"sources":["../../src/ssr/render-resolved.ts"],"mappings":";;;iBA4BgB,0BAAA,CAA2B,IAAA;EACzC,GAAA;EACA,MAAA,EAAQ,
|
|
1
|
+
{"version":3,"file":"render-resolved.d.ts","names":[],"sources":["../../src/ssr/render-resolved.ts"],"mappings":";;;iBA4BgB,0BAAA,CAA2B,IAAA;EACzC,GAAA;EACA,MAAA,EAAQ,aAAA;IACN,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,OAAA,EAAS,YAAA;EACT,MAAA,GAAS,MAAA;EACT,OAAA;IAAY,IAAA;IAAe,IAAA,GAAO,OAAA;EAAA;AAAA"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { resolveRouteFromRoutes } from "../router/
|
|
2
|
-
import
|
|
1
|
+
import { resolveRouteFromRoutes } from "../router/resolution.js";
|
|
2
|
+
import "../router/route.js";
|
|
3
|
+
import { renderToString } from "./index-internal.js";
|
|
4
|
+
import "./index.js";
|
|
3
5
|
//#region src/ssr/render-resolved.ts
|
|
4
6
|
function sameRouteParams(left, right) {
|
|
5
7
|
if (!left || !right) return !left && !right;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-resolved.js","names":["RouteModule.resolveRouteFromRoutes"],"sources":["../../src/ssr/render-resolved.ts"],"sourcesContent":["import type { RouteHandler } from '../common/router';\nimport * as RouteModule from '../router/route';\nimport type { SSRData } from './context';\nimport { renderToString, type SSRRoute } from './index';\n\nfunction sameRouteParams(\n left: Record<string, string> | undefined,\n right: Record<string, string> | undefined\n): boolean {\n if (!left || !right) {\n return !left && !right;\n }\n\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (left[key] !== right[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function renderResolvedToStringSync(opts: {\n url: string;\n routes:
|
|
1
|
+
{"version":3,"file":"render-resolved.js","names":["RouteModule.resolveRouteFromRoutes"],"sources":["../../src/ssr/render-resolved.ts"],"sourcesContent":["import type { RouteHandler } from '../common/router';\nimport * as RouteModule from '../router/route';\nimport type { SSRData } from './context';\nimport { renderToString, type SSRRoute } from './index';\n\nfunction sameRouteParams(\n left: Record<string, string> | undefined,\n right: Record<string, string> | undefined\n): boolean {\n if (!left || !right) {\n return !left && !right;\n }\n\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (left[key] !== right[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function renderResolvedToStringSync(opts: {\n url: string;\n routes: ReadonlyArray<{\n path: string;\n handler: RouteHandler;\n namespace?: string;\n }>;\n handler: RouteHandler;\n params?: Record<string, string>;\n options?: { seed?: number; data?: SSRData };\n}): string {\n const { url, routes, handler, params, options } = opts;\n const requestUrl = new URL(url, 'http://localhost');\n\n const matchedIndex = routes.findIndex((route) => {\n const resolved = RouteModule.resolveRouteFromRoutes(requestUrl.pathname, [\n route,\n ]);\n\n return (\n resolved !== null &&\n resolved.handler === route.handler &&\n sameRouteParams(resolved.params, params)\n );\n });\n\n if (matchedIndex < 0) {\n throw new Error(\n `renderResolvedToStringSync: no route found for url: ${url}`\n );\n }\n\n const effectiveRoutes = routes.map((route, index) =>\n index === matchedIndex ? { ...route, handler } : route\n );\n\n return renderToString({\n url,\n routes: effectiveRoutes as SSRRoute[],\n seed: options?.seed,\n data: options?.data,\n });\n}\n"],"mappings":";;;;;AAKA,SAAS,gBACP,MACA,OACS;CACT,IAAI,CAAC,QAAQ,CAAC,OACZ,OAAO,CAAC,QAAQ,CAAC;CAGnB,MAAM,WAAW,OAAO,KAAK,IAAI;CACjC,MAAM,YAAY,OAAO,KAAK,KAAK;CACnC,IAAI,SAAS,WAAW,UAAU,QAChC,OAAO;CAGT,KAAK,MAAM,OAAO,UAChB,IAAI,KAAK,SAAS,MAAM,MACtB,OAAO;CAIX,OAAO;AACT;AAEA,SAAgB,2BAA2B,MAUhC;CACT,MAAM,EAAE,KAAK,QAAQ,SAAS,QAAQ,YAAY;CAClD,MAAM,aAAa,IAAI,IAAI,KAAK,kBAAkB;CAElD,MAAM,eAAe,OAAO,WAAW,UAAU;EAC/C,MAAM,WAAWA,uBAAmC,WAAW,UAAU,CACvE,KACF,CAAC;EAED,OACE,aAAa,QACb,SAAS,YAAY,MAAM,WAC3B,gBAAgB,SAAS,QAAQ,MAAM;CAE3C,CAAC;CAED,IAAI,eAAe,GACjB,MAAM,IAAI,MACR,uDAAuD,KACzD;CAOF,OAAO,eAAe;EACpB;EACA,QANsB,OAAO,KAAK,OAAO,UACzC,UAAU,eAAe;GAAE,GAAG;GAAO;EAAQ,IAAI,KAKzC;EACR,MAAM,SAAS;EACf,MAAM,SAAS;CACjB,CAAC;AACH"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { JSXElement } from "../common/jsx.js";
|
|
2
|
+
import { SSRData } from "../common/ssr.js";
|
|
3
|
+
import { RenderContext } from "./context.js";
|
|
4
|
+
import { RouteAppRenderInput } from "./route-render.js";
|
|
5
|
+
import { VNode } from "./types.js";
|
|
6
|
+
|
|
7
|
+
//#region src/ssr/render-sync.d.ts
|
|
8
|
+
declare function inheritRenderableKey(source: VNode | JSXElement, result: VNode | JSXElement): VNode | JSXElement;
|
|
9
|
+
declare function renderRenderableSyncToSink(value: unknown, sink: {
|
|
10
|
+
write(html: string): void;
|
|
11
|
+
write2?: (a: string, b: string) => void;
|
|
12
|
+
write3?: (a: string, b: string, c: string) => void;
|
|
13
|
+
}, ctx: RenderContext): void;
|
|
14
|
+
declare function renderToStringSync(component: (props?: Record<string, unknown>) => VNode | JSXElement | string | number | boolean | null | undefined, props?: Record<string, unknown>, options?: {
|
|
15
|
+
seed?: number;
|
|
16
|
+
data?: SSRData;
|
|
17
|
+
}): string;
|
|
18
|
+
declare function renderSSRRouteAppToSink(input: RouteAppRenderInput): void;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { renderToStringSync };
|
|
21
|
+
//# sourceMappingURL=render-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-sync.d.ts","names":[],"sources":["../../src/ssr/render-sync.ts"],"mappings":";;;;;;;iBAsCgB,oBAAA,CACd,MAAA,EAAQ,KAAA,GAAQ,UAAA,EAChB,MAAA,EAAQ,KAAA,GAAQ,UAAA,GACf,KAAA,GAAQ,UAAA;AAAA,iBA2CK,0BAAA,CACd,KAAA,WACA,IAAA;EACE,KAAA,CAAM,IAAA;EACN,MAAA,IAAU,CAAA,UAAW,CAAA;EACrB,MAAA,IAAU,CAAA,UAAW,CAAA,UAAW,CAAA;AAAA,GAElC,GAAA,EAAK,aAAa;AAAA,iBA8VJ,kBAAA,CACd,SAAA,GACE,KAAA,GAAQ,MAAA,sBACL,KAAA,GAAQ,UAAA,iDACb,KAAA,GAAQ,MAAA,mBACR,OAAA;EAAY,IAAA;EAAe,IAAA,GAAO,OAAA;AAAA;AAAA,iBA+BpB,uBAAA,CAAwB,KAA0B,EAAnB,mBAAmB"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { __CONTROL_BOUNDARY__ } from "../common/control.js";
|
|
2
|
+
import { __ERROR_BOUNDARY__ } from "../common/vnode.js";
|
|
3
|
+
import { logger } from "../dev/logger.js";
|
|
4
|
+
import { Fragment } from "../common/jsx.js";
|
|
5
|
+
import "../jsx/index.js";
|
|
6
|
+
import { VOID_ELEMENTS, escapeText } from "./escape.js";
|
|
7
|
+
import { createRenderContext, withRenderContext } from "./context.js";
|
|
8
|
+
import { StringSink } from "./sink.js";
|
|
9
|
+
import { disposeSSRTemporaryOwners, executeComponentSync, renderSyncComponentRoot } from "./component-runtime.js";
|
|
10
|
+
import { createErrorBoundaryReset, evaluateControlBoundaryChildren, getErrorBoundaryState, getRenderableChildren, normalizeRenderableChildren, resolveErrorBoundaryFallbackNode } from "./boundaries.js";
|
|
11
|
+
import { renderAttrs, renderAttrsDirect } from "./attrs.js";
|
|
12
|
+
import { serializeHydrationRenderData } from "./hydration-data.js";
|
|
13
|
+
import { startRenderPhase, stopRenderPhase } from "./render-keys.js";
|
|
14
|
+
//#region src/ssr/render-sync.ts
|
|
15
|
+
const __SSR_DEBUG = process.env.ASKR_SSR_DEBUG === "1" || process.env.ASKR_SSR_DEBUG === "true";
|
|
16
|
+
function inheritRenderableKey(source, result) {
|
|
17
|
+
const inheritedKey = source.key;
|
|
18
|
+
if (inheritedKey === void 0 || inheritedKey === null) return result;
|
|
19
|
+
if (!result || typeof result !== "object" || !("type" in result)) return result;
|
|
20
|
+
const resultVNode = result;
|
|
21
|
+
if (resultVNode.key === void 0 || resultVNode.key === null) resultVNode.key = inheritedKey;
|
|
22
|
+
if (typeof resultVNode.type === "string") {
|
|
23
|
+
if (!resultVNode.props) resultVNode.props = {};
|
|
24
|
+
if (resultVNode.props["data-key"] === void 0) resultVNode.props["data-key"] = String(inheritedKey);
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
function renderRenderableSync(value, ctx) {
|
|
29
|
+
if (typeof value === "string") return escapeText(value);
|
|
30
|
+
if (typeof value === "number") return escapeText(String(value));
|
|
31
|
+
if (value === null || value === void 0 || value === false) return "";
|
|
32
|
+
if (Array.isArray(value)) return renderChildrenSync(value, ctx);
|
|
33
|
+
if (value && typeof value === "object" && "type" in value) return renderNodeSync(value, ctx);
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
function renderChildSync(child, ctx) {
|
|
37
|
+
return renderRenderableSync(child, ctx);
|
|
38
|
+
}
|
|
39
|
+
function renderRenderableSyncToSink(value, sink, ctx) {
|
|
40
|
+
if (value === null || value === void 0 || value === false) return;
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
sink.write(escapeText(value));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (typeof value === "number") {
|
|
46
|
+
sink.write(escapeText(String(value)));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
renderChildrenSyncToSink(value, sink, ctx);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (value && typeof value === "object" && "type" in value) renderNodeSyncToSink(value, sink, ctx);
|
|
54
|
+
}
|
|
55
|
+
function renderChildSyncToSink(child, sink, ctx) {
|
|
56
|
+
renderRenderableSyncToSink(child, sink, ctx);
|
|
57
|
+
}
|
|
58
|
+
function renderChildrenSync(children, ctx) {
|
|
59
|
+
if (!children || !Array.isArray(children) || children.length === 0) return "";
|
|
60
|
+
if (children.length === 1) return renderChildSync(children[0], ctx);
|
|
61
|
+
if (children.length <= 8) {
|
|
62
|
+
let result = "";
|
|
63
|
+
for (const child of children) result += renderChildSync(child, ctx);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
return Array.from({ length: children.length }, (_, index) => renderChildSync(children[index], ctx)).join("");
|
|
67
|
+
}
|
|
68
|
+
function renderErrorBoundaryFallbackValue(fallback, error, reset, ctx) {
|
|
69
|
+
const nextValue = resolveErrorBoundaryFallbackNode(fallback, error, reset);
|
|
70
|
+
return Array.isArray(nextValue) ? renderChildrenSync(normalizeRenderableChildren(nextValue), ctx) : renderChildSync(nextValue, ctx);
|
|
71
|
+
}
|
|
72
|
+
function renderErrorBoundaryFallbackValueToSink(fallback, error, reset, sink, ctx) {
|
|
73
|
+
sink.write(renderErrorBoundaryFallbackValue(fallback, error, reset, ctx));
|
|
74
|
+
}
|
|
75
|
+
function renderChildrenSyncToSink(children, sink, ctx) {
|
|
76
|
+
if (!children || !Array.isArray(children) || children.length === 0) return;
|
|
77
|
+
if (children.length >= 32) {
|
|
78
|
+
for (let i = 0; i < children.length; i++) renderRenderableSyncToSink(children[i], sink, ctx);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
for (let i = 0; i < children.length; i++) renderChildSyncToSink(children[i], sink, ctx);
|
|
82
|
+
}
|
|
83
|
+
function sinkWrite2(sink, a, b) {
|
|
84
|
+
if (typeof sink.write2 === "function") {
|
|
85
|
+
sink.write2(a, b);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
sink.write(a);
|
|
89
|
+
sink.write(b);
|
|
90
|
+
}
|
|
91
|
+
function sinkWrite3(sink, a, b, c) {
|
|
92
|
+
if (typeof sink.write3 === "function") {
|
|
93
|
+
sink.write3(a, b, c);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
sink.write(a);
|
|
97
|
+
sink.write(b);
|
|
98
|
+
sink.write(c);
|
|
99
|
+
}
|
|
100
|
+
function renderNodeSync(node, ctx) {
|
|
101
|
+
const { type, props } = node;
|
|
102
|
+
/* istanbul ignore if - dev-only debug */
|
|
103
|
+
if (__SSR_DEBUG) try {
|
|
104
|
+
logger.warn("[SSR] renderNodeSync type:", typeof type, type);
|
|
105
|
+
} catch {}
|
|
106
|
+
if (typeof type === "function") return renderRenderableSync(inheritRenderableKey(node, executeComponentSync(type, props, ctx)), ctx);
|
|
107
|
+
if (typeof type === "symbol") {
|
|
108
|
+
if (type === Fragment) {
|
|
109
|
+
const childrenArr = getRenderableChildren(node);
|
|
110
|
+
/* istanbul ignore if - dev-only debug */
|
|
111
|
+
if (__SSR_DEBUG) try {
|
|
112
|
+
logger.warn("[SSR] fragment children length:", childrenArr?.length);
|
|
113
|
+
} catch {}
|
|
114
|
+
return renderChildrenSync(childrenArr, ctx);
|
|
115
|
+
}
|
|
116
|
+
if (type === __CONTROL_BOUNDARY__) return renderChildrenSync(evaluateControlBoundaryChildren(node), ctx);
|
|
117
|
+
if (type === __ERROR_BOUNDARY__) {
|
|
118
|
+
const boundaryState = getErrorBoundaryState(node);
|
|
119
|
+
const fallback = props?.fallback;
|
|
120
|
+
const reset = createErrorBoundaryReset(node);
|
|
121
|
+
if (boundaryState?.error != null) return renderErrorBoundaryFallbackValue(fallback, boundaryState.error, reset, ctx);
|
|
122
|
+
try {
|
|
123
|
+
return renderChildrenSync(normalizeRenderableChildren(props?.children), ctx);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
if (boundaryState) {
|
|
126
|
+
boundaryState.error = error;
|
|
127
|
+
boundaryState.notified = true;
|
|
128
|
+
}
|
|
129
|
+
logger.error("[Askr] ErrorBoundary caught render error:", error);
|
|
130
|
+
return renderErrorBoundaryFallbackValue(fallback, error, reset, ctx);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
throw new Error(`renderNodeSync: unsupported VNode symbol type: ${String(type)}`);
|
|
134
|
+
}
|
|
135
|
+
const typeStr = type;
|
|
136
|
+
if (VOID_ELEMENTS.has(typeStr)) return `<${typeStr}${renderAttrs(props)} />`;
|
|
137
|
+
const maybeDangerous = props?.dangerouslySetInnerHTML;
|
|
138
|
+
if (maybeDangerous !== void 0 && maybeDangerous !== null) {
|
|
139
|
+
const { attrs, dangerousHtml } = renderAttrs(props, { returnDangerousHtml: true });
|
|
140
|
+
if (dangerousHtml !== void 0) return `<${typeStr}${attrs}>${dangerousHtml}</${typeStr}>`;
|
|
141
|
+
return `<${typeStr}${attrs}>${renderChildrenSync(getRenderableChildren(node), ctx)}</${typeStr}>`;
|
|
142
|
+
}
|
|
143
|
+
return `<${typeStr}${renderAttrs(props)}>${renderChildrenSync(getRenderableChildren(node), ctx)}</${typeStr}>`;
|
|
144
|
+
}
|
|
145
|
+
function renderNodeSyncToSink(node, sink, ctx) {
|
|
146
|
+
const { type, props } = node;
|
|
147
|
+
if (typeof type === "function") {
|
|
148
|
+
renderRenderableSyncToSink(inheritRenderableKey(node, executeComponentSync(type, props, ctx)), sink, ctx);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (typeof type === "symbol") {
|
|
152
|
+
if (type === Fragment) {
|
|
153
|
+
renderChildrenSyncToSink(getRenderableChildren(node), sink, ctx);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (type === __CONTROL_BOUNDARY__) {
|
|
157
|
+
renderChildrenSyncToSink(evaluateControlBoundaryChildren(node), sink, ctx);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (type === __ERROR_BOUNDARY__) {
|
|
161
|
+
const boundaryState = getErrorBoundaryState(node);
|
|
162
|
+
const fallback = props?.fallback;
|
|
163
|
+
const reset = createErrorBoundaryReset(node);
|
|
164
|
+
if (boundaryState?.error != null) {
|
|
165
|
+
renderErrorBoundaryFallbackValueToSink(fallback, boundaryState.error, reset, sink, ctx);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
renderChildrenSyncToSink(normalizeRenderableChildren(props?.children), sink, ctx);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (boundaryState) {
|
|
172
|
+
boundaryState.error = error;
|
|
173
|
+
boundaryState.notified = true;
|
|
174
|
+
}
|
|
175
|
+
logger.error("[Askr] ErrorBoundary caught render error:", error);
|
|
176
|
+
renderErrorBoundaryFallbackValueToSink(fallback, error, reset, sink, ctx);
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
throw new Error(`renderNodeSyncToSink: unsupported VNode symbol type: ${String(type)}`);
|
|
181
|
+
}
|
|
182
|
+
const typeStr = type;
|
|
183
|
+
if (VOID_ELEMENTS.has(typeStr)) {
|
|
184
|
+
sinkWrite2(sink, "<", typeStr);
|
|
185
|
+
renderAttrsDirect(props, sink);
|
|
186
|
+
sink.write(" />");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const maybeDangerous = props ? props?.dangerouslySetInnerHTML : void 0;
|
|
190
|
+
if (maybeDangerous !== void 0 && maybeDangerous !== null) {
|
|
191
|
+
const dangerousHtml = typeof maybeDangerous === "object" && "__html" in maybeDangerous ? String(maybeDangerous.__html) : void 0;
|
|
192
|
+
sinkWrite2(sink, "<", typeStr);
|
|
193
|
+
renderAttrsDirect(props, sink);
|
|
194
|
+
sink.write(">");
|
|
195
|
+
if (dangerousHtml !== void 0) sink.write(dangerousHtml);
|
|
196
|
+
else renderChildrenSyncToSink(getRenderableChildren(node), sink, ctx);
|
|
197
|
+
sinkWrite3(sink, "</", typeStr, ">");
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const children = getRenderableChildren(node);
|
|
201
|
+
if (!children || Array.isArray(children) && children.length === 0) {
|
|
202
|
+
sinkWrite2(sink, "<", typeStr);
|
|
203
|
+
renderAttrsDirect(props, sink);
|
|
204
|
+
sink.write(">");
|
|
205
|
+
sinkWrite3(sink, "</", typeStr, ">");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (Array.isArray(children) && children.length === 1) {
|
|
209
|
+
const only = children[0];
|
|
210
|
+
if (typeof only === "string") {
|
|
211
|
+
const content = escapeText(only);
|
|
212
|
+
sinkWrite2(sink, "<", typeStr);
|
|
213
|
+
renderAttrsDirect(props, sink);
|
|
214
|
+
sink.write(">");
|
|
215
|
+
sink.write(content);
|
|
216
|
+
sinkWrite3(sink, "</", typeStr, ">");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (typeof only === "number") {
|
|
220
|
+
const content = escapeText(String(only));
|
|
221
|
+
sinkWrite2(sink, "<", typeStr);
|
|
222
|
+
renderAttrsDirect(props, sink);
|
|
223
|
+
sink.write(">");
|
|
224
|
+
sink.write(content);
|
|
225
|
+
sinkWrite3(sink, "</", typeStr, ">");
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
sinkWrite2(sink, "<", typeStr);
|
|
230
|
+
renderAttrsDirect(props, sink);
|
|
231
|
+
sink.write(">");
|
|
232
|
+
renderChildrenSyncToSink(children, sink, ctx);
|
|
233
|
+
sinkWrite3(sink, "</", typeStr, ">");
|
|
234
|
+
}
|
|
235
|
+
function renderToStringSync(component, props, options) {
|
|
236
|
+
const ctx = createRenderContext(options?.seed ?? 12345, { data: options?.data });
|
|
237
|
+
return withRenderContext(ctx, () => {
|
|
238
|
+
startRenderPhase(options?.data ?? null);
|
|
239
|
+
try {
|
|
240
|
+
const node = renderSyncComponentRoot(component, props || {}, ctx);
|
|
241
|
+
if (!node) throw new Error("renderToStringSync: wrapped component returned empty");
|
|
242
|
+
const sink = new StringSink();
|
|
243
|
+
renderNodeSyncToSink(node, sink, ctx);
|
|
244
|
+
sink.write(serializeHydrationRenderData(options?.data));
|
|
245
|
+
sink.end();
|
|
246
|
+
return sink.toString();
|
|
247
|
+
} finally {
|
|
248
|
+
try {
|
|
249
|
+
stopRenderPhase();
|
|
250
|
+
} finally {
|
|
251
|
+
disposeSSRTemporaryOwners(ctx);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
function renderSSRRouteAppToSink(input) {
|
|
257
|
+
const { ctx, data, route, params, sink } = input;
|
|
258
|
+
withRenderContext(ctx, () => {
|
|
259
|
+
startRenderPhase(data || null);
|
|
260
|
+
try {
|
|
261
|
+
renderRenderableSyncToSink(executeComponentSync(route.handler, params, ctx), sink, ctx);
|
|
262
|
+
sink.write(serializeHydrationRenderData(data));
|
|
263
|
+
} finally {
|
|
264
|
+
try {
|
|
265
|
+
stopRenderPhase();
|
|
266
|
+
} finally {
|
|
267
|
+
disposeSSRTemporaryOwners(ctx);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
//#endregion
|
|
273
|
+
export { inheritRenderableKey, renderRenderableSyncToSink, renderSSRRouteAppToSink, renderToStringSync };
|
|
274
|
+
|
|
275
|
+
//# sourceMappingURL=render-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-sync.js","names":[],"sources":["../../src/ssr/render-sync.ts"],"sourcesContent":["import type { JSXElement } from '../common/jsx';\nimport { __CONTROL_BOUNDARY__ } from '../common/control';\nimport type { DOMElement } from '../common/vnode';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport { Fragment } from '../jsx';\nimport { logger } from '../dev/logger';\nimport {\n createRenderContext,\n withRenderContext,\n type RenderContext,\n type SSRData,\n} from './context';\nimport {\n disposeSSRTemporaryOwners,\n executeComponentSync,\n renderSyncComponentRoot,\n type Component,\n} from './component-runtime';\nimport {\n createErrorBoundaryReset,\n evaluateControlBoundaryChildren,\n getErrorBoundaryState,\n getRenderableChildren,\n normalizeRenderableChildren,\n resolveErrorBoundaryFallbackNode,\n} from './boundaries';\nimport { renderAttrs, renderAttrsDirect } from './attrs';\nimport { VOID_ELEMENTS, escapeText } from './escape';\nimport { serializeHydrationRenderData } from './hydration-data';\nimport { startRenderPhase, stopRenderPhase } from './render-keys';\nimport type { RouteAppRenderInput } from './route-render';\nimport { StringSink } from './sink';\nimport type { VNode } from './types';\n\nconst __SSR_DEBUG =\n process.env.NODE_ENV !== 'production' &&\n (process.env.ASKR_SSR_DEBUG === '1' || process.env.ASKR_SSR_DEBUG === 'true');\n\nexport function inheritRenderableKey(\n source: VNode | JSXElement,\n result: VNode | JSXElement\n): VNode | JSXElement {\n const inheritedKey = (source as DOMElement).key;\n if (inheritedKey === undefined || inheritedKey === null) {\n return result;\n }\n\n if (!result || typeof result !== 'object' || !('type' in result)) {\n return result;\n }\n\n const resultVNode = result as DOMElement;\n if (resultVNode.key === undefined || resultVNode.key === null) {\n resultVNode.key = inheritedKey;\n }\n\n if (typeof resultVNode.type === 'string') {\n if (!resultVNode.props) {\n resultVNode.props = {};\n }\n\n if (resultVNode.props['data-key'] === undefined) {\n resultVNode.props['data-key'] = String(inheritedKey);\n }\n }\n\n return result;\n}\n\nfunction renderRenderableSync(value: unknown, ctx: RenderContext): string {\n if (typeof value === 'string') return escapeText(value);\n if (typeof value === 'number') return escapeText(String(value));\n if (value === null || value === undefined || value === false) return '';\n if (Array.isArray(value)) return renderChildrenSync(value, ctx);\n if (value && typeof value === 'object' && 'type' in value) {\n return renderNodeSync(value as VNode, ctx);\n }\n return '';\n}\n\nfunction renderChildSync(child: unknown, ctx: RenderContext): string {\n return renderRenderableSync(child, ctx);\n}\n\nexport function renderRenderableSyncToSink(\n value: unknown,\n sink: {\n write(html: string): void;\n write2?: (a: string, b: string) => void;\n write3?: (a: string, b: string, c: string) => void;\n },\n ctx: RenderContext\n): void {\n if (value === null || value === undefined || value === false) return;\n if (typeof value === 'string') {\n sink.write(escapeText(value));\n return;\n }\n if (typeof value === 'number') {\n sink.write(escapeText(String(value)));\n return;\n }\n if (Array.isArray(value)) {\n renderChildrenSyncToSink(value, sink, ctx);\n return;\n }\n if (value && typeof value === 'object' && 'type' in value) {\n renderNodeSyncToSink(value as VNode, sink, ctx);\n }\n}\n\nfunction renderChildSyncToSink(\n child: unknown,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n renderRenderableSyncToSink(child, sink, ctx);\n}\n\nfunction renderChildrenSync(\n children: unknown[] | undefined,\n ctx: RenderContext\n): string {\n if (!children || !Array.isArray(children) || children.length === 0) return '';\n if (children.length === 1) return renderChildSync(children[0], ctx);\n\n if (children.length <= 8) {\n let result = '';\n for (const child of children) result += renderChildSync(child, ctx);\n return result;\n }\n\n const parts = Array.from({ length: children.length }, (_, index) =>\n renderChildSync(children[index], ctx)\n );\n return parts.join('');\n}\n\nfunction renderErrorBoundaryFallbackValue(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n ctx: RenderContext\n): string {\n const nextValue = resolveErrorBoundaryFallbackNode(fallback, error, reset);\n\n return Array.isArray(nextValue)\n ? renderChildrenSync(normalizeRenderableChildren(nextValue), ctx)\n : renderChildSync(nextValue, ctx);\n}\n\nfunction renderErrorBoundaryFallbackValueToSink(\n fallback: unknown,\n error: unknown,\n reset: () => void,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n sink.write(renderErrorBoundaryFallbackValue(fallback, error, reset, ctx));\n}\n\nfunction renderChildrenSyncToSink(\n children: unknown[] | undefined,\n sink: { write(html: string): void },\n ctx: RenderContext\n): void {\n if (!children || !Array.isArray(children) || children.length === 0) return;\n if (children.length >= 32) {\n for (let i = 0; i < children.length; i++) {\n renderRenderableSyncToSink(children[i], sink, ctx);\n }\n return;\n }\n for (let i = 0; i < children.length; i++) {\n renderChildSyncToSink(children[i], sink, ctx);\n }\n}\n\nfunction sinkWrite2(\n sink: { write(html: string): void; write2?: (a: string, b: string) => void },\n a: string,\n b: string\n): void {\n if (typeof sink.write2 === 'function') {\n sink.write2(a, b);\n return;\n }\n sink.write(a);\n sink.write(b);\n}\n\nfunction sinkWrite3(\n sink: {\n write(html: string): void;\n write3?: (a: string, b: string, c: string) => void;\n },\n a: string,\n b: string,\n c: string\n): void {\n if (typeof sink.write3 === 'function') {\n sink.write3(a, b, c);\n return;\n }\n sink.write(a);\n sink.write(b);\n sink.write(c);\n}\n\nfunction renderNodeSync(node: VNode | JSXElement, ctx: RenderContext): string {\n const { type, props } = node;\n\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] renderNodeSync type:', typeof type, type);\n } catch {}\n }\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n return renderRenderableSync(inheritRenderableKey(node, result), ctx);\n }\n\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n const childrenArr = getRenderableChildren(node);\n /* istanbul ignore if - dev-only debug */\n if (__SSR_DEBUG) {\n try {\n logger.warn('[SSR] fragment children length:', childrenArr?.length);\n } catch {\n // Ignore\n }\n }\n return renderChildrenSync(childrenArr, ctx);\n }\n if (type === __CONTROL_BOUNDARY__) {\n return renderChildrenSync(evaluateControlBoundaryChildren(node), ctx);\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = createErrorBoundaryReset(node);\n\n if (boundaryState?.error != null) {\n return renderErrorBoundaryFallbackValue(\n fallback,\n boundaryState.error,\n reset,\n ctx\n );\n }\n\n try {\n return renderChildrenSync(\n normalizeRenderableChildren(props?.children),\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n return renderErrorBoundaryFallbackValue(fallback, error, reset, ctx);\n }\n }\n throw new Error(\n `renderNodeSync: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n const attrs = renderAttrs(props);\n return `<${typeStr}${attrs} />`;\n }\n\n const maybeDangerous = (\n props as unknown as { dangerouslySetInnerHTML?: unknown }\n )?.dangerouslySetInnerHTML;\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const { attrs, dangerousHtml } = renderAttrs(props, {\n returnDangerousHtml: true,\n });\n if (dangerousHtml !== undefined) {\n return `<${typeStr}${attrs}>${dangerousHtml}</${typeStr}>`;\n }\n const childrenHtml = renderChildrenSync(getRenderableChildren(node), ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n }\n\n const attrs = renderAttrs(props);\n const childrenHtml = renderChildrenSync(getRenderableChildren(node), ctx);\n return `<${typeStr}${attrs}>${childrenHtml}</${typeStr}>`;\n}\n\nfunction renderNodeSyncToSink(\n node: VNode | JSXElement,\n sink: {\n write(html: string): void;\n write2?: (a: string, b: string) => void;\n write3?: (a: string, b: string, c: string) => void;\n },\n ctx: RenderContext\n): void {\n const { type, props } = node;\n\n if (typeof type === 'function') {\n const result = executeComponentSync(type as Component, props, ctx);\n renderRenderableSyncToSink(inheritRenderableKey(node, result), sink, ctx);\n return;\n }\n\n if (typeof type === 'symbol') {\n if (type === Fragment) {\n const childrenArr = getRenderableChildren(node);\n renderChildrenSyncToSink(childrenArr, sink, ctx);\n return;\n }\n if (type === __CONTROL_BOUNDARY__) {\n renderChildrenSyncToSink(\n evaluateControlBoundaryChildren(node),\n sink,\n ctx\n );\n return;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(node);\n const fallback = props?.fallback;\n const reset = createErrorBoundaryReset(node);\n\n if (boundaryState?.error != null) {\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n boundaryState.error,\n reset,\n sink,\n ctx\n );\n return;\n }\n\n try {\n renderChildrenSyncToSink(\n normalizeRenderableChildren(props?.children),\n sink,\n ctx\n );\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n renderErrorBoundaryFallbackValueToSink(\n fallback,\n error,\n reset,\n sink,\n ctx\n );\n }\n return;\n }\n throw new Error(\n `renderNodeSyncToSink: unsupported VNode symbol type: ${String(type)}`\n );\n }\n\n const typeStr = type as string;\n if (VOID_ELEMENTS.has(typeStr)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write(' />');\n return;\n }\n\n const maybeDangerous = props\n ? (props as unknown as { dangerouslySetInnerHTML?: unknown })\n ?.dangerouslySetInnerHTML\n : undefined;\n\n if (maybeDangerous !== undefined && maybeDangerous !== null) {\n const dangerousHtml =\n typeof maybeDangerous === 'object' && '__html' in maybeDangerous\n ? String((maybeDangerous as { __html: unknown }).__html)\n : undefined;\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n if (dangerousHtml !== undefined) {\n sink.write(dangerousHtml);\n } else {\n renderChildrenSyncToSink(getRenderableChildren(node), sink, ctx);\n }\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n const children = getRenderableChildren(node);\n\n if (!children || (Array.isArray(children) && children.length === 0)) {\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n\n if (Array.isArray(children) && children.length === 1) {\n const only = children[0];\n if (typeof only === 'string') {\n const content = escapeText(only);\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n if (typeof only === 'number') {\n const content = escapeText(String(only));\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n sink.write(content);\n sinkWrite3(sink, '</', typeStr, '>');\n return;\n }\n }\n\n sinkWrite2(sink, '<', typeStr);\n renderAttrsDirect(props, sink);\n sink.write('>');\n renderChildrenSyncToSink(children, sink, ctx);\n sinkWrite3(sink, '</', typeStr, '>');\n}\n\nexport function renderToStringSync(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | boolean | null | undefined,\n props?: Record<string, unknown>,\n options?: { seed?: number; data?: SSRData }\n): string {\n const seed = options?.seed ?? 12345;\n const ctx = createRenderContext(seed, { data: options?.data });\n\n return withRenderContext(ctx, () => {\n startRenderPhase(options?.data ?? null);\n try {\n const node = renderSyncComponentRoot(\n component as unknown as Component,\n props || {},\n ctx\n );\n if (!node) {\n throw new Error('renderToStringSync: wrapped component returned empty');\n }\n const sink = new StringSink();\n renderNodeSyncToSink(node, sink, ctx);\n sink.write(serializeHydrationRenderData(options?.data));\n sink.end();\n return sink.toString();\n } finally {\n try {\n stopRenderPhase();\n } finally {\n disposeSSRTemporaryOwners(ctx);\n }\n }\n });\n}\n\nexport function renderSSRRouteAppToSink(input: RouteAppRenderInput): void {\n const { ctx, data, route, params, sink } = input;\n\n withRenderContext(ctx, () => {\n startRenderPhase(data || null);\n try {\n const app = executeComponentSync(\n route.handler as unknown as Component,\n params,\n ctx\n );\n renderRenderableSyncToSink(app, sink, ctx);\n sink.write(serializeHydrationRenderData(data));\n } finally {\n try {\n stopRenderPhase();\n } finally {\n disposeSSRTemporaryOwners(ctx);\n }\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { isPromiseLike } from "../common/promise.js";
|
|
2
|
+
import { _resolveRouteMatchFromRoutes, resolveRouteRequest } from "../router/resolution.js";
|
|
3
|
+
import "../router/route.js";
|
|
4
|
+
import { throwSSRDataMissing } from "./context.js";
|
|
5
|
+
//#region src/ssr/route-policy-resolution.ts
|
|
6
|
+
const MAX_SSR_REDIRECTS = 20;
|
|
7
|
+
function getRouteRequestResultSync(result) {
|
|
8
|
+
if (isPromiseLike(result)) throwSSRDataMissing();
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
function buildDeniedRoute(route, status) {
|
|
12
|
+
return {
|
|
13
|
+
...route,
|
|
14
|
+
handler: () => ({
|
|
15
|
+
type: "div",
|
|
16
|
+
props: { "data-route-denied": String(status) },
|
|
17
|
+
children: [String(status)]
|
|
18
|
+
})
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function routeHasSSRLoader(manifest, route) {
|
|
22
|
+
const routeFallbackPrefix = route.fallbackPrefix;
|
|
23
|
+
return manifest.records.some((record) => {
|
|
24
|
+
const recordFallbackPrefix = record.fallbackPrefix;
|
|
25
|
+
return record.path === route.path && recordFallbackPrefix === routeFallbackPrefix && typeof record.options?.loader === "function";
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function resolvePolicyAwareSSRRoute(opts, routeTable) {
|
|
29
|
+
const manifest = opts.registry?.manifest;
|
|
30
|
+
if (!manifest) {
|
|
31
|
+
const matched = _resolveRouteMatchFromRoutes(new URL(opts.url, "http://localhost").pathname, routeTable);
|
|
32
|
+
if (!matched) throw new Error(`SSR: no route found for url: ${opts.url}`);
|
|
33
|
+
return {
|
|
34
|
+
url: opts.url,
|
|
35
|
+
route: matched.route,
|
|
36
|
+
params: matched.params
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
let href = opts.url;
|
|
40
|
+
const visited = /* @__PURE__ */ new Set();
|
|
41
|
+
for (let redirects = 0; redirects <= MAX_SSR_REDIRECTS; redirects += 1) {
|
|
42
|
+
const matched = _resolveRouteMatchFromRoutes(new URL(href, "http://localhost").pathname, routeTable);
|
|
43
|
+
if (!matched) throw new Error(`SSR: no route found for url: ${href}`);
|
|
44
|
+
const resolved = getRouteRequestResultSync(resolveRouteRequest(href, {
|
|
45
|
+
manifest,
|
|
46
|
+
mode: "ssr"
|
|
47
|
+
}));
|
|
48
|
+
if (resolved === null) throw new Error(`SSR: no route found for url: ${href}`);
|
|
49
|
+
if (resolved.kind === "redirect") {
|
|
50
|
+
const redirectTarget = new URL(resolved.to, "http://localhost");
|
|
51
|
+
const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;
|
|
52
|
+
if (redirectHref === href || visited.has(redirectHref)) throw new Error(`[Askr] SSR redirect cycle detected at ${redirectHref}.`);
|
|
53
|
+
if (redirects >= MAX_SSR_REDIRECTS) throw new Error(`[Askr] SSR redirect limit exceeded (${MAX_SSR_REDIRECTS}).`);
|
|
54
|
+
visited.add(redirectHref);
|
|
55
|
+
href = redirectHref;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (resolved.kind === "deny") return {
|
|
59
|
+
url: href,
|
|
60
|
+
route: buildDeniedRoute(matched.route, resolved.status),
|
|
61
|
+
params: matched.params
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
url: href,
|
|
65
|
+
route: {
|
|
66
|
+
...matched.route,
|
|
67
|
+
handler: routeHasSSRLoader(manifest, matched.route) ? resolved.handler : matched.route.handler
|
|
68
|
+
},
|
|
69
|
+
params: matched.params
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`[Askr] SSR redirect limit exceeded (${MAX_SSR_REDIRECTS}).`);
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { resolvePolicyAwareSSRRoute };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=route-policy-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-policy-resolution.js","names":["RouteModule._resolveRouteMatchFromRoutes","RouteModule.resolveRouteRequest"],"sources":["../../src/ssr/route-policy-resolution.ts"],"sourcesContent":["import { isPromiseLike } from '../common/promise';\nimport type {\n AccessDenyStatus,\n RouteManifest,\n RouteRequestResult,\n} from '../common/router';\nimport * as RouteModule from '../router/route';\nimport { throwSSRDataMissing } from './context';\nimport type { RouteRenderOptions, SSRRoute } from './route-render';\n\nconst MAX_SSR_REDIRECTS = 20;\n\ntype ResolvedPolicyAwareSSRRoute = {\n url: string;\n route: SSRRoute;\n params: Record<string, string>;\n};\n\nfunction getRouteRequestResultSync(\n result: RouteRequestResult | Promise<RouteRequestResult>\n): RouteRequestResult {\n if (isPromiseLike(result)) {\n throwSSRDataMissing();\n }\n\n return result;\n}\n\nfunction buildDeniedRoute(route: SSRRoute, status: AccessDenyStatus): SSRRoute {\n return {\n ...route,\n handler: () => ({\n type: 'div',\n props: {\n 'data-route-denied': String(status),\n },\n children: [String(status)],\n }),\n };\n}\n\nfunction routeHasSSRLoader(manifest: RouteManifest, route: SSRRoute): boolean {\n const routeFallbackPrefix = (route as { fallbackPrefix?: string })\n .fallbackPrefix;\n\n return manifest.records.some((record) => {\n const recordFallbackPrefix = (record as { fallbackPrefix?: string })\n .fallbackPrefix;\n\n return (\n record.path === route.path &&\n recordFallbackPrefix === routeFallbackPrefix &&\n typeof record.options?.loader === 'function'\n );\n });\n}\n\nexport function resolvePolicyAwareSSRRoute(\n opts: RouteRenderOptions,\n routeTable: SSRRoute[]\n): ResolvedPolicyAwareSSRRoute {\n const manifest = opts.registry?.manifest;\n\n if (!manifest) {\n const requestUrl = new URL(opts.url, 'http://localhost');\n const matched = RouteModule._resolveRouteMatchFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n if (!matched) {\n throw new Error(`SSR: no route found for url: ${opts.url}`);\n }\n\n return {\n url: opts.url,\n route: matched.route,\n params: matched.params,\n };\n }\n\n let href = opts.url;\n const visited = new Set<string>();\n\n for (let redirects = 0; redirects <= MAX_SSR_REDIRECTS; redirects += 1) {\n const requestUrl = new URL(href, 'http://localhost');\n const matched = RouteModule._resolveRouteMatchFromRoutes(\n requestUrl.pathname,\n routeTable\n );\n\n if (!matched) {\n throw new Error(`SSR: no route found for url: ${href}`);\n }\n\n const resolved = getRouteRequestResultSync(\n RouteModule.resolveRouteRequest(href, {\n manifest,\n mode: 'ssr',\n })\n );\n\n if (resolved === null) {\n throw new Error(`SSR: no route found for url: ${href}`);\n }\n\n if (resolved.kind === 'redirect') {\n const redirectTarget = new URL(resolved.to, 'http://localhost');\n const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;\n\n if (redirectHref === href || visited.has(redirectHref)) {\n throw new Error(\n `[Askr] SSR redirect cycle detected at ${redirectHref}.`\n );\n }\n\n if (redirects >= MAX_SSR_REDIRECTS) {\n throw new Error(\n `[Askr] SSR redirect limit exceeded (${MAX_SSR_REDIRECTS}).`\n );\n }\n\n visited.add(redirectHref);\n href = redirectHref;\n continue;\n }\n\n if (resolved.kind === 'deny') {\n return {\n url: href,\n route: buildDeniedRoute(matched.route, resolved.status),\n params: matched.params,\n };\n }\n\n return {\n url: href,\n route: {\n ...matched.route,\n handler: routeHasSSRLoader(manifest, matched.route)\n ? resolved.handler\n : matched.route.handler,\n },\n params: matched.params,\n };\n }\n\n throw new Error(`[Askr] SSR redirect limit exceeded (${MAX_SSR_REDIRECTS}).`);\n}\n"],"mappings":";;;;;AAUA,MAAM,oBAAoB;AAQ1B,SAAS,0BACP,QACoB;CACpB,IAAI,cAAc,MAAM,GACtB,oBAAoB;CAGtB,OAAO;AACT;AAEA,SAAS,iBAAiB,OAAiB,QAAoC;CAC7E,OAAO;EACL,GAAG;EACH,gBAAgB;GACd,MAAM;GACN,OAAO,EACL,qBAAqB,OAAO,MAAM,EACpC;GACA,UAAU,CAAC,OAAO,MAAM,CAAC;EAC3B;CACF;AACF;AAEA,SAAS,kBAAkB,UAAyB,OAA0B;CAC5E,MAAM,sBAAuB,MAC1B;CAEH,OAAO,SAAS,QAAQ,MAAM,WAAW;EACvC,MAAM,uBAAwB,OAC3B;EAEH,OACE,OAAO,SAAS,MAAM,QACtB,yBAAyB,uBACzB,OAAO,OAAO,SAAS,WAAW;CAEtC,CAAC;AACH;AAEA,SAAgB,2BACd,MACA,YAC6B;CAC7B,MAAM,WAAW,KAAK,UAAU;CAEhC,IAAI,CAAC,UAAU;EAEb,MAAM,UAAUA,6BACd,IAFqB,IAAI,KAAK,KAAK,kBAEnC,CAAA,CAAW,UACX,UACF;EACA,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,gCAAgC,KAAK,KAAK;EAG5D,OAAO;GACL,KAAK,KAAK;GACV,OAAO,QAAQ;GACf,QAAQ,QAAQ;EAClB;CACF;CAEA,IAAI,OAAO,KAAK;CAChB,MAAM,0BAAU,IAAI,IAAY;CAEhC,KAAK,IAAI,YAAY,GAAG,aAAa,mBAAmB,aAAa,GAAG;EAEtE,MAAM,UAAUA,6BACd,IAFqB,IAAI,MAAM,kBAE/B,CAAA,CAAW,UACX,UACF;EAEA,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,gCAAgC,MAAM;EAGxD,MAAM,WAAW,0BACfC,oBAAgC,MAAM;GACpC;GACA,MAAM;EACR,CAAC,CACH;EAEA,IAAI,aAAa,MACf,MAAM,IAAI,MAAM,gCAAgC,MAAM;EAGxD,IAAI,SAAS,SAAS,YAAY;GAChC,MAAM,iBAAiB,IAAI,IAAI,SAAS,IAAI,kBAAkB;GAC9D,MAAM,eAAe,GAAG,eAAe,WAAW,eAAe,SAAS,eAAe;GAEzF,IAAI,iBAAiB,QAAQ,QAAQ,IAAI,YAAY,GACnD,MAAM,IAAI,MACR,yCAAyC,aAAa,EACxD;GAGF,IAAI,aAAa,mBACf,MAAM,IAAI,MACR,uCAAuC,kBAAkB,GAC3D;GAGF,QAAQ,IAAI,YAAY;GACxB,OAAO;GACP;EACF;EAEA,IAAI,SAAS,SAAS,QACpB,OAAO;GACL,KAAK;GACL,OAAO,iBAAiB,QAAQ,OAAO,SAAS,MAAM;GACtD,QAAQ,QAAQ;EAClB;EAGF,OAAO;GACL,KAAK;GACL,OAAO;IACL,GAAG,QAAQ;IACX,SAAS,kBAAkB,UAAU,QAAQ,KAAK,IAC9C,SAAS,UACT,QAAQ,MAAM;GACpB;GACA,QAAQ,QAAQ;EAClB;CACF;CAEA,MAAM,IAAI,MAAM,uCAAuC,kBAAkB,GAAG;AAC9E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { DocumentRenderer, SSRData } from "../common/ssr.js";
|
|
2
|
+
import { RouteAuthOptions, RouteHandler, RouteManifest, RouteRegistry, RouteRequestResult } from "../common/router.js";
|
|
3
|
+
import { RenderContext } from "./context.js";
|
|
4
|
+
import { RenderSink } from "./sink.js";
|
|
5
|
+
|
|
6
|
+
//#region src/ssr/route-render.d.ts
|
|
7
|
+
type SSRRoute = {
|
|
8
|
+
path: string;
|
|
9
|
+
handler: RouteHandler;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
};
|
|
12
|
+
type SSRRouteSource = {
|
|
13
|
+
registry: RouteRegistry;
|
|
14
|
+
routes?: readonly SSRRoute[];
|
|
15
|
+
} | {
|
|
16
|
+
registry?: RouteRegistry;
|
|
17
|
+
routes: readonly SSRRoute[];
|
|
18
|
+
};
|
|
19
|
+
type RouteRenderOptions = SSRRouteSource & {
|
|
20
|
+
url: string;
|
|
21
|
+
seed?: number;
|
|
22
|
+
data?: SSRData;
|
|
23
|
+
document?: DocumentRenderer;
|
|
24
|
+
};
|
|
25
|
+
type RouteStreamOptions = RouteRenderOptions & {
|
|
26
|
+
onChunk(html: string): void;
|
|
27
|
+
onComplete(): void;
|
|
28
|
+
};
|
|
29
|
+
type RouteAppRenderInput = {
|
|
30
|
+
route: SSRRoute;
|
|
31
|
+
params: Record<string, string>;
|
|
32
|
+
data?: SSRData;
|
|
33
|
+
ctx: RenderContext;
|
|
34
|
+
sink: RenderSink;
|
|
35
|
+
};
|
|
36
|
+
interface RouteRenderHost {
|
|
37
|
+
renderAppToSink(input: RouteAppRenderInput): void;
|
|
38
|
+
}
|
|
39
|
+
declare function resolveRequest(opts: {
|
|
40
|
+
url: string;
|
|
41
|
+
registry: RouteRegistry;
|
|
42
|
+
manifest?: RouteManifest;
|
|
43
|
+
routes?: Array<{
|
|
44
|
+
path: string;
|
|
45
|
+
handler: RouteHandler;
|
|
46
|
+
namespace?: string;
|
|
47
|
+
}>;
|
|
48
|
+
auth?: RouteAuthOptions;
|
|
49
|
+
signal?: AbortSignal;
|
|
50
|
+
} | {
|
|
51
|
+
url: string;
|
|
52
|
+
manifest: RouteManifest;
|
|
53
|
+
registry?: RouteRegistry;
|
|
54
|
+
routes?: Array<{
|
|
55
|
+
path: string;
|
|
56
|
+
handler: RouteHandler;
|
|
57
|
+
namespace?: string;
|
|
58
|
+
}>;
|
|
59
|
+
auth?: RouteAuthOptions;
|
|
60
|
+
signal?: AbortSignal;
|
|
61
|
+
} | {
|
|
62
|
+
url: string;
|
|
63
|
+
manifest?: RouteManifest;
|
|
64
|
+
registry?: RouteRegistry;
|
|
65
|
+
routes: Array<{
|
|
66
|
+
path: string;
|
|
67
|
+
handler: RouteHandler;
|
|
68
|
+
namespace?: string;
|
|
69
|
+
}>;
|
|
70
|
+
auth?: RouteAuthOptions;
|
|
71
|
+
signal?: AbortSignal;
|
|
72
|
+
}): Promise<RouteRequestResult>;
|
|
73
|
+
declare function renderRouteToString(opts: RouteRenderOptions, host: RouteRenderHost): string;
|
|
74
|
+
declare function renderRouteToStream(opts: RouteStreamOptions, host: RouteRenderHost): void;
|
|
75
|
+
//#endregion
|
|
76
|
+
export { RouteAppRenderInput, RouteRenderHost, RouteRenderOptions, RouteStreamOptions, SSRRoute, resolveRequest };
|
|
77
|
+
//# sourceMappingURL=route-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-render.d.ts","names":[],"sources":["../../src/ssr/route-render.ts"],"mappings":";;;;;;KAsBY,QAAA;EACV,IAAA;EACA,OAAA,EAAS,YAAY;EACrB,SAAA;AAAA;AAAA,KAGG,cAAA;EAEC,QAAA,EAAU,aAAA;EACV,MAAA,YAAkB,QAAA;AAAA;EAGlB,QAAA,GAAW,aAAA;EACX,MAAA,WAAiB,QAAA;AAAA;AAAA,KAGX,kBAAA,GAAqB,cAAA;EAC/B,GAAA;EACA,IAAA;EACA,IAAA,GAAO,OAAA;EACP,QAAA,GAAW,gBAAA;AAAA;AAAA,KAGD,kBAAA,GAAqB,kBAAkB;EACjD,OAAA,CAAQ,IAAA;EACR,UAAA;AAAA;AAAA,KAcU,mBAAA;EACV,KAAA,EAAO,QAAA;EACP,MAAA,EAAQ,MAAA;EACR,IAAA,GAAO,OAAA;EACP,GAAA,EAAK,aAAA;EACL,IAAA,EAAM,UAAA;AAAA;AAAA,UAGS,eAAA;EACf,eAAA,CAAgB,KAAA,EAAO,mBAAmB;AAAA;AAAA,iBAGtB,cAAA,CACpB,IAAA;EAEM,GAAA;EACA,QAAA,EAAU,aAAA;EACV,QAAA,GAAW,aAAA;EACX,MAAA,GAAS,KAAA;IACP,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,WAAA;AAAA;EAGT,GAAA;EACA,QAAA,EAAU,aAAA;EACV,QAAA,GAAW,aAAA;EACX,MAAA,GAAS,KAAA;IACP,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,WAAA;AAAA;EAGT,GAAA;EACA,QAAA,GAAW,aAAA;EACX,QAAA,GAAW,aAAA;EACX,MAAA,EAAQ,KAAA;IACN,IAAA;IACA,OAAA,EAAS,YAAA;IACT,SAAA;EAAA;EAEF,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,WAAA;AAAA,IAEd,OAAA,CAAQ,kBAAA;AAAA,iBA2IK,mBAAA,CACd,IAAA,EAAM,kBAAA,EACN,IAAA,EAAM,eAAe;AAAA,iBAQP,mBAAA,CACd,IAAA,EAAM,kBAAA,EACN,IAAA,EAAM,eAAe"}
|