@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.
- package/LICENSE +15 -0
- package/README.md +24 -0
- package/dist/cjs/constants.cjs +17 -0
- package/dist/cjs/constants.cjs.map +1 -0
- package/dist/cjs/constants.d.cts +8 -0
- package/dist/cjs/create-context.cjs +8 -0
- package/dist/cjs/create-context.cjs.map +1 -0
- package/dist/cjs/create-context.d.cts +5 -0
- package/dist/cjs/define/handler.cjs +38 -0
- package/dist/cjs/define/handler.cjs.map +1 -0
- package/dist/cjs/define/handler.d.cts +13 -0
- package/dist/cjs/define/middleware.cjs +36 -0
- package/dist/cjs/define/middleware.cjs.map +1 -0
- package/dist/cjs/define/middleware.d.cts +85 -0
- package/dist/cjs/define/validators.cjs +14 -0
- package/dist/cjs/define/validators.cjs.map +1 -0
- package/dist/cjs/define/validators.d.cts +8 -0
- package/dist/cjs/factories.cjs +29 -0
- package/dist/cjs/factories.cjs.map +1 -0
- package/dist/cjs/factories.d.cts +61 -0
- package/dist/cjs/index.cjs +42 -0
- package/dist/cjs/index.d.cts +12 -0
- package/dist/cjs/middleware/auth.cjs +34 -0
- package/dist/cjs/middleware/auth.cjs.map +1 -0
- package/dist/cjs/middleware/auth.d.cts +9 -0
- package/dist/cjs/middleware/body-limit.cjs +12 -0
- package/dist/cjs/middleware/body-limit.cjs.map +1 -0
- package/dist/cjs/middleware/body-limit.d.cts +3 -0
- package/dist/cjs/middleware/compress.cjs +12 -0
- package/dist/cjs/middleware/compress.cjs.map +1 -0
- package/dist/cjs/middleware/compress.d.cts +3 -0
- package/dist/cjs/middleware/cors.cjs +12 -0
- package/dist/cjs/middleware/cors.cjs.map +1 -0
- package/dist/cjs/middleware/cors.d.cts +3 -0
- package/dist/cjs/middleware/csrf.cjs +12 -0
- package/dist/cjs/middleware/csrf.cjs.map +1 -0
- package/dist/cjs/middleware/csrf.d.cts +3 -0
- package/dist/cjs/middleware/etag.cjs +12 -0
- package/dist/cjs/middleware/etag.cjs.map +1 -0
- package/dist/cjs/middleware/etag.d.cts +3 -0
- package/dist/cjs/middleware/jwk.cjs +25 -0
- package/dist/cjs/middleware/jwk.cjs.map +1 -0
- package/dist/cjs/middleware/jwk.d.cts +15 -0
- package/dist/cjs/middleware/jwt.cjs +16 -0
- package/dist/cjs/middleware/jwt.cjs.map +1 -0
- package/dist/cjs/middleware/jwt.d.cts +10 -0
- package/dist/cjs/middleware/secure-headers.cjs +12 -0
- package/dist/cjs/middleware/secure-headers.cjs.map +1 -0
- package/dist/cjs/middleware/secure-headers.d.cts +3 -0
- package/dist/cjs/middleware/timing.cjs +12 -0
- package/dist/cjs/middleware/timing.cjs.map +1 -0
- package/dist/cjs/middleware/timing.d.cts +3 -0
- package/dist/cjs/middleware.cjs +17 -0
- package/dist/cjs/middleware.cjs.map +1 -0
- package/dist/cjs/middleware.d.cts +2 -0
- package/dist/cjs/register.d.cts +2 -0
- package/dist/cjs/route.cjs +94 -0
- package/dist/cjs/route.cjs.map +1 -0
- package/dist/cjs/route.d.cts +5 -0
- package/dist/cjs/taser-app.cjs +42 -0
- package/dist/cjs/taser-app.cjs.map +1 -0
- package/dist/cjs/taser-app.d.cts +21 -0
- package/dist/cjs/taser-router.cjs +83 -0
- package/dist/cjs/taser-router.cjs.map +1 -0
- package/dist/cjs/taser-router.d.cts +44 -0
- package/dist/cjs/types/app.d.cts +46 -0
- package/dist/cjs/types/index.d.cts +305 -0
- package/dist/cjs/types/returns.d.cts +37 -0
- package/dist/cjs/types/schema.d.cts +14 -0
- package/dist/cjs/types/type-utils.d.cts +52 -0
- package/dist/cjs/types/units.cjs +8 -0
- package/dist/cjs/types/units.cjs.map +1 -0
- package/dist/cjs/types/units.d.cts +98 -0
- package/dist/esm/constants.d.ts +8 -0
- package/dist/esm/constants.js +16 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/create-context.d.ts +5 -0
- package/dist/esm/create-context.js +8 -0
- package/dist/esm/create-context.js.map +1 -0
- package/dist/esm/define/handler.d.ts +13 -0
- package/dist/esm/define/handler.js +38 -0
- package/dist/esm/define/handler.js.map +1 -0
- package/dist/esm/define/middleware.d.ts +85 -0
- package/dist/esm/define/middleware.js +36 -0
- package/dist/esm/define/middleware.js.map +1 -0
- package/dist/esm/define/validators.d.ts +8 -0
- package/dist/esm/define/validators.js +14 -0
- package/dist/esm/define/validators.js.map +1 -0
- package/dist/esm/factories.d.ts +61 -0
- package/dist/esm/factories.js +21 -0
- package/dist/esm/factories.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/middleware/auth.d.ts +9 -0
- package/dist/esm/middleware/auth.js +33 -0
- package/dist/esm/middleware/auth.js.map +1 -0
- package/dist/esm/middleware/body-limit.d.ts +3 -0
- package/dist/esm/middleware/body-limit.js +11 -0
- package/dist/esm/middleware/body-limit.js.map +1 -0
- package/dist/esm/middleware/compress.d.ts +3 -0
- package/dist/esm/middleware/compress.js +11 -0
- package/dist/esm/middleware/compress.js.map +1 -0
- package/dist/esm/middleware/cors.d.ts +3 -0
- package/dist/esm/middleware/cors.js +11 -0
- package/dist/esm/middleware/cors.js.map +1 -0
- package/dist/esm/middleware/csrf.d.ts +3 -0
- package/dist/esm/middleware/csrf.js +11 -0
- package/dist/esm/middleware/csrf.js.map +1 -0
- package/dist/esm/middleware/etag.d.ts +3 -0
- package/dist/esm/middleware/etag.js +11 -0
- package/dist/esm/middleware/etag.js.map +1 -0
- package/dist/esm/middleware/jwk.d.ts +15 -0
- package/dist/esm/middleware/jwk.js +24 -0
- package/dist/esm/middleware/jwk.js.map +1 -0
- package/dist/esm/middleware/jwt.d.ts +10 -0
- package/dist/esm/middleware/jwt.js +15 -0
- package/dist/esm/middleware/jwt.js.map +1 -0
- package/dist/esm/middleware/secure-headers.d.ts +3 -0
- package/dist/esm/middleware/secure-headers.js +11 -0
- package/dist/esm/middleware/secure-headers.js.map +1 -0
- package/dist/esm/middleware/timing.d.ts +3 -0
- package/dist/esm/middleware/timing.js +11 -0
- package/dist/esm/middleware/timing.js.map +1 -0
- package/dist/esm/middleware.d.ts +2 -0
- package/dist/esm/middleware.js +17 -0
- package/dist/esm/middleware.js.map +1 -0
- package/dist/esm/register.d.ts +2 -0
- package/dist/esm/route.d.ts +5 -0
- package/dist/esm/route.js +94 -0
- package/dist/esm/route.js.map +1 -0
- package/dist/esm/taser-app.d.ts +21 -0
- package/dist/esm/taser-app.js +40 -0
- package/dist/esm/taser-app.js.map +1 -0
- package/dist/esm/taser-router.d.ts +44 -0
- package/dist/esm/taser-router.js +82 -0
- package/dist/esm/taser-router.js.map +1 -0
- package/dist/esm/types/app.d.ts +46 -0
- package/dist/esm/types/index.d.ts +305 -0
- package/dist/esm/types/returns.d.ts +37 -0
- package/dist/esm/types/schema.d.ts +14 -0
- package/dist/esm/types/type-utils.d.ts +52 -0
- package/dist/esm/types/units.d.ts +98 -0
- package/dist/esm/types/units.js +8 -0
- package/dist/esm/types/units.js.map +1 -0
- package/package.json +149 -0
- package/src/constants.ts +10 -0
- package/src/create-context.ts +19 -0
- package/src/define/handler.ts +72 -0
- package/src/define/middleware.ts +289 -0
- package/src/define/validators.ts +22 -0
- package/src/factories.ts +183 -0
- package/src/index.ts +44 -0
- package/src/middleware/auth.ts +51 -0
- package/src/middleware/body-limit.ts +11 -0
- package/src/middleware/compress.ts +11 -0
- package/src/middleware/cors.ts +11 -0
- package/src/middleware/csrf.ts +11 -0
- package/src/middleware/etag.ts +11 -0
- package/src/middleware/jwk.ts +47 -0
- package/src/middleware/jwt.ts +18 -0
- package/src/middleware/secure-headers.ts +11 -0
- package/src/middleware/timing.ts +11 -0
- package/src/middleware.ts +19 -0
- package/src/register.ts +1 -0
- package/src/route.ts +145 -0
- package/src/taser-app.ts +43 -0
- package/src/taser-router.ts +160 -0
- package/src/types/app.ts +65 -0
- package/src/types/index.ts +1064 -0
- package/src/types/returns.ts +135 -0
- package/src/types/schema.ts +22 -0
- package/src/types/type-utils.ts +86 -0
- 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
|
+
}
|