@rangojs/router 0.0.0-experimental.0f44aca1

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.
Files changed (305) hide show
  1. package/AGENTS.md +5 -0
  2. package/README.md +899 -0
  3. package/dist/bin/rango.js +1601 -0
  4. package/dist/vite/index.js +5214 -0
  5. package/package.json +176 -0
  6. package/skills/breadcrumbs/SKILL.md +250 -0
  7. package/skills/cache-guide/SKILL.md +262 -0
  8. package/skills/caching/SKILL.md +220 -0
  9. package/skills/composability/SKILL.md +172 -0
  10. package/skills/debug-manifest/SKILL.md +112 -0
  11. package/skills/document-cache/SKILL.md +182 -0
  12. package/skills/fonts/SKILL.md +167 -0
  13. package/skills/hooks/SKILL.md +704 -0
  14. package/skills/host-router/SKILL.md +218 -0
  15. package/skills/intercept/SKILL.md +313 -0
  16. package/skills/layout/SKILL.md +310 -0
  17. package/skills/links/SKILL.md +239 -0
  18. package/skills/loader/SKILL.md +596 -0
  19. package/skills/middleware/SKILL.md +339 -0
  20. package/skills/mime-routes/SKILL.md +128 -0
  21. package/skills/parallel/SKILL.md +305 -0
  22. package/skills/prerender/SKILL.md +643 -0
  23. package/skills/rango/SKILL.md +118 -0
  24. package/skills/response-routes/SKILL.md +411 -0
  25. package/skills/route/SKILL.md +385 -0
  26. package/skills/router-setup/SKILL.md +439 -0
  27. package/skills/tailwind/SKILL.md +129 -0
  28. package/skills/theme/SKILL.md +79 -0
  29. package/skills/typesafety/SKILL.md +623 -0
  30. package/skills/use-cache/SKILL.md +324 -0
  31. package/src/__internal.ts +273 -0
  32. package/src/bin/rango.ts +321 -0
  33. package/src/browser/action-coordinator.ts +97 -0
  34. package/src/browser/action-response-classifier.ts +99 -0
  35. package/src/browser/event-controller.ts +899 -0
  36. package/src/browser/history-state.ts +80 -0
  37. package/src/browser/index.ts +18 -0
  38. package/src/browser/intercept-utils.ts +52 -0
  39. package/src/browser/link-interceptor.ts +141 -0
  40. package/src/browser/logging.ts +55 -0
  41. package/src/browser/merge-segment-loaders.ts +134 -0
  42. package/src/browser/navigation-bridge.ts +645 -0
  43. package/src/browser/navigation-client.ts +215 -0
  44. package/src/browser/navigation-store.ts +806 -0
  45. package/src/browser/navigation-transaction.ts +295 -0
  46. package/src/browser/network-error-handler.ts +61 -0
  47. package/src/browser/partial-update.ts +550 -0
  48. package/src/browser/prefetch/cache.ts +146 -0
  49. package/src/browser/prefetch/fetch.ts +135 -0
  50. package/src/browser/prefetch/observer.ts +65 -0
  51. package/src/browser/prefetch/policy.ts +42 -0
  52. package/src/browser/prefetch/queue.ts +88 -0
  53. package/src/browser/rango-state.ts +112 -0
  54. package/src/browser/react/Link.tsx +360 -0
  55. package/src/browser/react/NavigationProvider.tsx +386 -0
  56. package/src/browser/react/ScrollRestoration.tsx +94 -0
  57. package/src/browser/react/context.ts +59 -0
  58. package/src/browser/react/filter-segment-order.ts +11 -0
  59. package/src/browser/react/index.ts +52 -0
  60. package/src/browser/react/location-state-shared.ts +162 -0
  61. package/src/browser/react/location-state.ts +107 -0
  62. package/src/browser/react/mount-context.ts +37 -0
  63. package/src/browser/react/nonce-context.ts +23 -0
  64. package/src/browser/react/shallow-equal.ts +27 -0
  65. package/src/browser/react/use-action.ts +218 -0
  66. package/src/browser/react/use-client-cache.ts +58 -0
  67. package/src/browser/react/use-handle.ts +162 -0
  68. package/src/browser/react/use-href.tsx +40 -0
  69. package/src/browser/react/use-link-status.ts +135 -0
  70. package/src/browser/react/use-mount.ts +31 -0
  71. package/src/browser/react/use-navigation.ts +99 -0
  72. package/src/browser/react/use-params.ts +65 -0
  73. package/src/browser/react/use-pathname.ts +47 -0
  74. package/src/browser/react/use-router.ts +63 -0
  75. package/src/browser/react/use-search-params.ts +56 -0
  76. package/src/browser/react/use-segments.ts +171 -0
  77. package/src/browser/response-adapter.ts +73 -0
  78. package/src/browser/rsc-router.tsx +431 -0
  79. package/src/browser/scroll-restoration.ts +400 -0
  80. package/src/browser/segment-reconciler.ts +216 -0
  81. package/src/browser/segment-structure-assert.ts +83 -0
  82. package/src/browser/server-action-bridge.ts +667 -0
  83. package/src/browser/shallow.ts +40 -0
  84. package/src/browser/types.ts +538 -0
  85. package/src/browser/validate-redirect-origin.ts +29 -0
  86. package/src/build/generate-manifest.ts +438 -0
  87. package/src/build/generate-route-types.ts +36 -0
  88. package/src/build/index.ts +35 -0
  89. package/src/build/route-trie.ts +265 -0
  90. package/src/build/route-types/ast-helpers.ts +25 -0
  91. package/src/build/route-types/ast-route-extraction.ts +98 -0
  92. package/src/build/route-types/codegen.ts +102 -0
  93. package/src/build/route-types/include-resolution.ts +411 -0
  94. package/src/build/route-types/param-extraction.ts +48 -0
  95. package/src/build/route-types/per-module-writer.ts +128 -0
  96. package/src/build/route-types/router-processing.ts +469 -0
  97. package/src/build/route-types/scan-filter.ts +78 -0
  98. package/src/build/runtime-discovery.ts +231 -0
  99. package/src/cache/background-task.ts +34 -0
  100. package/src/cache/cache-key-utils.ts +44 -0
  101. package/src/cache/cache-policy.ts +125 -0
  102. package/src/cache/cache-runtime.ts +338 -0
  103. package/src/cache/cache-scope.ts +382 -0
  104. package/src/cache/cf/cf-cache-store.ts +540 -0
  105. package/src/cache/cf/index.ts +25 -0
  106. package/src/cache/document-cache.ts +369 -0
  107. package/src/cache/handle-capture.ts +81 -0
  108. package/src/cache/handle-snapshot.ts +41 -0
  109. package/src/cache/index.ts +43 -0
  110. package/src/cache/memory-segment-store.ts +328 -0
  111. package/src/cache/profile-registry.ts +73 -0
  112. package/src/cache/read-through-swr.ts +134 -0
  113. package/src/cache/segment-codec.ts +256 -0
  114. package/src/cache/taint.ts +98 -0
  115. package/src/cache/types.ts +342 -0
  116. package/src/client.rsc.tsx +85 -0
  117. package/src/client.tsx +601 -0
  118. package/src/component-utils.ts +76 -0
  119. package/src/components/DefaultDocument.tsx +27 -0
  120. package/src/context-var.ts +86 -0
  121. package/src/debug.ts +243 -0
  122. package/src/default-error-boundary.tsx +88 -0
  123. package/src/deps/browser.ts +8 -0
  124. package/src/deps/html-stream-client.ts +2 -0
  125. package/src/deps/html-stream-server.ts +2 -0
  126. package/src/deps/rsc.ts +10 -0
  127. package/src/deps/ssr.ts +2 -0
  128. package/src/errors.ts +365 -0
  129. package/src/handle.ts +135 -0
  130. package/src/handles/MetaTags.tsx +246 -0
  131. package/src/handles/breadcrumbs.ts +66 -0
  132. package/src/handles/index.ts +7 -0
  133. package/src/handles/meta.ts +264 -0
  134. package/src/host/cookie-handler.ts +165 -0
  135. package/src/host/errors.ts +97 -0
  136. package/src/host/index.ts +53 -0
  137. package/src/host/pattern-matcher.ts +214 -0
  138. package/src/host/router.ts +352 -0
  139. package/src/host/testing.ts +79 -0
  140. package/src/host/types.ts +146 -0
  141. package/src/host/utils.ts +25 -0
  142. package/src/href-client.ts +222 -0
  143. package/src/index.rsc.ts +233 -0
  144. package/src/index.ts +277 -0
  145. package/src/internal-debug.ts +11 -0
  146. package/src/loader.rsc.ts +89 -0
  147. package/src/loader.ts +64 -0
  148. package/src/network-error-thrower.tsx +23 -0
  149. package/src/outlet-context.ts +15 -0
  150. package/src/outlet-provider.tsx +45 -0
  151. package/src/prerender/param-hash.ts +37 -0
  152. package/src/prerender/store.ts +185 -0
  153. package/src/prerender.ts +463 -0
  154. package/src/reverse.ts +330 -0
  155. package/src/root-error-boundary.tsx +289 -0
  156. package/src/route-content-wrapper.tsx +196 -0
  157. package/src/route-definition/dsl-helpers.ts +934 -0
  158. package/src/route-definition/helper-factories.ts +200 -0
  159. package/src/route-definition/helpers-types.ts +430 -0
  160. package/src/route-definition/index.ts +52 -0
  161. package/src/route-definition/redirect.ts +93 -0
  162. package/src/route-definition.ts +1 -0
  163. package/src/route-map-builder.ts +275 -0
  164. package/src/route-name.ts +53 -0
  165. package/src/route-types.ts +259 -0
  166. package/src/router/content-negotiation.ts +116 -0
  167. package/src/router/debug-manifest.ts +72 -0
  168. package/src/router/error-handling.ts +287 -0
  169. package/src/router/find-match.ts +158 -0
  170. package/src/router/handler-context.ts +451 -0
  171. package/src/router/intercept-resolution.ts +395 -0
  172. package/src/router/lazy-includes.ts +234 -0
  173. package/src/router/loader-resolution.ts +420 -0
  174. package/src/router/logging.ts +248 -0
  175. package/src/router/manifest.ts +267 -0
  176. package/src/router/match-api.ts +620 -0
  177. package/src/router/match-context.ts +266 -0
  178. package/src/router/match-handlers.ts +440 -0
  179. package/src/router/match-middleware/background-revalidation.ts +223 -0
  180. package/src/router/match-middleware/cache-lookup.ts +634 -0
  181. package/src/router/match-middleware/cache-store.ts +295 -0
  182. package/src/router/match-middleware/index.ts +81 -0
  183. package/src/router/match-middleware/intercept-resolution.ts +306 -0
  184. package/src/router/match-middleware/segment-resolution.ts +192 -0
  185. package/src/router/match-pipelines.ts +179 -0
  186. package/src/router/match-result.ts +219 -0
  187. package/src/router/metrics.ts +282 -0
  188. package/src/router/middleware-cookies.ts +55 -0
  189. package/src/router/middleware-types.ts +222 -0
  190. package/src/router/middleware.ts +748 -0
  191. package/src/router/pattern-matching.ts +563 -0
  192. package/src/router/prerender-match.ts +402 -0
  193. package/src/router/preview-match.ts +170 -0
  194. package/src/router/revalidation.ts +289 -0
  195. package/src/router/router-context.ts +316 -0
  196. package/src/router/router-interfaces.ts +452 -0
  197. package/src/router/router-options.ts +592 -0
  198. package/src/router/router-registry.ts +24 -0
  199. package/src/router/segment-resolution/fresh.ts +570 -0
  200. package/src/router/segment-resolution/helpers.ts +263 -0
  201. package/src/router/segment-resolution/loader-cache.ts +198 -0
  202. package/src/router/segment-resolution/revalidation.ts +1239 -0
  203. package/src/router/segment-resolution/static-store.ts +67 -0
  204. package/src/router/segment-resolution.ts +21 -0
  205. package/src/router/segment-wrappers.ts +289 -0
  206. package/src/router/telemetry-otel.ts +299 -0
  207. package/src/router/telemetry.ts +300 -0
  208. package/src/router/timeout.ts +148 -0
  209. package/src/router/trie-matching.ts +239 -0
  210. package/src/router/types.ts +170 -0
  211. package/src/router.ts +1002 -0
  212. package/src/rsc/handler-context.ts +45 -0
  213. package/src/rsc/handler.ts +1089 -0
  214. package/src/rsc/helpers.ts +198 -0
  215. package/src/rsc/index.ts +36 -0
  216. package/src/rsc/loader-fetch.ts +209 -0
  217. package/src/rsc/manifest-init.ts +86 -0
  218. package/src/rsc/nonce.ts +32 -0
  219. package/src/rsc/origin-guard.ts +141 -0
  220. package/src/rsc/progressive-enhancement.ts +379 -0
  221. package/src/rsc/response-error.ts +37 -0
  222. package/src/rsc/response-route-handler.ts +347 -0
  223. package/src/rsc/rsc-rendering.ts +235 -0
  224. package/src/rsc/runtime-warnings.ts +42 -0
  225. package/src/rsc/server-action.ts +348 -0
  226. package/src/rsc/ssr-setup.ts +128 -0
  227. package/src/rsc/types.ts +263 -0
  228. package/src/search-params.ts +230 -0
  229. package/src/segment-system.tsx +454 -0
  230. package/src/server/context.ts +591 -0
  231. package/src/server/cookie-store.ts +190 -0
  232. package/src/server/fetchable-loader-store.ts +37 -0
  233. package/src/server/handle-store.ts +308 -0
  234. package/src/server/loader-registry.ts +133 -0
  235. package/src/server/request-context.ts +914 -0
  236. package/src/server/root-layout.tsx +10 -0
  237. package/src/server/tsconfig.json +14 -0
  238. package/src/server.ts +51 -0
  239. package/src/ssr/index.tsx +365 -0
  240. package/src/static-handler.ts +114 -0
  241. package/src/theme/ThemeProvider.tsx +297 -0
  242. package/src/theme/ThemeScript.tsx +61 -0
  243. package/src/theme/constants.ts +62 -0
  244. package/src/theme/index.ts +48 -0
  245. package/src/theme/theme-context.ts +44 -0
  246. package/src/theme/theme-script.ts +155 -0
  247. package/src/theme/types.ts +182 -0
  248. package/src/theme/use-theme.ts +44 -0
  249. package/src/types/boundaries.ts +158 -0
  250. package/src/types/cache-types.ts +198 -0
  251. package/src/types/error-types.ts +192 -0
  252. package/src/types/global-namespace.ts +100 -0
  253. package/src/types/handler-context.ts +687 -0
  254. package/src/types/index.ts +88 -0
  255. package/src/types/loader-types.ts +183 -0
  256. package/src/types/route-config.ts +170 -0
  257. package/src/types/route-entry.ts +102 -0
  258. package/src/types/segments.ts +148 -0
  259. package/src/types.ts +1 -0
  260. package/src/urls/include-helper.ts +197 -0
  261. package/src/urls/index.ts +53 -0
  262. package/src/urls/path-helper-types.ts +339 -0
  263. package/src/urls/path-helper.ts +329 -0
  264. package/src/urls/pattern-types.ts +95 -0
  265. package/src/urls/response-types.ts +106 -0
  266. package/src/urls/type-extraction.ts +372 -0
  267. package/src/urls/urls-function.ts +98 -0
  268. package/src/urls.ts +1 -0
  269. package/src/use-loader.tsx +354 -0
  270. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  271. package/src/vite/discovery/discover-routers.ts +344 -0
  272. package/src/vite/discovery/prerender-collection.ts +385 -0
  273. package/src/vite/discovery/route-types-writer.ts +258 -0
  274. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  275. package/src/vite/discovery/state.ts +110 -0
  276. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  277. package/src/vite/index.ts +16 -0
  278. package/src/vite/plugin-types.ts +131 -0
  279. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  280. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  281. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  282. package/src/vite/plugins/expose-action-id.ts +365 -0
  283. package/src/vite/plugins/expose-id-utils.ts +287 -0
  284. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  285. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  286. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  287. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  288. package/src/vite/plugins/expose-ids/types.ts +45 -0
  289. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  290. package/src/vite/plugins/refresh-cmd.ts +65 -0
  291. package/src/vite/plugins/use-cache-transform.ts +323 -0
  292. package/src/vite/plugins/version-injector.ts +83 -0
  293. package/src/vite/plugins/version-plugin.ts +254 -0
  294. package/src/vite/plugins/version.d.ts +12 -0
  295. package/src/vite/plugins/virtual-entries.ts +123 -0
  296. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  297. package/src/vite/rango.ts +510 -0
  298. package/src/vite/router-discovery.ts +785 -0
  299. package/src/vite/utils/ast-handler-extract.ts +517 -0
  300. package/src/vite/utils/banner.ts +36 -0
  301. package/src/vite/utils/bundle-analysis.ts +137 -0
  302. package/src/vite/utils/manifest-utils.ts +70 -0
  303. package/src/vite/utils/package-resolution.ts +121 -0
  304. package/src/vite/utils/prerender-utils.ts +189 -0
  305. package/src/vite/utils/shared-utils.ts +169 -0
@@ -0,0 +1,452 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import type { SerializedManifest } from "../debug.js";
3
+ import type { ReverseFunction } from "../reverse.js";
4
+ import type { UrlPatterns } from "../urls.js";
5
+ import type { EntryData } from "../server/context";
6
+ import type { ErrorInfo, MatchResult } from "../types";
7
+ import type { NonceProvider } from "../rsc/types.js";
8
+ import type { ExecutionContext } from "../server/request-context.js";
9
+ import type {
10
+ SerializedSegmentData,
11
+ SegmentHandleData,
12
+ } from "../cache/types.js";
13
+ import type { MiddlewareEntry, MiddlewareFn } from "./middleware.js";
14
+ import { RSC_ROUTER_BRAND } from "./router-registry.js";
15
+ import type { RSCRouterOptions, RootLayoutProps } from "./router-options.js";
16
+ import type { DefaultVars } from "../types/global-namespace.js";
17
+ import type { ResolvedTimeouts, OnTimeoutCallback } from "./timeout.js";
18
+
19
+ /**
20
+ * Options passed to router.fetch(), router.match(), and other request entrypoints.
21
+ * All entrypoints use this same shape for consistency.
22
+ */
23
+ export interface RouterRequestInput<TEnv, TVars = DefaultVars> {
24
+ env?: TEnv;
25
+ vars?: Partial<TVars>;
26
+ ctx?: ExecutionContext;
27
+ }
28
+
29
+ /**
30
+ * Merge route patterns with response types into a single route map.
31
+ * Routes with response types get { path, response } objects; others stay as strings.
32
+ * Handles both plain string routes and { path, search } object routes.
33
+ */
34
+ type MergeRoutesWithResponses<
35
+ TRoutes extends Record<string, unknown>,
36
+ TResponses,
37
+ > = {
38
+ [K in keyof TRoutes]: K extends keyof NonNullable<TResponses>
39
+ ? unknown extends NonNullable<TResponses>[K]
40
+ ? TRoutes[K] // RSC route — TData defaults to unknown, keep as-is
41
+ : TRoutes[K] extends { readonly path: infer P extends string }
42
+ ? TRoutes[K] & { readonly response: NonNullable<TResponses>[K] }
43
+ : {
44
+ readonly path: TRoutes[K] & string;
45
+ readonly response: NonNullable<TResponses>[K];
46
+ }
47
+ : TRoutes[K];
48
+ };
49
+
50
+ /**
51
+ * Public RSC Router interface — the user-facing API surface.
52
+ *
53
+ * Users interact with this type when building and using routers.
54
+ * Internal framework code uses RSCRouterInternal (via toInternal()) to access
55
+ * matching, build-time, and configuration members that are not part of the
56
+ * public contract.
57
+ *
58
+ * TRoutes accumulates all registered route types through the builder chain.
59
+ */
60
+ export interface RSCRouter<
61
+ TEnv = any,
62
+ TRoutes extends Record<string, unknown> = Record<string, string>,
63
+ > {
64
+ /**
65
+ * Unique identifier for this router instance.
66
+ * Used to namespace static output and isolate route maps between routers.
67
+ */
68
+ readonly id: string;
69
+
70
+ /**
71
+ * Register routes using URL patterns from urls()
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * createRouter({})
76
+ * .routes(urlpatterns)
77
+ * ```
78
+ */
79
+ routes<T extends UrlPatterns<TEnv, any>>(
80
+ patterns: T,
81
+ ): RSCRouter<
82
+ TEnv,
83
+ TRoutes &
84
+ (NonNullable<T["_routes"]> extends Record<string, unknown>
85
+ ? MergeRoutesWithResponses<NonNullable<T["_routes"]>, T["_responses"]>
86
+ : Record<string, string>)
87
+ >;
88
+
89
+ /**
90
+ * Add global middleware that runs on all routes
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * createRouter({ document: RootLayout })
95
+ * .use(loggerMiddleware) // All routes
96
+ * .use("/api/*", rateLimiter) // Pattern match
97
+ * .routes(urlpatterns)
98
+ * ```
99
+ */
100
+ use(
101
+ patternOrMiddleware: string | MiddlewareFn<TEnv>,
102
+ middleware?: MiddlewareFn<TEnv>,
103
+ ): RSCRouter<TEnv, TRoutes>;
104
+
105
+ /**
106
+ * Type-safe URL builder for registered routes
107
+ * Types are inferred from the accumulated route registrations
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * router.reverse("cart"); // "/shop/cart"
112
+ * router.reverse("detail", { slug: "widget" }); // "/shop/product/widget"
113
+ * ```
114
+ */
115
+ reverse: ReverseFunction<TRoutes>;
116
+
117
+ /**
118
+ * Accumulated route map for typeof extraction
119
+ * Used for module augmentation: `type AppRoutes = typeof _router.routeMap`
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const _router = createRouter<AppEnv>({
124
+ * urls: urlpatterns,
125
+ * });
126
+ *
127
+ * type AppRoutes = typeof _router.routeMap;
128
+ *
129
+ * declare global {
130
+ * namespace RSCRouter {
131
+ * interface RegisteredRoutes extends AppRoutes {}
132
+ * }
133
+ * }
134
+ * ```
135
+ */
136
+ readonly routeMap: TRoutes;
137
+
138
+ /**
139
+ * Handle an RSC request.
140
+ *
141
+ * Uses the router's configuration (nonce, version, cache) automatically.
142
+ * The handler is lazily created on first call.
143
+ *
144
+ * @example Cloudflare Workers
145
+ * ```tsx
146
+ * import { router } from "./router";
147
+ *
148
+ * export default { fetch: router.fetch };
149
+ * ```
150
+ *
151
+ * @example Direct export
152
+ * ```tsx
153
+ * const router = createRouter({
154
+ * document: Document,
155
+ * urls: urlpatterns,
156
+ * nonce: () => true,
157
+ * });
158
+ *
159
+ * export const fetch = router.fetch;
160
+ * ```
161
+ */
162
+ fetch(request: Request, input?: RouterRequestInput<TEnv>): Promise<Response>;
163
+ }
164
+
165
+ /**
166
+ * Internal RSC Router interface — the full framework-facing API.
167
+ *
168
+ * This type includes all members used by the Vite plugin, RSC handler,
169
+ * pre-rendering pipeline, and other framework internals. It is NOT exported
170
+ * from the public package API.
171
+ *
172
+ * Use toInternal(router) to assert a public RSCRouter into this type
173
+ * at the boundary where framework code receives a user-provided router.
174
+ */
175
+ export interface RSCRouterInternal<
176
+ TEnv = any,
177
+ TRoutes extends Record<string, unknown> = Record<string, string>,
178
+ > {
179
+ /**
180
+ * Brand marker for build-time discovery.
181
+ * The Vite plugin uses this to identify router instances in module exports.
182
+ */
183
+ readonly __brand: typeof RSC_ROUTER_BRAND;
184
+
185
+ /**
186
+ * Unique identifier for this router instance.
187
+ * Used to namespace static output and isolate route maps between routers.
188
+ */
189
+ readonly id: string;
190
+
191
+ /**
192
+ * Register routes using URL patterns from urls()
193
+ */
194
+ routes<T extends UrlPatterns<TEnv, any>>(
195
+ patterns: T,
196
+ ): RSCRouter<
197
+ TEnv,
198
+ TRoutes &
199
+ (NonNullable<T["_routes"]> extends Record<string, unknown>
200
+ ? MergeRoutesWithResponses<NonNullable<T["_routes"]>, T["_responses"]>
201
+ : Record<string, string>)
202
+ >;
203
+
204
+ /**
205
+ * Add global middleware that runs on all routes
206
+ */
207
+ use(
208
+ patternOrMiddleware: string | MiddlewareFn<TEnv>,
209
+ middleware?: MiddlewareFn<TEnv>,
210
+ ): RSCRouter<TEnv, TRoutes>;
211
+
212
+ /**
213
+ * Type-safe URL builder for registered routes
214
+ */
215
+ reverse: ReverseFunction<TRoutes>;
216
+
217
+ /**
218
+ * Accumulated route map for typeof extraction
219
+ */
220
+ readonly routeMap: TRoutes;
221
+
222
+ /**
223
+ * Root layout component that wraps the entire application
224
+ * Access this to pass to renderSegments
225
+ */
226
+ readonly rootLayout?: ComponentType<RootLayoutProps>;
227
+
228
+ /**
229
+ * Error callback for monitoring/alerting
230
+ * Called when errors occur in loaders, actions, or routes
231
+ */
232
+ readonly onError?: RSCRouterOptions<TEnv>["onError"];
233
+
234
+ /**
235
+ * Cache configuration
236
+ */
237
+ readonly cache?: RSCRouterOptions<TEnv>["cache"];
238
+
239
+ /**
240
+ * Not found component to render when no route matches
241
+ */
242
+ readonly notFound?: RSCRouterOptions<TEnv>["notFound"];
243
+
244
+ /**
245
+ * Resolved theme configuration (null if theme not enabled)
246
+ * Used by NavigationProvider to include ThemeProvider and by MetaTags to render theme script
247
+ */
248
+ readonly themeConfig: import("../theme/types.js").ResolvedThemeConfig | null;
249
+
250
+ /**
251
+ * Cache profiles for "use cache" per-request resolution.
252
+ * Always includes at least the "default" profile.
253
+ */
254
+ readonly cacheProfiles: Record<
255
+ string,
256
+ import("../cache/profile-registry.js").CacheProfile
257
+ >;
258
+
259
+ /**
260
+ * Cache-Control header value for prefetch responses.
261
+ * False means no caching of prefetch responses.
262
+ * Derived from prefetchCacheTTL.
263
+ */
264
+ readonly prefetchCacheControl: string | false;
265
+
266
+ /**
267
+ * TTL in milliseconds for the client-side in-memory prefetch cache.
268
+ * 0 means caching is disabled.
269
+ */
270
+ readonly prefetchCacheTTL: number;
271
+
272
+ /**
273
+ * Whether connection warmup is enabled.
274
+ * When true, the client sends HEAD /?_rsc_warmup after idle periods
275
+ * and the server responds with 204 No Content.
276
+ */
277
+ readonly warmupEnabled: boolean;
278
+
279
+ /**
280
+ * Whether router-wide performance debugging is enabled.
281
+ * Used by the request handler to create metrics before middleware runs.
282
+ */
283
+ readonly debugPerformance?: boolean;
284
+
285
+ /**
286
+ * Whether ?__debug_manifest is allowed in production.
287
+ * Always enabled in development.
288
+ */
289
+ readonly allowDebugManifest: boolean;
290
+
291
+ /**
292
+ * Resolved timeout configuration (merged from shorthand + structured).
293
+ */
294
+ readonly timeouts: ResolvedTimeouts;
295
+
296
+ /**
297
+ * Custom timeout response handler.
298
+ */
299
+ readonly onTimeout?: OnTimeoutCallback<TEnv>;
300
+
301
+ /**
302
+ * App-level middleware entries
303
+ * These wrap the entire request/response cycle
304
+ */
305
+ readonly middleware: MiddlewareEntry<TEnv>[];
306
+
307
+ /**
308
+ * Nonce provider for CSP
309
+ */
310
+ readonly nonce?: NonceProvider<TEnv>;
311
+
312
+ /**
313
+ * RSC version string
314
+ */
315
+ readonly version?: string;
316
+
317
+ /**
318
+ * URL patterns reference for build-time manifest generation
319
+ */
320
+ readonly urlpatterns?: UrlPatterns<TEnv, any>;
321
+
322
+ /**
323
+ * SSR configuration. resolveStreaming determines stream vs allReady
324
+ * per HTML request (undefined = always stream).
325
+ */
326
+ readonly ssr?: import("./router-options.js").SSROptions<TEnv>;
327
+
328
+ /**
329
+ * Cross-origin request protection configuration.
330
+ * Default: true (enabled).
331
+ */
332
+ readonly originCheck: import("../rsc/origin-guard.js").OriginCheckConfig<TEnv>;
333
+
334
+ /**
335
+ * Source file path where createRouter() was called.
336
+ * Set via Error.stack parsing at construction time.
337
+ * Used by the Vite plugin to write per-router named-routes.gen.ts files.
338
+ */
339
+ readonly __sourceFile?: string;
340
+
341
+ match(
342
+ request: Request,
343
+ input?: RouterRequestInput<TEnv>,
344
+ ): Promise<MatchResult>;
345
+
346
+ /**
347
+ * Build-time pre-render match. Resolves segments with a BuildContext
348
+ * (no request/env/headers/cookies), skipping middleware and loaders.
349
+ * Used by the Vite plugin to collect pre-render data at build time.
350
+ */
351
+ matchForPrerender(
352
+ pathname: string,
353
+ params: Record<string, string>,
354
+ buildVars?: Record<string, any>,
355
+ isPassthroughRoute?: boolean,
356
+ ): Promise<{
357
+ segments: SerializedSegmentData[];
358
+ handles: Record<string, SegmentHandleData>;
359
+ routeName: string;
360
+ params: Record<string, string>;
361
+ interceptSegments?: SerializedSegmentData[];
362
+ interceptHandles?: Record<string, SegmentHandleData>;
363
+ passthrough?: true;
364
+ } | null>;
365
+
366
+ /**
367
+ * Render a single Static handler at build time.
368
+ * Returns the RSC-serialized component string and handle data, or null on failure.
369
+ */
370
+ renderStaticSegment(
371
+ handler: Function,
372
+ handlerId: string,
373
+ routeName?: string,
374
+ ): Promise<{ encoded: string; handles: Record<string, unknown[]> } | null>;
375
+
376
+ /**
377
+ * Preview match - returns route middleware without segment resolution.
378
+ * Also returns responseType and handler for response routes (non-RSC short-circuit).
379
+ */
380
+ previewMatch(
381
+ request: Request,
382
+ input?: RouterRequestInput<TEnv>,
383
+ ): Promise<{
384
+ routeMiddleware?: Array<{
385
+ handler: import("./middleware.js").MiddlewareFn;
386
+ params: Record<string, string>;
387
+ }>;
388
+ responseType?: string;
389
+ handler?: Function;
390
+ params?: Record<string, string>;
391
+ negotiated?: boolean;
392
+ manifestEntry?: EntryData;
393
+ routeKey?: string;
394
+ } | null>;
395
+
396
+ matchPartial(
397
+ request: Request,
398
+ input?: RouterRequestInput<TEnv>,
399
+ actionContext?: {
400
+ actionId?: string;
401
+ actionUrl?: URL;
402
+ actionResult?: any;
403
+ formData?: FormData;
404
+ },
405
+ ): Promise<MatchResult | null>;
406
+
407
+ /**
408
+ * Match an error to the nearest error boundary and return error segments
409
+ *
410
+ * Used when an action or other operation fails and we need to render
411
+ * the error boundary UI. Finds the nearest errorBoundary in the route tree
412
+ * for the current URL and renders it with the error info.
413
+ *
414
+ * @param request - The current request (used to match the route)
415
+ * @param context - Environment context
416
+ * @param error - The error that occurred
417
+ * @param segmentType - Type of segment where error occurred (default: "route")
418
+ * @returns MatchResult with error segment, or null if no error boundary found
419
+ */
420
+ matchError(
421
+ request: Request,
422
+ input: RouterRequestInput<TEnv> | undefined,
423
+ error: unknown,
424
+ segmentType?: ErrorInfo["segmentType"],
425
+ ): Promise<MatchResult | null>;
426
+
427
+ /**
428
+ * Debug utility to serialize the manifest for inspection
429
+ * Returns a JSON-friendly representation of all routes and layouts
430
+ */
431
+ debugManifest(): Promise<SerializedManifest>;
432
+
433
+ /**
434
+ * Handle an RSC request.
435
+ */
436
+ fetch(request: Request, input?: RouterRequestInput<TEnv>): Promise<Response>;
437
+ }
438
+
439
+ /**
440
+ * Assert a public RSCRouter into the internal type.
441
+ *
442
+ * Use this at the boundary where framework code receives a user-provided
443
+ * router and needs access to internal members (match, config, build-time).
444
+ * The cast is safe because createRouter() always produces an object that
445
+ * satisfies RSCRouterInternal; the public type is just a narrower view.
446
+ */
447
+ export function toInternal<
448
+ TEnv = any,
449
+ TRoutes extends Record<string, unknown> = Record<string, string>,
450
+ >(router: RSCRouter<TEnv, TRoutes>): RSCRouterInternal<TEnv, TRoutes> {
451
+ return router as RSCRouterInternal<TEnv, TRoutes>;
452
+ }