@rangojs/router 0.0.0-experimental.10

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 (172) hide show
  1. package/CLAUDE.md +43 -0
  2. package/README.md +19 -0
  3. package/dist/bin/rango.js +227 -0
  4. package/dist/vite/index.js +3039 -0
  5. package/package.json +171 -0
  6. package/skills/caching/SKILL.md +191 -0
  7. package/skills/debug-manifest/SKILL.md +108 -0
  8. package/skills/document-cache/SKILL.md +180 -0
  9. package/skills/fonts/SKILL.md +165 -0
  10. package/skills/hooks/SKILL.md +442 -0
  11. package/skills/intercept/SKILL.md +190 -0
  12. package/skills/layout/SKILL.md +213 -0
  13. package/skills/links/SKILL.md +180 -0
  14. package/skills/loader/SKILL.md +246 -0
  15. package/skills/middleware/SKILL.md +202 -0
  16. package/skills/mime-routes/SKILL.md +124 -0
  17. package/skills/parallel/SKILL.md +228 -0
  18. package/skills/prerender/SKILL.md +283 -0
  19. package/skills/rango/SKILL.md +54 -0
  20. package/skills/response-routes/SKILL.md +358 -0
  21. package/skills/route/SKILL.md +173 -0
  22. package/skills/router-setup/SKILL.md +346 -0
  23. package/skills/tailwind/SKILL.md +129 -0
  24. package/skills/theme/SKILL.md +78 -0
  25. package/skills/typesafety/SKILL.md +394 -0
  26. package/src/__internal.ts +175 -0
  27. package/src/bin/rango.ts +24 -0
  28. package/src/browser/event-controller.ts +876 -0
  29. package/src/browser/index.ts +18 -0
  30. package/src/browser/link-interceptor.ts +121 -0
  31. package/src/browser/lru-cache.ts +69 -0
  32. package/src/browser/merge-segment-loaders.ts +126 -0
  33. package/src/browser/navigation-bridge.ts +913 -0
  34. package/src/browser/navigation-client.ts +165 -0
  35. package/src/browser/navigation-store.ts +823 -0
  36. package/src/browser/partial-update.ts +600 -0
  37. package/src/browser/react/Link.tsx +248 -0
  38. package/src/browser/react/NavigationProvider.tsx +346 -0
  39. package/src/browser/react/ScrollRestoration.tsx +94 -0
  40. package/src/browser/react/context.ts +53 -0
  41. package/src/browser/react/index.ts +52 -0
  42. package/src/browser/react/location-state-shared.ts +120 -0
  43. package/src/browser/react/location-state.ts +62 -0
  44. package/src/browser/react/mount-context.ts +32 -0
  45. package/src/browser/react/use-action.ts +240 -0
  46. package/src/browser/react/use-client-cache.ts +56 -0
  47. package/src/browser/react/use-handle.ts +203 -0
  48. package/src/browser/react/use-href.tsx +40 -0
  49. package/src/browser/react/use-link-status.ts +134 -0
  50. package/src/browser/react/use-mount.ts +31 -0
  51. package/src/browser/react/use-navigation.ts +140 -0
  52. package/src/browser/react/use-segments.ts +188 -0
  53. package/src/browser/request-controller.ts +164 -0
  54. package/src/browser/rsc-router.tsx +352 -0
  55. package/src/browser/scroll-restoration.ts +324 -0
  56. package/src/browser/segment-structure-assert.ts +67 -0
  57. package/src/browser/server-action-bridge.ts +762 -0
  58. package/src/browser/shallow.ts +35 -0
  59. package/src/browser/types.ts +478 -0
  60. package/src/build/generate-manifest.ts +377 -0
  61. package/src/build/generate-route-types.ts +828 -0
  62. package/src/build/index.ts +36 -0
  63. package/src/build/route-trie.ts +239 -0
  64. package/src/cache/cache-scope.ts +563 -0
  65. package/src/cache/cf/cf-cache-store.ts +428 -0
  66. package/src/cache/cf/index.ts +19 -0
  67. package/src/cache/document-cache.ts +340 -0
  68. package/src/cache/index.ts +58 -0
  69. package/src/cache/memory-segment-store.ts +150 -0
  70. package/src/cache/memory-store.ts +253 -0
  71. package/src/cache/types.ts +392 -0
  72. package/src/client.rsc.tsx +83 -0
  73. package/src/client.tsx +643 -0
  74. package/src/component-utils.ts +76 -0
  75. package/src/components/DefaultDocument.tsx +23 -0
  76. package/src/debug.ts +233 -0
  77. package/src/default-error-boundary.tsx +88 -0
  78. package/src/deps/browser.ts +8 -0
  79. package/src/deps/html-stream-client.ts +2 -0
  80. package/src/deps/html-stream-server.ts +2 -0
  81. package/src/deps/rsc.ts +10 -0
  82. package/src/deps/ssr.ts +2 -0
  83. package/src/errors.ts +295 -0
  84. package/src/handle.ts +130 -0
  85. package/src/handles/MetaTags.tsx +193 -0
  86. package/src/handles/index.ts +6 -0
  87. package/src/handles/meta.ts +247 -0
  88. package/src/host/cookie-handler.ts +159 -0
  89. package/src/host/errors.ts +97 -0
  90. package/src/host/index.ts +56 -0
  91. package/src/host/pattern-matcher.ts +214 -0
  92. package/src/host/router.ts +330 -0
  93. package/src/host/testing.ts +79 -0
  94. package/src/host/types.ts +138 -0
  95. package/src/host/utils.ts +25 -0
  96. package/src/href-client.ts +202 -0
  97. package/src/href-context.ts +33 -0
  98. package/src/index.rsc.ts +121 -0
  99. package/src/index.ts +165 -0
  100. package/src/loader.rsc.ts +207 -0
  101. package/src/loader.ts +47 -0
  102. package/src/network-error-thrower.tsx +21 -0
  103. package/src/outlet-context.ts +15 -0
  104. package/src/prerender/param-hash.ts +35 -0
  105. package/src/prerender/store.ts +40 -0
  106. package/src/prerender.ts +156 -0
  107. package/src/reverse.ts +267 -0
  108. package/src/root-error-boundary.tsx +277 -0
  109. package/src/route-content-wrapper.tsx +193 -0
  110. package/src/route-definition.ts +1431 -0
  111. package/src/route-map-builder.ts +242 -0
  112. package/src/route-types.ts +220 -0
  113. package/src/router/error-handling.ts +287 -0
  114. package/src/router/handler-context.ts +158 -0
  115. package/src/router/intercept-resolution.ts +387 -0
  116. package/src/router/loader-resolution.ts +327 -0
  117. package/src/router/manifest.ts +216 -0
  118. package/src/router/match-api.ts +621 -0
  119. package/src/router/match-context.ts +264 -0
  120. package/src/router/match-middleware/background-revalidation.ts +236 -0
  121. package/src/router/match-middleware/cache-lookup.ts +382 -0
  122. package/src/router/match-middleware/cache-store.ts +276 -0
  123. package/src/router/match-middleware/index.ts +81 -0
  124. package/src/router/match-middleware/intercept-resolution.ts +281 -0
  125. package/src/router/match-middleware/segment-resolution.ts +184 -0
  126. package/src/router/match-pipelines.ts +214 -0
  127. package/src/router/match-result.ts +213 -0
  128. package/src/router/metrics.ts +62 -0
  129. package/src/router/middleware.ts +791 -0
  130. package/src/router/pattern-matching.ts +407 -0
  131. package/src/router/revalidation.ts +190 -0
  132. package/src/router/router-context.ts +301 -0
  133. package/src/router/segment-resolution.ts +1315 -0
  134. package/src/router/trie-matching.ts +172 -0
  135. package/src/router/types.ts +163 -0
  136. package/src/router.gen.ts +6 -0
  137. package/src/router.ts +2423 -0
  138. package/src/rsc/handler.ts +1443 -0
  139. package/src/rsc/helpers.ts +64 -0
  140. package/src/rsc/index.ts +56 -0
  141. package/src/rsc/nonce.ts +18 -0
  142. package/src/rsc/types.ts +236 -0
  143. package/src/segment-system.tsx +442 -0
  144. package/src/server/context.ts +466 -0
  145. package/src/server/handle-store.ts +229 -0
  146. package/src/server/loader-registry.ts +174 -0
  147. package/src/server/request-context.ts +554 -0
  148. package/src/server/root-layout.tsx +10 -0
  149. package/src/server/tsconfig.json +14 -0
  150. package/src/server.ts +171 -0
  151. package/src/ssr/index.tsx +296 -0
  152. package/src/theme/ThemeProvider.tsx +291 -0
  153. package/src/theme/ThemeScript.tsx +61 -0
  154. package/src/theme/constants.ts +59 -0
  155. package/src/theme/index.ts +58 -0
  156. package/src/theme/theme-context.ts +70 -0
  157. package/src/theme/theme-script.ts +152 -0
  158. package/src/theme/types.ts +182 -0
  159. package/src/theme/use-theme.ts +44 -0
  160. package/src/types.ts +1757 -0
  161. package/src/urls.gen.ts +8 -0
  162. package/src/urls.ts +1282 -0
  163. package/src/use-loader.tsx +346 -0
  164. package/src/vite/expose-action-id.ts +344 -0
  165. package/src/vite/expose-handle-id.ts +209 -0
  166. package/src/vite/expose-loader-id.ts +426 -0
  167. package/src/vite/expose-location-state-id.ts +177 -0
  168. package/src/vite/expose-prerender-handler-id.ts +429 -0
  169. package/src/vite/index.ts +2068 -0
  170. package/src/vite/package-resolution.ts +125 -0
  171. package/src/vite/version.d.ts +12 -0
  172. package/src/vite/virtual-entries.ts +114 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Client-safe type-safe href function
3
+ *
4
+ * This is a compile-time only href that validates paths against registered routes.
5
+ * No runtime route map lookup - just an identity function with TypeScript validation.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { href } from "rsc-router/client";
10
+ *
11
+ * href("/blog/my-post"); // ✓ matches /blog/:slug
12
+ * href("/shop/product/widget"); // ✓ matches /shop/product/:slug
13
+ * href("/invalid"); // ✗ TypeScript error
14
+ * ```
15
+ */
16
+
17
+ import type { GetRegisteredRoutes } from "./types.js";
18
+ import type { ResponseEnvelope } from "./urls.js";
19
+
20
+ /**
21
+ * Parse constraint values into a union type for paths
22
+ * "a|b|c" → "a" | "b" | "c"
23
+ */
24
+ type ParseConstraintPath<T extends string> =
25
+ T extends `${infer First}|${infer Rest}`
26
+ ? First | ParseConstraintPath<Rest>
27
+ : T;
28
+
29
+ /**
30
+ * Convert a route pattern to a template literal type
31
+ *
32
+ * Supports:
33
+ * - Static: /about → "/about"
34
+ * - Dynamic: /blog/:slug → `/blog/${string}`
35
+ * - Optional: /:locale?/blog → "/blog" | `/${string}/blog`
36
+ * - Constrained: /:locale(en|gb)/blog → "/en/blog" | "/gb/blog"
37
+ * - Optional + Constrained: /:locale(en|gb)?/blog → "/blog" | "/en/blog" | "/gb/blog"
38
+ *
39
+ * @example
40
+ * PatternToPath<"/blog/:slug"> = `/blog/${string}`
41
+ * PatternToPath<"/:locale?/blog"> = "/blog" | `/${string}/blog`
42
+ * PatternToPath<"/:locale(en|gb)/blog"> = "/en/blog" | "/gb/blog"
43
+ * PatternToPath<"/:locale(en|gb)?/blog"> = "/blog" | "/en/blog" | "/gb/blog"
44
+ */
45
+ export type PatternToPath<T extends string> =
46
+ // Optional + constrained param in middle: /:param(a|b)?/rest
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;
72
+
73
+ /**
74
+ * Allow optional query string (?...) and/or hash fragment (#...) suffix
75
+ *
76
+ * @example
77
+ * WithSuffix<"/about"> = "/about" | "/about?..." | "/about#..." | "/about?...#..."
78
+ */
79
+ type WithSuffix<T extends string> =
80
+ | T
81
+ | `${T}?${string}`
82
+ | `${T}#${string}`
83
+ | `${T}?${string}#${string}`;
84
+
85
+ /**
86
+ * Helper type to get pattern from routes, handling string values and { path, response } objects
87
+ */
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
+
93
+ /**
94
+ * Reverse lookup: find route name where the pattern matches TPattern
95
+ */
96
+ type NameForPattern<
97
+ TPattern extends string,
98
+ TRoutes = GetRegisteredRoutes
99
+ > = {
100
+ [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern ? K : never
101
+ }[keyof TRoutes];
102
+
103
+ /**
104
+ * Look up the response data type for a route pattern from RegisteredRoutes.
105
+ *
106
+ * Works by reverse-looking up the route name for the given pattern,
107
+ * then extracting the response type from the route entry.
108
+ *
109
+ * For static routes (no params), pattern === path:
110
+ * PathResponse<"/api/health"> → { status: string; timestamp: number }
111
+ *
112
+ * For dynamic routes, use the pattern:
113
+ * PathResponse<"/api/products/:id"> → Product
114
+ */
115
+ export type PathResponse<TPattern extends string, TRoutes = GetRegisteredRoutes> =
116
+ ResponseEnvelope<{
117
+ [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]>;
121
+
122
+ /**
123
+ * Strip trailing slash from a path (e.g., "/blog/" -> "/blog" | "/blog/")
124
+ * Allows navigation to include() prefixes without requiring trailing slash
125
+ */
126
+ type OptionalTrailingSlash<T extends string> =
127
+ T extends `${infer Base}/` ? (Base extends "" ? T : Base | T) : T;
128
+
129
+ /**
130
+ * Union of all valid paths from registered routes
131
+ *
132
+ * Generated from RSCRouter.RegisteredRoutes via module augmentation.
133
+ * Allows optional query strings and hash fragments.
134
+ */
135
+ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
136
+ keyof TRoutes extends never
137
+ ? `/${string}` // Fallback when no routes are registered
138
+ : WithSuffix<{
139
+ [K in keyof TRoutes]: OptionalTrailingSlash<PatternToPath<RoutePattern<TRoutes, K>>>
140
+ }[keyof TRoutes]>;
141
+
142
+ /**
143
+ * Type-safe href function for client-side use
144
+ *
145
+ * Without mount: identity function, validates absolute paths at compile time.
146
+ * With mount: prepends mount path, for use with useMount() inside include() scopes.
147
+ *
148
+ * @param path - A valid path matching one of the registered route patterns
149
+ * @param mount - Optional mount prefix from useMount() for include-scoped paths
150
+ * @returns The resolved path
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * // Absolute paths (type-safe)
155
+ * href("/blog/hello"); // "/blog/hello"
156
+ * href("/shop/product/widget"); // "/shop/product/widget"
157
+ *
158
+ * // With mount (inside an include)
159
+ * const mount = useMount(); // "/articles"
160
+ * href("/", mount); // "/articles/"
161
+ * href("/my-post", mount); // "/articles/my-post"
162
+ *
163
+ * // Query strings and hashes pass through
164
+ * href("/blog/hello?page=1");
165
+ * href("/about#contact");
166
+ * ```
167
+ */
168
+ export function href<T extends ValidPaths>(path: T, mount?: string): string {
169
+ if (mount && mount !== "/") {
170
+ return mount + path;
171
+ }
172
+ return path;
173
+ }
174
+
175
+ /**
176
+ * Props shape returned by href.json() etc. for spreading on <Link>.
177
+ * Sets data-external to trigger hard navigation (skips RSC fetch).
178
+ */
179
+ export interface ResponseHrefProps {
180
+ to: string;
181
+ "data-external": "";
182
+ }
183
+
184
+ type ResponseHrefFn = <T extends ValidPaths>(path: T, mount?: string) => ResponseHrefProps;
185
+
186
+ function createResponseHrefTag(): ResponseHrefFn {
187
+ return (path, mount) => ({
188
+ to: href(path, mount),
189
+ "data-external": "" as const,
190
+ });
191
+ }
192
+
193
+ export namespace href {
194
+ export const json: ResponseHrefFn = createResponseHrefTag();
195
+ export const text: ResponseHrefFn = createResponseHrefTag();
196
+ export const html: ResponseHrefFn = createResponseHrefTag();
197
+ export const xml: ResponseHrefFn = createResponseHrefTag();
198
+ export const md: ResponseHrefFn = createResponseHrefTag();
199
+ export const image: ResponseHrefFn = createResponseHrefTag();
200
+ export const stream: ResponseHrefFn = createResponseHrefTag();
201
+ export const any: ResponseHrefFn = createResponseHrefTag();
202
+ }
@@ -0,0 +1,33 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Href Context for route name resolution
5
+ *
6
+ * This module is marked "use client" so it can be imported by both:
7
+ * - Server (segment-system): Gets a client reference for createElement
8
+ * - Client (useHref): Uses the actual context for useContext
9
+ *
10
+ * The context stores:
11
+ * - routeMap: Map of route names to URL patterns
12
+ * - routeName: Current matched route name (for local name resolution)
13
+ */
14
+ import { createContext, type Context } from "react";
15
+
16
+ /**
17
+ * Context value for href resolution
18
+ */
19
+ export interface HrefContextValue {
20
+ /** Route map: route name -> URL pattern */
21
+ routeMap: Record<string, string>;
22
+ /** Current matched route name (includes name prefix from include()) */
23
+ routeName?: string;
24
+ }
25
+
26
+ /**
27
+ * Context for href resolution (route map and current route name)
28
+ *
29
+ * On the server: Populated by renderSegments() via HrefContext.Provider
30
+ * On the client: Populated by NavigationProvider from RSC metadata
31
+ */
32
+ export const HrefContext: Context<HrefContextValue | null> =
33
+ createContext<HrefContextValue | null>(null);
@@ -0,0 +1,121 @@
1
+ /**
2
+ * rsc-router (react-server environment)
3
+ *
4
+ * This file is used when importing "rsc-router" from RSC (server components).
5
+ * It re-exports everything from the universal index.ts plus adds server-side
6
+ * createLoader that includes the actual loader function.
7
+ *
8
+ * The bundler uses the "react-server" export condition to select this file
9
+ * in RSC context, while the regular index.ts is used in client components.
10
+ */
11
+
12
+ // Re-export all universal exports from index.ts
13
+ export {
14
+ // Universal rendering utilities
15
+ renderSegments,
16
+ // Error classes
17
+ RouteNotFoundError,
18
+ DataNotFoundError,
19
+ notFound,
20
+ MiddlewareError,
21
+ HandlerError,
22
+ BuildError,
23
+ InvalidHandlerError,
24
+ NetworkError,
25
+ isNetworkError,
26
+ sanitizeError,
27
+ RouterError,
28
+ } from "./index.js";
29
+
30
+ // Re-export all types from types.ts (user-facing types only)
31
+ export type {
32
+ // Configuration types
33
+ DocumentProps,
34
+ RouterEnv,
35
+ DefaultEnv,
36
+ RouteDefinition,
37
+ // Handler types
38
+ Handler,
39
+ ScopedRouteMap,
40
+ HandlerContext,
41
+ ExtractParams,
42
+ GenericParams,
43
+ // Middleware types
44
+ Middleware,
45
+ // Revalidation types
46
+ RevalidateParams,
47
+ Revalidate,
48
+ RouteKeys,
49
+ // Loader types
50
+ LoaderDefinition,
51
+ LoaderFn,
52
+ LoaderContext,
53
+ FetchableLoaderOptions,
54
+ LoadOptions,
55
+ LoaderActionContext,
56
+ LoaderAction,
57
+ LoaderMiddlewareFn,
58
+ // Error boundary types
59
+ ErrorInfo,
60
+ ErrorBoundaryFallbackProps,
61
+ ErrorBoundaryHandler,
62
+ ClientErrorBoundaryFallbackProps,
63
+ // NotFound boundary types
64
+ NotFoundInfo,
65
+ NotFoundBoundaryFallbackProps,
66
+ NotFoundBoundaryHandler,
67
+ } from "./types.js";
68
+
69
+ // Router options type (server-only, so import directly)
70
+ export type { RSCRouterOptions } from "./router.js";
71
+
72
+ // Server-side createLoader and redirect
73
+ export { createLoader, redirect } from "./route-definition.js";
74
+
75
+ // Handle API
76
+ export { createHandle, isHandle, type Handle } from "./handle.js";
77
+
78
+ // Pre-render handler API
79
+ export {
80
+ createPrerenderHandler,
81
+ isPrerenderHandler,
82
+ type PrerenderHandlerDefinition,
83
+ type PrerenderOptions,
84
+ type BuildContext,
85
+ } from "./prerender.js";
86
+
87
+ // Django-style URL patterns (RSC/server context)
88
+ export {
89
+ urls,
90
+ type PathHelpers,
91
+ type PathOptions,
92
+ type UrlPatterns,
93
+ type IncludeOptions,
94
+ type IncludeItem,
95
+ type RouteResponse,
96
+ type ResponseError,
97
+ type ResponseEnvelope,
98
+ } from "./urls.js";
99
+
100
+ // Core router (server-side)
101
+ export {
102
+ createRouter,
103
+ type RSCRouter,
104
+ type RootLayoutProps,
105
+ } from "./router.js";
106
+
107
+ // RSC handler types (server-side)
108
+ export type { HandlerCacheConfig } from "./rsc/types.js";
109
+
110
+ // Built-in handles (server-side)
111
+ export { Meta } from "./handles/meta.js";
112
+
113
+ // Request context (for accessing request data in server actions/components)
114
+ export { getRequestContext, type RequestContext } from "./server/request-context.js";
115
+
116
+ // Meta types
117
+ export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
118
+
119
+ // Reverse type utilities for type-safe URL generation (Django-style URL reversal)
120
+ export type { ScopedReverseFunction, ReverseFunction, ExtractLocalRoutes } from "./reverse.js";
121
+ export { scopedReverse } from "./reverse.js";
package/src/index.ts ADDED
@@ -0,0 +1,165 @@
1
+ /**
2
+ * rsc-router
3
+ *
4
+ * Universal exports - types and utilities safe for both server and client
5
+ *
6
+ * For server-only exports (urls, createRouter, createLoader, etc.):
7
+ * import from "rsc-router/server"
8
+ *
9
+ * For client-only exports (Outlet, useOutlet, etc.):
10
+ * import from "rsc-router/client"
11
+ */
12
+
13
+ // Universal rendering utilities (work on both server and client)
14
+ export { renderSegments } from "./segment-system.js";
15
+
16
+ // Error classes (can be used on both server and client)
17
+ export {
18
+ RouteNotFoundError,
19
+ DataNotFoundError,
20
+ notFound,
21
+ MiddlewareError,
22
+ HandlerError,
23
+ BuildError,
24
+ InvalidHandlerError,
25
+ NetworkError,
26
+ isNetworkError,
27
+ sanitizeError,
28
+ RouterError,
29
+ } from "./errors.js";
30
+
31
+ // Types (safe to import anywhere - no runtime code)
32
+ export type {
33
+ // Configuration types
34
+ DocumentProps,
35
+ RouterEnv,
36
+ DefaultEnv,
37
+ RouteDefinition,
38
+ // Handler types
39
+ Handler, // Supports params object, path pattern, or route name
40
+ ScopedRouteMap, // Scoped view of GeneratedRouteMap for Handler<"localName", ScopedRouteMap<"prefix">>
41
+ HandlerContext,
42
+ ExtractParams,
43
+ GenericParams,
44
+ // Middleware types
45
+ Middleware,
46
+ // Revalidation types
47
+ RevalidateParams,
48
+ Revalidate,
49
+ RouteKeys,
50
+ // Loader types
51
+ LoaderDefinition,
52
+ LoaderFn,
53
+ LoaderContext,
54
+ FetchableLoaderOptions,
55
+ LoadOptions,
56
+ LoaderActionContext,
57
+ LoaderAction,
58
+ LoaderMiddlewareFn,
59
+ // Error boundary types
60
+ ErrorInfo,
61
+ ErrorBoundaryFallbackProps,
62
+ ErrorBoundaryHandler,
63
+ ClientErrorBoundaryFallbackProps,
64
+ // NotFound boundary types
65
+ NotFoundInfo,
66
+ NotFoundBoundaryFallbackProps,
67
+ NotFoundBoundaryHandler,
68
+ } from "./types.js";
69
+
70
+ // Client-safe createLoader - only stores the $$id, function is not included
71
+ // Use this when defining loaders that will be imported by client components
72
+ export { createLoader } from "./loader.js";
73
+
74
+ // Response route types (usable in both server and client contexts)
75
+ export type {
76
+ ResponseHandler,
77
+ ResponseHandlerContext,
78
+ JsonResponseHandler,
79
+ TextResponseHandler,
80
+ JsonValue,
81
+ ResponsePathFn,
82
+ JsonResponsePathFn,
83
+ TextResponsePathFn,
84
+ RouteResponse,
85
+ ResponseError,
86
+ ResponseEnvelope,
87
+ } from "./urls.js";
88
+
89
+ /**
90
+ * Error-throwing stub for server-only `urls` function.
91
+ * Import from "@rangojs/router/server" or use within RSC context instead.
92
+ */
93
+ export function urls(): never {
94
+ throw new Error(
95
+ 'urls() is server-only. Import from "@rangojs/router/server" instead, or ensure you\'re using it in a server component.'
96
+ );
97
+ }
98
+
99
+ /**
100
+ * Error-throwing stub for server-only `createRouter` function.
101
+ * Import from "@rangojs/router/server" instead.
102
+ */
103
+ export function createRouter(): never {
104
+ throw new Error(
105
+ 'createRouter() is server-only. Import from "@rangojs/router/server" instead.'
106
+ );
107
+ }
108
+
109
+ /**
110
+ * Error-throwing stub for server-only `redirect` function.
111
+ * Import from "@rangojs/router/server" or use within RSC context instead.
112
+ */
113
+ export function redirect(): never {
114
+ throw new Error(
115
+ 'redirect() is server-only. Import from "@rangojs/router/server" instead.'
116
+ );
117
+ }
118
+
119
+ /**
120
+ * Error-throwing stub for server-only `createHandle` function.
121
+ * Import from "@rangojs/router/server" or use within RSC context instead.
122
+ */
123
+ export function createHandle(): never {
124
+ throw new Error(
125
+ 'createHandle() is server-only. Import from "@rangojs/router/server" instead.'
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Error-throwing stub for server-only `createPrerenderHandler` function.
131
+ * Import from "@rangojs/router/server" or use within RSC context instead.
132
+ */
133
+ export function createPrerenderHandler(): never {
134
+ throw new Error(
135
+ 'createPrerenderHandler() is server-only. Import from "@rangojs/router/server" instead.'
136
+ );
137
+ }
138
+
139
+ // Handle API (type-only exports safe for client)
140
+ export { isHandle, type Handle } from "./handle.js";
141
+
142
+ /**
143
+ * Error-throwing stub for server-only `getRequestContext` function.
144
+ * Import from "@rangojs/router/server" or use within RSC context instead.
145
+ */
146
+ export function getRequestContext(): never {
147
+ throw new Error(
148
+ 'getRequestContext() is server-only. Import from "@rangojs/router/server" instead.'
149
+ );
150
+ }
151
+
152
+ // Request context type (safe for client)
153
+ export type { RequestContext } from "./server/request-context.js";
154
+
155
+ // Meta types
156
+ export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
157
+
158
+ // Reverse type utilities for type-safe URL generation (Django-style URL reversal)
159
+ // ScopedReverseFunction is used with scopedReverse<typeof patterns>() for composable modules
160
+ export type { ScopedReverseFunction, ReverseFunction, ExtractLocalRoutes } from "./reverse.js";
161
+ // scopedReverse() helper for handlers to get locally-typed reverse
162
+ export { scopedReverse } from "./reverse.js";
163
+
164
+ // Path-based response type lookup from RegisteredRoutes
165
+ export type { PathResponse } from "./href-client.js";