@rangojs/router 0.0.0-experimental.7 → 0.0.0-experimental.70
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 +9 -0
- package/README.md +942 -4
- package/dist/bin/rango.js +1689 -0
- package/dist/vite/index.js +4951 -930
- package/package.json +70 -60
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +334 -72
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +92 -31
- package/skills/loader/SKILL.md +404 -44
- package/skills/middleware/SKILL.md +173 -34
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +204 -1
- package/skills/prerender/SKILL.md +685 -0
- package/skills/rango/SKILL.md +85 -16
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +257 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +328 -89
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +296 -558
- package/src/browser/navigation-client.ts +179 -69
- package/src/browser/navigation-store.ts +73 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -313
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +230 -74
- package/src/browser/react/NavigationProvider.tsx +87 -11
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -126
- package/src/browser/react/use-href.tsx +2 -2
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +76 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +214 -58
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +141 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +235 -24
- package/src/build/generate-route-types.ts +39 -0
- package/src/build/index.ts +13 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -309
- package/src/cache/cf/cf-cache-store.ts +571 -17
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +105 -179
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +108 -2
- package/src/handle.ts +55 -29
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +119 -29
- package/src/index.rsc.ts +155 -19
- package/src/index.ts +223 -30
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +26 -157
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/reverse.ts +351 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +982 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +434 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +149 -0
- package/src/route-definition.ts +1 -1428
- package/src/route-map-builder.ts +217 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -8
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +435 -86
- package/src/router/intercept-resolution.ts +402 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +356 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +154 -35
- package/src/router/match-api.ts +555 -0
- package/src/router/match-context.ts +5 -3
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +459 -10
- package/src/router/match-middleware/cache-store.ts +98 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +55 -33
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +220 -0
- package/src/router/middleware.ts +324 -369
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +211 -43
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +743 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1373 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +78 -3
- package/src/router.ts +740 -4252
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +907 -797
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +391 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +246 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +356 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +46 -11
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +315 -58
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +607 -81
- package/src/server.ts +35 -130
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +791 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +210 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1623
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +346 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +116 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -802
- package/src/use-loader.tsx +161 -81
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +348 -0
- package/src/vite/discovery/prerender-collection.ts +439 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +15 -1129
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +786 -0
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +23 -14
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +462 -0
- package/src/vite/router-discovery.ts +918 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +207 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/href-context.ts +0 -33
- package/src/href.ts +0 -255
- package/src/server/route-manifest-cache.ts +0 -173
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
2
|
+
import {
|
|
3
|
+
requireRequestContext,
|
|
4
|
+
getRequestContext,
|
|
5
|
+
_getRequestContext,
|
|
6
|
+
} from "../server/request-context.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create a soft redirect Response for middleware short-circuit
|
|
10
|
+
*
|
|
11
|
+
* Returns a Response that signals a client-side navigation to the target URL.
|
|
12
|
+
* Unlike Response.redirect() which causes a full page reload, this redirect
|
|
13
|
+
* is handled by the router for SPA-style navigation.
|
|
14
|
+
*
|
|
15
|
+
* Supports an optional state parameter to carry location state through the
|
|
16
|
+
* redirect. On the target page, state can be read via useLocationState()
|
|
17
|
+
* (use { flash: true } in createLocationState for read-once flash messages).
|
|
18
|
+
*
|
|
19
|
+
* @param url - The URL to redirect to
|
|
20
|
+
* @param statusOrOptions - HTTP status code (default: 302) or options object
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Simple redirect
|
|
25
|
+
* middleware((ctx, next) => {
|
|
26
|
+
* if (!ctx.get('user')) {
|
|
27
|
+
* return redirect('/login');
|
|
28
|
+
* }
|
|
29
|
+
* next();
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* // Redirect with state
|
|
33
|
+
* return redirect('/dashboard', {
|
|
34
|
+
* state: [Flash({ text: "Item saved!" })],
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Redirect with custom status and state
|
|
38
|
+
* return redirect('/login', {
|
|
39
|
+
* status: 303,
|
|
40
|
+
* state: [Flash({ text: "Session expired" })],
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function redirect(url: string, status?: number): Response;
|
|
45
|
+
export function redirect(
|
|
46
|
+
url: string,
|
|
47
|
+
options: {
|
|
48
|
+
status?: number;
|
|
49
|
+
state?: LocationStateEntry | LocationStateEntry[];
|
|
50
|
+
},
|
|
51
|
+
): Response;
|
|
52
|
+
export function redirect(
|
|
53
|
+
url: string,
|
|
54
|
+
statusOrOptions?:
|
|
55
|
+
| number
|
|
56
|
+
| { status?: number; state?: LocationStateEntry | LocationStateEntry[] },
|
|
57
|
+
): Response {
|
|
58
|
+
const status =
|
|
59
|
+
typeof statusOrOptions === "number"
|
|
60
|
+
? statusOrOptions
|
|
61
|
+
: (statusOrOptions?.status ?? 302);
|
|
62
|
+
const state =
|
|
63
|
+
typeof statusOrOptions === "object" ? statusOrOptions?.state : undefined;
|
|
64
|
+
|
|
65
|
+
if (state) {
|
|
66
|
+
const ctx = requireRequestContext();
|
|
67
|
+
ctx.setLocationState(state);
|
|
68
|
+
|
|
69
|
+
if (process.env.NODE_ENV !== "production") {
|
|
70
|
+
const reqCtx = getRequestContext();
|
|
71
|
+
// Warn only on true full-page SSR loads. SPA partial requests and server
|
|
72
|
+
// actions both deliver state through Flight payloads, so suppress for those.
|
|
73
|
+
if (
|
|
74
|
+
reqCtx &&
|
|
75
|
+
!reqCtx.originalUrl.searchParams.has("_rsc_partial") &&
|
|
76
|
+
!reqCtx.request.headers.has("rsc-action") &&
|
|
77
|
+
!reqCtx.originalUrl.searchParams.has("_rsc_action")
|
|
78
|
+
) {
|
|
79
|
+
console.warn(
|
|
80
|
+
`[Router] redirect() with state during a full-page (SSR) request to "${url}". ` +
|
|
81
|
+
"Location state is only delivered during SPA navigations and will be lost on this request.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Auto-prefix root-relative URLs with basename for app-local redirects.
|
|
88
|
+
const bn = _getRequestContext()?._basename;
|
|
89
|
+
let resolvedUrl = url;
|
|
90
|
+
if (bn && url.startsWith("/") && !url.startsWith(bn + "/") && url !== bn) {
|
|
91
|
+
resolvedUrl = url === "/" ? bn : bn + url;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return new Response(null, {
|
|
95
|
+
status,
|
|
96
|
+
headers: {
|
|
97
|
+
Location: resolvedUrl,
|
|
98
|
+
"X-RSC-Redirect": "soft",
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { AllUseItems } from "../route-types.js";
|
|
2
|
+
import { isPrerenderHandler, isPassthroughHandler } from "../prerender.js";
|
|
3
|
+
import { isStaticHandler } from "../static-handler.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extract the .use callback from any handler shape.
|
|
7
|
+
*
|
|
8
|
+
* Checks definition brands first (objects with __brand), then plain functions.
|
|
9
|
+
* ReactNode handlers return undefined (no .use possible).
|
|
10
|
+
*/
|
|
11
|
+
export function resolveHandlerUse(handler: unknown): (() => any[]) | undefined {
|
|
12
|
+
if (handler == null) return undefined;
|
|
13
|
+
|
|
14
|
+
// Check branded definitions first — they're objects but also have typeof "object"
|
|
15
|
+
if (isPassthroughHandler(handler)) {
|
|
16
|
+
return (handler as any).use;
|
|
17
|
+
}
|
|
18
|
+
if (isPrerenderHandler(handler)) {
|
|
19
|
+
return (handler as any).use;
|
|
20
|
+
}
|
|
21
|
+
if (isStaticHandler(handler)) {
|
|
22
|
+
return (handler as any).use;
|
|
23
|
+
}
|
|
24
|
+
// Plain handler function
|
|
25
|
+
if (typeof handler === "function") {
|
|
26
|
+
return (handler as any).use;
|
|
27
|
+
}
|
|
28
|
+
// ReactNode or other — no .use
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Allowed item types per mount site.
|
|
34
|
+
* Mirrors the RouteUseItem / ParallelUseItem / InterceptUseItem / LayoutUseItem unions
|
|
35
|
+
* from route-types.ts for runtime validation.
|
|
36
|
+
*/
|
|
37
|
+
const MOUNT_SITE_ALLOWED_TYPES: Record<string, Set<string>> = {
|
|
38
|
+
path: new Set([
|
|
39
|
+
"layout",
|
|
40
|
+
"parallel",
|
|
41
|
+
"intercept",
|
|
42
|
+
"middleware",
|
|
43
|
+
"revalidate",
|
|
44
|
+
"loader",
|
|
45
|
+
"loading",
|
|
46
|
+
"errorBoundary",
|
|
47
|
+
"notFoundBoundary",
|
|
48
|
+
"cache",
|
|
49
|
+
"transition",
|
|
50
|
+
]),
|
|
51
|
+
// Response routes (path.json, path.text, etc.) — mirrors ResponseRouteUseItem
|
|
52
|
+
response: new Set(["middleware", "cache"]),
|
|
53
|
+
route: new Set([
|
|
54
|
+
"layout",
|
|
55
|
+
"parallel",
|
|
56
|
+
"intercept",
|
|
57
|
+
"middleware",
|
|
58
|
+
"revalidate",
|
|
59
|
+
"loader",
|
|
60
|
+
"loading",
|
|
61
|
+
"errorBoundary",
|
|
62
|
+
"notFoundBoundary",
|
|
63
|
+
"cache",
|
|
64
|
+
"transition",
|
|
65
|
+
]),
|
|
66
|
+
// layout allows AllUseItems — no validation needed, but included for completeness
|
|
67
|
+
layout: new Set([
|
|
68
|
+
"layout",
|
|
69
|
+
"route",
|
|
70
|
+
"middleware",
|
|
71
|
+
"revalidate",
|
|
72
|
+
"parallel",
|
|
73
|
+
"intercept",
|
|
74
|
+
"loader",
|
|
75
|
+
"loading",
|
|
76
|
+
"errorBoundary",
|
|
77
|
+
"notFoundBoundary",
|
|
78
|
+
"cache",
|
|
79
|
+
"transition",
|
|
80
|
+
"include",
|
|
81
|
+
]),
|
|
82
|
+
parallel: new Set([
|
|
83
|
+
"revalidate",
|
|
84
|
+
"loader",
|
|
85
|
+
"loading",
|
|
86
|
+
"errorBoundary",
|
|
87
|
+
"notFoundBoundary",
|
|
88
|
+
"transition",
|
|
89
|
+
]),
|
|
90
|
+
intercept: new Set([
|
|
91
|
+
"middleware",
|
|
92
|
+
"revalidate",
|
|
93
|
+
"loader",
|
|
94
|
+
"loading",
|
|
95
|
+
"errorBoundary",
|
|
96
|
+
"notFoundBoundary",
|
|
97
|
+
"layout",
|
|
98
|
+
"route",
|
|
99
|
+
"when",
|
|
100
|
+
"transition",
|
|
101
|
+
]),
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Validate that items from handler.use() are valid for the given mount site.
|
|
106
|
+
* Throws a descriptive error if any item is not allowed.
|
|
107
|
+
*/
|
|
108
|
+
export function validateHandlerUseItems(
|
|
109
|
+
items: AllUseItems[],
|
|
110
|
+
mountSite: string,
|
|
111
|
+
): void {
|
|
112
|
+
const allowed = MOUNT_SITE_ALLOWED_TYPES[mountSite];
|
|
113
|
+
if (!allowed) return;
|
|
114
|
+
for (const item of items) {
|
|
115
|
+
if (item == null) continue;
|
|
116
|
+
if (!allowed.has((item as any).type)) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
`handler.use() returned ${(item as any).type}() which is not valid inside ${mountSite}(). ` +
|
|
119
|
+
`Allowed types: ${[...allowed].join(", ")}.`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Create a merged use callback from handler.use and explicit use.
|
|
127
|
+
* handler.use items come first (defaults), explicit items second (overrides).
|
|
128
|
+
* Returns undefined if both are absent.
|
|
129
|
+
*/
|
|
130
|
+
export function mergeHandlerUse(
|
|
131
|
+
handlerUse: (() => any[]) | undefined,
|
|
132
|
+
explicitUse: (() => any[]) | undefined,
|
|
133
|
+
mountSite: string,
|
|
134
|
+
): (() => any[]) | undefined {
|
|
135
|
+
if (!handlerUse && !explicitUse) return undefined;
|
|
136
|
+
if (!handlerUse) return explicitUse;
|
|
137
|
+
if (!explicitUse) {
|
|
138
|
+
return () => {
|
|
139
|
+
const items = handlerUse().flat(3);
|
|
140
|
+
validateHandlerUseItems(items, mountSite);
|
|
141
|
+
return items;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return () => {
|
|
145
|
+
const hItems = handlerUse().flat(3);
|
|
146
|
+
validateHandlerUseItems(hItems, mountSite);
|
|
147
|
+
return [...hItems, ...explicitUse()];
|
|
148
|
+
};
|
|
149
|
+
}
|