@taserjs/router 0.0.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 (173) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +24 -0
  3. package/dist/cjs/constants.cjs +17 -0
  4. package/dist/cjs/constants.cjs.map +1 -0
  5. package/dist/cjs/constants.d.cts +8 -0
  6. package/dist/cjs/create-context.cjs +8 -0
  7. package/dist/cjs/create-context.cjs.map +1 -0
  8. package/dist/cjs/create-context.d.cts +5 -0
  9. package/dist/cjs/define/handler.cjs +38 -0
  10. package/dist/cjs/define/handler.cjs.map +1 -0
  11. package/dist/cjs/define/handler.d.cts +13 -0
  12. package/dist/cjs/define/middleware.cjs +36 -0
  13. package/dist/cjs/define/middleware.cjs.map +1 -0
  14. package/dist/cjs/define/middleware.d.cts +85 -0
  15. package/dist/cjs/define/validators.cjs +14 -0
  16. package/dist/cjs/define/validators.cjs.map +1 -0
  17. package/dist/cjs/define/validators.d.cts +8 -0
  18. package/dist/cjs/factories.cjs +29 -0
  19. package/dist/cjs/factories.cjs.map +1 -0
  20. package/dist/cjs/factories.d.cts +61 -0
  21. package/dist/cjs/index.cjs +42 -0
  22. package/dist/cjs/index.d.cts +12 -0
  23. package/dist/cjs/middleware/auth.cjs +34 -0
  24. package/dist/cjs/middleware/auth.cjs.map +1 -0
  25. package/dist/cjs/middleware/auth.d.cts +9 -0
  26. package/dist/cjs/middleware/body-limit.cjs +12 -0
  27. package/dist/cjs/middleware/body-limit.cjs.map +1 -0
  28. package/dist/cjs/middleware/body-limit.d.cts +3 -0
  29. package/dist/cjs/middleware/compress.cjs +12 -0
  30. package/dist/cjs/middleware/compress.cjs.map +1 -0
  31. package/dist/cjs/middleware/compress.d.cts +3 -0
  32. package/dist/cjs/middleware/cors.cjs +12 -0
  33. package/dist/cjs/middleware/cors.cjs.map +1 -0
  34. package/dist/cjs/middleware/cors.d.cts +3 -0
  35. package/dist/cjs/middleware/csrf.cjs +12 -0
  36. package/dist/cjs/middleware/csrf.cjs.map +1 -0
  37. package/dist/cjs/middleware/csrf.d.cts +3 -0
  38. package/dist/cjs/middleware/etag.cjs +12 -0
  39. package/dist/cjs/middleware/etag.cjs.map +1 -0
  40. package/dist/cjs/middleware/etag.d.cts +3 -0
  41. package/dist/cjs/middleware/jwk.cjs +25 -0
  42. package/dist/cjs/middleware/jwk.cjs.map +1 -0
  43. package/dist/cjs/middleware/jwk.d.cts +15 -0
  44. package/dist/cjs/middleware/jwt.cjs +16 -0
  45. package/dist/cjs/middleware/jwt.cjs.map +1 -0
  46. package/dist/cjs/middleware/jwt.d.cts +10 -0
  47. package/dist/cjs/middleware/secure-headers.cjs +12 -0
  48. package/dist/cjs/middleware/secure-headers.cjs.map +1 -0
  49. package/dist/cjs/middleware/secure-headers.d.cts +3 -0
  50. package/dist/cjs/middleware/timing.cjs +12 -0
  51. package/dist/cjs/middleware/timing.cjs.map +1 -0
  52. package/dist/cjs/middleware/timing.d.cts +3 -0
  53. package/dist/cjs/middleware.cjs +17 -0
  54. package/dist/cjs/middleware.cjs.map +1 -0
  55. package/dist/cjs/middleware.d.cts +2 -0
  56. package/dist/cjs/register.d.cts +2 -0
  57. package/dist/cjs/route.cjs +94 -0
  58. package/dist/cjs/route.cjs.map +1 -0
  59. package/dist/cjs/route.d.cts +5 -0
  60. package/dist/cjs/taser-app.cjs +42 -0
  61. package/dist/cjs/taser-app.cjs.map +1 -0
  62. package/dist/cjs/taser-app.d.cts +21 -0
  63. package/dist/cjs/taser-router.cjs +83 -0
  64. package/dist/cjs/taser-router.cjs.map +1 -0
  65. package/dist/cjs/taser-router.d.cts +44 -0
  66. package/dist/cjs/types/app.d.cts +46 -0
  67. package/dist/cjs/types/index.d.cts +305 -0
  68. package/dist/cjs/types/returns.d.cts +37 -0
  69. package/dist/cjs/types/schema.d.cts +14 -0
  70. package/dist/cjs/types/type-utils.d.cts +52 -0
  71. package/dist/cjs/types/units.cjs +8 -0
  72. package/dist/cjs/types/units.cjs.map +1 -0
  73. package/dist/cjs/types/units.d.cts +98 -0
  74. package/dist/esm/constants.d.ts +8 -0
  75. package/dist/esm/constants.js +16 -0
  76. package/dist/esm/constants.js.map +1 -0
  77. package/dist/esm/create-context.d.ts +5 -0
  78. package/dist/esm/create-context.js +8 -0
  79. package/dist/esm/create-context.js.map +1 -0
  80. package/dist/esm/define/handler.d.ts +13 -0
  81. package/dist/esm/define/handler.js +38 -0
  82. package/dist/esm/define/handler.js.map +1 -0
  83. package/dist/esm/define/middleware.d.ts +85 -0
  84. package/dist/esm/define/middleware.js +36 -0
  85. package/dist/esm/define/middleware.js.map +1 -0
  86. package/dist/esm/define/validators.d.ts +8 -0
  87. package/dist/esm/define/validators.js +14 -0
  88. package/dist/esm/define/validators.js.map +1 -0
  89. package/dist/esm/factories.d.ts +61 -0
  90. package/dist/esm/factories.js +21 -0
  91. package/dist/esm/factories.js.map +1 -0
  92. package/dist/esm/index.d.ts +12 -0
  93. package/dist/esm/index.js +8 -0
  94. package/dist/esm/middleware/auth.d.ts +9 -0
  95. package/dist/esm/middleware/auth.js +33 -0
  96. package/dist/esm/middleware/auth.js.map +1 -0
  97. package/dist/esm/middleware/body-limit.d.ts +3 -0
  98. package/dist/esm/middleware/body-limit.js +11 -0
  99. package/dist/esm/middleware/body-limit.js.map +1 -0
  100. package/dist/esm/middleware/compress.d.ts +3 -0
  101. package/dist/esm/middleware/compress.js +11 -0
  102. package/dist/esm/middleware/compress.js.map +1 -0
  103. package/dist/esm/middleware/cors.d.ts +3 -0
  104. package/dist/esm/middleware/cors.js +11 -0
  105. package/dist/esm/middleware/cors.js.map +1 -0
  106. package/dist/esm/middleware/csrf.d.ts +3 -0
  107. package/dist/esm/middleware/csrf.js +11 -0
  108. package/dist/esm/middleware/csrf.js.map +1 -0
  109. package/dist/esm/middleware/etag.d.ts +3 -0
  110. package/dist/esm/middleware/etag.js +11 -0
  111. package/dist/esm/middleware/etag.js.map +1 -0
  112. package/dist/esm/middleware/jwk.d.ts +15 -0
  113. package/dist/esm/middleware/jwk.js +24 -0
  114. package/dist/esm/middleware/jwk.js.map +1 -0
  115. package/dist/esm/middleware/jwt.d.ts +10 -0
  116. package/dist/esm/middleware/jwt.js +15 -0
  117. package/dist/esm/middleware/jwt.js.map +1 -0
  118. package/dist/esm/middleware/secure-headers.d.ts +3 -0
  119. package/dist/esm/middleware/secure-headers.js +11 -0
  120. package/dist/esm/middleware/secure-headers.js.map +1 -0
  121. package/dist/esm/middleware/timing.d.ts +3 -0
  122. package/dist/esm/middleware/timing.js +11 -0
  123. package/dist/esm/middleware/timing.js.map +1 -0
  124. package/dist/esm/middleware.d.ts +2 -0
  125. package/dist/esm/middleware.js +17 -0
  126. package/dist/esm/middleware.js.map +1 -0
  127. package/dist/esm/register.d.ts +2 -0
  128. package/dist/esm/route.d.ts +5 -0
  129. package/dist/esm/route.js +94 -0
  130. package/dist/esm/route.js.map +1 -0
  131. package/dist/esm/taser-app.d.ts +21 -0
  132. package/dist/esm/taser-app.js +40 -0
  133. package/dist/esm/taser-app.js.map +1 -0
  134. package/dist/esm/taser-router.d.ts +44 -0
  135. package/dist/esm/taser-router.js +82 -0
  136. package/dist/esm/taser-router.js.map +1 -0
  137. package/dist/esm/types/app.d.ts +46 -0
  138. package/dist/esm/types/index.d.ts +305 -0
  139. package/dist/esm/types/returns.d.ts +37 -0
  140. package/dist/esm/types/schema.d.ts +14 -0
  141. package/dist/esm/types/type-utils.d.ts +52 -0
  142. package/dist/esm/types/units.d.ts +98 -0
  143. package/dist/esm/types/units.js +8 -0
  144. package/dist/esm/types/units.js.map +1 -0
  145. package/package.json +149 -0
  146. package/src/constants.ts +10 -0
  147. package/src/create-context.ts +19 -0
  148. package/src/define/handler.ts +72 -0
  149. package/src/define/middleware.ts +289 -0
  150. package/src/define/validators.ts +22 -0
  151. package/src/factories.ts +183 -0
  152. package/src/index.ts +44 -0
  153. package/src/middleware/auth.ts +51 -0
  154. package/src/middleware/body-limit.ts +11 -0
  155. package/src/middleware/compress.ts +11 -0
  156. package/src/middleware/cors.ts +11 -0
  157. package/src/middleware/csrf.ts +11 -0
  158. package/src/middleware/etag.ts +11 -0
  159. package/src/middleware/jwk.ts +47 -0
  160. package/src/middleware/jwt.ts +18 -0
  161. package/src/middleware/secure-headers.ts +11 -0
  162. package/src/middleware/timing.ts +11 -0
  163. package/src/middleware.ts +19 -0
  164. package/src/register.ts +1 -0
  165. package/src/route.ts +145 -0
  166. package/src/taser-app.ts +43 -0
  167. package/src/taser-router.ts +160 -0
  168. package/src/types/app.ts +65 -0
  169. package/src/types/index.ts +1064 -0
  170. package/src/types/returns.ts +135 -0
  171. package/src/types/schema.ts +22 -0
  172. package/src/types/type-utils.ts +86 -0
  173. package/src/types/units.ts +167 -0
@@ -0,0 +1,1064 @@
1
+ import type { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core'
2
+ import type { ReplyResult } from '@taserjs/router-utils'
3
+ import type { RouterRegister } from '../register.js'
4
+ import type {
5
+ MergeMiddlewareField,
6
+ MergeMiddlewareInputField,
7
+ MergePart,
8
+ RequestShape,
9
+ RuntimeContextFields,
10
+ Simplify,
11
+ } from './type-utils.js'
12
+ import type { ReturnsMap, ValidHandlerReply } from './returns.js'
13
+ import type { Schema } from './schema.js'
14
+ import type {
15
+ AppContext,
16
+ HandlerContext,
17
+ HandlerUnit,
18
+ Method,
19
+ MiddlewareDefinition,
20
+ MiddlewareReturnFromParts,
21
+ MiddlewareUnit,
22
+ NativeContext,
23
+ ValidatorParts,
24
+ } from './units.js'
25
+
26
+ export type { Awaitable } from '@taserjs/router-core'
27
+ export type {
28
+ SchemaRequestShape,
29
+ InferInput,
30
+ InferOutput,
31
+ Schema,
32
+ StandardSchemaV1,
33
+ } from './schema.js'
34
+ export type { RouterRegister } from '../register.js'
35
+ export type {
36
+ MergeMiddlewareField,
37
+ MergeMiddlewareInputField,
38
+ MergePart,
39
+ RequestShape,
40
+ Simplify,
41
+ UnwrapPart,
42
+ } from './type-utils.js'
43
+ export type {
44
+ EmptyReturns,
45
+ EnforceHandlerReply,
46
+ HandlerReply,
47
+ HasReturns,
48
+ MergeReturns,
49
+ ReplyResultFor,
50
+ ReturnsMap,
51
+ StatusCode,
52
+ ValidHandlerReply,
53
+ } from './returns.js'
54
+ export type {
55
+ AppContext,
56
+ HandlerContext,
57
+ HandlerUnit,
58
+ HttpMethod,
59
+ InlineMiddlewareOptions,
60
+ Method,
61
+ MiddlewareDefinition,
62
+ MiddlewareNext,
63
+ MiddlewareReturnFromParts,
64
+ MiddlewareUnit,
65
+ NativeContext,
66
+ StandaloneMiddlewareContext,
67
+ ValidatorParts,
68
+ } from './units.js'
69
+
70
+ export type RoutePath = RouterRegister extends { RoutePath: infer P } ? P : never
71
+ export type LayoutId = RouterRegister extends { LayoutId: infer L } ? L : never
72
+ export type LayoutTree = RouterRegister extends { LayoutTree: infer T } ? T : Record<never, never>
73
+ export type RouteByPathMethod = RouterRegister extends { RouteByPathMethod: infer R }
74
+ ? R
75
+ : Record<never, never>
76
+
77
+ type ParseParam<Segment extends string>
78
+ = Segment extends '*' ? { _splat: string }
79
+ : Segment extends `:${infer Name extends string}`
80
+ ? Name extends '' ? {} : { [K in Name]: string }
81
+ : {}
82
+
83
+ type ParseParamsFromSegments<S extends string>
84
+ = S extends `${infer Segment}/${infer Rest}`
85
+ ? ParseParam<Segment> & ParseParamsFromSegments<Rest>
86
+ : ParseParam<S>
87
+
88
+ export type PathParams<Path extends string>
89
+ = Path extends `/${infer Rest}` ? ParseParamsFromSegments<Rest> : {}
90
+
91
+ type LayoutParent<Layout extends LayoutId>
92
+ = LayoutTree[Layout] extends { parent: infer Parent extends LayoutId | null }
93
+ ? Parent
94
+ : null
95
+
96
+ type ResolveLayoutMiddlewares<Layout extends LayoutId | null>
97
+ = Layout extends null ? readonly []
98
+ : Layout extends LayoutId
99
+ ? readonly [
100
+ ...ResolveLayoutMiddlewares<LayoutParent<Layout>>,
101
+ ...LayoutTree[Layout]['middlewares'],
102
+ ]
103
+ : readonly []
104
+
105
+ /** Fold layout middleware Acc from a route's layoutChain (shallow → deep). */
106
+ type ResolveLayoutChainMiddlewares<Chain extends readonly LayoutId[]>
107
+ = Chain extends readonly [infer Head extends LayoutId, ...infer Rest]
108
+ ? readonly [
109
+ ...LayoutTree[Head]['middlewares'],
110
+ ...ResolveLayoutChainMiddlewares<
111
+ Rest extends readonly LayoutId[] ? Rest : readonly []
112
+ >,
113
+ ]
114
+ : readonly []
115
+
116
+ type RouteEntry<
117
+ Path extends RoutePath,
118
+ TMethod extends Method,
119
+ > = RouteByPathMethod[Path] extends { [K in TMethod]: infer Entry } ? Entry : never
120
+
121
+ type RouteParent<Path extends RoutePath, TMethod extends Method>
122
+ = RouteEntry<Path, TMethod> extends { parent: infer Parent extends LayoutId | null }
123
+ ? Parent
124
+ : null
125
+
126
+ type RouteLayoutChain<Path extends RoutePath, TMethod extends Method>
127
+ = RouteEntry<Path, TMethod> extends { layoutChain: infer Chain extends readonly LayoutId[] }
128
+ ? Chain
129
+ : RouteParent<Path, TMethod> extends LayoutId
130
+ ? readonly [RouteParent<Path, TMethod>]
131
+ : readonly []
132
+
133
+ type RouteResolvedField<
134
+ Path extends RoutePath,
135
+ TMethod extends Method,
136
+ Acc extends readonly unknown[],
137
+ Field extends 'query' | 'params' | 'body' | 'state' | 'ctx',
138
+ > = MergeMiddlewareField<
139
+ ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>,
140
+ Field
141
+ > & MergeMiddlewareField<Acc, Field>
142
+
143
+ type MiddlewareCtxField<
144
+ Layout extends LayoutId,
145
+ Field extends 'query' | 'params' | 'body' | 'state' | 'ctx',
146
+ > = MergeMiddlewareField<
147
+ ResolveLayoutMiddlewares<LayoutParent<Layout>>,
148
+ Field
149
+ >
150
+
151
+ type RouteChainField<
152
+ Path extends RoutePath,
153
+ TMethod extends Method,
154
+ Acc extends readonly unknown[],
155
+ Field extends 'query' | 'params' | 'body' | 'state' | 'ctx',
156
+ > = RouteResolvedField<Path, TMethod, Acc, Field>
157
+
158
+ type UnitRuntimeContext = RuntimeContextFields<NativeContext>
159
+
160
+ export type RouteChainContext<
161
+ Path extends RoutePath,
162
+ TMethod extends Method,
163
+ Acc extends readonly unknown[],
164
+ TQuery,
165
+ TParams,
166
+ TBody,
167
+ TAppContext extends Record<string, unknown> = AppContext,
168
+ > = Simplify<
169
+ TAppContext
170
+ & UnitRuntimeContext
171
+ & RouteChainField<Path, TMethod, Acc, 'ctx'>
172
+ & {
173
+ query: Simplify<MergePart<TQuery, RouteChainField<Path, TMethod, Acc, 'query'>>>
174
+ params: Simplify<PathParams<Path> & MergePart<TParams, RouteChainField<Path, TMethod, Acc, 'params'>>>
175
+ body: Simplify<MergePart<TBody, RouteChainField<Path, TMethod, Acc, 'body'>>>
176
+ state: Simplify<RouteChainField<Path, TMethod, Acc, 'state'>>
177
+ headers: TaserHeaders
178
+ cookies: TaserCookieJar
179
+ }
180
+ >
181
+
182
+ export type RouteHandleContext<
183
+ Path extends RoutePath,
184
+ TMethod extends Method,
185
+ Acc extends readonly unknown[],
186
+ Validators extends {
187
+ query?: unknown
188
+ params?: unknown
189
+ body?: unknown
190
+ },
191
+ TAppContext extends Record<string, unknown> = AppContext,
192
+ > = Simplify<
193
+ TAppContext
194
+ & UnitRuntimeContext
195
+ & RouteResolvedField<Path, TMethod, Acc, 'ctx'>
196
+ & {
197
+ path: Path
198
+ method: TMethod
199
+ query: Simplify<MergePart<
200
+ Validators extends { query?: infer Q } ? Q : unknown,
201
+ RouteResolvedField<Path, TMethod, Acc, 'query'>
202
+ >>
203
+ params: Simplify<PathParams<Path> & MergePart<
204
+ Validators extends { params?: infer P } ? P : unknown,
205
+ RouteResolvedField<Path, TMethod, Acc, 'params'>
206
+ >>
207
+ body: Simplify<MergePart<
208
+ Validators extends { body?: infer B } ? B : unknown,
209
+ RouteResolvedField<Path, TMethod, Acc, 'body'>
210
+ >>
211
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, 'state'>>
212
+ headers: TaserHeaders
213
+ cookies: TaserCookieJar
214
+ }
215
+ >
216
+
217
+ export type RouteHandleContextWithoutBody<
218
+ Path extends RoutePath,
219
+ TMethod extends Method,
220
+ Acc extends readonly unknown[],
221
+ Validators extends {
222
+ query?: unknown
223
+ params?: unknown
224
+ },
225
+ TAppContext extends Record<string, unknown> = AppContext,
226
+ > = Simplify<
227
+ TAppContext
228
+ & UnitRuntimeContext
229
+ & RouteResolvedField<Path, TMethod, Acc, 'ctx'>
230
+ & {
231
+ path: Path
232
+ method: TMethod
233
+ query: Simplify<MergePart<
234
+ Validators extends { query?: infer Q } ? Q : unknown,
235
+ RouteResolvedField<Path, TMethod, Acc, 'query'>
236
+ >>
237
+ params: Simplify<PathParams<Path> & MergePart<
238
+ Validators extends { params?: infer P } ? P : unknown,
239
+ RouteResolvedField<Path, TMethod, Acc, 'params'>
240
+ >>
241
+ body: never
242
+ state: Simplify<RouteResolvedField<Path, TMethod, Acc, 'state'>>
243
+ headers: TaserHeaders
244
+ cookies: TaserCookieJar
245
+ }
246
+ >
247
+
248
+ type RouteResolvedInputField<
249
+ Path extends RoutePath,
250
+ TMethod extends Method,
251
+ Acc extends readonly unknown[],
252
+ Field extends 'query' | 'params' | 'body',
253
+ > = MergeMiddlewareInputField<
254
+ ResolveLayoutChainMiddlewares<RouteLayoutChain<Path, TMethod>>,
255
+ Field
256
+ > & MergeMiddlewareInputField<Acc, Field>
257
+
258
+ type IsNever<T> = [T] extends [never] ? true : false
259
+
260
+ type IsEmptyObject<T> = [keyof T] extends [never] ? true : false
261
+
262
+ type InputFacet<T, K extends string> = IsNever<T> extends true
263
+ ? {}
264
+ : IsEmptyObject<T> extends true
265
+ ? {}
266
+ : { [Key in K]: T }
267
+
268
+ type RouteQueryInput<
269
+ Path extends RoutePath,
270
+ TMethod extends Method,
271
+ Acc extends readonly unknown[],
272
+ Validators extends ValidatorParts,
273
+ > = Simplify<
274
+ MergePart<
275
+ RequestShape<
276
+ Validators extends { queryIn?: infer QI } ? QI : unknown,
277
+ Validators extends { query?: infer Q } ? Q : unknown
278
+ >,
279
+ RouteResolvedInputField<Path, TMethod, Acc, 'query'>
280
+ >
281
+ >
282
+
283
+ type RouteParamsInput<
284
+ Path extends RoutePath,
285
+ TMethod extends Method,
286
+ Acc extends readonly unknown[],
287
+ Validators extends ValidatorParts,
288
+ > = Simplify<
289
+ PathParams<Path> & MergePart<
290
+ RequestShape<
291
+ Validators extends { paramsIn?: infer PI } ? PI : unknown,
292
+ Validators extends { params?: infer P } ? P : unknown
293
+ >,
294
+ RouteResolvedInputField<Path, TMethod, Acc, 'params'>
295
+ >
296
+ >
297
+
298
+ type RouteBodyInput<
299
+ Path extends RoutePath,
300
+ TMethod extends Method,
301
+ Acc extends readonly unknown[],
302
+ Validators extends ValidatorParts,
303
+ > = Simplify<
304
+ MergePart<
305
+ RequestShape<
306
+ Validators extends { bodyIn?: infer BI } ? BI : unknown,
307
+ Validators extends { body?: infer B } ? B : unknown
308
+ >,
309
+ RouteResolvedInputField<Path, TMethod, Acc, 'body'>
310
+ >
311
+ >
312
+
313
+ export type RouteHandleInputWithoutBody<
314
+ Path extends RoutePath,
315
+ TMethod extends Method,
316
+ Acc extends readonly unknown[],
317
+ Validators extends ValidatorParts = {},
318
+ > = Simplify<
319
+ InputFacet<RouteQueryInput<Path, TMethod, Acc, Validators>, 'query'>
320
+ & InputFacet<RouteParamsInput<Path, TMethod, Acc, Validators>, 'params'>
321
+ >
322
+
323
+ export type RouteHandleInput<
324
+ Path extends RoutePath,
325
+ TMethod extends Method,
326
+ Acc extends readonly unknown[],
327
+ Validators extends ValidatorParts = {},
328
+ > = Simplify<
329
+ RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators>
330
+ & InputFacet<RouteBodyInput<Path, TMethod, Acc, Validators>, 'body'>
331
+ >
332
+
333
+ export type InferRouteInput<
334
+ Path extends RoutePath,
335
+ TMethod extends Method,
336
+ > = RouteEntry<Path, TMethod> extends { route: infer Route }
337
+ ? Route extends { $Infer: { Input: infer I } } ? I : never
338
+ : never
339
+
340
+ type MiddlewareChainField<
341
+ Layout extends LayoutId,
342
+ Acc extends readonly unknown[],
343
+ Field extends 'query' | 'params' | 'body' | 'state' | 'ctx',
344
+ > = MiddlewareCtxField<Layout, Field> & MergeMiddlewareField<Acc, Field>
345
+
346
+ export type MiddlewareChainContext<
347
+ Layout extends LayoutId,
348
+ Acc extends readonly unknown[],
349
+ TQuery,
350
+ TParams,
351
+ TBody,
352
+ TAppContext extends Record<string, unknown> = AppContext,
353
+ > = Simplify<
354
+ TAppContext
355
+ & UnitRuntimeContext
356
+ & MiddlewareChainField<Layout, Acc, 'ctx'>
357
+ & {
358
+ query: Simplify<MergePart<TQuery, MiddlewareChainField<Layout, Acc, 'query'>>>
359
+ params: Simplify<MergePart<TParams, MiddlewareChainField<Layout, Acc, 'params'>>>
360
+ body: Simplify<MergePart<TBody, MiddlewareChainField<Layout, Acc, 'body'>>>
361
+ state: Simplify<MiddlewareChainField<Layout, Acc, 'state'>>
362
+ headers: TaserHeaders
363
+ cookies: TaserCookieJar
364
+ }
365
+ >
366
+
367
+ type StatefulUseOptions<
368
+ Ctx,
369
+ TState,
370
+ TQuery,
371
+ TParams,
372
+ TBody,
373
+ TReturns extends ReturnsMap = {},
374
+ TQueryIn = unknown,
375
+ TParamsIn = unknown,
376
+ TBodyIn = unknown,
377
+ > = {
378
+ state: Schema<TState>
379
+ query?: Schema<TQuery, TQueryIn>
380
+ params?: Schema<TParams, TParamsIn>
381
+ body?: Schema<TBody, TBodyIn>
382
+ returns?: TReturns
383
+ handler: (
384
+ ctx: Ctx,
385
+ next: (args: { state: TState }) => Promise<ReplyResult>,
386
+ ) => Awaitable<ReplyResult | Response | unknown>
387
+ }
388
+
389
+ type CtxUseOptions<
390
+ Ctx,
391
+ TCtx,
392
+ TQuery,
393
+ TParams,
394
+ TBody,
395
+ TReturns extends ReturnsMap = {},
396
+ TQueryIn = unknown,
397
+ TParamsIn = unknown,
398
+ TBodyIn = unknown,
399
+ > = {
400
+ ctx: Schema<TCtx>
401
+ query?: Schema<TQuery, TQueryIn>
402
+ params?: Schema<TParams, TParamsIn>
403
+ body?: Schema<TBody, TBodyIn>
404
+ returns?: TReturns
405
+ handler: (
406
+ ctx: Ctx,
407
+ next: (args: { ctx: TCtx }) => Promise<ReplyResult>,
408
+ ) => Awaitable<ReplyResult | Response | unknown>
409
+ }
410
+
411
+ type StateAndCtxUseOptions<
412
+ Ctx,
413
+ TState,
414
+ TCtx,
415
+ TQuery,
416
+ TParams,
417
+ TBody,
418
+ TReturns extends ReturnsMap = {},
419
+ TQueryIn = unknown,
420
+ TParamsIn = unknown,
421
+ TBodyIn = unknown,
422
+ > = {
423
+ state: Schema<TState>
424
+ ctx: Schema<TCtx>
425
+ query?: Schema<TQuery, TQueryIn>
426
+ params?: Schema<TParams, TParamsIn>
427
+ body?: Schema<TBody, TBodyIn>
428
+ returns?: TReturns
429
+ handler: (
430
+ ctx: Ctx,
431
+ next: (args: { state: TState, ctx: TCtx }) => Promise<ReplyResult>,
432
+ ) => Awaitable<ReplyResult | Response | unknown>
433
+ }
434
+
435
+ type StatelessUseOptions<
436
+ Ctx,
437
+ TQuery,
438
+ TParams,
439
+ TBody,
440
+ TReturns extends ReturnsMap = {},
441
+ TQueryIn = unknown,
442
+ TParamsIn = unknown,
443
+ TBodyIn = unknown,
444
+ > = {
445
+ query?: Schema<TQuery, TQueryIn>
446
+ params?: Schema<TParams, TParamsIn>
447
+ body?: Schema<TBody, TBodyIn>
448
+ returns?: TReturns
449
+ handler: (
450
+ ctx: Ctx,
451
+ next: () => Promise<ReplyResult>,
452
+ ) => Awaitable<ReplyResult | Response | unknown>
453
+ }
454
+
455
+ export type MiddlewareBuilder<
456
+ Layout extends LayoutId,
457
+ Acc extends readonly unknown[] = readonly [],
458
+ TAppContext extends Record<string, unknown> = AppContext,
459
+ > = Acc & {
460
+ readonly layout: Layout
461
+ readonly middlewares: readonly MiddlewareDefinition[]
462
+ readonly $Infer: {
463
+ Context: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>
464
+ }
465
+ use<TAcc, TReturns extends ReturnsMap = {}>(
466
+ unit: MiddlewareUnit<TAcc, TReturns>,
467
+ ): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>
468
+ use<
469
+ TState,
470
+ TCtx,
471
+ TQuery = unknown,
472
+ TParams = unknown,
473
+ TBody = unknown,
474
+ TReturns extends ReturnsMap = {},
475
+ TQueryIn = unknown,
476
+ TParamsIn = unknown,
477
+ TBodyIn = unknown,
478
+ >(
479
+ options: StateAndCtxUseOptions<
480
+ MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>,
481
+ TState,
482
+ TCtx,
483
+ TQuery,
484
+ TParams,
485
+ TBody,
486
+ TReturns,
487
+ TQueryIn,
488
+ TParamsIn,
489
+ TBodyIn
490
+ >,
491
+ ): MiddlewareBuilder<
492
+ Layout,
493
+ readonly [...Acc, MiddlewareReturnFromParts<
494
+ TQuery,
495
+ TParams,
496
+ TBody,
497
+ TState,
498
+ TCtx,
499
+ TQueryIn,
500
+ TParamsIn,
501
+ TBodyIn
502
+ >],
503
+ TAppContext
504
+ >
505
+ use<
506
+ TState,
507
+ TQuery = unknown,
508
+ TParams = unknown,
509
+ TBody = unknown,
510
+ TReturns extends ReturnsMap = {},
511
+ TQueryIn = unknown,
512
+ TParamsIn = unknown,
513
+ TBodyIn = unknown,
514
+ >(
515
+ options: StatefulUseOptions<
516
+ MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>,
517
+ TState,
518
+ TQuery,
519
+ TParams,
520
+ TBody,
521
+ TReturns,
522
+ TQueryIn,
523
+ TParamsIn,
524
+ TBodyIn
525
+ >,
526
+ ): MiddlewareBuilder<
527
+ Layout,
528
+ readonly [...Acc, MiddlewareReturnFromParts<
529
+ TQuery,
530
+ TParams,
531
+ TBody,
532
+ TState,
533
+ unknown,
534
+ TQueryIn,
535
+ TParamsIn,
536
+ TBodyIn
537
+ >],
538
+ TAppContext
539
+ >
540
+ use<
541
+ TCtx,
542
+ TQuery = unknown,
543
+ TParams = unknown,
544
+ TBody = unknown,
545
+ TReturns extends ReturnsMap = {},
546
+ TQueryIn = unknown,
547
+ TParamsIn = unknown,
548
+ TBodyIn = unknown,
549
+ >(
550
+ options: CtxUseOptions<
551
+ MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>,
552
+ TCtx,
553
+ TQuery,
554
+ TParams,
555
+ TBody,
556
+ TReturns,
557
+ TQueryIn,
558
+ TParamsIn,
559
+ TBodyIn
560
+ >,
561
+ ): MiddlewareBuilder<
562
+ Layout,
563
+ readonly [...Acc, MiddlewareReturnFromParts<
564
+ TQuery,
565
+ TParams,
566
+ TBody,
567
+ {},
568
+ TCtx,
569
+ TQueryIn,
570
+ TParamsIn,
571
+ TBodyIn
572
+ >],
573
+ TAppContext
574
+ >
575
+ use<
576
+ TQuery = unknown,
577
+ TParams = unknown,
578
+ TBody = unknown,
579
+ TReturns extends ReturnsMap = {},
580
+ TQueryIn = unknown,
581
+ TParamsIn = unknown,
582
+ TBodyIn = unknown,
583
+ >(
584
+ options: StatelessUseOptions<
585
+ MiddlewareChainContext<Layout, Acc, TQuery, TParams, TBody, TAppContext>,
586
+ TQuery,
587
+ TParams,
588
+ TBody,
589
+ TReturns,
590
+ TQueryIn,
591
+ TParamsIn,
592
+ TBodyIn
593
+ >,
594
+ ): MiddlewareBuilder<
595
+ Layout,
596
+ readonly [...Acc, MiddlewareReturnFromParts<
597
+ TQuery,
598
+ TParams,
599
+ TBody,
600
+ {},
601
+ unknown,
602
+ TQueryIn,
603
+ TParamsIn,
604
+ TBodyIn
605
+ >],
606
+ TAppContext
607
+ >
608
+ }
609
+
610
+ export type RouteExport<
611
+ Path extends RoutePath,
612
+ TMethod extends Method,
613
+ Acc extends readonly unknown[],
614
+ TReturns extends ReturnsMap = {},
615
+ TOutput = Response,
616
+ > = Acc & {
617
+ readonly path: Path
618
+ readonly method: TMethod | 'ANY' | 'ALL'
619
+ readonly methods?: readonly Method[]
620
+ readonly middlewares: readonly MiddlewareDefinition[]
621
+ readonly handlerMiddlewares: readonly MiddlewareDefinition[]
622
+ readonly returns?: TReturns
623
+ handler: (ctx: unknown) => Awaitable<Response>
624
+ readonly $Infer: {
625
+ Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS'
626
+ ? RouteHandleContextWithoutBody<Path, TMethod, Acc, {}>
627
+ : RouteHandleContext<Path, TMethod, Acc, {}>
628
+ /** Concrete handler reply (`ReplyOf` union) for client inference. */
629
+ Output: TOutput
630
+ }
631
+ query?: Schema<unknown>
632
+ params?: Schema<unknown>
633
+ body?: Schema<unknown>
634
+ handlerQuery?: Schema<unknown>
635
+ handlerParams?: Schema<unknown>
636
+ handlerBody?: Schema<unknown>
637
+ }
638
+
639
+ type RouteHandleResult<
640
+ Path extends RoutePath,
641
+ TMethod extends Method,
642
+ Acc extends readonly unknown[],
643
+ Validators extends ValidatorParts,
644
+ TReturns extends ReturnsMap = {},
645
+ TOutput = Response,
646
+ TAppContext extends Record<string, unknown> = AppContext,
647
+ > = Omit<RouteExport<Path, TMethod, Acc, TReturns, TOutput>, '$Infer'> & {
648
+ readonly $Infer: {
649
+ Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS'
650
+ ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext>
651
+ : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>
652
+ Input: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS'
653
+ ? RouteHandleInputWithoutBody<Path, TMethod, Acc, Validators>
654
+ : RouteHandleInput<Path, TMethod, Acc, Validators>
655
+ Output: TOutput
656
+ }
657
+ }
658
+
659
+ export type RouteBuilder<
660
+ Path extends RoutePath,
661
+ TMethod extends Method,
662
+ Acc extends readonly unknown[] = readonly [],
663
+ Validators extends ValidatorParts = {},
664
+ TReturns extends ReturnsMap = {},
665
+ TAppContext extends Record<string, unknown> = AppContext,
666
+ > = {
667
+ readonly path: Path
668
+ readonly method: TMethod
669
+ readonly $Infer: {
670
+ Context: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS'
671
+ ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext>
672
+ : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>
673
+ }
674
+ returns<const M extends ReturnsMap>(
675
+ map: M,
676
+ ): RouteBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>
677
+ use<TAcc, UReturns extends ReturnsMap = {}>(
678
+ unit: MiddlewareUnit<TAcc, UReturns>,
679
+ ): RouteBuilder<
680
+ Path,
681
+ TMethod,
682
+ readonly [...Acc, TAcc],
683
+ Validators,
684
+ Omit<TReturns, keyof UReturns> & UReturns,
685
+ TAppContext
686
+ >
687
+ use<
688
+ TState,
689
+ TCtx,
690
+ TQuery = unknown,
691
+ TParams = unknown,
692
+ TBody = unknown,
693
+ UReturns extends ReturnsMap = {},
694
+ TQueryIn = unknown,
695
+ TParamsIn = unknown,
696
+ TBodyIn = unknown,
697
+ >(
698
+ options: StateAndCtxUseOptions<
699
+ RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>,
700
+ TState,
701
+ TCtx,
702
+ TQuery,
703
+ TParams,
704
+ TBody,
705
+ UReturns,
706
+ TQueryIn,
707
+ TParamsIn,
708
+ TBodyIn
709
+ >,
710
+ ): RouteBuilder<
711
+ Path,
712
+ TMethod,
713
+ readonly [...Acc, MiddlewareReturnFromParts<
714
+ TQuery,
715
+ TParams,
716
+ TBody,
717
+ TState,
718
+ TCtx,
719
+ TQueryIn,
720
+ TParamsIn,
721
+ TBodyIn
722
+ >],
723
+ Validators,
724
+ Omit<TReturns, keyof UReturns> & UReturns,
725
+ TAppContext
726
+ >
727
+ use<
728
+ TState,
729
+ TQuery = unknown,
730
+ TParams = unknown,
731
+ TBody = unknown,
732
+ UReturns extends ReturnsMap = {},
733
+ TQueryIn = unknown,
734
+ TParamsIn = unknown,
735
+ TBodyIn = unknown,
736
+ >(
737
+ options: StatefulUseOptions<
738
+ RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>,
739
+ TState,
740
+ TQuery,
741
+ TParams,
742
+ TBody,
743
+ UReturns,
744
+ TQueryIn,
745
+ TParamsIn,
746
+ TBodyIn
747
+ >,
748
+ ): RouteBuilder<
749
+ Path,
750
+ TMethod,
751
+ readonly [...Acc, MiddlewareReturnFromParts<
752
+ TQuery,
753
+ TParams,
754
+ TBody,
755
+ TState,
756
+ unknown,
757
+ TQueryIn,
758
+ TParamsIn,
759
+ TBodyIn
760
+ >],
761
+ Validators,
762
+ Omit<TReturns, keyof UReturns> & UReturns,
763
+ TAppContext
764
+ >
765
+ use<
766
+ TCtx,
767
+ TQuery = unknown,
768
+ TParams = unknown,
769
+ TBody = unknown,
770
+ UReturns extends ReturnsMap = {},
771
+ TQueryIn = unknown,
772
+ TParamsIn = unknown,
773
+ TBodyIn = unknown,
774
+ >(
775
+ options: CtxUseOptions<
776
+ RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>,
777
+ TCtx,
778
+ TQuery,
779
+ TParams,
780
+ TBody,
781
+ UReturns,
782
+ TQueryIn,
783
+ TParamsIn,
784
+ TBodyIn
785
+ >,
786
+ ): RouteBuilder<
787
+ Path,
788
+ TMethod,
789
+ readonly [...Acc, MiddlewareReturnFromParts<
790
+ TQuery,
791
+ TParams,
792
+ TBody,
793
+ {},
794
+ TCtx,
795
+ TQueryIn,
796
+ TParamsIn,
797
+ TBodyIn
798
+ >],
799
+ Validators,
800
+ Omit<TReturns, keyof UReturns> & UReturns,
801
+ TAppContext
802
+ >
803
+ use<
804
+ TQuery = unknown,
805
+ TParams = unknown,
806
+ TBody = unknown,
807
+ UReturns extends ReturnsMap = {},
808
+ TQueryIn = unknown,
809
+ TParamsIn = unknown,
810
+ TBodyIn = unknown,
811
+ >(
812
+ options: StatelessUseOptions<
813
+ RouteChainContext<Path, TMethod, Acc, TQuery, TParams, TBody, TAppContext>,
814
+ TQuery,
815
+ TParams,
816
+ TBody,
817
+ UReturns,
818
+ TQueryIn,
819
+ TParamsIn,
820
+ TBodyIn
821
+ >,
822
+ ): RouteBuilder<
823
+ Path,
824
+ TMethod,
825
+ readonly [...Acc, MiddlewareReturnFromParts<
826
+ TQuery,
827
+ TParams,
828
+ TBody,
829
+ {},
830
+ unknown,
831
+ TQueryIn,
832
+ TParamsIn,
833
+ TBodyIn
834
+ >],
835
+ Validators,
836
+ Omit<TReturns, keyof UReturns> & UReturns,
837
+ TAppContext
838
+ >
839
+ handler<R extends Response = Response>(
840
+ fn: (
841
+ ctx: TMethod extends 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS'
842
+ ? RouteHandleContextWithoutBody<Path, TMethod, Acc, Validators, TAppContext>
843
+ : RouteHandleContext<Path, TMethod, Acc, Validators, TAppContext>,
844
+ ) => Awaitable<R>,
845
+ ..._assert: [R] extends [ValidHandlerReply<R, TReturns>]
846
+ ? []
847
+ : [{
848
+ expected: ValidHandlerReply<R, TReturns>
849
+ actual: R
850
+ }]
851
+ ): RouteHandleResult<
852
+ Path,
853
+ TMethod,
854
+ Acc,
855
+ Validators,
856
+ TReturns,
857
+ R,
858
+ TAppContext
859
+ >
860
+ handler<
861
+ HandlerAcc extends readonly unknown[] = readonly [],
862
+ HandlerValidators extends ValidatorParts = ValidatorParts,
863
+ HReturns extends ReturnsMap = {},
864
+ HOutput = Response,
865
+ >(
866
+ unit: HandlerUnit<HandlerAcc, HandlerValidators, HReturns, HOutput>,
867
+ ): RouteHandleResult<
868
+ Path,
869
+ TMethod,
870
+ readonly [...Acc, ...HandlerAcc],
871
+ Validators,
872
+ Omit<TReturns, keyof HReturns> & HReturns,
873
+ HOutput,
874
+ TAppContext
875
+ >
876
+ }
877
+
878
+ export type HandlerBuilder<
879
+ Acc extends readonly unknown[] = readonly [],
880
+ Validators extends ValidatorParts = {},
881
+ TReturns extends ReturnsMap = {},
882
+ TAppContext extends Record<string, unknown> = AppContext,
883
+ > = {
884
+ returns<const M extends ReturnsMap>(
885
+ map: M,
886
+ ): HandlerBuilder<Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>
887
+ use<TAcc, UReturns extends ReturnsMap = {}>(
888
+ unit: MiddlewareUnit<TAcc, UReturns>,
889
+ ): HandlerBuilder<
890
+ readonly [...Acc, TAcc],
891
+ Validators,
892
+ Omit<TReturns, keyof UReturns> & UReturns,
893
+ TAppContext
894
+ >
895
+ use<
896
+ TState,
897
+ TCtx,
898
+ TQuery = unknown,
899
+ TParams = unknown,
900
+ TBody = unknown,
901
+ UReturns extends ReturnsMap = {},
902
+ TQueryIn = unknown,
903
+ TParamsIn = unknown,
904
+ TBodyIn = unknown,
905
+ >(
906
+ options: StateAndCtxUseOptions<
907
+ HandlerContext<
908
+ Acc,
909
+ { query: TQuery, params: TParams, body: TBody },
910
+ TAppContext
911
+ >,
912
+ TState,
913
+ TCtx,
914
+ TQuery,
915
+ TParams,
916
+ TBody,
917
+ UReturns,
918
+ TQueryIn,
919
+ TParamsIn,
920
+ TBodyIn
921
+ >,
922
+ ): HandlerBuilder<
923
+ readonly [...Acc, MiddlewareReturnFromParts<
924
+ TQuery,
925
+ TParams,
926
+ TBody,
927
+ TState,
928
+ TCtx,
929
+ TQueryIn,
930
+ TParamsIn,
931
+ TBodyIn
932
+ >],
933
+ Validators,
934
+ Omit<TReturns, keyof UReturns> & UReturns,
935
+ TAppContext
936
+ >
937
+ use<
938
+ TState,
939
+ TQuery = unknown,
940
+ TParams = unknown,
941
+ TBody = unknown,
942
+ UReturns extends ReturnsMap = {},
943
+ TQueryIn = unknown,
944
+ TParamsIn = unknown,
945
+ TBodyIn = unknown,
946
+ >(
947
+ options: StatefulUseOptions<
948
+ HandlerContext<
949
+ Acc,
950
+ { query: TQuery, params: TParams, body: TBody },
951
+ TAppContext
952
+ >,
953
+ TState,
954
+ TQuery,
955
+ TParams,
956
+ TBody,
957
+ UReturns,
958
+ TQueryIn,
959
+ TParamsIn,
960
+ TBodyIn
961
+ >,
962
+ ): HandlerBuilder<
963
+ readonly [...Acc, MiddlewareReturnFromParts<
964
+ TQuery,
965
+ TParams,
966
+ TBody,
967
+ TState,
968
+ unknown,
969
+ TQueryIn,
970
+ TParamsIn,
971
+ TBodyIn
972
+ >],
973
+ Validators,
974
+ Omit<TReturns, keyof UReturns> & UReturns,
975
+ TAppContext
976
+ >
977
+ use<
978
+ TCtx,
979
+ TQuery = unknown,
980
+ TParams = unknown,
981
+ TBody = unknown,
982
+ UReturns extends ReturnsMap = {},
983
+ TQueryIn = unknown,
984
+ TParamsIn = unknown,
985
+ TBodyIn = unknown,
986
+ >(
987
+ options: CtxUseOptions<
988
+ HandlerContext<
989
+ Acc,
990
+ { query: TQuery, params: TParams, body: TBody },
991
+ TAppContext
992
+ >,
993
+ TCtx,
994
+ TQuery,
995
+ TParams,
996
+ TBody,
997
+ UReturns,
998
+ TQueryIn,
999
+ TParamsIn,
1000
+ TBodyIn
1001
+ >,
1002
+ ): HandlerBuilder<
1003
+ readonly [...Acc, MiddlewareReturnFromParts<
1004
+ TQuery,
1005
+ TParams,
1006
+ TBody,
1007
+ {},
1008
+ TCtx,
1009
+ TQueryIn,
1010
+ TParamsIn,
1011
+ TBodyIn
1012
+ >],
1013
+ Validators,
1014
+ Omit<TReturns, keyof UReturns> & UReturns,
1015
+ TAppContext
1016
+ >
1017
+ use<
1018
+ TQuery = unknown,
1019
+ TParams = unknown,
1020
+ TBody = unknown,
1021
+ UReturns extends ReturnsMap = {},
1022
+ TQueryIn = unknown,
1023
+ TParamsIn = unknown,
1024
+ TBodyIn = unknown,
1025
+ >(
1026
+ options: StatelessUseOptions<
1027
+ HandlerContext<
1028
+ Acc,
1029
+ { query: TQuery, params: TParams, body: TBody },
1030
+ TAppContext
1031
+ >,
1032
+ TQuery,
1033
+ TParams,
1034
+ TBody,
1035
+ UReturns,
1036
+ TQueryIn,
1037
+ TParamsIn,
1038
+ TBodyIn
1039
+ >,
1040
+ ): HandlerBuilder<
1041
+ readonly [...Acc, MiddlewareReturnFromParts<
1042
+ TQuery,
1043
+ TParams,
1044
+ TBody,
1045
+ {},
1046
+ unknown,
1047
+ TQueryIn,
1048
+ TParamsIn,
1049
+ TBodyIn
1050
+ >],
1051
+ Validators,
1052
+ Omit<TReturns, keyof UReturns> & UReturns,
1053
+ TAppContext
1054
+ >
1055
+ handler<R extends Response = Response>(
1056
+ fn: (ctx: HandlerContext<Acc, Validators, TAppContext>) => Awaitable<R>,
1057
+ ..._assert: [R] extends [ValidHandlerReply<R, TReturns>]
1058
+ ? []
1059
+ : [{
1060
+ expected: ValidHandlerReply<R, TReturns>
1061
+ actual: R
1062
+ }]
1063
+ ): HandlerUnit<Acc, Validators, TReturns, R>
1064
+ }