@rangojs/router 0.0.0-experimental.10 → 0.0.0-experimental.100
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 +1037 -4
- package/dist/bin/rango.js +1619 -157
- package/dist/vite/index.js +5762 -2301
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +71 -63
- package/skills/breadcrumbs/SKILL.md +252 -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 +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +367 -71
- package/skills/host-router/SKILL.md +218 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +176 -8
- package/skills/layout/SKILL.md +124 -3
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +474 -47
- package/skills/middleware/SKILL.md +207 -37
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +15 -11
- package/skills/parallel/SKILL.md +272 -1
- package/skills/prerender/SKILL.md +467 -65
- package/skills/rango/SKILL.md +89 -21
- package/skills/response-routes/SKILL.md +152 -91
- package/skills/route/SKILL.md +305 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +333 -86
- package/skills/use-cache/SKILL.md +324 -0
- package/skills/view-transitions/SKILL.md +212 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +136 -68
- 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 +374 -561
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +376 -315
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +152 -24
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -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 -120
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +78 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +99 -0
- package/src/browser/react/use-router.ts +83 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +246 -64
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -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 +158 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +84 -23
- package/src/build/generate-route-types.ts +39 -828
- package/src/build/index.ts +4 -5
- package/src/build/route-trie.ts +85 -32
- 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 -307
- package/src/cache/cf/cf-cache-store.ts +573 -21
- 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 +6 -1
- package/src/client.tsx +118 -302
- 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 +77 -7
- package/src/handle.ts +55 -10
- 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 +65 -45
- package/src/index.rsc.ts +138 -21
- package/src/index.ts +206 -51
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +25 -143
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +159 -13
- package/src/prerender.ts +397 -29
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +231 -121
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +483 -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 +155 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +66 -9
- 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 +418 -86
- package/src/router/intercept-resolution.ts +35 -20
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +359 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +98 -32
- package/src/router/match-api.ts +196 -261
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +441 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +415 -86
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +154 -35
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +373 -371
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +292 -52
- 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 +152 -39
- 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 +756 -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 +1407 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1315
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -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 +111 -39
- package/src/router/types.ts +17 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +642 -2011
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +864 -1114
- package/src/rsc/helpers.ts +181 -19
- 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 +395 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +256 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +360 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +52 -11
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +187 -38
- package/src/server/context.ts +333 -59
- 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 +603 -109
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +107 -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 +764 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +167 -0
- package/src/types.ts +1 -1757
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1282
- package/src/use-loader.tsx +161 -81
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +376 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +486 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -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 -2063
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +98 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +117 -0
- 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 +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +107 -64
- 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 +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +816 -0
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +336 -0
- package/src/vite/plugins/version-injector.ts +109 -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 +497 -0
- package/src/vite/router-discovery.ts +1423 -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/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -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/router.gen.ts +0 -6
- package/src/urls.gen.ts +0 -8
- 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/expose-prerender-handler-id.ts +0 -429
- package/src/vite/package-resolution.ts +0 -125
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { AllUseItems } from "../route-types.js";
|
|
2
|
+
import type { TrailingSlashMode, ResolvedRouteMap } from "./route-config.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Context captured for lazy include evaluation
|
|
6
|
+
*/
|
|
7
|
+
export interface LazyIncludeContext {
|
|
8
|
+
urlPrefix: string;
|
|
9
|
+
namePrefix: string | undefined;
|
|
10
|
+
parent: unknown; // EntryData - avoid circular import
|
|
11
|
+
/** Counter snapshot from pattern extraction for consistent shortCode indices */
|
|
12
|
+
counters?: Record<string, number>;
|
|
13
|
+
cacheProfiles?: Record<
|
|
14
|
+
string,
|
|
15
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
16
|
+
>;
|
|
17
|
+
/** Root scope flag for dot-local reverse resolution */
|
|
18
|
+
rootScoped?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Positional include scope token composed from the parent scope plus this
|
|
21
|
+
* include's sibling index (`${parentScope}I${idx}`). Applied to direct-
|
|
22
|
+
* descendant shortCodes during lazy evaluation so routes inside the
|
|
23
|
+
* include cannot collide with siblings declared outside it.
|
|
24
|
+
*/
|
|
25
|
+
includeScope?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Internal route entry stored in router
|
|
30
|
+
*/
|
|
31
|
+
export interface RouteEntry<TEnv = any> {
|
|
32
|
+
prefix: string;
|
|
33
|
+
/**
|
|
34
|
+
* Pre-computed static prefix for fast short-circuit matching.
|
|
35
|
+
* Extracted from prefix at registration time (everything before first param).
|
|
36
|
+
*
|
|
37
|
+
* Examples:
|
|
38
|
+
* - "/api" -> staticPrefix = "/api"
|
|
39
|
+
* - "/site/:locale" -> staticPrefix = "/site"
|
|
40
|
+
* - "/:locale" -> staticPrefix = "" (empty, can't optimize)
|
|
41
|
+
*
|
|
42
|
+
* At runtime: if staticPrefix && !pathname.startsWith(staticPrefix), skip entry.
|
|
43
|
+
*/
|
|
44
|
+
staticPrefix: string;
|
|
45
|
+
/**
|
|
46
|
+
* Route patterns map. For lazy entries, this starts as empty and is
|
|
47
|
+
* populated on first request.
|
|
48
|
+
*/
|
|
49
|
+
routes: ResolvedRouteMap<any>;
|
|
50
|
+
/**
|
|
51
|
+
* Trailing slash config per route key
|
|
52
|
+
* If not specified for a route, defaults to pattern-based detection
|
|
53
|
+
*/
|
|
54
|
+
trailingSlash?: Record<string, TrailingSlashMode>;
|
|
55
|
+
/**
|
|
56
|
+
* Supported handler shapes:
|
|
57
|
+
* - sync: () => Array<AllUseItems>
|
|
58
|
+
* - lazy import: () => Promise<{ default: () => Array<AllUseItems> }>
|
|
59
|
+
* - lazy function: () => Promise<() => Array<AllUseItems>>
|
|
60
|
+
*
|
|
61
|
+
* Direct Promise<Array> is NOT supported and rejected at runtime.
|
|
62
|
+
*/
|
|
63
|
+
handler: () =>
|
|
64
|
+
| Array<AllUseItems>
|
|
65
|
+
| Promise<{ default: () => Array<AllUseItems> }>
|
|
66
|
+
| Promise<() => Array<AllUseItems>>;
|
|
67
|
+
mountIndex: number;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Router ID that owns this entry. Used to namespace the manifest cache
|
|
71
|
+
* so multi-router setups (host routing) don't share cached EntryData
|
|
72
|
+
* across routers with overlapping mountIndex + routeKey combinations.
|
|
73
|
+
*/
|
|
74
|
+
routerId?: string;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Route keys in this entry that have pre-render handlers.
|
|
78
|
+
* Used by the non-trie match path to set the `pr` flag.
|
|
79
|
+
*/
|
|
80
|
+
prerenderRouteKeys?: Set<string>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Route keys in this entry that are wrapped with `Passthrough()`.
|
|
84
|
+
* Used by the non-trie match path to set the `pt` flag.
|
|
85
|
+
*/
|
|
86
|
+
passthroughRouteKeys?: Set<string>;
|
|
87
|
+
|
|
88
|
+
// === Lazy evaluation fields ===
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Whether this entry is lazily evaluated.
|
|
92
|
+
* When true, routes are populated on first matching request.
|
|
93
|
+
*/
|
|
94
|
+
lazy?: boolean;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* For lazy entries: the UrlPatterns to evaluate
|
|
98
|
+
*/
|
|
99
|
+
lazyPatterns?: unknown;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* For lazy entries: captured context at definition time
|
|
103
|
+
*/
|
|
104
|
+
lazyContext?: LazyIncludeContext;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* For lazy entries: whether patterns have been evaluated
|
|
108
|
+
*/
|
|
109
|
+
lazyEvaluated?: boolean;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Cache profiles for DSL-time cache("profileName") resolution.
|
|
113
|
+
* Set on all entries (lazy and non-lazy) so loadManifest() can
|
|
114
|
+
* propagate them into the HelperContext Store.
|
|
115
|
+
*/
|
|
116
|
+
cacheProfiles?: Record<
|
|
117
|
+
string,
|
|
118
|
+
import("../cache/profile-registry.js").CacheProfile
|
|
119
|
+
>;
|
|
120
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ErrorInfo, NotFoundInfo } from "./boundaries.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* CSS class(es) for a ViewTransition phase.
|
|
6
|
+
* Can be a simple string or an object mapping transition types to class names
|
|
7
|
+
* for direction-aware transitions (e.g., { "navigation": "slide-right", "navigation-back": "slide-left" }).
|
|
8
|
+
*/
|
|
9
|
+
export type ViewTransitionClass = Record<string, string> | string;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for React's <ViewTransition> component.
|
|
13
|
+
* Maps directly to ViewTransitionProps (minus children/ref/callbacks).
|
|
14
|
+
*/
|
|
15
|
+
export interface TransitionConfig {
|
|
16
|
+
enter?: ViewTransitionClass;
|
|
17
|
+
exit?: ViewTransitionClass;
|
|
18
|
+
update?: ViewTransitionClass;
|
|
19
|
+
share?: ViewTransitionClass;
|
|
20
|
+
default?: ViewTransitionClass;
|
|
21
|
+
name?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Resolved segment with component
|
|
26
|
+
*
|
|
27
|
+
* Segment types:
|
|
28
|
+
* - layout: Wraps child content via <Outlet />
|
|
29
|
+
* - route: The leaf content for a URL
|
|
30
|
+
* - parallel: Named slots rendered via <ParallelOutlet name="@slot" />
|
|
31
|
+
* - loader: Data segment (no visual rendering, carries loaderData)
|
|
32
|
+
* - error: Error fallback segment (replaces failed segment with error UI)
|
|
33
|
+
* - notFound: Not found fallback segment (replaces segment when data not found)
|
|
34
|
+
*
|
|
35
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
36
|
+
*/
|
|
37
|
+
export interface ResolvedSegment {
|
|
38
|
+
id: string;
|
|
39
|
+
namespace: string; // Optional namespace for segment (used for parallel groups)
|
|
40
|
+
type: "layout" | "route" | "parallel" | "loader" | "error" | "notFound";
|
|
41
|
+
index: number;
|
|
42
|
+
component: ReactNode; // Component, handler promise, or resolved element
|
|
43
|
+
loading?: ReactNode; // Loading component for this segment (shown during navigation)
|
|
44
|
+
transition?: TransitionConfig; // ViewTransition config for this segment
|
|
45
|
+
layout?: ReactNode; // Layout element to wrap content (used by intercept segments)
|
|
46
|
+
params?: Record<string, string>;
|
|
47
|
+
slot?: string; // For parallel segments: '@sidebar', '@modal', etc.
|
|
48
|
+
belongsToRoute?: boolean; // True if segment belongs to the matched route (route itself + its children)
|
|
49
|
+
layoutName?: string; // For layouts: the layout name identifier
|
|
50
|
+
parallelName?: string; // For parallels: the parallel group name (used to match with revalidations)
|
|
51
|
+
// Loader-specific fields
|
|
52
|
+
loaderId?: string; // For loaders: the loader $$id identifier
|
|
53
|
+
_inherited?: boolean; // For inherited loaders: dedup marker for buildMatchResult
|
|
54
|
+
loaderData?: any; // For loaders: the resolved data from loader execution
|
|
55
|
+
parallelLoading?: ReactNode; // For parallel-owned loaders: the parallel's loading fallback
|
|
56
|
+
// Intercept loader fields (for streaming loader data in parallel segments)
|
|
57
|
+
loaderDataPromise?: Promise<any[]> | any[]; // Loader data promise or resolved array
|
|
58
|
+
loaderIds?: string[]; // IDs ($$id) of loaders for this segment
|
|
59
|
+
// Error-specific fields
|
|
60
|
+
error?: ErrorInfo; // For error segments: the error information
|
|
61
|
+
// NotFound-specific fields
|
|
62
|
+
notFoundInfo?: NotFoundInfo; // For notFound segments: the not found information
|
|
63
|
+
// Mount path from include() scope, used for MountContext.Provider wrapping
|
|
64
|
+
mountPath?: string;
|
|
65
|
+
/**
|
|
66
|
+
* @internal Server-side marker: true when the segment's handler actually ran
|
|
67
|
+
* this request (not skipped via the revalidate cache path). Used by
|
|
68
|
+
* match-result.ts to populate `MatchResult.resolvedIds` for client-side
|
|
69
|
+
* handle-bucket cleanup. Stripped from the wire payload before serialization
|
|
70
|
+
* — never reaches the client.
|
|
71
|
+
*/
|
|
72
|
+
_handlerRan?: boolean;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Segment metadata (without component)
|
|
77
|
+
*
|
|
78
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
79
|
+
*/
|
|
80
|
+
export interface SegmentMetadata {
|
|
81
|
+
id: string;
|
|
82
|
+
type: "layout" | "route" | "parallel" | "loader" | "error" | "notFound";
|
|
83
|
+
index: number;
|
|
84
|
+
params?: Record<string, string>;
|
|
85
|
+
slot?: string;
|
|
86
|
+
loaderId?: string;
|
|
87
|
+
error?: ErrorInfo;
|
|
88
|
+
notFoundInfo?: NotFoundInfo;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Note: route symbols are now defined in route-definition.ts
|
|
92
|
+
// as properties on the route() function
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* State of a named slot (e.g., @modal, @sidebar)
|
|
96
|
+
* Used for intercepting routes where slots render alternative content
|
|
97
|
+
*
|
|
98
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
99
|
+
*/
|
|
100
|
+
export interface SlotState {
|
|
101
|
+
/**
|
|
102
|
+
* Whether the slot is currently active (has content to render)
|
|
103
|
+
*/
|
|
104
|
+
active: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Segments for this slot when active
|
|
107
|
+
*/
|
|
108
|
+
segments?: ResolvedSegment[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Props passed to the root layout component
|
|
113
|
+
*/
|
|
114
|
+
export interface RootLayoutProps {
|
|
115
|
+
children: ReactNode;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Router match result
|
|
120
|
+
*
|
|
121
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
122
|
+
*/
|
|
123
|
+
export interface MatchResult {
|
|
124
|
+
segments: ResolvedSegment[];
|
|
125
|
+
matched: string[];
|
|
126
|
+
diff: string[];
|
|
127
|
+
/**
|
|
128
|
+
* Every segment id whose handler actually ran on the server this request,
|
|
129
|
+
* including ones with `component === null` that get filtered out of
|
|
130
|
+
* `segments`/`diff` to avoid wasted bytes. Drives the client's handle-
|
|
131
|
+
* cleanup pass — a slot that re-resolves and pushes nothing must clear
|
|
132
|
+
* its previous handle bucket, but `diff` doesn't carry it because the
|
|
133
|
+
* segment payload doesn't either. A superset of `diff`.
|
|
134
|
+
*/
|
|
135
|
+
resolvedIds: string[];
|
|
136
|
+
/**
|
|
137
|
+
* Merged route params from all matched segments
|
|
138
|
+
* Available for use by the handler after route matching
|
|
139
|
+
*/
|
|
140
|
+
params: Record<string, string>;
|
|
141
|
+
/**
|
|
142
|
+
* The matched route name (includes name prefix from include()).
|
|
143
|
+
* Used by ctx.reverse() for local name resolution.
|
|
144
|
+
*/
|
|
145
|
+
routeName?: string;
|
|
146
|
+
/**
|
|
147
|
+
* State of named slots for this route match
|
|
148
|
+
* Key is slot name (e.g., "@modal"), value is slot state
|
|
149
|
+
* Slots are used for intercepting routes during soft navigation
|
|
150
|
+
*/
|
|
151
|
+
slots?: Record<string, SlotState>;
|
|
152
|
+
/**
|
|
153
|
+
* Redirect URL for trailing slash normalization.
|
|
154
|
+
* When set, the RSC handler should return a 308 redirect to this URL
|
|
155
|
+
* instead of rendering the page.
|
|
156
|
+
*/
|
|
157
|
+
redirect?: string;
|
|
158
|
+
/**
|
|
159
|
+
* Route-level middleware collected from the matched entry tree.
|
|
160
|
+
* These run with the same onion-style execution as app-level middleware,
|
|
161
|
+
* wrapping the entire RSC response creation.
|
|
162
|
+
*/
|
|
163
|
+
routeMiddleware?: Array<{
|
|
164
|
+
handler: import("../router/middleware.js").MiddlewareFn;
|
|
165
|
+
params: Record<string, string>;
|
|
166
|
+
}>;
|
|
167
|
+
}
|