effect-start 0.34.0 → 0.35.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 (127) hide show
  1. package/README.md +303 -36
  2. package/dist/Fetch.d.ts +1 -1
  3. package/dist/FileRouter.d.ts +1 -1
  4. package/dist/FileRouterCodegen.d.ts.map +1 -1
  5. package/dist/FileRouterCodegen.js +8 -2
  6. package/dist/FileRouterCodegen.js.map +1 -1
  7. package/dist/Job.d.ts +94 -0
  8. package/dist/Job.d.ts.map +1 -0
  9. package/dist/Job.js +157 -0
  10. package/dist/Job.js.map +1 -0
  11. package/dist/Password.d.ts +1 -1
  12. package/dist/Route.d.ts +20 -15
  13. package/dist/Route.d.ts.map +1 -1
  14. package/dist/Route.js +12 -0
  15. package/dist/Route.js.map +1 -1
  16. package/dist/RouteBody.d.ts +7 -7
  17. package/dist/RouteBody.d.ts.map +1 -1
  18. package/dist/RouteBody.js.map +1 -1
  19. package/dist/RouteHook.d.ts +1 -1
  20. package/dist/RouteHook.d.ts.map +1 -1
  21. package/dist/RouteHook.js.map +1 -1
  22. package/dist/RouteHttp.d.ts.map +1 -1
  23. package/dist/RouteHttp.js +10 -4
  24. package/dist/RouteHttp.js.map +1 -1
  25. package/dist/RouteLink.d.ts +16 -0
  26. package/dist/RouteLink.d.ts.map +1 -0
  27. package/dist/RouteLink.js +23 -0
  28. package/dist/RouteLink.js.map +1 -0
  29. package/dist/RouteMount.d.ts +29 -32
  30. package/dist/RouteMount.d.ts.map +1 -1
  31. package/dist/RouteMount.js.map +1 -1
  32. package/dist/RouteSchema.d.ts +81 -28
  33. package/dist/RouteSchema.d.ts.map +1 -1
  34. package/dist/RouteSchema.js +56 -101
  35. package/dist/RouteSchema.js.map +1 -1
  36. package/dist/RouteSse.d.ts +1 -1
  37. package/dist/RouteSse.d.ts.map +1 -1
  38. package/dist/RouteSse.js.map +1 -1
  39. package/dist/Socket.d.ts +1 -1
  40. package/dist/Start.js +1 -1
  41. package/dist/Start.js.map +1 -1
  42. package/dist/StaticFiles.d.ts +4 -10
  43. package/dist/StaticFiles.d.ts.map +1 -1
  44. package/dist/StaticFiles.js +3 -10
  45. package/dist/StaticFiles.js.map +1 -1
  46. package/dist/System.d.ts +1 -1
  47. package/dist/_Docker.d.ts +1 -1
  48. package/dist/_HtmlScanner.d.ts +42 -0
  49. package/dist/_HtmlScanner.d.ts.map +1 -0
  50. package/dist/_HtmlScanner.js +385 -0
  51. package/dist/_HtmlScanner.js.map +1 -0
  52. package/dist/_RouteLink.d.ts +16 -0
  53. package/dist/_RouteLink.d.ts.map +1 -0
  54. package/dist/_RouteLink.js +22 -0
  55. package/dist/_RouteLink.js.map +1 -0
  56. package/dist/bun/BunRoute.d.ts +4 -6
  57. package/dist/bun/BunRoute.d.ts.map +1 -1
  58. package/dist/bun/BunRoute.js +1 -1
  59. package/dist/bun/BunRoute.js.map +1 -1
  60. package/dist/bundler/Bundle.d.ts +1 -1
  61. package/dist/bundler/BundleRoute.d.ts +5 -6
  62. package/dist/bundler/BundleRoute.d.ts.map +1 -1
  63. package/dist/bundler/BundleRoute.js +5 -11
  64. package/dist/bundler/BundleRoute.js.map +1 -1
  65. package/dist/datastar/watchers/patchElements.js +1 -1
  66. package/dist/datastar/watchers/patchElements.js.map +1 -1
  67. package/dist/experimental/CsrfProtection.d.ts +67 -0
  68. package/dist/experimental/CsrfProtection.d.ts.map +1 -0
  69. package/dist/experimental/CsrfProtection.js +100 -0
  70. package/dist/experimental/CsrfProtection.js.map +1 -0
  71. package/dist/experimental/EncryptedCookies.d.ts +1 -1
  72. package/dist/experimental/KeyValueStore.d.ts +1 -1
  73. package/dist/lint/plugin.js +4 -0
  74. package/dist/lint/plugin.js.map +1 -1
  75. package/dist/sql/SqlClient.d.ts +1 -1
  76. package/dist/studio/Studio.d.ts +1 -1
  77. package/dist/studio/Studio.d.ts.map +1 -1
  78. package/dist/studio/Studio.js +4 -10
  79. package/dist/studio/Studio.js.map +1 -1
  80. package/dist/studio/routes/errors/route.d.ts +3 -3
  81. package/dist/studio/routes/errors/route.d.ts.map +1 -1
  82. package/dist/studio/routes/errors/route.js +3 -2
  83. package/dist/studio/routes/errors/route.js.map +1 -1
  84. package/dist/studio/routes/fiberDetail.d.ts +3 -7
  85. package/dist/studio/routes/fiberDetail.d.ts.map +1 -1
  86. package/dist/studio/routes/fibers/route.d.ts +3 -3
  87. package/dist/studio/routes/layout.d.ts +3 -3
  88. package/dist/studio/routes/logs/route.d.ts +3 -3
  89. package/dist/studio/routes/logs/route.d.ts.map +1 -1
  90. package/dist/studio/routes/logs/route.js +3 -2
  91. package/dist/studio/routes/logs/route.js.map +1 -1
  92. package/dist/studio/routes/metrics/route.d.ts +3 -3
  93. package/dist/studio/routes/route.d.ts +2 -2
  94. package/dist/studio/routes/routes/route.d.ts +2 -2
  95. package/dist/studio/routes/services/route.d.ts +2 -2
  96. package/dist/studio/routes/system/route.d.ts +3 -3
  97. package/dist/studio/routes/traceDetail.d.ts +3 -7
  98. package/dist/studio/routes/traceDetail.d.ts.map +1 -1
  99. package/dist/studio/routes/traces/route.d.ts +3 -3
  100. package/dist/studio/routes/traces/route.d.ts.map +1 -1
  101. package/dist/studio/routes/traces/route.js +3 -2
  102. package/dist/studio/routes/traces/route.js.map +1 -1
  103. package/dist/studio/routes/tree.d.ts +43 -51
  104. package/dist/studio/routes/tree.d.ts.map +1 -1
  105. package/package.json +4 -3
  106. package/src/FileRouterCodegen.ts +8 -2
  107. package/src/Route.ts +55 -34
  108. package/src/RouteBody.ts +15 -15
  109. package/src/RouteHook.ts +3 -3
  110. package/src/RouteHttp.ts +10 -4
  111. package/src/RouteLink.ts +56 -0
  112. package/src/RouteMount.ts +43 -48
  113. package/src/RouteSchema.ts +299 -166
  114. package/src/RouteSse.ts +3 -3
  115. package/src/Start.ts +1 -1
  116. package/src/StaticFiles.ts +10 -24
  117. package/src/_HtmlScanner.ts +415 -0
  118. package/src/bun/BunRoute.ts +11 -11
  119. package/src/bundler/BundleRoute.ts +8 -19
  120. package/src/datastar/watchers/patchElements.ts +1 -1
  121. package/src/dev.d.ts +3 -0
  122. package/src/experimental/CsrfProtection.ts +153 -0
  123. package/src/lint/plugin.js +2 -0
  124. package/src/studio/Studio.ts +4 -14
  125. package/src/studio/routes/errors/route.tsx +3 -2
  126. package/src/studio/routes/logs/route.tsx +3 -2
  127. package/src/studio/routes/traces/route.tsx +3 -2
package/src/RouteBody.ts CHANGED
@@ -111,13 +111,13 @@ export interface BuildReturn<Value, F extends Format, Body = never> {
111
111
  >(
112
112
  handler: GeneratorHandler<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, Y>,
113
113
  ): (
114
- self: Route.RouteSet.RouteSet<D, B, I>,
115
- ) => Route.RouteSet.RouteSet<
114
+ self: Route.RouteSet<D, B, I>,
115
+ ) => Route.RouteSet<
116
116
  D,
117
117
  B,
118
118
  [
119
119
  ...I,
120
- Route.Route.Route<
120
+ Route.Route<
121
121
  { format: F },
122
122
  {},
123
123
  [Body] extends [never] ? A : Body,
@@ -137,11 +137,11 @@ export interface BuildReturn<Value, F extends Format, Body = never> {
137
137
  >(
138
138
  handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, E, R>,
139
139
  ): (
140
- self: Route.RouteSet.RouteSet<D, B, I>,
141
- ) => Route.RouteSet.RouteSet<
140
+ self: Route.RouteSet<D, B, I>,
141
+ ) => Route.RouteSet<
142
142
  D,
143
143
  B,
144
- [...I, Route.Route.Route<{ format: F }, {}, [Body] extends [never] ? A : Body, E, R>]
144
+ [...I, Route.Route<{ format: F }, {}, [Body] extends [never] ? A : Body, E, R>]
145
145
  >
146
146
  }
147
147
 
@@ -163,7 +163,7 @@ export function build<Value, F extends Format>(options: {
163
163
  E = never,
164
164
  R = never,
165
165
  >(handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, E, R>) {
166
- return (self: Route.RouteSet.RouteSet<D, B, I>) => {
166
+ return (self: Route.RouteSet<D, B, I>) => {
167
167
  const contentType = formatToContentType[descriptors.format]
168
168
  const baseHandler = handle(handler)
169
169
  const wrappedHandler: Route.Route.Handler<{ format: F }, A, E, R> = (ctx, next) =>
@@ -191,7 +191,7 @@ export function build<Value, F extends Format>(options: {
191
191
 
192
192
  const route = Route.make<{ format: F }, {}, A, E, R>(wrappedHandler, descriptors)
193
193
 
194
- return Route.set<D, B, [...I, Route.Route.Route<{ format: F }, {}, A, E, R>]>(
194
+ return Route.set<D, B, [...I, Route.Route<{ format: F }, {}, A, E, R>]>(
195
195
  [...Route.items(self), route],
196
196
  Route.descriptor(self),
197
197
  )
@@ -210,11 +210,11 @@ export function render<
210
210
  >(
211
211
  handler: GeneratorHandler<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, Y>,
212
212
  ): (
213
- self: Route.RouteSet.RouteSet<D, B, I>,
214
- ) => Route.RouteSet.RouteSet<
213
+ self: Route.RouteSet<D, B, I>,
214
+ ) => Route.RouteSet<
215
215
  D,
216
216
  B,
217
- [...I, Route.Route.Route<{ format: "*" }, {}, A, YieldError<Y>, YieldContext<Y>>]
217
+ [...I, Route.Route<{ format: "*" }, {}, A, YieldError<Y>, YieldContext<Y>>]
218
218
  >
219
219
  export function render<
220
220
  D extends Route.RouteDescriptor.Any,
@@ -226,8 +226,8 @@ export function render<
226
226
  >(
227
227
  handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, E, R>,
228
228
  ): (
229
- self: Route.RouteSet.RouteSet<D, B, I>,
230
- ) => Route.RouteSet.RouteSet<D, B, [...I, Route.Route.Route<{ format: "*" }, {}, A, E, R>]>
229
+ self: Route.RouteSet<D, B, I>,
230
+ ) => Route.RouteSet<D, B, [...I, Route.Route<{ format: "*" }, {}, A, E, R>]>
231
231
  export function render<
232
232
  D extends Route.RouteDescriptor.Any,
233
233
  B extends {},
@@ -236,14 +236,14 @@ export function render<
236
236
  E = never,
237
237
  R = never,
238
238
  >(handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, E, R>) {
239
- return (self: Route.RouteSet.RouteSet<D, B, I>) => {
239
+ return (self: Route.RouteSet<D, B, I>) => {
240
240
  const baseHandler = handle(handler)
241
241
  const route = Route.make<{ format: "*" }, {}, A, E, R>(
242
242
  (ctx, next) => baseHandler(ctx as D & B & Route.ExtractBindings<I> & { format: "*" }, next),
243
243
  { format: "*" },
244
244
  )
245
245
 
246
- return Route.set<D, B, [...I, Route.Route.Route<{ format: "*" }, {}, A, E, R>]>(
246
+ return Route.set<D, B, [...I, Route.Route<{ format: "*" }, {}, A, E, R>]>(
247
247
  [...Route.items(self), route],
248
248
  Route.descriptor(self),
249
249
  )
package/src/RouteHook.ts CHANGED
@@ -25,8 +25,8 @@ export function filter<
25
25
  const normalized = normalizeFilterHandler(filterHandler)
26
26
 
27
27
  return function (
28
- self: Route.RouteSet.RouteSet<D, SB, P>,
29
- ): Route.RouteSet.RouteSet<D, SB, [...P, Route.Route.Route<{}, BOut, unknown, E, R>]> {
28
+ self: Route.RouteSet<D, SB, P>,
29
+ ): Route.RouteSet<D, SB, [...P, Route.Route<{}, BOut, unknown, E, R>]> {
30
30
  const route = Route.make<{}, BOut, unknown, E, R>(
31
31
  (context: BOut, next: (ctx?: Partial<BOut>) => Entity.Entity<unknown>) =>
32
32
  Effect.gen(function* () {
@@ -39,7 +39,7 @@ export function filter<
39
39
  )
40
40
 
41
41
  return Route.set(
42
- [...Route.items(self), route] as [...P, Route.Route.Route<{}, BOut, unknown, E, R>],
42
+ [...Route.items(self), route] as [...P, Route.Route<{}, BOut, unknown, E, R>],
43
43
  Route.descriptor(self),
44
44
  )
45
45
  }
package/src/RouteHttp.ts CHANGED
@@ -185,6 +185,8 @@ function determineSelectedFormat(
185
185
 
186
186
  export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
187
187
  const runFork = Runtime.runFork(runtime)
188
+ const runSync = Runtime.runSync(runtime)
189
+ const inDevelopment = Option.isSome(runSync(Development.option))
188
190
 
189
191
  return (routes: Iterable<UnboundedRouteWithMethod>): Http.WebHandler => {
190
192
  const allRoutes = Array.from(routes)
@@ -290,7 +292,7 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
290
292
 
291
293
  const url = new URL(request.url)
292
294
 
293
- const innerEffect = Effect.gen(function* () {
295
+ const innerEffect = Effect.provideService(Effect.gen(function* () {
294
296
  const result = yield* createChain({ request, selectedFormat })
295
297
 
296
298
  const entity = Entity.isEntity(result) ? result : Entity.make(result, { status: 200 })
@@ -304,7 +306,7 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
304
306
  response.headers.set("vary", "Accept")
305
307
  }
306
308
  return response
307
- })
309
+ }), Route.Request, request)
308
310
 
309
311
  if (tracerDisabled) {
310
312
  return innerEffect
@@ -354,7 +356,9 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
354
356
  Effect.gen(function* () {
355
357
  yield* Effect.logError(cause)
356
358
  const status = getStatusFromCause(cause)
357
- const message = Cause.pretty(cause, { renderErrorCause: true })
359
+ const message = inDevelopment
360
+ ? Cause.pretty(cause, { renderErrorCause: true })
361
+ : "Internal Server Error"
358
362
  return respondError({ status, message })
359
363
  }),
360
364
  ),
@@ -382,7 +386,9 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
382
386
  resolve(respondError({ status: 499, message: "client closed request" }))
383
387
  } else {
384
388
  const status = getStatusFromCause(exit.cause)
385
- const message = Cause.pretty(exit.cause, { renderErrorCause: true })
389
+ const message = inDevelopment
390
+ ? Cause.pretty(exit.cause, { renderErrorCause: true })
391
+ : "Internal Server Error"
386
392
  resolve(respondError({ status, message }))
387
393
  }
388
394
  })
@@ -0,0 +1,56 @@
1
+ import type * as PathPattern from "./_PathPattern.ts"
2
+ import type * as Route from "./Route.ts"
3
+ import type { Routes as DevRoutes } from "effect-start/dev"
4
+
5
+ export type LinkParams<
6
+ Routes,
7
+ P extends string,
8
+ B = P extends keyof Routes
9
+ ? Routes[P] extends [...any[], infer L] // last route
10
+ ? L extends () => Promise<{ default: infer R extends Route.RouteSet.Any }>
11
+ ? Route.Route.Bindings<R>
12
+ : {}
13
+ : {}
14
+ : {},
15
+ > = {
16
+ [K in keyof PathPattern.Params<P>]: B extends { pathParams: infer S }
17
+ ? K extends keyof S
18
+ ? S[K]
19
+ : string | number
20
+ : string | number
21
+ } & (B extends { searchParams: infer S } ? { [K in keyof S]?: S[K] } : {})
22
+
23
+ export function link<
24
+ Routes = DevRoutes,
25
+ P extends keyof Routes extends never
26
+ ? // Falls back to any string when no routes are registered
27
+ string
28
+ : keyof Routes & string = keyof Routes extends never ? string : keyof Routes & string,
29
+ >(
30
+ ...args: {} extends LinkParams<Routes, P>
31
+ ? [path: P, params?: LinkParams<Routes, P>]
32
+ : [path: P, params: LinkParams<Routes, P>]
33
+ ): string {
34
+ const path = args[0] as string
35
+ // Substitute path params, deleting used keys so the rest become search params
36
+ const remaining = { ...args[1] } as Record<string, string | number | undefined>
37
+ const result = path.replace(
38
+ /\/:(\w+)([?*+])?/g,
39
+ (_, name: string, modifier: string | undefined) => {
40
+ const value = remaining[name]
41
+ delete remaining[name]
42
+ if (value == null) {
43
+ if (modifier === "?" || modifier === "*") return ""
44
+ return "/"
45
+ }
46
+ return "/" + encodeURIComponent(String(value))
47
+ },
48
+ )
49
+
50
+ const search = new URLSearchParams()
51
+ for (const key in remaining) {
52
+ if (remaining[key] != null) search.set(key, String(remaining[key]))
53
+ }
54
+ const qs = search.toString()
55
+ return qs ? result + "?" + qs : result
56
+ }
package/src/RouteMount.ts CHANGED
@@ -7,10 +7,7 @@ import type * as RouteBody from "./RouteBody.ts"
7
7
 
8
8
  const RouteSetTypeId = "~effect-start/RouteSet" as const
9
9
 
10
- // oxlint-disable-next-line import/first, typescript/consistent-type-imports -- typeof import() is not an import statement
11
- type Module = typeof import("./RouteMount.ts")
12
-
13
- export type Self = RouteMount.Builder<any, any> | Omit<RouteMount.Builder<any, any>, "use"> | Module
10
+ export type Self = RouteMount.Builder<any, any> | typeof import("./RouteMount.ts")
14
11
 
15
12
  export const use = makeMethodDescriber("*")
16
13
  export const get = makeMethodDescriber("GET")
@@ -65,7 +62,7 @@ function makeMethodDescriber<M extends RouteMount.Method>(method: M): RouteMount
65
62
  const itemDescriptor = Route.descriptor(item)
66
63
  const newDescriptor = { method, ...itemDescriptor }
67
64
  return Route.make(
68
- (item as Route.Route.Route).handler as Route.Route.Handler<any, any, any, any>,
65
+ (item as Route.Route).handler as Route.Route.Handler<any, any, any, any>,
69
66
  newDescriptor,
70
67
  )
71
68
  })
@@ -75,7 +72,7 @@ function makeMethodDescriber<M extends RouteMount.Method>(method: M): RouteMount
75
72
  return describeMethod as RouteMount.Describer<M>
76
73
  }
77
74
 
78
- export type MountedRoute = Route.Route.Route<
75
+ export type MountedRoute = Route.Route<
79
76
  {
80
77
  method: RouteMount.Method
81
78
  path: PathPattern.PathPattern
@@ -90,34 +87,43 @@ export type MountedRoute = Route.Route.Route<
90
87
  export namespace RouteMount {
91
88
  export type Method = "*" | Http.Method
92
89
 
93
- export type MountSet = Route.RouteSet.RouteSet<{ method: Method }, {}, Route.Route.Tuple>
90
+ export type MountSet = Route.RouteSet<{ method: Method }, {}, Route.Route.Tuple>
94
91
 
95
- export interface Builder<D extends {} = {}, I extends Route.Route.Tuple = []>
96
- extends Route.RouteSet.RouteSet<D, {}, I> {
97
- use: Describer<"*">
98
- get: Describer<"GET">
99
- post: Describer<"POST">
100
- put: Describer<"PUT">
101
- del: Describer<"DELETE">
102
- patch: Describer<"PATCH">
103
- head: Describer<"HEAD">
104
- options: Describer<"OPTIONS">
105
- }
92
+ export type Builder<D extends {} = {}, I extends Route.Route.Tuple = []> = Route.RouteSet<
93
+ D,
94
+ {},
95
+ I
96
+ > &
97
+ (HasMethod<I> extends true ? {} : { use: Describer<"*"> }) & {
98
+ get: Describer<"GET">
99
+ post: Describer<"POST">
100
+ put: Describer<"PUT">
101
+ del: Describer<"DELETE">
102
+ patch: Describer<"PATCH">
103
+ head: Describer<"HEAD">
104
+ options: Describer<"OPTIONS">
105
+ }
106
106
 
107
- export type BuilderAfter<M extends Method, I extends Route.Route.Tuple> =
108
- M extends "*" ? Builder<{}, I> : Omit<Builder<{}, I>, "use">
107
+ type HasMethod<I extends Route.Route.Tuple> = I extends [
108
+ infer Head,
109
+ ...infer Tail extends Route.Route.Tuple,
110
+ ]
111
+ ? Head extends Route.Route<{ method: infer M }, any, any, any, any>
112
+ ? M extends Http.Method
113
+ ? true
114
+ : HasMethod<Tail>
115
+ : HasMethod<Tail>
116
+ : false
109
117
 
110
- export type EmptySet<M extends Method, B = {}> = Route.RouteSet.RouteSet<{ method: M }, B, []>
118
+ export type EmptySet<M extends Method, B = {}> = Route.RouteSet<{ method: M }, B, []>
111
119
 
112
120
  export type Items<S> = S extends Builder<any, infer I> ? I : []
113
121
 
114
122
  export type BuilderBindings<S> =
115
- S extends Builder<any, infer I>
116
- ? Types.Simplify<WildcardBindings<I>> & { request: Request }
117
- : { request: Request }
123
+ S extends Builder<any, infer I> ? Types.Simplify<WildcardBindings<I>> : {}
118
124
 
119
125
  type WildcardBindingsItem<T> =
120
- T extends Route.Route.Route<{ method: "*" }, infer B, any, any, any> ? B : {}
126
+ T extends Route.Route<{ method: "*" }, infer B, any, any, any> ? B : {}
121
127
 
122
128
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
123
129
  k: infer I,
@@ -131,35 +137,24 @@ export namespace RouteMount {
131
137
  }[number]
132
138
  >
133
139
 
134
- // Flatten items: merge method into descriptor and accumulate bindings through the chain
135
- // `request` is omitted from bindings since it's implicit (always available)
136
- export type FlattenItems<M extends Method, B, I extends Route.Route.Tuple> = I extends [
137
- Route.Route.Route<infer D, infer RB, infer A, infer E, infer R>,
140
+ export type FlattenItems<M extends Method, I extends Route.Route.Tuple> = I extends [
141
+ Route.Route<infer D, infer RB, infer A, infer E, infer R>,
138
142
  ...infer Tail extends Route.Route.Tuple,
139
143
  ]
140
- ? [
141
- Route.Route.Route<
142
- Types.Simplify<{ method: M } & D> & {},
143
- Types.Simplify<Omit<B & RB, "request">>,
144
- A,
145
- E,
146
- R
147
- >,
148
- ...FlattenItems<M, Types.Simplify<B & RB>, Tail>,
149
- ]
144
+ ? [Route.Route<Types.Simplify<{ method: M } & D> & {}, RB, A, E, R>, ...FlattenItems<M, Tail>]
150
145
  : []
151
146
 
152
147
  export interface Describer<M extends Method> {
153
148
  <S extends Self, A extends Route.RouteSet.Any>(
154
149
  this: S,
155
150
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
156
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<A>>]>
151
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<A>>]>
157
152
 
158
153
  <S extends Self, A extends Route.RouteSet.Any, B extends Route.RouteSet.Any>(
159
154
  this: S,
160
155
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
161
156
  bc: (b: A) => B,
162
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<B>>]>
157
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<B>>]>
163
158
 
164
159
  <
165
160
  S extends Self,
@@ -171,7 +166,7 @@ export namespace RouteMount {
171
166
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
172
167
  bc: (b: A) => B,
173
168
  cd: (c: B) => C,
174
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<C>>]>
169
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<C>>]>
175
170
 
176
171
  <
177
172
  S extends Self,
@@ -185,7 +180,7 @@ export namespace RouteMount {
185
180
  bc: (b: A) => B,
186
181
  cd: (c: B) => C,
187
182
  de: (d: C) => D,
188
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<D>>]>
183
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<D>>]>
189
184
 
190
185
  <
191
186
  S extends Self,
@@ -201,7 +196,7 @@ export namespace RouteMount {
201
196
  cd: (c: B) => C,
202
197
  de: (d: C) => D,
203
198
  ef: (e: D) => E,
204
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<E>>]>
199
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<E>>]>
205
200
 
206
201
  <
207
202
  S extends Self,
@@ -219,7 +214,7 @@ export namespace RouteMount {
219
214
  de: (d: C) => D,
220
215
  ef: (e: D) => E,
221
216
  fg: (f: E) => F,
222
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<F>>]>
217
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<F>>]>
223
218
 
224
219
  <
225
220
  S extends Self,
@@ -239,7 +234,7 @@ export namespace RouteMount {
239
234
  ef: (e: D) => E,
240
235
  fg: (f: E) => F,
241
236
  gh: (g: F) => G,
242
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<G>>]>
237
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<G>>]>
243
238
 
244
239
  <
245
240
  S extends Self,
@@ -261,7 +256,7 @@ export namespace RouteMount {
261
256
  fg: (f: E) => F,
262
257
  gh: (g: F) => G,
263
258
  hi: (h: G) => H,
264
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<H>>]>
259
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<H>>]>
265
260
 
266
261
  <
267
262
  S extends Self,
@@ -285,6 +280,6 @@ export namespace RouteMount {
285
280
  gh: (g: F) => G,
286
281
  hi: (h: G) => H,
287
282
  ij: (i: H) => I,
288
- ): BuilderAfter<M, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<I>>]>
283
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<I>>]>
289
284
  }
290
285
  }