@rangojs/router 0.0.0-experimental.002d056c

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 +9 -0
  2. package/README.md +899 -0
  3. package/dist/bin/rango.js +1606 -0
  4. package/dist/vite/index.js +5153 -0
  5. package/package.json +177 -0
  6. package/skills/breadcrumbs/SKILL.md +250 -0
  7. package/skills/cache-guide/SKILL.md +262 -0
  8. package/skills/caching/SKILL.md +253 -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 +638 -0
  43. package/src/browser/navigation-client.ts +261 -0
  44. package/src/browser/navigation-store.ts +806 -0
  45. package/src/browser/navigation-transaction.ts +297 -0
  46. package/src/browser/network-error-handler.ts +61 -0
  47. package/src/browser/partial-update.ts +582 -0
  48. package/src/browser/prefetch/cache.ts +206 -0
  49. package/src/browser/prefetch/fetch.ts +145 -0
  50. package/src/browser/prefetch/observer.ts +65 -0
  51. package/src/browser/prefetch/policy.ts +48 -0
  52. package/src/browser/prefetch/queue.ts +128 -0
  53. package/src/browser/rango-state.ts +112 -0
  54. package/src/browser/react/Link.tsx +368 -0
  55. package/src/browser/react/NavigationProvider.tsx +413 -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 +464 -0
  79. package/src/browser/scroll-restoration.ts +397 -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 +547 -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 +479 -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 +982 -0
  105. package/src/cache/cf/index.ts +29 -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 +44 -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 +281 -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 +160 -0
  170. package/src/router/handler-context.ts +451 -0
  171. package/src/router/intercept-resolution.ts +397 -0
  172. package/src/router/lazy-includes.ts +236 -0
  173. package/src/router/loader-resolution.ts +420 -0
  174. package/src/router/logging.ts +251 -0
  175. package/src/router/manifest.ts +269 -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 +193 -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 +749 -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 +320 -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 +1242 -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 +291 -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 +1006 -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 +237 -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 +920 -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 +109 -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 +108 -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 +48 -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 +363 -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 +266 -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 +445 -0
  298. package/src/vite/router-discovery.ts +777 -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,192 @@
1
+ /**
2
+ * Phase where the error occurred during request handling.
3
+ *
4
+ * Coverage notes:
5
+ * - "routing": Invoked when route matching fails (router.ts, rsc/handler.ts)
6
+ * - "manifest": Reserved for manifest loading errors (not currently invoked)
7
+ * - "middleware": Reserved for middleware execution errors (errors propagate to handler phase)
8
+ * - "loader": Invoked when loader execution fails (router.ts via wrapLoaderWithErrorHandling, rsc/handler.ts)
9
+ * - "handler": Invoked when route/layout handler execution fails (router.ts)
10
+ * - "rendering": Invoked during SSR rendering errors (ssr/index.tsx, separate callback)
11
+ * - "action": Invoked when server action execution fails (rsc/handler.ts, router.ts)
12
+ * - "revalidation": Invoked when revalidation fails (router.ts, conditional with action)
13
+ * - "origin": Invoked when cross-origin request validation rejects a request (rsc/handler.ts)
14
+ * - "unknown": Fallback for unclassified errors (not currently invoked)
15
+ */
16
+ export type ErrorPhase =
17
+ | "routing" // During route matching
18
+ | "manifest" // During manifest loading (reserved, not currently invoked)
19
+ | "middleware" // During middleware execution (errors propagate to handler phase)
20
+ | "loader" // During loader execution
21
+ | "handler" // During route/layout handler execution
22
+ | "rendering" // During RSC/SSR rendering (SSR handler uses separate callback)
23
+ | "action" // During server action execution
24
+ | "revalidation" // During revalidation evaluation
25
+ | "cache" // During "use cache" background operations (stale revalidation, async cache writes)
26
+ | "prerender" // During build-time pre-rendering (Vite closeBundle)
27
+ | "static" // During build-time static handler rendering (Vite closeBundle)
28
+ | "origin" // During cross-origin request validation (CSRF protection)
29
+ | "unknown"; // Fallback for unclassified errors
30
+
31
+ /**
32
+ * Comprehensive context passed to onError callback
33
+ *
34
+ * Provides all available information about where and when an error occurred
35
+ * during request handling. The callback can use this for logging, monitoring,
36
+ * error tracking services, or custom error responses.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const router = createRouter<AppEnv>({
41
+ * onError: (context) => {
42
+ * // Log to error tracking service
43
+ * errorTracker.capture({
44
+ * error: context.error,
45
+ * phase: context.phase,
46
+ * url: context.request.url,
47
+ * route: context.routeKey,
48
+ * userId: context.env?.user?.id,
49
+ * });
50
+ *
51
+ * // Log to console with context
52
+ * console.error(`[${context.phase}] Error in ${context.routeKey}:`, {
53
+ * message: context.error.message,
54
+ * segment: context.segmentId,
55
+ * duration: context.duration,
56
+ * });
57
+ * },
58
+ * });
59
+ * ```
60
+ */
61
+ export interface OnErrorContext<TEnv = any> {
62
+ /**
63
+ * The error that occurred
64
+ */
65
+ error: Error;
66
+
67
+ /**
68
+ * Phase where the error occurred
69
+ */
70
+ phase: ErrorPhase;
71
+
72
+ /**
73
+ * The original request
74
+ */
75
+ request: Request;
76
+
77
+ /**
78
+ * Parsed URL from the request
79
+ */
80
+ url: URL;
81
+
82
+ /**
83
+ * Request pathname
84
+ */
85
+ pathname: string;
86
+
87
+ /**
88
+ * HTTP method
89
+ */
90
+ method: string;
91
+
92
+ /**
93
+ * Matched route key (if available)
94
+ * e.g., "shop.products.detail"
95
+ */
96
+ routeKey?: string;
97
+
98
+ /**
99
+ * Route params (if available)
100
+ * e.g., { slug: "headphones" }
101
+ */
102
+ params?: Record<string, string>;
103
+
104
+ /**
105
+ * Segment ID where error occurred (if available)
106
+ * e.g., "M1L0" for a layout, "M1R0" for a route
107
+ */
108
+ segmentId?: string;
109
+
110
+ /**
111
+ * Segment type where error occurred (if available)
112
+ */
113
+ segmentType?: "layout" | "route" | "parallel" | "loader" | "middleware";
114
+
115
+ /**
116
+ * Loader name (if error occurred in a loader)
117
+ */
118
+ loaderName?: string;
119
+
120
+ /**
121
+ * Middleware name/id (if error occurred in middleware)
122
+ */
123
+ middlewareId?: string;
124
+
125
+ /**
126
+ * Action ID (if error occurred during server action)
127
+ * e.g., "src/actions.ts#addToCart"
128
+ */
129
+ actionId?: string;
130
+
131
+ /**
132
+ * Environment/bindings (platform context)
133
+ */
134
+ env?: TEnv;
135
+
136
+ /**
137
+ * Duration from request start to error (milliseconds)
138
+ */
139
+ duration?: number;
140
+
141
+ /**
142
+ * Whether this is a partial/navigation request
143
+ */
144
+ isPartial?: boolean;
145
+
146
+ /**
147
+ * Whether an error boundary caught the error
148
+ * If true, the error was handled and a fallback UI was rendered
149
+ */
150
+ handledByBoundary?: boolean;
151
+
152
+ /**
153
+ * Stack trace (if available)
154
+ */
155
+ stack?: string;
156
+
157
+ /**
158
+ * Additional metadata specific to the error phase
159
+ */
160
+ metadata?: Record<string, unknown>;
161
+ }
162
+
163
+ /**
164
+ * Callback function for error handling
165
+ *
166
+ * Called whenever an error occurs during request handling.
167
+ * The callback is for notification/logging purposes - it cannot
168
+ * modify the error handling flow (use errorBoundary for that).
169
+ *
170
+ * @param context - Comprehensive error context
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * const onError: OnErrorCallback = (context) => {
175
+ * // Send to error tracking service
176
+ * Sentry.captureException(context.error, {
177
+ * tags: {
178
+ * phase: context.phase,
179
+ * route: context.routeKey,
180
+ * },
181
+ * extra: {
182
+ * url: context.url.toString(),
183
+ * params: context.params,
184
+ * duration: context.duration,
185
+ * },
186
+ * });
187
+ * };
188
+ * ```
189
+ */
190
+ export type OnErrorCallback<TEnv = any> = (
191
+ context: OnErrorContext<TEnv>,
192
+ ) => void | Promise<void>;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Global namespace for module augmentation
3
+ *
4
+ * Users augment these interfaces for type-safe context:
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // In env.ts or env.d.ts
9
+ * declare global {
10
+ * namespace RSCRouter {
11
+ * interface Env extends AppBindings {}
12
+ * interface Vars extends AppVariables {}
13
+ * }
14
+ * }
15
+ *
16
+ * // Now all handlers have type-safe context without imports!
17
+ * // ctx.env.DB, ctx.get("user"), etc.
18
+ * ```
19
+ */
20
+ declare global {
21
+ namespace RSCRouter {
22
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
23
+ interface Env {
24
+ // Empty by default - users augment with their bindings (e.g., { DB: D1Database })
25
+ }
26
+
27
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
28
+ interface Vars {
29
+ // Empty by default - users augment with their variables (e.g., { user?: User })
30
+ }
31
+
32
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
33
+ interface RegisteredRoutes {
34
+ // Empty by default - users augment with their merged route maps for type-safe href()
35
+ // Values are string (pattern) for RSC routes, or { path: string; response: T } for response routes
36
+ }
37
+
38
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
39
+ interface GeneratedRouteMap {
40
+ // Empty by default - populated by generated named-routes.gen.ts
41
+ // Maps route names to URL pattern strings for Handler<"routeName"> support
42
+ }
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Get registered routes or fallback to generic Record<string, string>
48
+ * When RSCRouter.RegisteredRoutes is augmented, provides autocomplete for route names
49
+ * When not augmented, allows any string (no autocomplete)
50
+ */
51
+ export type GetRegisteredRoutes = keyof RSCRouter.RegisteredRoutes extends never
52
+ ? Record<string, string>
53
+ : RSCRouter.RegisteredRoutes;
54
+
55
+ /**
56
+ * Default route map for reverse() surfaces.
57
+ * Prefers GeneratedRouteMap to avoid router.tsx -> urls.tsx -> types -> router.tsx
58
+ * cycles, but falls back to RegisteredRoutes for manual augmentation and then to
59
+ * a permissive record when no route types are available.
60
+ */
61
+ export type DefaultReverseRouteMap =
62
+ keyof RSCRouter.GeneratedRouteMap extends never
63
+ ? keyof RSCRouter.RegisteredRoutes extends never
64
+ ? Record<string, string>
65
+ : RSCRouter.RegisteredRoutes
66
+ : RSCRouter.GeneratedRouteMap;
67
+
68
+ /**
69
+ * Default route map for Handler type.
70
+ * Uses GeneratedRouteMap (from gen file) instead of RegisteredRoutes to avoid
71
+ * circular dependencies: router.tsx -> urls.tsx -> handler.tsx -> RegisteredRoutes -> router.tsx.
72
+ * GeneratedRouteMap is declared in a standalone gen file with no imports.
73
+ */
74
+ export type DefaultHandlerRouteMap =
75
+ keyof RSCRouter.GeneratedRouteMap extends never
76
+ ? {}
77
+ : RSCRouter.GeneratedRouteMap;
78
+
79
+ /**
80
+ * Default environment type - uses global augmentation if available, any otherwise
81
+ */
82
+ export type DefaultEnv = keyof RSCRouter.Env extends never
83
+ ? any
84
+ : RSCRouter.Env;
85
+
86
+ /**
87
+ * Default variables type - uses global augmentation if available, Record<string, any> otherwise
88
+ */
89
+ export type DefaultVars = keyof RSCRouter.Vars extends never
90
+ ? Record<string, any>
91
+ : RSCRouter.Vars;
92
+
93
+ /**
94
+ * Default route name type for public `routeName` on contexts.
95
+ * When GeneratedRouteMap is augmented, narrows to the known route names.
96
+ * Otherwise falls back to `string` for untyped usage.
97
+ */
98
+ export type DefaultRouteName = keyof RSCRouter.GeneratedRouteMap extends never
99
+ ? string
100
+ : keyof RSCRouter.GeneratedRouteMap & string;