@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.13221847

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 (298) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +884 -4
  3. package/dist/bin/rango.js +1531 -212
  4. package/dist/vite/index.js +3995 -2489
  5. package/package.json +57 -52
  6. package/skills/breadcrumbs/SKILL.md +250 -0
  7. package/skills/cache-guide/SKILL.md +262 -0
  8. package/skills/caching/SKILL.md +85 -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 +6 -4
  13. package/skills/hooks/SKILL.md +328 -70
  14. package/skills/host-router/SKILL.md +218 -0
  15. package/skills/intercept/SKILL.md +131 -8
  16. package/skills/layout/SKILL.md +100 -3
  17. package/skills/links/SKILL.md +62 -15
  18. package/skills/loader/SKILL.md +368 -42
  19. package/skills/middleware/SKILL.md +171 -34
  20. package/skills/mime-routes/SKILL.md +14 -10
  21. package/skills/parallel/SKILL.md +137 -1
  22. package/skills/prerender/SKILL.md +366 -28
  23. package/skills/rango/SKILL.md +85 -21
  24. package/skills/response-routes/SKILL.md +136 -83
  25. package/skills/route/SKILL.md +195 -21
  26. package/skills/router-setup/SKILL.md +123 -30
  27. package/skills/theme/SKILL.md +9 -8
  28. package/skills/typesafety/SKILL.md +240 -102
  29. package/skills/use-cache/SKILL.md +324 -0
  30. package/src/__internal.ts +102 -4
  31. package/src/bin/rango.ts +312 -15
  32. package/src/browser/action-coordinator.ts +97 -0
  33. package/src/browser/action-response-classifier.ts +99 -0
  34. package/src/browser/event-controller.ts +92 -64
  35. package/src/browser/history-state.ts +80 -0
  36. package/src/browser/intercept-utils.ts +52 -0
  37. package/src/browser/link-interceptor.ts +24 -4
  38. package/src/browser/logging.ts +11 -0
  39. package/src/browser/merge-segment-loaders.ts +20 -12
  40. package/src/browser/navigation-bridge.ts +266 -558
  41. package/src/browser/navigation-client.ts +132 -75
  42. package/src/browser/navigation-store.ts +33 -50
  43. package/src/browser/navigation-transaction.ts +297 -0
  44. package/src/browser/network-error-handler.ts +61 -0
  45. package/src/browser/partial-update.ts +303 -309
  46. package/src/browser/prefetch/cache.ts +206 -0
  47. package/src/browser/prefetch/fetch.ts +144 -0
  48. package/src/browser/prefetch/observer.ts +65 -0
  49. package/src/browser/prefetch/policy.ts +48 -0
  50. package/src/browser/prefetch/queue.ts +128 -0
  51. package/src/browser/rango-state.ts +112 -0
  52. package/src/browser/react/Link.tsx +190 -70
  53. package/src/browser/react/NavigationProvider.tsx +78 -11
  54. package/src/browser/react/context.ts +6 -0
  55. package/src/browser/react/filter-segment-order.ts +11 -0
  56. package/src/browser/react/index.ts +12 -12
  57. package/src/browser/react/location-state-shared.ts +95 -53
  58. package/src/browser/react/location-state.ts +60 -15
  59. package/src/browser/react/mount-context.ts +6 -1
  60. package/src/browser/react/nonce-context.ts +23 -0
  61. package/src/browser/react/shallow-equal.ts +27 -0
  62. package/src/browser/react/use-action.ts +29 -51
  63. package/src/browser/react/use-client-cache.ts +5 -3
  64. package/src/browser/react/use-handle.ts +29 -70
  65. package/src/browser/react/use-link-status.ts +6 -5
  66. package/src/browser/react/use-navigation.ts +22 -63
  67. package/src/browser/react/use-params.ts +65 -0
  68. package/src/browser/react/use-pathname.ts +47 -0
  69. package/src/browser/react/use-router.ts +63 -0
  70. package/src/browser/react/use-search-params.ts +56 -0
  71. package/src/browser/react/use-segments.ts +80 -97
  72. package/src/browser/response-adapter.ts +73 -0
  73. package/src/browser/rsc-router.tsx +188 -57
  74. package/src/browser/scroll-restoration.ts +117 -44
  75. package/src/browser/segment-reconciler.ts +221 -0
  76. package/src/browser/segment-structure-assert.ts +16 -0
  77. package/src/browser/server-action-bridge.ts +488 -606
  78. package/src/browser/shallow.ts +6 -1
  79. package/src/browser/types.ts +116 -47
  80. package/src/browser/validate-redirect-origin.ts +29 -0
  81. package/src/build/generate-manifest.ts +63 -21
  82. package/src/build/generate-route-types.ts +36 -1038
  83. package/src/build/index.ts +2 -5
  84. package/src/build/route-trie.ts +38 -12
  85. package/src/build/route-types/ast-helpers.ts +25 -0
  86. package/src/build/route-types/ast-route-extraction.ts +98 -0
  87. package/src/build/route-types/codegen.ts +102 -0
  88. package/src/build/route-types/include-resolution.ts +411 -0
  89. package/src/build/route-types/param-extraction.ts +48 -0
  90. package/src/build/route-types/per-module-writer.ts +128 -0
  91. package/src/build/route-types/router-processing.ts +479 -0
  92. package/src/build/route-types/scan-filter.ts +78 -0
  93. package/src/build/runtime-discovery.ts +231 -0
  94. package/src/cache/background-task.ts +34 -0
  95. package/src/cache/cache-key-utils.ts +44 -0
  96. package/src/cache/cache-policy.ts +125 -0
  97. package/src/cache/cache-runtime.ts +342 -0
  98. package/src/cache/cache-scope.ts +122 -303
  99. package/src/cache/cf/cf-cache-store.ts +571 -17
  100. package/src/cache/cf/index.ts +13 -3
  101. package/src/cache/document-cache.ts +116 -77
  102. package/src/cache/handle-capture.ts +81 -0
  103. package/src/cache/handle-snapshot.ts +41 -0
  104. package/src/cache/index.ts +1 -15
  105. package/src/cache/memory-segment-store.ts +191 -13
  106. package/src/cache/profile-registry.ts +73 -0
  107. package/src/cache/read-through-swr.ts +134 -0
  108. package/src/cache/segment-codec.ts +256 -0
  109. package/src/cache/taint.ts +98 -0
  110. package/src/cache/types.ts +72 -122
  111. package/src/client.rsc.tsx +3 -1
  112. package/src/client.tsx +84 -126
  113. package/src/component-utils.ts +4 -4
  114. package/src/components/DefaultDocument.tsx +5 -1
  115. package/src/context-var.ts +86 -0
  116. package/src/debug.ts +19 -9
  117. package/src/errors.ts +77 -7
  118. package/src/handle.ts +12 -7
  119. package/src/handles/MetaTags.tsx +73 -20
  120. package/src/handles/breadcrumbs.ts +66 -0
  121. package/src/handles/index.ts +1 -0
  122. package/src/handles/meta.ts +30 -13
  123. package/src/host/cookie-handler.ts +21 -15
  124. package/src/host/errors.ts +8 -8
  125. package/src/host/index.ts +4 -7
  126. package/src/host/pattern-matcher.ts +27 -27
  127. package/src/host/router.ts +61 -39
  128. package/src/host/testing.ts +8 -8
  129. package/src/host/types.ts +15 -7
  130. package/src/host/utils.ts +1 -1
  131. package/src/href-client.ts +65 -45
  132. package/src/index.rsc.ts +104 -40
  133. package/src/index.ts +122 -67
  134. package/src/internal-debug.ts +9 -3
  135. package/src/loader.rsc.ts +18 -93
  136. package/src/loader.ts +26 -9
  137. package/src/network-error-thrower.tsx +3 -1
  138. package/src/outlet-provider.tsx +45 -0
  139. package/src/prerender/param-hash.ts +4 -2
  140. package/src/prerender/store.ts +121 -17
  141. package/src/prerender.ts +325 -20
  142. package/src/reverse.ts +144 -124
  143. package/src/root-error-boundary.tsx +41 -29
  144. package/src/route-content-wrapper.tsx +7 -4
  145. package/src/route-definition/dsl-helpers.ts +959 -0
  146. package/src/route-definition/helper-factories.ts +200 -0
  147. package/src/route-definition/helpers-types.ts +430 -0
  148. package/src/route-definition/index.ts +52 -0
  149. package/src/route-definition/redirect.ts +93 -0
  150. package/src/route-definition.ts +1 -1450
  151. package/src/route-map-builder.ts +87 -133
  152. package/src/route-name.ts +53 -0
  153. package/src/route-types.ts +41 -6
  154. package/src/router/content-negotiation.ts +116 -0
  155. package/src/router/debug-manifest.ts +72 -0
  156. package/src/router/error-handling.ts +9 -9
  157. package/src/router/find-match.ts +160 -0
  158. package/src/router/handler-context.ts +324 -116
  159. package/src/router/intercept-resolution.ts +11 -4
  160. package/src/router/lazy-includes.ts +237 -0
  161. package/src/router/loader-resolution.ts +179 -133
  162. package/src/router/logging.ts +112 -6
  163. package/src/router/manifest.ts +58 -19
  164. package/src/router/match-api.ts +89 -88
  165. package/src/router/match-context.ts +4 -2
  166. package/src/router/match-handlers.ts +440 -0
  167. package/src/router/match-middleware/background-revalidation.ts +86 -89
  168. package/src/router/match-middleware/cache-lookup.ts +295 -49
  169. package/src/router/match-middleware/cache-store.ts +56 -13
  170. package/src/router/match-middleware/intercept-resolution.ts +45 -22
  171. package/src/router/match-middleware/segment-resolution.ts +20 -9
  172. package/src/router/match-pipelines.ts +10 -45
  173. package/src/router/match-result.ts +44 -21
  174. package/src/router/metrics.ts +240 -15
  175. package/src/router/middleware-cookies.ts +55 -0
  176. package/src/router/middleware-types.ts +222 -0
  177. package/src/router/middleware.ts +327 -369
  178. package/src/router/pattern-matching.ts +169 -31
  179. package/src/router/prerender-match.ts +402 -0
  180. package/src/router/preview-match.ts +170 -0
  181. package/src/router/revalidation.ts +105 -14
  182. package/src/router/router-context.ts +40 -21
  183. package/src/router/router-interfaces.ts +452 -0
  184. package/src/router/router-options.ts +592 -0
  185. package/src/router/router-registry.ts +24 -0
  186. package/src/router/segment-resolution/fresh.ts +677 -0
  187. package/src/router/segment-resolution/helpers.ts +263 -0
  188. package/src/router/segment-resolution/loader-cache.ts +199 -0
  189. package/src/router/segment-resolution/revalidation.ts +1296 -0
  190. package/src/router/segment-resolution/static-store.ts +67 -0
  191. package/src/router/segment-resolution.ts +21 -1354
  192. package/src/router/segment-wrappers.ts +291 -0
  193. package/src/router/telemetry-otel.ts +299 -0
  194. package/src/router/telemetry.ts +300 -0
  195. package/src/router/timeout.ts +148 -0
  196. package/src/router/trie-matching.ts +96 -29
  197. package/src/router/types.ts +15 -9
  198. package/src/router.ts +642 -2366
  199. package/src/rsc/handler-context.ts +45 -0
  200. package/src/rsc/handler.ts +639 -1027
  201. package/src/rsc/helpers.ts +140 -6
  202. package/src/rsc/index.ts +0 -20
  203. package/src/rsc/loader-fetch.ts +209 -0
  204. package/src/rsc/manifest-init.ts +86 -0
  205. package/src/rsc/nonce.ts +14 -0
  206. package/src/rsc/origin-guard.ts +141 -0
  207. package/src/rsc/progressive-enhancement.ts +379 -0
  208. package/src/rsc/response-error.ts +37 -0
  209. package/src/rsc/response-route-handler.ts +347 -0
  210. package/src/rsc/rsc-rendering.ts +237 -0
  211. package/src/rsc/runtime-warnings.ts +42 -0
  212. package/src/rsc/server-action.ts +348 -0
  213. package/src/rsc/ssr-setup.ts +128 -0
  214. package/src/rsc/types.ts +38 -11
  215. package/src/search-params.ts +66 -54
  216. package/src/segment-system.tsx +165 -17
  217. package/src/server/context.ts +237 -54
  218. package/src/server/cookie-store.ts +190 -0
  219. package/src/server/fetchable-loader-store.ts +11 -6
  220. package/src/server/handle-store.ts +94 -15
  221. package/src/server/loader-registry.ts +15 -56
  222. package/src/server/request-context.ts +438 -71
  223. package/src/server.ts +26 -164
  224. package/src/ssr/index.tsx +101 -31
  225. package/src/static-handler.ts +22 -4
  226. package/src/theme/ThemeProvider.tsx +21 -15
  227. package/src/theme/ThemeScript.tsx +5 -5
  228. package/src/theme/constants.ts +5 -2
  229. package/src/theme/index.ts +4 -14
  230. package/src/theme/theme-context.ts +4 -30
  231. package/src/theme/theme-script.ts +21 -18
  232. package/src/types/boundaries.ts +158 -0
  233. package/src/types/cache-types.ts +198 -0
  234. package/src/types/error-types.ts +192 -0
  235. package/src/types/global-namespace.ts +100 -0
  236. package/src/types/handler-context.ts +773 -0
  237. package/src/types/index.ts +88 -0
  238. package/src/types/loader-types.ts +183 -0
  239. package/src/types/route-config.ts +170 -0
  240. package/src/types/route-entry.ts +109 -0
  241. package/src/types/segments.ts +150 -0
  242. package/src/types.ts +1 -1795
  243. package/src/urls/include-helper.ts +197 -0
  244. package/src/urls/index.ts +53 -0
  245. package/src/urls/path-helper-types.ts +339 -0
  246. package/src/urls/path-helper.ts +329 -0
  247. package/src/urls/pattern-types.ts +95 -0
  248. package/src/urls/response-types.ts +106 -0
  249. package/src/urls/type-extraction.ts +372 -0
  250. package/src/urls/urls-function.ts +98 -0
  251. package/src/urls.ts +1 -1323
  252. package/src/use-loader.tsx +85 -77
  253. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  254. package/src/vite/discovery/discover-routers.ts +344 -0
  255. package/src/vite/discovery/prerender-collection.ts +385 -0
  256. package/src/vite/discovery/route-types-writer.ts +258 -0
  257. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  258. package/src/vite/discovery/state.ts +108 -0
  259. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  260. package/src/vite/index.ts +11 -2259
  261. package/src/vite/plugin-types.ts +48 -0
  262. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  263. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  264. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  265. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -47
  266. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
  267. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  268. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  269. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  270. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  271. package/src/vite/plugins/expose-ids/types.ts +45 -0
  272. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  273. package/src/vite/plugins/refresh-cmd.ts +65 -0
  274. package/src/vite/plugins/use-cache-transform.ts +323 -0
  275. package/src/vite/plugins/version-injector.ts +83 -0
  276. package/src/vite/plugins/version-plugin.ts +266 -0
  277. package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +23 -14
  278. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  279. package/src/vite/rango.ts +445 -0
  280. package/src/vite/router-discovery.ts +777 -0
  281. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
  282. package/src/vite/utils/banner.ts +36 -0
  283. package/src/vite/utils/bundle-analysis.ts +137 -0
  284. package/src/vite/utils/manifest-utils.ts +70 -0
  285. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  286. package/src/vite/utils/prerender-utils.ts +189 -0
  287. package/src/vite/utils/shared-utils.ts +169 -0
  288. package/CLAUDE.md +0 -43
  289. package/dist/vite/index.named-routes.gen.ts +0 -103
  290. package/src/browser/lru-cache.ts +0 -69
  291. package/src/browser/request-controller.ts +0 -164
  292. package/src/cache/memory-store.ts +0 -253
  293. package/src/href-context.ts +0 -33
  294. package/src/router.gen.ts +0 -6
  295. package/src/static-handler.gen.ts +0 -5
  296. package/src/urls.gen.ts +0 -8
  297. package/src/vite/expose-internal-ids.ts +0 -1167
  298. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -45,30 +45,34 @@ type ParseConstraintPath<T extends string> =
45
45
  export type PatternToPath<T extends string> =
46
46
  // Optional + constrained param in middle: /:param(a|b)?/rest
47
47
  T extends `${infer Before}:${infer _Name}(${infer Constraint})?/${infer After}`
48
- ? PatternToPath<`${Before}${After}`> | `${Before}${ParseConstraintPath<Constraint>}/${PatternToPath<After>}`
49
- // Optional + constrained param at end: /path/:param(a|b)?
50
- : T extends `${infer Before}:${infer _Name}(${infer Constraint})?`
51
- ? Before | `${Before}${ParseConstraintPath<Constraint>}`
52
- // Constrained param in middle: /:param(a|b)/rest
53
- : T extends `${infer Before}:${infer _Name}(${infer Constraint})/${infer After}`
54
- ? `${Before}${ParseConstraintPath<Constraint>}/${PatternToPath<After>}`
55
- // Constrained param at end: /path/:param(a|b)
56
- : T extends `${infer Before}:${infer _Name}(${infer Constraint})`
57
- ? `${Before}${ParseConstraintPath<Constraint>}`
58
- // Optional param in middle: /:param?/rest
59
- : T extends `${infer Before}:${infer _Param}?/${infer After}`
60
- ? PatternToPath<`${Before}${After}`> | `${Before}${string}/${PatternToPath<After>}`
61
- // Optional param at end: /path/:param?
62
- : T extends `${infer Before}:${infer _Param}?`
63
- ? Before | `${Before}${string}`
64
- // Required param in middle: /:param/rest
65
- : T extends `${infer Before}:${infer _Param}/${infer After}`
66
- ? `${Before}${string}/${PatternToPath<After>}`
67
- // Required param at end: /path/:param
68
- : T extends `${infer Before}:${infer _Param}`
69
- ? `${Before}${string}`
70
- // Static path
71
- : T;
48
+ ?
49
+ | PatternToPath<`${Before}${After}`>
50
+ | `${Before}${ParseConstraintPath<Constraint>}/${PatternToPath<After>}`
51
+ : // Optional + constrained param at end: /path/:param(a|b)?
52
+ T extends `${infer Before}:${infer _Name}(${infer Constraint})?`
53
+ ? Before | `${Before}${ParseConstraintPath<Constraint>}`
54
+ : // Constrained param in middle: /:param(a|b)/rest
55
+ T extends `${infer Before}:${infer _Name}(${infer Constraint})/${infer After}`
56
+ ? `${Before}${ParseConstraintPath<Constraint>}/${PatternToPath<After>}`
57
+ : // Constrained param at end: /path/:param(a|b)
58
+ T extends `${infer Before}:${infer _Name}(${infer Constraint})`
59
+ ? `${Before}${ParseConstraintPath<Constraint>}`
60
+ : // Optional param in middle: /:param?/rest
61
+ T extends `${infer Before}:${infer _Param}?/${infer After}`
62
+ ?
63
+ | PatternToPath<`${Before}${After}`>
64
+ | `${Before}${string}/${PatternToPath<After>}`
65
+ : // Optional param at end: /path/:param?
66
+ T extends `${infer Before}:${infer _Param}?`
67
+ ? Before | `${Before}${string}`
68
+ : // Required param in middle: /:param/rest
69
+ T extends `${infer Before}:${infer _Param}/${infer After}`
70
+ ? `${Before}${string}/${PatternToPath<After>}`
71
+ : // Required param at end: /path/:param
72
+ T extends `${infer Before}:${infer _Param}`
73
+ ? `${Before}${string}`
74
+ : // Static path
75
+ T;
72
76
 
73
77
  /**
74
78
  * Allow optional query string (?...) and/or hash fragment (#...) suffix
@@ -85,19 +89,17 @@ type WithSuffix<T extends string> =
85
89
  /**
86
90
  * Helper type to get pattern from routes, handling string values and { path, response } objects
87
91
  */
88
- type RoutePattern<TRoutes, K extends keyof TRoutes> =
89
- TRoutes[K] extends string ? TRoutes[K]
90
- : TRoutes[K] extends { readonly path: infer P extends string } ? P
91
- : string;
92
+ type RoutePattern<TRoutes, K extends keyof TRoutes> = TRoutes[K] extends string
93
+ ? TRoutes[K]
94
+ : TRoutes[K] extends { readonly path: infer P extends string }
95
+ ? P
96
+ : string;
92
97
 
93
98
  /**
94
99
  * Reverse lookup: find route name where the pattern matches TPattern
95
100
  */
96
- type NameForPattern<
97
- TPattern extends string,
98
- TRoutes = GetRegisteredRoutes
99
- > = {
100
- [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern ? K : never
101
+ type NameForPattern<TPattern extends string, TRoutes = GetRegisteredRoutes> = {
102
+ [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern ? K : never;
101
103
  }[keyof TRoutes];
102
104
 
103
105
  /**
@@ -112,19 +114,28 @@ type NameForPattern<
112
114
  * For dynamic routes, use the pattern:
113
115
  * PathResponse<"/api/products/:id"> → Product
114
116
  */
115
- export type PathResponse<TPattern extends string, TRoutes = GetRegisteredRoutes> =
116
- ResponseEnvelope<{
117
+ export type PathResponse<
118
+ TPattern extends string,
119
+ TRoutes = GetRegisteredRoutes,
120
+ > = ResponseEnvelope<
121
+ {
117
122
  [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern
118
- ? TRoutes[K] extends { readonly response: infer R } ? Exclude<R, Response> : never
119
- : never
120
- }[keyof TRoutes]>;
123
+ ? TRoutes[K] extends { readonly response: infer R }
124
+ ? Exclude<R, Response>
125
+ : never
126
+ : never;
127
+ }[keyof TRoutes]
128
+ >;
121
129
 
122
130
  /**
123
131
  * Strip trailing slash from a path (e.g., "/blog/" -> "/blog" | "/blog/")
124
132
  * Allows navigation to include() prefixes without requiring trailing slash
125
133
  */
126
- type OptionalTrailingSlash<T extends string> =
127
- T extends `${infer Base}/` ? (Base extends "" ? T : Base | T) : T;
134
+ type OptionalTrailingSlash<T extends string> = T extends `${infer Base}/`
135
+ ? Base extends ""
136
+ ? T
137
+ : Base | T
138
+ : T;
128
139
 
129
140
  /**
130
141
  * Union of all valid paths from registered routes
@@ -135,9 +146,13 @@ type OptionalTrailingSlash<T extends string> =
135
146
  export type ValidPaths<TRoutes = GetRegisteredRoutes> =
136
147
  keyof TRoutes extends never
137
148
  ? `/${string}` // Fallback when no routes are registered
138
- : WithSuffix<{
139
- [K in keyof TRoutes]: OptionalTrailingSlash<PatternToPath<RoutePattern<TRoutes, K>>>
140
- }[keyof TRoutes]>;
149
+ : WithSuffix<
150
+ {
151
+ [K in keyof TRoutes]: OptionalTrailingSlash<
152
+ PatternToPath<RoutePattern<TRoutes, K>>
153
+ >;
154
+ }[keyof TRoutes]
155
+ >;
141
156
 
142
157
  /**
143
158
  * Type-safe href function for client-side use
@@ -167,7 +182,9 @@ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
167
182
  */
168
183
  export function href<T extends ValidPaths>(path: T, mount?: string): string {
169
184
  if (mount && mount !== "/") {
170
- return mount + path;
185
+ // Strip trailing slash from mount to avoid double-slash when joining
186
+ const normalizedMount = mount.endsWith("/") ? mount.slice(0, -1) : mount;
187
+ return normalizedMount + path;
171
188
  }
172
189
  return path;
173
190
  }
@@ -181,7 +198,10 @@ export interface ResponseHrefProps {
181
198
  "data-external": "";
182
199
  }
183
200
 
184
- type ResponseHrefFn = <T extends ValidPaths>(path: T, mount?: string) => ResponseHrefProps;
201
+ type ResponseHrefFn = <T extends ValidPaths>(
202
+ path: T,
203
+ mount?: string,
204
+ ) => ResponseHrefProps;
185
205
 
186
206
  function createResponseHrefTag(): ResponseHrefFn {
187
207
  return (path, mount) => ({
package/src/index.rsc.ts CHANGED
@@ -11,8 +11,6 @@
11
11
 
12
12
  // Re-export all universal exports from index.ts
13
13
  export {
14
- // Universal rendering utilities
15
- renderSegments,
16
14
  // Error classes
17
15
  RouteNotFoundError,
18
16
  DataNotFoundError,
@@ -21,17 +19,15 @@ export {
21
19
  HandlerError,
22
20
  BuildError,
23
21
  InvalidHandlerError,
24
- NetworkError,
25
- isNetworkError,
26
- sanitizeError,
27
22
  RouterError,
23
+ Skip,
24
+ isSkip,
28
25
  } from "./index.js";
29
26
 
30
27
  // Re-export all types from types.ts (user-facing types only)
31
28
  export type {
32
29
  // Configuration types
33
30
  DocumentProps,
34
- RouterEnv,
35
31
  DefaultEnv,
36
32
  RouteDefinition,
37
33
  RouteConfig,
@@ -39,7 +35,6 @@ export type {
39
35
  TrailingSlashMode,
40
36
  // Handler types
41
37
  Handler,
42
- ScopedRouteMap,
43
38
  HandlerContext,
44
39
  ExtractParams,
45
40
  GenericParams,
@@ -55,9 +50,6 @@ export type {
55
50
  LoaderContext,
56
51
  FetchableLoaderOptions,
57
52
  LoadOptions,
58
- LoaderActionContext,
59
- LoaderAction,
60
- LoaderMiddlewareFn,
61
53
  // Error boundary types
62
54
  ErrorInfo,
63
55
  ErrorBoundaryFallbackProps,
@@ -67,37 +59,75 @@ export type {
67
59
  NotFoundInfo,
68
60
  NotFoundBoundaryFallbackProps,
69
61
  NotFoundBoundaryHandler,
62
+ // Error handling callback types
63
+ ErrorPhase,
64
+ OnErrorContext,
65
+ OnErrorCallback,
70
66
  } from "./types.js";
71
67
 
72
68
  // Router options type (server-only, so import directly)
73
- export type { RSCRouterOptions } from "./router.js";
69
+ export type {
70
+ RSCRouterOptions,
71
+ SSRStreamMode,
72
+ SSROptions,
73
+ ResolveStreamingContext,
74
+ } from "./router.js";
74
75
 
75
76
  // Server-side createLoader and redirect
76
- export { createLoader, redirect } from "./route-definition.js";
77
+ export {
78
+ createLoader,
79
+ redirect,
80
+ type RouteHelpers,
81
+ type RouteHandlers,
82
+ // Globally importable route helpers for composition
83
+ layout,
84
+ cache,
85
+ middleware,
86
+ revalidate,
87
+ loader,
88
+ loading,
89
+ parallel,
90
+ intercept,
91
+ when,
92
+ errorBoundary,
93
+ notFoundBoundary,
94
+ transition,
95
+ } from "./route-definition.js";
96
+
97
+ // Composition types for reusable callback factories
98
+ export type {
99
+ RouteUseItem,
100
+ LayoutUseItem,
101
+ AllUseItems,
102
+ UseItems,
103
+ } from "./route-types.js";
77
104
 
78
105
  // Handle API
79
106
  export { createHandle, isHandle, type Handle } from "./handle.js";
80
107
 
108
+ // Context variable API (typed ctx.set/ctx.get tokens)
109
+ export { createVar, type ContextVar } from "./context-var.js";
110
+
111
+ // CSP nonce token (use with ctx.get(nonce) in middleware/handlers)
112
+ export { nonce } from "./rsc/nonce.js";
113
+
81
114
  // Pre-render handler API
82
115
  export {
83
116
  Prerender,
84
- isPrerenderHandler,
85
117
  type PrerenderHandlerDefinition,
118
+ type PrerenderPassthroughContext,
86
119
  type PrerenderOptions,
87
120
  type BuildContext,
121
+ type StaticBuildContext,
122
+ type GetParamsContext,
88
123
  } from "./prerender.js";
89
124
 
90
125
  // Static handler API
91
- export {
92
- Static,
93
- isStaticHandler,
94
- type StaticHandlerDefinition,
95
- } from "./static-handler.js";
126
+ export { Static, type StaticHandlerDefinition } from "./static-handler.js";
96
127
 
97
128
  // Django-style URL patterns (RSC/server context)
98
129
  export {
99
130
  urls,
100
- RESPONSE_TYPE,
101
131
  type PathHelpers,
102
132
  type PathOptions,
103
133
  type UrlPatterns,
@@ -121,6 +151,7 @@ export {
121
151
  createRouter,
122
152
  type RSCRouter,
123
153
  type RootLayoutProps,
154
+ type RouterRequestInput,
124
155
  } from "./router.js";
125
156
 
126
157
  // RSC handler types (server-side)
@@ -128,42 +159,75 @@ export type { HandlerCacheConfig } from "./rsc/types.js";
128
159
 
129
160
  // Built-in handles (server-side)
130
161
  export { Meta } from "./handles/meta.js";
131
-
132
- // Request context (for accessing request data in server actions/components)
162
+ export { Breadcrumbs, type BreadcrumbItem } from "./handles/breadcrumbs.js";
163
+
164
+ // Request context (for accessing request data in server actions/components).
165
+ // Re-exported with a narrowed return type so that public consumers only see
166
+ // public members. Internal code imports from "./server/request-context.js"
167
+ // directly and gets the full type.
168
+ import { getRequestContext as _getRequestContextInternal } from "./server/request-context.js";
169
+ export type { PublicRequestContext as RequestContext } from "./server/request-context.js";
170
+ import type { PublicRequestContext } from "./server/request-context.js";
171
+ import type { DefaultEnv } from "./types/global-namespace.js";
172
+
173
+ export const getRequestContext: <
174
+ TEnv = DefaultEnv,
175
+ >() => PublicRequestContext<TEnv> = _getRequestContextInternal;
176
+
177
+ // Request-scoped shorthands
133
178
  export {
134
- getRequestContext,
135
- requireRequestContext,
136
- type RequestContext,
137
- } from "./server/request-context.js";
179
+ cookies,
180
+ headers,
181
+ type CookieStore,
182
+ type Cookie,
183
+ type ReadonlyHeaders,
184
+ } from "./server/cookie-store.js";
138
185
 
139
186
  // Meta types
140
187
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
141
188
 
142
189
  // Middleware context types
143
- export type {
144
- MiddlewareContext,
145
- CookieOptions,
146
- } from "./router/middleware.js";
190
+ export type { MiddlewareContext, CookieOptions } from "./router/middleware.js";
147
191
 
148
192
  // Reverse type utilities for type-safe URL generation (Django-style URL reversal)
149
- export type { ScopedReverseFunction, ReverseFunction, ExtractLocalRoutes, PrefixedRoutes, PrefixRoutePatterns, ParamsFor, SanitizePrefix, MergeRoutes } from "./reverse.js";
193
+ export type {
194
+ ScopedReverseFunction,
195
+ ReverseFunction,
196
+ ExtractLocalRoutes,
197
+ ParamsFor,
198
+ } from "./reverse.js";
150
199
  export { scopedReverse, createReverse } from "./reverse.js";
151
200
 
152
201
  // Search params schema types
153
- export type { SearchSchema, SearchSchemaValue, ResolveSearchSchema, RouteSearchParams, RouteParams } from "./search-params.js";
154
-
155
- // Performance tracking (server-only)
156
- export { track } from "./server/context.js";
157
-
158
- // Debug utilities for route matching (development only)
159
- export {
160
- enableMatchDebug,
161
- getMatchDebugStats,
162
- } from "./router/pattern-matching.js";
202
+ export type {
203
+ SearchSchema,
204
+ SearchSchemaValue,
205
+ ResolveSearchSchema,
206
+ RouteSearchParams,
207
+ RouteParams,
208
+ } from "./search-params.js";
163
209
 
164
210
  // Location state (universal)
165
211
  export {
166
212
  createLocationState,
167
213
  type LocationStateDefinition,
168
214
  type LocationStateEntry,
215
+ type LocationStateOptions,
169
216
  } from "./browser/react/location-state-shared.js";
217
+
218
+ // Path-based response type lookup from RegisteredRoutes
219
+ export type { PathResponse } from "./href-client.js";
220
+
221
+ // Telemetry sink
222
+ export { createConsoleSink } from "./router/telemetry.js";
223
+ export { createOTelSink } from "./router/telemetry-otel.js";
224
+ export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
225
+ export type { TelemetrySink, TelemetryEvent } from "./router/telemetry.js";
226
+
227
+ // Timeout types and error class
228
+ export { RouterTimeoutError } from "./router/timeout.js";
229
+ export type {
230
+ RouterTimeouts,
231
+ TimeoutPhase,
232
+ TimeoutContext,
233
+ } from "./router/timeout.js";