@rangojs/router 0.0.0-experimental.32 → 0.0.0-experimental.3232cd17
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/AGENTS.md +4 -0
- package/README.md +198 -44
- package/dist/bin/rango.js +287 -105
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3248 -1117
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +73 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +107 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +245 -21
- package/skills/caching/SKILL.md +302 -6
- package/skills/composability/SKILL.md +27 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +270 -30
- package/skills/host-router/SKILL.md +82 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +49 -5
- package/skills/layout/SKILL.md +35 -9
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +294 -30
- package/skills/middleware/SKILL.md +52 -13
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +203 -7
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +250 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +122 -47
- package/skills/route/SKILL.md +97 -5
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +36 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +86 -147
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +148 -19
- package/src/browser/navigation-client.ts +187 -67
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +76 -67
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/partial-update.ts +123 -94
- package/src/browser/prefetch/cache.ts +214 -36
- package/src/browser/prefetch/fetch.ts +260 -38
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +126 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +93 -11
- package/src/browser/react/NavigationProvider.tsx +115 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +49 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +166 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +22 -5
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +52 -1
- package/src/browser/rsc-router.tsx +215 -76
- package/src/browser/scroll-restoration.ts +46 -39
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +176 -50
- package/src/browser/types.ts +95 -11
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +137 -32
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +278 -96
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-policy.ts +68 -28
- package/src/cache/cache-runtime.ts +149 -43
- package/src/cache/cache-scope.ts +148 -81
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2550 -93
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +78 -27
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +6 -30
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +0 -16
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +33 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +799 -0
- package/src/client.rsc.tsx +6 -21
- package/src/client.tsx +108 -290
- package/src/component-utils.ts +19 -0
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +70 -22
- package/src/handles/MetaTags.tsx +0 -14
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/handles/meta.ts +0 -39
- package/src/host/cookie-handler.ts +0 -36
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +7 -50
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +52 -26
- package/src/index.ts +100 -38
- package/src/internal-debug.ts +2 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +198 -82
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +437 -274
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +113 -37
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +52 -10
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +7 -17
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +108 -9
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +45 -22
- package/src/router/handler-context.ts +83 -41
- package/src/router/intercept-resolution.ts +25 -23
- package/src/router/lazy-includes.ts +19 -53
- package/src/router/loader-resolution.ts +213 -30
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +49 -45
- package/src/router/match-api.ts +120 -204
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +27 -6
- package/src/router/match-middleware/cache-lookup.ts +205 -249
- package/src/router/match-middleware/cache-store.ts +45 -32
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +104 -40
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +173 -143
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +109 -63
- package/src/router/prerender-match.ts +190 -54
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +63 -55
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +6 -28
- package/src/router/router-interfaces.ts +100 -35
- package/src/router/router-options.ts +91 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +242 -75
- package/src/router/segment-resolution/helpers.ts +63 -24
- package/src/router/segment-resolution/loader-cache.ts +41 -37
- package/src/router/segment-resolution/revalidation.ts +456 -372
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +4 -1
- package/src/router/segment-wrappers.ts +2 -3
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +0 -20
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/trie-matching.ts +91 -46
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +134 -43
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +492 -383
- package/src/rsc/helpers.ts +162 -46
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +30 -3
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +90 -63
- package/src/rsc/rsc-rendering.ts +56 -54
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +74 -67
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +25 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +272 -129
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +309 -61
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +26 -24
- package/src/server/loader-registry.ts +10 -28
- package/src/server/request-context.ts +338 -126
- package/src/ssr/index.tsx +23 -15
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +0 -52
- package/src/theme/ThemeScript.tsx +0 -6
- package/src/theme/constants.ts +0 -12
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +0 -14
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +233 -81
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +37 -14
- package/src/urls/include-helper.ts +33 -70
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +58 -11
- package/src/urls/path-helper.ts +57 -111
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +346 -89
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +192 -99
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +51 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin-types.ts +187 -69
- package/src/vite/plugins/cjs-to-esm.ts +8 -18
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +11 -50
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
- package/src/vite/plugins/expose-internal-ids.ts +554 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +21 -25
- package/src/vite/plugins/version-plugin.ts +41 -20
- package/src/vite/plugins/virtual-entries.ts +2 -17
- package/src/vite/rango.ts +257 -289
- package/src/vite/router-discovery.ts +930 -140
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +27 -29
- package/src/vite/utils/shared-utils.ts +92 -42
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/router/middleware-cookies.ts +0 -55
package/src/router/manifest.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Router Manifest Loading
|
|
3
|
-
*
|
|
4
|
-
* Handles lazy loading and validation of route manifests.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
1
|
import { invariant, RouteNotFoundError } from "../errors";
|
|
8
2
|
import { createRouteHelpers } from "../route-definition";
|
|
9
3
|
import {
|
|
10
4
|
getContext,
|
|
11
5
|
runWithPrefixes,
|
|
6
|
+
getIsolatedLazyParent,
|
|
12
7
|
type EntryData,
|
|
13
8
|
type MetricsStore,
|
|
14
9
|
} from "../server/context";
|
|
15
10
|
import MapRootLayout from "../server/root-layout";
|
|
11
|
+
import { joinPrefix } from "./pattern-matching.js";
|
|
16
12
|
import type { RouteEntry } from "../types";
|
|
17
13
|
import type { UrlPatterns } from "../urls";
|
|
18
14
|
import { VERSION } from "@rangojs/router:version";
|
|
@@ -22,20 +18,19 @@ import { VERSION } from "@rangojs/router:version";
|
|
|
22
18
|
// stable references), so the resulting EntryData tree can be safely cached and reused
|
|
23
19
|
// across requests within the same isolate.
|
|
24
20
|
//
|
|
25
|
-
// Cache is keyed by (VERSION, mountIndex, routeKey, isSSR).
|
|
21
|
+
// Cache is keyed by (VERSION, routerId, mountIndex, routeKey, isSSR). routeKey is
|
|
22
|
+
// REQUIRED in the key: loadManifest() runs the handler with forRoute=routeKey, and
|
|
23
|
+
// path-helper.ts prunes (skips registering) every route except forRoute, so the
|
|
24
|
+
// resulting Store.manifest is pruned to the requested route — NOT the full include.
|
|
25
|
+
// Dropping routeKey would make a sibling route miss and overwrite this entry with its
|
|
26
|
+
// own pruned manifest, so alternating sibling requests would thrash (re-run the
|
|
27
|
+
// handler every time). Running the include handler once per isolate instead of once
|
|
28
|
+
// per route is possible but needs an unpruned manifest cache with prune-on-read — see
|
|
29
|
+
// LP1 in docs/internal/matching-and-lazy-discovery.md. VERSION comes from the
|
|
26
30
|
// @rangojs/router:version virtual module which Vite invalidates on RSC module HMR.
|
|
27
31
|
// When VERSION changes, this module re-evaluates and the cache is recreated empty.
|
|
28
|
-
// Including VERSION in the key is additional defense against stale entries.
|
|
29
32
|
const manifestModuleCache = new Map<string, Map<string, EntryData>>();
|
|
30
33
|
|
|
31
|
-
/**
|
|
32
|
-
* Load manifest from route entry with AsyncLocalStorage context
|
|
33
|
-
* Handles lazy imports, unwrapping, and validation
|
|
34
|
-
*
|
|
35
|
-
* Results are cached at module level after first execution. Subsequent calls
|
|
36
|
-
* for the same (routeKey, isSSR) within the same isolate return cached data
|
|
37
|
-
* without re-executing the DSL handler.
|
|
38
|
-
*/
|
|
39
34
|
/**
|
|
40
35
|
* Clear the module-level manifest cache.
|
|
41
36
|
* Called on HMR to ensure stale handler references are discarded.
|
|
@@ -64,8 +59,12 @@ export async function loadManifest(
|
|
|
64
59
|
|
|
65
60
|
const mountIndex = entry.mountIndex;
|
|
66
61
|
|
|
67
|
-
// Check module-level cache (persists across requests within same isolate)
|
|
68
|
-
|
|
62
|
+
// Check module-level cache (persists across requests within same isolate).
|
|
63
|
+
// Include routerId so multi-router setups (host routing) don't share cached
|
|
64
|
+
// EntryData across routers with overlapping mountIndex + routeKey combinations.
|
|
65
|
+
// routeKey is in the key because loadManifest() builds a manifest pruned to
|
|
66
|
+
// forRoute=routeKey (see path-helper.ts) — see the cache comment above.
|
|
67
|
+
const cacheKey = `${VERSION}:${entry.routerId ?? ""}:${mountIndex ?? ""}:${routeKey}:${isSSR ? 1 : 0}`;
|
|
69
68
|
const cached = manifestModuleCache.get(cacheKey);
|
|
70
69
|
if (cached) {
|
|
71
70
|
const cacheStart = performance.now();
|
|
@@ -85,20 +84,15 @@ export async function loadManifest(
|
|
|
85
84
|
const storeSetupStart = performance.now();
|
|
86
85
|
const Store = getContext().getOrCreateStore(routeKey);
|
|
87
86
|
|
|
88
|
-
// Set mount index in store for unique shortCode prefixes
|
|
89
87
|
Store.mountIndex = mountIndex;
|
|
90
|
-
|
|
91
|
-
// Set isSSR flag so loading() can check if we're in SSR
|
|
92
88
|
Store.isSSR = isSSR;
|
|
93
89
|
|
|
94
|
-
// Attach metrics store to context if provided
|
|
95
90
|
if (metricsStore) {
|
|
96
91
|
Store.metrics = metricsStore;
|
|
97
92
|
}
|
|
98
93
|
|
|
99
94
|
pushMetric?.("manifest:store-setup", storeSetupStart);
|
|
100
95
|
|
|
101
|
-
// Clear manifest before rebuilding to prevent stale entry mutations
|
|
102
96
|
const clearStart = performance.now();
|
|
103
97
|
Store.manifest.clear();
|
|
104
98
|
pushMetric?.("manifest:clear", clearStart);
|
|
@@ -112,36 +106,48 @@ export async function loadManifest(
|
|
|
112
106
|
// This ensures routes are registered under the correct layout hierarchy
|
|
113
107
|
const lazyContext =
|
|
114
108
|
entry.lazy && entry.lazyPatterns ? entry.lazyContext : null;
|
|
115
|
-
const parentForContext =
|
|
116
|
-
(
|
|
109
|
+
const parentForContext = lazyContext
|
|
110
|
+
? getIsolatedLazyParent(
|
|
111
|
+
(lazyContext.parent as EntryData | null) ?? Store.parent,
|
|
112
|
+
)
|
|
113
|
+
: Store.parent;
|
|
117
114
|
|
|
118
115
|
// For lazy entries, merge captured counters from include() so the
|
|
119
116
|
// handler's entries get shortCode indices after sibling entries that
|
|
120
117
|
// were created during pattern extraction. This prevents shortCode
|
|
121
118
|
// collisions between lazy and non-lazy entries under the same parent
|
|
122
119
|
// (e.g., ArticlesLayout and BlogLayout both under NavLayout).
|
|
123
|
-
if (lazyContext
|
|
124
|
-
const
|
|
125
|
-
for (const [key, value] of Object.entries(captured)) {
|
|
120
|
+
if (lazyContext?.counters) {
|
|
121
|
+
for (const [key, value] of Object.entries(lazyContext.counters)) {
|
|
126
122
|
Store.counters[key] = Math.max(Store.counters[key] ?? 0, value);
|
|
127
123
|
}
|
|
128
124
|
}
|
|
129
125
|
|
|
130
126
|
// Propagate cache profiles for DSL-time cache("profileName") resolution.
|
|
131
127
|
// Non-lazy entries carry profiles directly; lazy entries carry them
|
|
132
|
-
// in the captured lazyContext from include() time.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
128
|
+
// in the captured lazyContext from include() time. Always write
|
|
129
|
+
// (including clearing to undefined) so a prior lazy build's profile
|
|
130
|
+
// map cannot leak into a later non-lazy build on the same ALS-backed
|
|
131
|
+
// Store — which would otherwise let cache("name") resolve a profile
|
|
132
|
+
// from an unrelated entry.
|
|
133
|
+
Store.cacheProfiles = entry.cacheProfiles ?? lazyContext?.cacheProfiles;
|
|
138
134
|
|
|
139
135
|
// Propagate rootScoped from lazyContext so that routes inside
|
|
140
136
|
// nested { name: "sub" } under { name: "" } keep inherited root scope
|
|
141
|
-
// when the manifest is rebuilt on each request.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
// when the manifest is rebuilt on each request. Always write
|
|
138
|
+
// (including clearing to undefined, which makes getRootScoped()
|
|
139
|
+
// return its true default) so a prior lazy build's scope cannot leak
|
|
140
|
+
// into a later non-lazy build on the same ALS-backed Store — which
|
|
141
|
+
// would otherwise mis-register plain routes as non-root-scoped and
|
|
142
|
+
// break dot-local reverse resolution.
|
|
143
|
+
Store.rootScoped = lazyContext?.rootScoped;
|
|
144
|
+
|
|
145
|
+
// Propagate includeScope from lazyContext so that direct-descendant
|
|
146
|
+
// shortCodes of this include use the correct scoped counter namespace
|
|
147
|
+
// on every manifest rebuild. Always write (including clearing to
|
|
148
|
+
// undefined) so a prior lazy build's scope cannot leak into a later
|
|
149
|
+
// non-lazy build on the same ALS-backed Store.
|
|
150
|
+
Store.includeScope = lazyContext?.includeScope;
|
|
145
151
|
|
|
146
152
|
const handlerExecStart = performance.now();
|
|
147
153
|
const useItems = await getContext().runWithStore(
|
|
@@ -161,7 +167,10 @@ export async function loadManifest(
|
|
|
161
167
|
if (entry.lazy && entry.lazyPatterns) {
|
|
162
168
|
const lazyPatterns = entry.lazyPatterns as UrlPatterns<any>;
|
|
163
169
|
const includePrefix = (entry as any)._lazyPrefix || "";
|
|
164
|
-
|
|
170
|
+
// Slash-collapsing join so a trailing-slash parent prefix does not
|
|
171
|
+
// bake a double slash into the registered route patterns (must match
|
|
172
|
+
// the same join in evaluateLazyEntry / the build-time runWithPrefixes).
|
|
173
|
+
const fullPrefix = joinPrefix(lazyContext?.urlPrefix, includePrefix);
|
|
165
174
|
|
|
166
175
|
if (fullPrefix || lazyContext?.namePrefix) {
|
|
167
176
|
return runWithPrefixes(fullPrefix, lazyContext?.namePrefix, () =>
|
|
@@ -171,20 +180,16 @@ export async function loadManifest(
|
|
|
171
180
|
return lazyPatterns.handler();
|
|
172
181
|
}
|
|
173
182
|
|
|
174
|
-
// Wrap handler execution in root layout so routes get correct parent
|
|
175
|
-
// This ensures all routes are registered with the layout as their parent
|
|
176
183
|
let promiseResult: Promise<any> | null = null;
|
|
177
184
|
const wrappedItems = helpers.layout(MapRootLayout, () => {
|
|
178
185
|
const result = entry.handler();
|
|
179
186
|
if (result instanceof Promise) {
|
|
180
|
-
// Lazy handler detected - capture promise for async handling
|
|
181
187
|
promiseResult = result;
|
|
182
|
-
return [];
|
|
188
|
+
return [];
|
|
183
189
|
}
|
|
184
190
|
return result;
|
|
185
191
|
});
|
|
186
192
|
|
|
187
|
-
// Handle lazy (Promise-based) handlers
|
|
188
193
|
if (promiseResult !== null) {
|
|
189
194
|
const load = await (promiseResult as Promise<any>);
|
|
190
195
|
if (
|
|
@@ -218,7 +223,6 @@ export async function loadManifest(
|
|
|
218
223
|
);
|
|
219
224
|
}
|
|
220
225
|
|
|
221
|
-
// Inline handler - routes were registered with correct parent inside layout
|
|
222
226
|
return [wrappedItems].flat(3);
|
|
223
227
|
},
|
|
224
228
|
);
|