@rangojs/router 0.0.0-experimental.8 → 0.0.0-experimental.80

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