fibrae 0.2.2 → 0.3.0

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 (119) hide show
  1. package/dist/cli/build.d.ts +34 -0
  2. package/dist/cli/build.js +92 -0
  3. package/dist/cli/build.js.map +1 -0
  4. package/dist/cli/cli.d.ts +10 -0
  5. package/dist/cli/cli.js +43 -0
  6. package/dist/cli/cli.js.map +1 -0
  7. package/dist/cli/config.d.ts +19 -0
  8. package/dist/cli/config.js +5 -0
  9. package/dist/cli/config.js.map +1 -0
  10. package/dist/cli/html.d.ts +13 -0
  11. package/dist/cli/html.js +101 -0
  12. package/dist/cli/html.js.map +1 -0
  13. package/dist/cli/index.d.ts +6 -0
  14. package/dist/cli/index.js +4 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli/vite-plugin.d.ts +9 -0
  17. package/dist/cli/vite-plugin.js +143 -0
  18. package/dist/cli/vite-plugin.js.map +1 -0
  19. package/dist/components.d.ts +27 -29
  20. package/dist/components.js +32 -52
  21. package/dist/components.js.map +1 -1
  22. package/dist/core.js +7 -10
  23. package/dist/core.js.map +1 -1
  24. package/dist/dom.d.ts +13 -4
  25. package/dist/dom.js +91 -26
  26. package/dist/dom.js.map +1 -1
  27. package/dist/fiber-boundary.d.ts +39 -0
  28. package/dist/fiber-boundary.js +151 -0
  29. package/dist/fiber-boundary.js.map +1 -0
  30. package/dist/fiber-commit.d.ts +27 -0
  31. package/dist/fiber-commit.js +243 -0
  32. package/dist/fiber-commit.js.map +1 -0
  33. package/dist/fiber-render.d.ts +9 -9
  34. package/dist/fiber-render.js +165 -958
  35. package/dist/fiber-render.js.map +1 -1
  36. package/dist/fiber-tree.d.ts +77 -0
  37. package/dist/fiber-tree.js +152 -0
  38. package/dist/fiber-tree.js.map +1 -0
  39. package/dist/fiber-update.d.ts +46 -0
  40. package/dist/fiber-update.js +515 -0
  41. package/dist/fiber-update.js.map +1 -0
  42. package/dist/h.js.map +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/jsx-runtime/index.d.ts +253 -2
  47. package/dist/live/atom.d.ts +31 -0
  48. package/dist/live/atom.js +33 -0
  49. package/dist/live/atom.js.map +1 -0
  50. package/dist/live/client.d.ts +50 -0
  51. package/dist/live/client.js +90 -0
  52. package/dist/live/client.js.map +1 -0
  53. package/dist/live/codec.d.ts +39 -0
  54. package/dist/live/codec.js +41 -0
  55. package/dist/live/codec.js.map +1 -0
  56. package/dist/live/config.d.ts +13 -0
  57. package/dist/live/config.js +11 -0
  58. package/dist/live/config.js.map +1 -0
  59. package/dist/live/index.d.ts +25 -0
  60. package/dist/live/index.js +19 -0
  61. package/dist/live/index.js.map +1 -0
  62. package/dist/live/server.d.ts +83 -0
  63. package/dist/live/server.js +106 -0
  64. package/dist/live/server.js.map +1 -0
  65. package/dist/live/sse-stream.d.ts +14 -0
  66. package/dist/live/sse-stream.js +30 -0
  67. package/dist/live/sse-stream.js.map +1 -0
  68. package/dist/live/types.d.ts +40 -0
  69. package/dist/live/types.js +20 -0
  70. package/dist/live/types.js.map +1 -0
  71. package/dist/router/History.d.ts +2 -2
  72. package/dist/router/History.js.map +1 -1
  73. package/dist/router/Link.d.ts +8 -4
  74. package/dist/router/Link.js +13 -34
  75. package/dist/router/Link.js.map +1 -1
  76. package/dist/router/Navigator.d.ts +12 -1
  77. package/dist/router/Navigator.js +31 -68
  78. package/dist/router/Navigator.js.map +1 -1
  79. package/dist/router/Route.d.ts +16 -3
  80. package/dist/router/Route.js +32 -25
  81. package/dist/router/Route.js.map +1 -1
  82. package/dist/router/Router.d.ts +27 -19
  83. package/dist/router/Router.js +78 -101
  84. package/dist/router/Router.js.map +1 -1
  85. package/dist/router/RouterBuilder.d.ts +106 -34
  86. package/dist/router/RouterBuilder.js +78 -39
  87. package/dist/router/RouterBuilder.js.map +1 -1
  88. package/dist/router/RouterOutlet.d.ts +1 -18
  89. package/dist/router/RouterOutlet.js +25 -8
  90. package/dist/router/RouterOutlet.js.map +1 -1
  91. package/dist/router/RouterState.d.ts +1 -1
  92. package/dist/router/index.d.ts +4 -4
  93. package/dist/router/index.js +4 -2
  94. package/dist/router/index.js.map +1 -1
  95. package/dist/router/utils.d.ts +36 -0
  96. package/dist/router/utils.js +48 -0
  97. package/dist/router/utils.js.map +1 -0
  98. package/dist/runtime.d.ts +10 -7
  99. package/dist/runtime.js +20 -2
  100. package/dist/runtime.js.map +1 -1
  101. package/dist/server.d.ts +2 -2
  102. package/dist/server.js +15 -29
  103. package/dist/server.js.map +1 -1
  104. package/dist/shared.d.ts +58 -59
  105. package/dist/shared.js +51 -13
  106. package/dist/shared.js.map +1 -1
  107. package/dist/tracking.d.ts +4 -3
  108. package/dist/tracking.js +6 -1
  109. package/dist/tracking.js.map +1 -1
  110. package/package.json +32 -7
  111. package/dist/hydration.d.ts +0 -30
  112. package/dist/hydration.js +0 -355
  113. package/dist/hydration.js.map +0 -1
  114. package/dist/render.d.ts +0 -19
  115. package/dist/render.js +0 -285
  116. package/dist/render.js.map +0 -1
  117. package/dist/scope-utils.d.ts +0 -14
  118. package/dist/scope-utils.js +0 -29
  119. package/dist/scope-utils.js.map +0 -1
@@ -15,32 +15,36 @@ import * as Option from "effect/Option";
15
15
  import * as Effect from "effect/Effect";
16
16
  import * as Layer from "effect/Layer";
17
17
  import * as Context from "effect/Context";
18
- import * as Data from "effect/Data";
18
+ import * as Schema from "effect/Schema";
19
19
  import { Registry as AtomRegistry } from "@effect-atom/atom";
20
20
  import { History, MemoryHistoryLive } from "./History.js";
21
21
  import { Navigator, NavigatorLive } from "./Navigator.js";
22
22
  import { RouterHandlers } from "./RouterBuilder.js";
23
23
  import { RouterStateAtom } from "./RouterState.js";
24
+ import { parseSearchParams, stripBasePath } from "./utils.js";
24
25
  /**
25
26
  * Router error for route matching and navigation failures.
26
27
  */
27
- export class RouterError extends Data.TaggedError("RouterError") {
28
+ export class RouterError extends Schema.TaggedError()("RouterError", {
29
+ message: Schema.String,
30
+ cause: Schema.optional(Schema.Unknown),
31
+ }) {
28
32
  }
29
33
  /**
30
34
  * Create a route group with the given name.
31
35
  * Routes are added via group.add(route).
36
+ * Route names accumulate as literal types through the builder chain.
32
37
  */
33
38
  export function group(name) {
39
+ return createRouteGroup(name, []);
40
+ }
41
+ /** Internal helper — creates a RouteGroup with accumulated RouteNames. */
42
+ function createRouteGroup(name, routes) {
34
43
  return {
35
44
  _tag: "RouteGroup",
36
45
  name,
37
- routes: [],
38
- add(route) {
39
- return {
40
- ...this,
41
- routes: [...this.routes, route],
42
- };
43
- },
46
+ routes,
47
+ add: (route) => createRouteGroup(name, [...routes, route]),
44
48
  };
45
49
  }
46
50
  /**
@@ -68,75 +72,60 @@ export function group(name) {
68
72
  export function layout(name, basePath) {
69
73
  // Normalize basePath - ensure it starts with / and doesn't end with /
70
74
  const normalizedBase = basePath.startsWith("/") ? basePath : `/${basePath}`;
71
- const cleanBase = normalizedBase.endsWith("/")
72
- ? normalizedBase.slice(0, -1)
73
- : normalizedBase;
75
+ const cleanBase = normalizedBase.endsWith("/") ? normalizedBase.slice(0, -1) : normalizedBase;
76
+ return createLayoutGroup(name, cleanBase, []);
77
+ }
78
+ /** Internal helper — creates a LayoutGroup with accumulated RouteNames. */
79
+ function createLayoutGroup(name, basePath, routes) {
74
80
  return {
75
81
  _tag: "LayoutGroup",
76
82
  name,
77
- basePath: cleanBase,
78
- routes: [],
79
- add(route) {
80
- return {
81
- ...this,
82
- routes: [...this.routes, route],
83
- };
84
- },
83
+ basePath,
84
+ routes,
85
+ add: (route) => createLayoutGroup(name, basePath, [...routes, route]),
85
86
  };
86
87
  }
87
88
  /**
88
89
  * Create a router with the given name.
89
90
  * Groups are added via router.add(group).
91
+ * Route names accumulate from groups for type-safe navigation.
90
92
  */
91
93
  export function make(name) {
94
+ return createRouter(name, []);
95
+ }
96
+ /** Internal helper — creates a Router with accumulated RouteNames. */
97
+ function createRouter(name, groups) {
92
98
  return {
93
99
  name,
94
- groups: [],
95
- add(g) {
96
- return {
97
- ...this,
98
- groups: [...this.groups, g],
99
- };
100
- },
100
+ groups,
101
+ add: (g) => createRouter(name, [...groups, g]),
101
102
  matchRoute(pathname) {
102
- // Try to match against each route in each group
103
- for (const g of this.groups) {
104
- if (g._tag === "LayoutGroup") {
105
- // For layout groups, check if pathname starts with basePath
106
- const layoutGroup = g;
107
- if (pathname.startsWith(layoutGroup.basePath)) {
108
- // Get the remaining path after the base
109
- const remainingPath = pathname.slice(layoutGroup.basePath.length) || "/";
110
- // Try to match child routes against remaining path
111
- for (const route of layoutGroup.routes) {
112
- const match = route.match(remainingPath);
113
- if (Option.isSome(match)) {
114
- return Option.some({
115
- groupName: layoutGroup.name,
116
- route,
117
- params: match.value,
118
- layouts: [layoutGroup],
119
- });
120
- }
121
- }
103
+ const tryMatchRoutes = (routes, path, groupName, layouts) => Effect.gen(function* () {
104
+ for (const route of routes) {
105
+ const match = yield* route.match(path);
106
+ if (Option.isSome(match)) {
107
+ return Option.some({ groupName, route, params: match.value, layouts });
122
108
  }
123
109
  }
124
- else {
125
- // Regular route group - match directly
126
- for (const route of g.routes) {
127
- const match = route.match(pathname);
128
- if (Option.isSome(match)) {
129
- return Option.some({
130
- groupName: g.name,
131
- route,
132
- params: match.value,
133
- layouts: [],
134
- });
135
- }
136
- }
110
+ return Option.none();
111
+ });
112
+ const tryMatchGroup = (g) => {
113
+ if (g._tag === "LayoutGroup") {
114
+ if (!pathname.startsWith(g.basePath))
115
+ return Effect.succeed(Option.none());
116
+ const remainingPath = pathname.slice(g.basePath.length) || "/";
117
+ return tryMatchRoutes(g.routes, remainingPath, g.name, [g]);
137
118
  }
138
- }
139
- return Option.none();
119
+ return tryMatchRoutes(g.routes, pathname, g.name, []);
120
+ };
121
+ return Effect.gen(function* () {
122
+ for (const g of groups) {
123
+ const result = yield* tryMatchGroup(g);
124
+ if (Option.isSome(result))
125
+ return result;
126
+ }
127
+ return Option.none();
128
+ });
140
129
  },
141
130
  };
142
131
  }
@@ -146,36 +135,6 @@ export function make(name) {
146
135
  */
147
136
  export class CurrentRouteElement extends Context.Tag("fibrae/CurrentRouteElement")() {
148
137
  }
149
- /**
150
- * Parse search params from URL search string.
151
- */
152
- function parseSearchParams(search) {
153
- const params = {};
154
- const searchString = search.startsWith("?") ? search.slice(1) : search;
155
- if (!searchString)
156
- return params;
157
- const searchParams = new URLSearchParams(searchString);
158
- searchParams.forEach((value, key) => {
159
- params[key] = value;
160
- });
161
- return params;
162
- }
163
- /**
164
- * Strip basePath prefix from pathname for route matching.
165
- */
166
- function stripBasePath(pathname, basePath) {
167
- if (!basePath || basePath === "/") {
168
- return pathname;
169
- }
170
- // Normalize: remove trailing slash from basePath
171
- const normalizedBase = basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
172
- if (pathname.startsWith(normalizedBase)) {
173
- const stripped = pathname.slice(normalizedBase.length);
174
- // Ensure we return "/" not "" for root
175
- return stripped || "/";
176
- }
177
- return pathname;
178
- }
179
138
  /**
180
139
  * Create a server-side layer for SSR rendering.
181
140
  *
@@ -215,11 +174,11 @@ export function serverLayer(options) {
215
174
  const routerHandlers = yield* RouterHandlers;
216
175
  const registry = yield* AtomRegistry.AtomRegistry;
217
176
  // Match route using stripped pathname
218
- const match = router.matchRoute(matchPathname);
219
- if (Option.isNone(match)) {
177
+ const matchResult = yield* router.matchRoute(matchPathname);
178
+ if (Option.isNone(matchResult)) {
220
179
  return yield* Effect.fail(new RouterError({ message: `No route matched pathname: ${matchPathname}` }));
221
180
  }
222
- const { route, params } = match.value;
181
+ const { route, params } = matchResult.value;
223
182
  // Get handler for this route
224
183
  const handler = routerHandlers.getHandler(route.name);
225
184
  if (Option.isNone(handler)) {
@@ -239,9 +198,14 @@ export function serverLayer(options) {
239
198
  searchParams,
240
199
  loaderData,
241
200
  };
201
+ // Execute head() if defined
202
+ const head = yield* Option.match(handler.value.head, {
203
+ onNone: () => Effect.succeedNone,
204
+ onSome: (fn) => fn({ loaderData, params, searchParams }).pipe(Effect.asSome),
205
+ });
242
206
  // Set RouterStateAtom so it gets included in dehydrated state
243
207
  registry.set(RouterStateAtom, Option.some(state));
244
- return { element, state };
208
+ return { element, state, head };
245
209
  }));
246
210
  return Layer.mergeAll(historyLayer, navigatorLayer, routeElementLayer);
247
211
  }
@@ -361,18 +325,27 @@ export function browserLayer(options) {
361
325
  searchParams: state.searchParams,
362
326
  loaderData: state.loaderData,
363
327
  };
364
- return { element, state: dehydratedState };
328
+ // Execute head on client too (for title updates etc.)
329
+ const head = yield* Option.match(handler.value.head, {
330
+ onNone: () => Effect.succeedNone,
331
+ onSome: (fn) => fn({
332
+ loaderData: state.loaderData,
333
+ params: state.params,
334
+ searchParams: state.searchParams,
335
+ }).pipe(Effect.asSome),
336
+ });
337
+ return { element, state: dehydratedState, head };
365
338
  }
366
339
  // Non-hydration mode: match and run loader
367
340
  const pathname = window.location.pathname;
368
341
  const matchPathname = stripBasePath(pathname, basePath);
369
342
  const search = window.location.search;
370
343
  const searchParams = parseSearchParams(search);
371
- const match = router.matchRoute(matchPathname);
372
- if (Option.isNone(match)) {
344
+ const matchResult = yield* router.matchRoute(matchPathname);
345
+ if (Option.isNone(matchResult)) {
373
346
  return yield* Effect.fail(new RouterError({ message: `No route matched pathname: ${matchPathname}` }));
374
347
  }
375
- const { route, params } = match.value;
348
+ const { route, params } = matchResult.value;
376
349
  const handler = routerHandlers.getHandler(route.name);
377
350
  if (Option.isNone(handler)) {
378
351
  return yield* Effect.fail(new RouterError({ message: `No handler found for route: ${route.name}` }));
@@ -390,9 +363,13 @@ export function browserLayer(options) {
390
363
  searchParams,
391
364
  loaderData,
392
365
  };
366
+ const head = yield* Option.match(handler.value.head, {
367
+ onNone: () => Effect.succeedNone,
368
+ onSome: (fn) => fn({ loaderData, params, searchParams }).pipe(Effect.asSome),
369
+ });
393
370
  // Set RouterStateAtom for DI access
394
371
  registry.set(RouterStateAtom, Option.some(state));
395
- return { element, state };
372
+ return { element, state, head };
396
373
  }));
397
374
  // Layer composition: historyLayer provides History, which navigatorLayer needs.
398
375
  // We use provideMerge to give Navigator the History it needs, then merge with routeElementLayer.
@@ -1 +1 @@
1
- {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/Router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/Router.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import * as Effect from "effect/Effect";
10
10
  import * as Context from "effect/Context";
11
11
  import * as Layer from "effect/Layer";
12
12
  import * as Option from "effect/Option";
13
- import type { Router } from "./Router.js";
13
+ import type { Router, RouteGroup, LayoutGroup } from "./Router.js";
14
14
  import type { Route } from "./Route.js";
15
15
  import type { VElement } from "../shared.js";
16
16
  /**
@@ -34,6 +34,47 @@ export interface ComponentProps<LoaderData = unknown, PathParams extends Record<
34
34
  * Plain values are automatically wrapped in Effect.succeed.
35
35
  */
36
36
  export type LoaderResult<T, E = never, R = never> = T | Effect.Effect<T, E, R>;
37
+ /**
38
+ * Per-route metadata for the document `<head>`.
39
+ * Rendered during SSR/SSG, updated on client navigation.
40
+ */
41
+ export type MetaDescriptor = {
42
+ readonly charset: "utf-8";
43
+ } | {
44
+ readonly title: string;
45
+ } | {
46
+ readonly name: string;
47
+ readonly content: string;
48
+ } | {
49
+ readonly property: string;
50
+ readonly content: string;
51
+ } | {
52
+ readonly httpEquiv: string;
53
+ readonly content: string;
54
+ } | {
55
+ readonly "script:ld+json": Record<string, unknown>;
56
+ } | {
57
+ readonly tagName: "meta" | "link";
58
+ readonly [key: string]: string;
59
+ };
60
+ export interface HeadData {
61
+ readonly title?: string;
62
+ readonly meta?: ReadonlyArray<MetaDescriptor>;
63
+ readonly links?: ReadonlyArray<Record<string, string>>;
64
+ readonly scripts?: ReadonlyArray<{
65
+ readonly src?: string;
66
+ readonly content?: string;
67
+ readonly type?: string;
68
+ }>;
69
+ }
70
+ /**
71
+ * Context provided to the head() function.
72
+ */
73
+ export interface HeadContext<LoaderData = unknown, PathParams extends Record<string, unknown> = Record<string, unknown>, SearchParams extends Record<string, unknown> = Record<string, unknown>> {
74
+ readonly loaderData: LoaderData;
75
+ readonly params: PathParams;
76
+ readonly searchParams: SearchParams;
77
+ }
37
78
  /**
38
79
  * Handler configuration for a route.
39
80
  * Loader fetches data, component renders with that data.
@@ -44,6 +85,18 @@ export type LoaderResult<T, E = never, R = never> = T | Effect.Effect<T, E, R>;
44
85
  export interface HandlerConfig<LoaderData = unknown, PathParams extends Record<string, unknown> = Record<string, unknown>, SearchParams extends Record<string, unknown> = Record<string, unknown>, R = never, E = never> {
45
86
  readonly loader?: (ctx: LoaderContext<PathParams, SearchParams>) => LoaderResult<LoaderData, E, R>;
46
87
  readonly component: (props: ComponentProps<LoaderData, PathParams, SearchParams>) => VElement;
88
+ /**
89
+ * Per-route `<head>` metadata. Receives loader data and route params.
90
+ * Can return plain HeadData or an Effect<HeadData>.
91
+ */
92
+ readonly head?: (ctx: HeadContext<LoaderData, PathParams, SearchParams>) => HeadData | Effect.Effect<HeadData>;
93
+ /** When true, this route will be pre-rendered to static HTML at build time. */
94
+ readonly prerender?: boolean;
95
+ /**
96
+ * For parameterized prerender routes, return all possible param combinations.
97
+ * Each entry generates a separate static HTML page.
98
+ */
99
+ readonly getStaticPaths?: () => ReadonlyArray<PathParams> | Effect.Effect<ReadonlyArray<PathParams>>;
47
100
  }
48
101
  /**
49
102
  * A registered route handler (type-erased for storage).
@@ -52,8 +105,12 @@ export interface HandlerConfig<LoaderData = unknown, PathParams extends Record<s
52
105
  export interface RouteHandler {
53
106
  readonly routeName: string;
54
107
  readonly route: Route;
55
- readonly loader: (ctx: LoaderContext) => Effect.Effect<unknown>;
108
+ /** Type-erased loader. R = never because requirements are captured by the Layer. */
109
+ readonly loader: (ctx: LoaderContext) => Effect.Effect<unknown, unknown>;
56
110
  readonly component: (props: ComponentProps) => VElement;
111
+ readonly head: Option.Option<(ctx: HeadContext) => Effect.Effect<HeadData, unknown>>;
112
+ readonly prerender: boolean;
113
+ readonly getStaticPaths: Option.Option<() => Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown>>;
57
114
  }
58
115
  /**
59
116
  * A registered layout handler.
@@ -65,21 +122,31 @@ export interface LayoutHandler {
65
122
  }
66
123
  /**
67
124
  * Handlers builder for a route group.
68
- * Accumulates handler registrations for routes in the group.
125
+ * Accumulates handler registrations and their service requirements (R).
126
+ *
127
+ * Each handle() call unions the loader's R into the group's accumulated R,
128
+ * ensuring the final Layer type declares all required services.
129
+ *
130
+ * RouteNames constrains handle() to only accept valid route names from the group.
69
131
  */
70
- export interface GroupHandlers<GroupName extends string = string> {
132
+ export interface GroupHandlers<GroupName extends string = string, RouteNames extends string = string, R = never> {
71
133
  readonly groupName: GroupName;
72
134
  readonly handlers: readonly RouteHandler[];
73
135
  /**
74
136
  * Register a handler for a route in this group.
137
+ * RouteName is constrained to the group's valid route names.
138
+ * Accumulates the loader's service requirements into the group's R.
75
139
  */
76
- readonly handle: <RouteName extends string, LoaderData, PathParams extends Record<string, unknown>, SearchParams extends Record<string, unknown>, R, E>(routeName: RouteName, config: HandlerConfig<LoaderData, PathParams, SearchParams, R, E>) => GroupHandlers<GroupName>;
140
+ readonly handle: <RouteName extends RouteNames, LoaderData = unknown, PathParams extends Record<string, unknown> = Record<string, unknown>, SearchParams extends Record<string, unknown> = Record<string, unknown>, R2 = never, E = never>(routeName: RouteName, config: HandlerConfig<LoaderData, PathParams, SearchParams, R2, E>) => GroupHandlers<GroupName, RouteNames, R | R2>;
77
141
  }
78
142
  /**
79
143
  * Handlers builder for a layout group.
80
144
  * Includes layout component registration plus child route handlers.
145
+ * Accumulates loader service requirements (R) like GroupHandlers.
146
+ *
147
+ * RouteNames constrains handle() to only accept valid route names from the group.
81
148
  */
82
- export interface LayoutGroupHandlers<GroupName extends string = string> {
149
+ export interface LayoutGroupHandlers<GroupName extends string = string, RouteNames extends string = string, R = never> {
83
150
  readonly groupName: GroupName;
84
151
  readonly handlers: readonly RouteHandler[];
85
152
  readonly layoutHandler: LayoutHandler | null;
@@ -87,11 +154,13 @@ export interface LayoutGroupHandlers<GroupName extends string = string> {
87
154
  * Register the layout component for this layout group.
88
155
  * The layout component should render <RouterOutlet /> for children.
89
156
  */
90
- readonly layout: (component: () => VElement) => LayoutGroupHandlers<GroupName>;
157
+ readonly layout: (component: () => VElement) => LayoutGroupHandlers<GroupName, RouteNames, R>;
91
158
  /**
92
159
  * Register a handler for a route in this layout group.
160
+ * RouteName is constrained to the group's valid route names.
161
+ * Accumulates the loader's service requirements into the group's R.
93
162
  */
94
- readonly handle: <RouteName extends string, LoaderData, PathParams extends Record<string, unknown>, SearchParams extends Record<string, unknown>, R, E>(routeName: RouteName, config: HandlerConfig<LoaderData, PathParams, SearchParams, R, E>) => LayoutGroupHandlers<GroupName>;
163
+ readonly handle: <RouteName extends RouteNames, LoaderData = unknown, PathParams extends Record<string, unknown> = Record<string, unknown>, SearchParams extends Record<string, unknown> = Record<string, unknown>, R2 = never, E = never>(routeName: RouteName, config: HandlerConfig<LoaderData, PathParams, SearchParams, R2, E>) => LayoutGroupHandlers<GroupName, RouteNames, R | R2>;
95
164
  }
96
165
  declare const RouterHandlers_base: Context.TagClass<RouterHandlers, "fibrae/RouterHandlers", {
97
166
  readonly handlers: ReadonlyMap<string, RouteHandler>;
@@ -108,6 +177,9 @@ export declare class RouterHandlers extends RouterHandlers_base {
108
177
  /**
109
178
  * Create a Layer that provides handlers for a route group.
110
179
  *
180
+ * Accepts the RouteGroup directly (not a string name) so that handle()
181
+ * is constrained to valid route names at compile time.
182
+ *
111
183
  * The build callback can return either:
112
184
  * - GroupHandlers directly (simple case)
113
185
  * - Effect<GroupHandlers> (when you need Effect context in handlers)
@@ -117,42 +189,25 @@ export declare class RouterHandlers extends RouterHandlers_base {
117
189
  * // Simple - no Effect wrapper needed
118
190
  * const AppRoutesLive = RouterBuilder.group(
119
191
  * AppRouter,
120
- * "app",
192
+ * AppRoutes, // pass the RouteGroup for type-safe handle()
121
193
  * (handlers) => handlers
122
- * .handle("home", { component: () => <HomePage /> })
194
+ * .handle("home", { component: () => <HomePage /> }) // constrained
123
195
  * .handle("posts", { loader: () => fetchPosts(), component: ... })
124
196
  * )
125
- *
126
- * // With Effect context (when handlers need services)
127
- * const AppRoutesLive = RouterBuilder.group(
128
- * AppRouter,
129
- * "app",
130
- * (handlers) => Effect.gen(function* () {
131
- * const config = yield* Config;
132
- * return handlers.handle("home", { ... });
133
- * })
134
- * )
135
197
  * ```
136
198
  */
137
- export declare function group<GroupName extends string>(appRouter: Router, groupName: GroupName, build: (handlers: GroupHandlers<GroupName>) => GroupHandlers<GroupName>): Layer.Layer<RouterHandlers, never, never>;
138
- export declare function group<GroupName extends string, R>(appRouter: Router, groupName: GroupName, build: (handlers: GroupHandlers<GroupName>) => Effect.Effect<GroupHandlers<GroupName>, never, R>): Layer.Layer<RouterHandlers, never, R>;
199
+ export declare function group<GroupName extends string, RouteNames extends string, R>(_appRouter: Router, routeGroup: RouteGroup<GroupName, RouteNames>, build: (handlers: GroupHandlers<GroupName, RouteNames>) => GroupHandlers<GroupName, RouteNames, R>): Layer.Layer<RouterHandlers, never, R>;
200
+ export declare function group<GroupName extends string, RouteNames extends string, R, R2>(_appRouter: Router, routeGroup: RouteGroup<GroupName, RouteNames>, build: (handlers: GroupHandlers<GroupName, RouteNames>) => Effect.Effect<GroupHandlers<GroupName, RouteNames, R>, never, R2>): Layer.Layer<RouterHandlers, never, R | R2>;
139
201
  /**
140
202
  * Create a Layer that provides handlers for a layout group.
141
203
  *
142
- * Layout groups require a layout component that renders <RouterOutlet /> for children.
204
+ * Accepts the LayoutGroup directly for type-safe handle() calls.
143
205
  *
144
206
  * Usage:
145
207
  * ```typescript
146
- * const DashboardLayout = () => (
147
- * <div class="dashboard">
148
- * <Sidebar />
149
- * <RouterOutlet />
150
- * </div>
151
- * );
152
- *
153
208
  * const DashboardRoutesLive = RouterBuilder.layoutGroup(
154
209
  * AppRouter,
155
- * "dashboard",
210
+ * DashboardRoutes,
156
211
  * (handlers) => handlers
157
212
  * .layout(DashboardLayout)
158
213
  * .handle("overview", { component: () => <Overview /> })
@@ -160,8 +215,8 @@ export declare function group<GroupName extends string, R>(appRouter: Router, gr
160
215
  * )
161
216
  * ```
162
217
  */
163
- export declare function layoutGroup<GroupName extends string>(appRouter: Router, groupName: GroupName, build: (handlers: LayoutGroupHandlers<GroupName>) => LayoutGroupHandlers<GroupName>): Layer.Layer<RouterHandlers, never, never>;
164
- export declare function layoutGroup<GroupName extends string, R>(appRouter: Router, groupName: GroupName, build: (handlers: LayoutGroupHandlers<GroupName>) => Effect.Effect<LayoutGroupHandlers<GroupName>, never, R>): Layer.Layer<RouterHandlers, never, R>;
218
+ export declare function layoutGroup<GroupName extends string, RouteNames extends string, R>(_appRouter: Router, layoutGrp: LayoutGroup<GroupName, RouteNames>, build: (handlers: LayoutGroupHandlers<GroupName, RouteNames>) => LayoutGroupHandlers<GroupName, RouteNames, R>): Layer.Layer<RouterHandlers, never, R>;
219
+ export declare function layoutGroup<GroupName extends string, RouteNames extends string, R, R2>(_appRouter: Router, layoutGrp: LayoutGroup<GroupName, RouteNames>, build: (handlers: LayoutGroupHandlers<GroupName, RouteNames>) => Effect.Effect<LayoutGroupHandlers<GroupName, RouteNames, R>, never, R2>): Layer.Layer<RouterHandlers, never, R | R2>;
165
220
  /**
166
221
  * Merge multiple group handler layers into a single RouterHandlers layer.
167
222
  *
@@ -178,5 +233,22 @@ export declare function router(_router: Router): Layer.Layer<RouterHandlers>;
178
233
  * Execute a route's loader and render its component.
179
234
  * Returns the rendered VElement.
180
235
  */
181
- export declare function executeRoute(handler: RouteHandler, ctx: LoaderContext): Effect.Effect<VElement>;
236
+ export declare function executeRoute(handler: RouteHandler, ctx: LoaderContext): Effect.Effect<VElement, unknown>;
237
+ /**
238
+ * A prerender route paired with its enumerated param sets.
239
+ */
240
+ export interface PrerenderRoute {
241
+ readonly handler: RouteHandler;
242
+ readonly paramSets: ReadonlyArray<Record<string, unknown>>;
243
+ }
244
+ /**
245
+ * Extract all prerender routes with their static path parameters.
246
+ *
247
+ * For each route with `prerender: true`:
248
+ * - If `getStaticPaths` is defined, calls it to enumerate all param sets
249
+ * - Otherwise, defaults to `[{}]` (a single page with no params)
250
+ */
251
+ export declare const getPrerenderRoutes: (handlers: {
252
+ readonly handlers: ReadonlyMap<string, RouteHandler>;
253
+ }) => Effect.Effect<readonly PrerenderRoute[], unknown, never>;
182
254
  export {};