@stacksjs/bun-router 0.0.2
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.md +21 -0
- package/README.md +397 -0
- package/bin/cli.ts +9 -0
- package/dist/auth.d.ts +77 -0
- package/dist/cache/lru-cache.d.ts +88 -0
- package/dist/cache/middleware-memoization.d.ts +101 -0
- package/dist/cache/route-cache-warmer.d.ts +125 -0
- package/dist/cache/sqlite-cache.d.ts +114 -0
- package/dist/cache/streaming-cache.d.ts +86 -0
- package/dist/chunk-r15a48wc.js +25448 -0
- package/dist/cli/colors.d.ts +12 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/middleware.d.ts +31 -0
- package/dist/cli/openapi.d.ts +17 -0
- package/dist/cli/router.d.ts +15 -0
- package/dist/cli/routes.d.ts +30 -0
- package/dist/cli/utils.d.ts +68 -0
- package/dist/cli.d.ts +0 -0
- package/dist/cli.js +3195 -0
- package/dist/config.d.ts +274 -0
- package/dist/container/container.d.ts +141 -0
- package/dist/container/contextual-binding.d.ts +112 -0
- package/dist/container/decorators.d.ts +114 -0
- package/dist/container/service-provider.d.ts +221 -0
- package/dist/development/hot-reload.d.ts +129 -0
- package/dist/development/index.d.ts +144 -0
- package/dist/development/performance-profiler.d.ts +152 -0
- package/dist/development/route-debugger.d.ts +102 -0
- package/dist/development/route-inspector.d.ts +142 -0
- package/dist/development/typescript-utilities.d.ts +116 -0
- package/dist/docs.d.ts +10 -0
- package/dist/errors/circuit-breaker.d.ts +138 -0
- package/dist/errors/error-handler.d.ts +57 -0
- package/dist/errors/error-reporting.d.ts +135 -0
- package/dist/errors/exceptions.d.ts +178 -0
- package/dist/errors/graceful-degradation.d.ts +130 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/router-errors.d.ts +97 -0
- package/dist/file-serving/static-files.d.ts +98 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +13417 -0
- package/dist/middleware/auth.d.ts +34 -0
- package/dist/middleware/content_security_policy.d.ts +54 -0
- package/dist/middleware/cors.d.ts +5 -0
- package/dist/middleware/csrf.d.ts +7 -0
- package/dist/middleware/ddos_protection.d.ts +47 -0
- package/dist/middleware/file_security.d.ts +23 -0
- package/dist/middleware/file_upload.d.ts +41 -0
- package/dist/middleware/helmet.d.ts +54 -0
- package/dist/middleware/index.d.ts +55 -0
- package/dist/middleware/input_validation.d.ts +46 -0
- package/dist/middleware/json_body.d.ts +4 -0
- package/dist/middleware/performance_alerting.d.ts +88 -0
- package/dist/middleware/performance_dashboard.d.ts +97 -0
- package/dist/middleware/performance_monitor.d.ts +236 -0
- package/dist/middleware/pipeline.d.ts +90 -0
- package/dist/middleware/rate_limit.d.ts +33 -0
- package/dist/middleware/request_id.d.ts +4 -0
- package/dist/middleware/request_signing.d.ts +96 -0
- package/dist/middleware/request_tracer.d.ts +76 -0
- package/dist/middleware/response_cache.d.ts +90 -0
- package/dist/middleware/security.d.ts +70 -0
- package/dist/middleware/security_suite.d.ts +46 -0
- package/dist/middleware/session.d.ts +7 -0
- package/dist/model-binding/index.d.ts +17 -0
- package/dist/model-binding/model-middleware.d.ts +80 -0
- package/dist/model-binding/model-registry.d.ts +125 -0
- package/dist/model-binding.d.ts +123 -0
- package/dist/model-resolver-factory.d.ts +31 -0
- package/dist/observability/correlation.d.ts +131 -0
- package/dist/observability/health-checks.d.ts +129 -0
- package/dist/observability/index.d.ts +92 -0
- package/dist/observability/integration.d.ts +112 -0
- package/dist/observability/metrics.d.ts +135 -0
- package/dist/observability/tracing.d.ts +112 -0
- package/dist/optimization/bun-utilities.d.ts +106 -0
- package/dist/query-builder-integration.d.ts +24 -0
- package/dist/request/enhanced-request.d.ts +143 -0
- package/dist/request/macros.d.ts +267 -0
- package/dist/response/macros.d.ts +207 -0
- package/dist/response/response-factory.d.ts +93 -0
- package/dist/router/file-based-routing.d.ts +40 -0
- package/dist/router/file-streaming.d.ts +6 -0
- package/dist/router/fluent-router.d.ts +179 -0
- package/dist/router/fluent-routing.d.ts +198 -0
- package/dist/router/group-organization.d.ts +5 -0
- package/dist/router/handler-resolver.d.ts +13 -0
- package/dist/router/http-methods.d.ts +10 -0
- package/dist/router/index.d.ts +114 -0
- package/dist/router/middleware-integration.d.ts +86 -0
- package/dist/router/middleware.d.ts +5 -0
- package/dist/router/model-binding.d.ts +7 -0
- package/dist/router/optimized-route-matching.d.ts +6 -0
- package/dist/router/route-building.d.ts +5 -0
- package/dist/router/route-compiler.d.ts +67 -0
- package/dist/router/route-matching.d.ts +5 -0
- package/dist/router/route-trie.d.ts +69 -0
- package/dist/router/router.d.ts +133 -0
- package/dist/router/server.d.ts +5 -0
- package/dist/router/validation-integration.d.ts +116 -0
- package/dist/router/view-rendering.d.ts +5 -0
- package/dist/router/websocket.d.ts +5 -0
- package/dist/routing/route-caching.d.ts +105 -0
- package/dist/routing/route-throttling.d.ts +112 -0
- package/dist/routing/subdomain-routing.d.ts +159 -0
- package/dist/streaming/index.d.ts +15 -0
- package/dist/streaming/sse-handler.d.ts +81 -0
- package/dist/streaming/stream-handler.d.ts +81 -0
- package/dist/testing/auth-testing.d.ts +107 -0
- package/dist/testing/file-upload-testing.d.ts +139 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/middleware-testing.d.ts +99 -0
- package/dist/testing/model-binding-testing.d.ts +132 -0
- package/dist/testing/performance-testing.d.ts +202 -0
- package/dist/testing/test-client.d.ts +58 -0
- package/dist/testing/test-request.d.ts +43 -0
- package/dist/testing/test-response.d.ts +45 -0
- package/dist/testing/types.d.ts +206 -0
- package/dist/testing/websocket-testing.d.ts +170 -0
- package/dist/types/controller-types.d.ts +303 -0
- package/dist/types/core.d.ts +526 -0
- package/dist/types/middleware-types.d.ts +315 -0
- package/dist/types/request-response-augmentation.d.ts +373 -0
- package/dist/types/route-inference.d.ts +287 -0
- package/dist/types.d.ts +1620 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/query-preservation.d.ts +31 -0
- package/dist/utils.d.ts +69 -0
- package/dist/validation/validator.d.ts +169 -0
- package/dist/websocket/clustering.d.ts +114 -0
- package/package.json +81 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import type { RouteHandler, TypedRequest } from './route-inference';
|
|
2
|
+
// Base middleware interface with generic constraints
|
|
3
|
+
export declare interface TypedMiddleware<TInput = any, TOutput = TInput, _TContext = object, TNext = any> {
|
|
4
|
+
(request: TInput, next: TNext): Promise<TOutput> | TOutput
|
|
5
|
+
}
|
|
6
|
+
// Authentication middleware types
|
|
7
|
+
export declare interface AuthenticatedRequest<TUser = any> {
|
|
8
|
+
user: TUser
|
|
9
|
+
isAuthenticated: true
|
|
10
|
+
}
|
|
11
|
+
export declare interface UnauthenticatedRequest {
|
|
12
|
+
user?: never
|
|
13
|
+
isAuthenticated: false
|
|
14
|
+
}
|
|
15
|
+
// Authorization middleware types
|
|
16
|
+
export declare interface AuthorizedRequest<TPermissions extends string = string> {
|
|
17
|
+
permissions: TPermissions[]
|
|
18
|
+
hasPermission: (permission: TPermissions) => boolean
|
|
19
|
+
}
|
|
20
|
+
// Validation middleware types
|
|
21
|
+
export declare interface ValidatedRequest<TParams = any, TQuery = any, TBody = any> {
|
|
22
|
+
validatedParams: TParams
|
|
23
|
+
validatedQuery: TQuery
|
|
24
|
+
validatedBody: TBody
|
|
25
|
+
}
|
|
26
|
+
// Rate limiting middleware types
|
|
27
|
+
export declare interface RateLimitedRequest {
|
|
28
|
+
rateLimit: {
|
|
29
|
+
remaining: number
|
|
30
|
+
reset: Date
|
|
31
|
+
limit: number
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Caching middleware types
|
|
35
|
+
export declare interface CachedRequest {
|
|
36
|
+
cache: {
|
|
37
|
+
key: string
|
|
38
|
+
ttl: number
|
|
39
|
+
hit: boolean
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Logging middleware types
|
|
43
|
+
export declare interface LoggedRequest {
|
|
44
|
+
requestId: string
|
|
45
|
+
startTime: number
|
|
46
|
+
logger: {
|
|
47
|
+
info: (message: string, meta?: any) => void
|
|
48
|
+
warn: (message: string, meta?: any) => void
|
|
49
|
+
error: (message: string, meta?: any) => void
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// CORS middleware types
|
|
53
|
+
export declare interface CORSRequest {
|
|
54
|
+
cors: {
|
|
55
|
+
origin: string
|
|
56
|
+
methods: string[]
|
|
57
|
+
headers: string[]
|
|
58
|
+
credentials: boolean
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// File upload middleware types
|
|
62
|
+
export declare interface FileUploadRequest<TFiles extends Record<string, any> = Record<string, File>> {
|
|
63
|
+
files: TFiles
|
|
64
|
+
formData: FormData
|
|
65
|
+
}
|
|
66
|
+
// Session middleware types
|
|
67
|
+
export declare interface SessionRequest<TSession = any> {
|
|
68
|
+
session: TSession & {
|
|
69
|
+
id: string
|
|
70
|
+
save: () => Promise<void>
|
|
71
|
+
destroy: () => Promise<void>
|
|
72
|
+
regenerate: () => Promise<void>
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Middleware factory types
|
|
76
|
+
export declare interface MiddlewareFactory<TOptions = any, TMiddleware extends TypedMiddleware<any, any, any, any> = any> {
|
|
77
|
+
(options?: TOptions): TMiddleware
|
|
78
|
+
}
|
|
79
|
+
// Middleware group types
|
|
80
|
+
export declare interface MiddlewareGroup<TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[]> {
|
|
81
|
+
middlewares: TMiddlewares
|
|
82
|
+
compose: () => MiddlewareChain<TMiddlewares>
|
|
83
|
+
}
|
|
84
|
+
// Error handling middleware types
|
|
85
|
+
export declare interface ErrorHandlingRequest {
|
|
86
|
+
error?: Error
|
|
87
|
+
errorHandled: boolean
|
|
88
|
+
}
|
|
89
|
+
// Middleware pipeline types
|
|
90
|
+
export declare interface MiddlewarePipeline<T extends readonly TypedMiddleware<any, any, any, any>[]> {
|
|
91
|
+
middlewares: T
|
|
92
|
+
execute: <TRequest>(request: TRequest) => Promise<
|
|
93
|
+
T extends readonly []
|
|
94
|
+
? TRequest
|
|
95
|
+
: MiddlewareChain<T> extends TypedMiddleware<TRequest, infer Output, any, any>
|
|
96
|
+
? Output
|
|
97
|
+
: never
|
|
98
|
+
>
|
|
99
|
+
}
|
|
100
|
+
// Advanced middleware constraints
|
|
101
|
+
export declare interface MiddlewareConstraint<T> {
|
|
102
|
+
input: T extends TypedMiddleware<infer Input, any, any, any> ? Input : never
|
|
103
|
+
output: T extends TypedMiddleware<any, infer Output, any, any> ? Output : never
|
|
104
|
+
context: T extends TypedMiddleware<any, any, infer Context, any> ? Context : never
|
|
105
|
+
}
|
|
106
|
+
// Middleware builder interface
|
|
107
|
+
export declare interface MiddlewareBuilder<TContext = object> {
|
|
108
|
+
use: <TNewContext>(
|
|
109
|
+
middleware: TypedMiddleware<any, any, TNewContext, any>
|
|
110
|
+
) => MiddlewareBuilder<TContext & TNewContext>
|
|
111
|
+
auth: <TUser>(
|
|
112
|
+
middleware: AuthMiddleware<TUser>
|
|
113
|
+
) => MiddlewareBuilder<TContext & { auth: { user: TUser } }>
|
|
114
|
+
validate: <TParams, TQuery, TBody>(
|
|
115
|
+
middleware: ValidationMiddleware<TParams, TQuery, TBody>
|
|
116
|
+
) => MiddlewareBuilder<TContext & { validation: { params: TParams, query: TQuery, body: TBody } }>
|
|
117
|
+
rateLimit: (
|
|
118
|
+
middleware: RateLimitMiddleware
|
|
119
|
+
) => MiddlewareBuilder<TContext & { rateLimit: RateLimitedRequest['rateLimit'] }>
|
|
120
|
+
cache: (
|
|
121
|
+
middleware: CacheMiddleware
|
|
122
|
+
) => MiddlewareBuilder<TContext & { cache: CachedRequest['cache'] }>
|
|
123
|
+
cors: (
|
|
124
|
+
middleware: CORSMiddleware
|
|
125
|
+
) => MiddlewareBuilder<TContext & { cors: CORSRequest['cors'] }>
|
|
126
|
+
session: <TSession>(
|
|
127
|
+
middleware: SessionMiddleware<TSession>
|
|
128
|
+
) => MiddlewareBuilder<TContext & { session: SessionRequest<TSession>['session'] }>
|
|
129
|
+
build: () => TypedMiddleware<Request, Request & TContext, TContext, any>[]
|
|
130
|
+
}
|
|
131
|
+
// Middleware execution context
|
|
132
|
+
export declare interface MiddlewareExecutionContext<TContext = object> {
|
|
133
|
+
request: Request
|
|
134
|
+
response?: Response
|
|
135
|
+
context: TContext
|
|
136
|
+
next: () => Promise<Response>
|
|
137
|
+
skip: () => void
|
|
138
|
+
abort: (response: Response) => void
|
|
139
|
+
}
|
|
140
|
+
// Middleware hooks
|
|
141
|
+
export declare interface MiddlewareHooks<TContext = object> {
|
|
142
|
+
beforeExecution?: (context: MiddlewareExecutionContext<TContext>) => Promise<void> | void
|
|
143
|
+
afterExecution?: (context: MiddlewareExecutionContext<TContext>, result: any) => Promise<void> | void
|
|
144
|
+
onError?: (context: MiddlewareExecutionContext<TContext>, error: Error) => Promise<Response> | Response
|
|
145
|
+
}
|
|
146
|
+
// Middleware metadata
|
|
147
|
+
export declare interface MiddlewareMetadata {
|
|
148
|
+
name: string
|
|
149
|
+
version?: string
|
|
150
|
+
description?: string
|
|
151
|
+
dependencies?: string[]
|
|
152
|
+
tags?: string[]
|
|
153
|
+
priority?: number
|
|
154
|
+
}
|
|
155
|
+
// Decorated middleware
|
|
156
|
+
export declare interface DecoratedMiddleware<TInput = any, TOutput = TInput, TContext = object, TNext = any> extends TypedMiddleware<TInput, TOutput, TContext, TNext> {
|
|
157
|
+
metadata: MiddlewareMetadata
|
|
158
|
+
}
|
|
159
|
+
// Middleware registry
|
|
160
|
+
export declare interface MiddlewareRegistry {
|
|
161
|
+
register: <T extends TypedMiddleware<any, any, any, any>>(
|
|
162
|
+
name: string,
|
|
163
|
+
middleware: T,
|
|
164
|
+
metadata?: Partial<MiddlewareMetadata>
|
|
165
|
+
) => void
|
|
166
|
+
get: <T extends TypedMiddleware<any, any, any, any>>(name: string) => T | undefined
|
|
167
|
+
list: () => Array<{ name: string, middleware: TypedMiddleware<any, any, any, any>, metadata: MiddlewareMetadata }>
|
|
168
|
+
resolve: (dependencies: string[]) => TypedMiddleware<any, any, any, any>[]
|
|
169
|
+
}
|
|
170
|
+
// Middleware performance tracking
|
|
171
|
+
export declare interface MiddlewarePerformance {
|
|
172
|
+
name: string
|
|
173
|
+
executionTime: number
|
|
174
|
+
memoryUsage: number
|
|
175
|
+
callCount: number
|
|
176
|
+
errorCount: number
|
|
177
|
+
}
|
|
178
|
+
// Middleware context augmentation
|
|
179
|
+
export type AugmentContext<TBase, TAddition> = TBase & TAddition
|
|
180
|
+
// Request augmentation through middleware
|
|
181
|
+
export type AugmentRequest<TRequest, TAugmentation> = TRequest & TAugmentation
|
|
182
|
+
// Middleware chain type inference
|
|
183
|
+
export type MiddlewareChain<T extends readonly any[]> = T extends readonly [
|
|
184
|
+
infer First,
|
|
185
|
+
...infer Rest,
|
|
186
|
+
]
|
|
187
|
+
? First extends TypedMiddleware<infer Input, infer Output, infer Context, any>
|
|
188
|
+
? Rest extends readonly []
|
|
189
|
+
? TypedMiddleware<Input, Output, Context, any>
|
|
190
|
+
: Rest extends readonly TypedMiddleware<Output, any, any, any>[]
|
|
191
|
+
? MiddlewareChain<Rest> extends TypedMiddleware<Output, infer FinalOutput, infer RestContext, any>
|
|
192
|
+
? TypedMiddleware<Input, FinalOutput, Context & RestContext, any>
|
|
193
|
+
: never
|
|
194
|
+
: never
|
|
195
|
+
: never
|
|
196
|
+
: never
|
|
197
|
+
// Middleware composition types
|
|
198
|
+
export type ComposeMiddleware<TFirst extends TypedMiddleware<any, any, any, any>, TSecond extends TypedMiddleware<any, any, any, any>> = TFirst extends TypedMiddleware<infer Input1, infer Output1, infer Context1, any>
|
|
199
|
+
? TSecond extends TypedMiddleware<Output1, infer Output2, infer Context2, any>
|
|
200
|
+
? TypedMiddleware<Input1, Output2, Context1 & Context2, any>
|
|
201
|
+
: never
|
|
202
|
+
: never
|
|
203
|
+
export type AuthMiddleware<TUser = any> = TypedMiddleware<
|
|
204
|
+
Request,
|
|
205
|
+
Request & AuthenticatedRequest<TUser>,
|
|
206
|
+
{ auth: { user: TUser } },
|
|
207
|
+
any
|
|
208
|
+
>
|
|
209
|
+
export type AuthzMiddleware<TPermissions extends string = string> = TypedMiddleware<
|
|
210
|
+
Request & AuthenticatedRequest,
|
|
211
|
+
Request & AuthenticatedRequest & AuthorizedRequest<TPermissions>,
|
|
212
|
+
{ authz: { permissions: TPermissions[] } },
|
|
213
|
+
any
|
|
214
|
+
>
|
|
215
|
+
export type ValidationMiddleware<TParams = any, TQuery = any, TBody = any> = TypedMiddleware<
|
|
216
|
+
Request,
|
|
217
|
+
Request & ValidatedRequest<TParams, TQuery, TBody>,
|
|
218
|
+
{ validation: { params: TParams, query: TQuery, body: TBody } },
|
|
219
|
+
any
|
|
220
|
+
>
|
|
221
|
+
export type RateLimitMiddleware = TypedMiddleware<
|
|
222
|
+
Request,
|
|
223
|
+
Request & RateLimitedRequest,
|
|
224
|
+
{ rateLimit: RateLimitedRequest['rateLimit'] },
|
|
225
|
+
any
|
|
226
|
+
>
|
|
227
|
+
export type CacheMiddleware = TypedMiddleware<
|
|
228
|
+
Request,
|
|
229
|
+
Request & CachedRequest,
|
|
230
|
+
{ cache: CachedRequest['cache'] },
|
|
231
|
+
any
|
|
232
|
+
>
|
|
233
|
+
export type LoggingMiddleware = TypedMiddleware<
|
|
234
|
+
Request,
|
|
235
|
+
Request & LoggedRequest,
|
|
236
|
+
{ logging: { requestId: string, logger: LoggedRequest['logger'] } },
|
|
237
|
+
any
|
|
238
|
+
>
|
|
239
|
+
export type CORSMiddleware = TypedMiddleware<
|
|
240
|
+
Request,
|
|
241
|
+
Request & CORSRequest,
|
|
242
|
+
{ cors: CORSRequest['cors'] },
|
|
243
|
+
any
|
|
244
|
+
>
|
|
245
|
+
export type FileUploadMiddleware<TFiles extends Record<string, any> = Record<string, File>> = TypedMiddleware<
|
|
246
|
+
Request,
|
|
247
|
+
Request & FileUploadRequest<TFiles>,
|
|
248
|
+
{ upload: { files: TFiles } },
|
|
249
|
+
any
|
|
250
|
+
>
|
|
251
|
+
export type SessionMiddleware<TSession = any> = TypedMiddleware<
|
|
252
|
+
Request,
|
|
253
|
+
Request & SessionRequest<TSession>,
|
|
254
|
+
{ session: SessionRequest<TSession>['session'] },
|
|
255
|
+
any
|
|
256
|
+
>
|
|
257
|
+
// Conditional middleware types
|
|
258
|
+
export type ConditionalMiddleware<_TCondition extends (req: any) => boolean, TMiddleware extends TypedMiddleware<any, any, any, any>> = TypedMiddleware<
|
|
259
|
+
Parameters<TMiddleware>[0],
|
|
260
|
+
TMiddleware extends TypedMiddleware<any, infer Output, any, any> ? Output : never,
|
|
261
|
+
TMiddleware extends TypedMiddleware<any, any, infer Context, any> ? Context : object,
|
|
262
|
+
any
|
|
263
|
+
>
|
|
264
|
+
export type ErrorMiddleware = TypedMiddleware<
|
|
265
|
+
Request & { error: Error },
|
|
266
|
+
Response,
|
|
267
|
+
{ error: { handled: boolean } },
|
|
268
|
+
any
|
|
269
|
+
>
|
|
270
|
+
// Middleware compatibility checking
|
|
271
|
+
export type MiddlewareCompatible<TFirst extends TypedMiddleware<any, any, any, any>, TSecond extends TypedMiddleware<any, any, any, any>> = MiddlewareConstraint<TFirst>['output'] extends MiddlewareConstraint<TSecond>['input']
|
|
272
|
+
? true
|
|
273
|
+
: false
|
|
274
|
+
// Route-specific middleware types
|
|
275
|
+
export type RouteMiddleware<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object> = TypedMiddleware<
|
|
276
|
+
TypedRequest<TPath, TQuery, TBody, TContext>,
|
|
277
|
+
TypedRequest<TPath, TQuery, TBody, TContext>,
|
|
278
|
+
TContext,
|
|
279
|
+
RouteHandler<TPath, TQuery, TBody, TContext>
|
|
280
|
+
>
|
|
281
|
+
// Async middleware types
|
|
282
|
+
export type AsyncMiddleware<TInput = any, TOutput = TInput, TContext = object, TNext = any> = TypedMiddleware<TInput, Promise<TOutput>, TContext, TNext>
|
|
283
|
+
// Middleware composition utilities
|
|
284
|
+
export type Compose<T extends readonly TypedMiddleware<any, any, any, any>[]> = T extends readonly [infer First, ...infer Rest]
|
|
285
|
+
? First extends TypedMiddleware<infer Input, infer Output, infer Context, any>
|
|
286
|
+
? Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
287
|
+
? Rest extends readonly []
|
|
288
|
+
? TypedMiddleware<Input, Output, Context, any>
|
|
289
|
+
: Compose<Rest> extends TypedMiddleware<Output, infer FinalOutput, infer RestContext, any>
|
|
290
|
+
? TypedMiddleware<Input, FinalOutput, Context & RestContext, any>
|
|
291
|
+
: never
|
|
292
|
+
: never
|
|
293
|
+
: never
|
|
294
|
+
: TypedMiddleware<any, any, object, any>
|
|
295
|
+
// Middleware type guards
|
|
296
|
+
export type IsMiddleware<T> = T extends TypedMiddleware<any, any, any, any> ? true : false
|
|
297
|
+
export type IsCompatibleMiddleware<T1, T2> = T1 extends TypedMiddleware<any, infer Output1, any, any>
|
|
298
|
+
? T2 extends TypedMiddleware<Output1, any, any, any>
|
|
299
|
+
? true
|
|
300
|
+
: false
|
|
301
|
+
: false
|
|
302
|
+
// Middleware transformation types
|
|
303
|
+
export type TransformMiddleware<TMiddleware extends TypedMiddleware<any, any, any, any>, TNewInput, TNewOutput = TNewInput> = TMiddleware extends TypedMiddleware<any, any, infer Context, any>
|
|
304
|
+
? TypedMiddleware<TNewInput, TNewOutput, Context, any>
|
|
305
|
+
: never
|
|
306
|
+
// Route-aware middleware
|
|
307
|
+
export type RouteAwareMiddleware<TRoutes extends Record<string, any> = object> = {
|
|
308
|
+
[K in keyof TRoutes]: TRoutes[K] extends RouteHandler<infer Path, infer Query, infer Body, infer Context>
|
|
309
|
+
? RouteMiddleware<Path, Query, Body, Context>
|
|
310
|
+
: never
|
|
311
|
+
}
|
|
312
|
+
export type PerformanceTrackingMiddleware<T extends TypedMiddleware<any, any, any, any>> = T & {
|
|
313
|
+
getPerformanceMetrics: () => MiddlewarePerformance
|
|
314
|
+
resetMetrics: () => void
|
|
315
|
+
}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import type { AuthenticatedRequest, AuthorizedRequest, CachedRequest, CORSRequest, FileUploadRequest, LoggedRequest, RateLimitedRequest, SessionRequest, TypedMiddleware, ValidatedRequest, } from './middleware-types';
|
|
2
|
+
import type { ExtractQueryParams, ExtractTypedParams, TypedRequest, } from './route-inference';
|
|
3
|
+
// Base augmentation interface
|
|
4
|
+
export declare interface RequestAugmentation {
|
|
5
|
+
|
|
6
|
+
}
|
|
7
|
+
export declare interface ResponseAugmentation {
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
// Enhanced response with middleware augmentations
|
|
11
|
+
export declare interface EnhancedResponse<TAugmentations = object> extends Response {
|
|
12
|
+
cached?: TAugmentations extends { cache: any }
|
|
13
|
+
? boolean
|
|
14
|
+
: never
|
|
15
|
+
rateLimited?: TAugmentations extends { rateLimit: any }
|
|
16
|
+
? boolean
|
|
17
|
+
: never
|
|
18
|
+
requestId?: TAugmentations extends { logging: any }
|
|
19
|
+
? string
|
|
20
|
+
: never
|
|
21
|
+
executionTime?: TAugmentations extends { logging: any }
|
|
22
|
+
? number
|
|
23
|
+
: never
|
|
24
|
+
}
|
|
25
|
+
// Augmentation builder
|
|
26
|
+
export declare interface AugmentationBuilder<TBase = Request> {
|
|
27
|
+
withAuth: <TUser>(
|
|
28
|
+
middleware: TypedMiddleware<any, any, { auth: { user: TUser } }, any>
|
|
29
|
+
) => AugmentationBuilder<TBase & AuthenticatedRequest<TUser>>
|
|
30
|
+
withValidation: <TParams, TQuery, TBody>(
|
|
31
|
+
middleware: TypedMiddleware<any, any, { validation: { params: TParams, query: TQuery, body: TBody } }, any>
|
|
32
|
+
) => AugmentationBuilder<TBase & ValidatedRequest<TParams, TQuery, TBody>>
|
|
33
|
+
withRateLimit: (
|
|
34
|
+
middleware: TypedMiddleware<any, any, { rateLimit: RateLimitedRequest['rateLimit'] }, any>
|
|
35
|
+
) => AugmentationBuilder<TBase & RateLimitedRequest>
|
|
36
|
+
withCache: (
|
|
37
|
+
middleware: TypedMiddleware<any, any, { cache: CachedRequest['cache'] }, any>
|
|
38
|
+
) => AugmentationBuilder<TBase & CachedRequest>
|
|
39
|
+
withLogging: (
|
|
40
|
+
middleware: TypedMiddleware<any, any, { logging: { requestId: string, logger: LoggedRequest['logger'] } }, any>
|
|
41
|
+
) => AugmentationBuilder<TBase & LoggedRequest>
|
|
42
|
+
withCORS: (
|
|
43
|
+
middleware: TypedMiddleware<any, any, { cors: CORSRequest['cors'] }, any>
|
|
44
|
+
) => AugmentationBuilder<TBase & CORSRequest>
|
|
45
|
+
withFileUpload: <TFiles extends Record<string, any>>(
|
|
46
|
+
middleware: TypedMiddleware<any, any, { upload: { files: TFiles } }, any>
|
|
47
|
+
) => AugmentationBuilder<TBase & FileUploadRequest<TFiles>>
|
|
48
|
+
withSession: <TSession>(
|
|
49
|
+
middleware: TypedMiddleware<any, any, { session: SessionRequest<TSession>['session'] }, any>
|
|
50
|
+
) => AugmentationBuilder<TBase & SessionRequest<TSession>>
|
|
51
|
+
build: () => TBase
|
|
52
|
+
}
|
|
53
|
+
// Route with augmented types
|
|
54
|
+
export declare interface AugmentedRoute<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object, TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = []> {
|
|
55
|
+
method: string
|
|
56
|
+
path: TPath
|
|
57
|
+
handler: AugmentedRouteHandler<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
58
|
+
middleware: TMiddlewares
|
|
59
|
+
augmentedRequest: EnhancedRequest<TPath, TQuery, TBody, TContext, AccumulateContext<TMiddlewares>>
|
|
60
|
+
augmentedResponse: EnhancedResponse<AccumulateContext<TMiddlewares>>
|
|
61
|
+
}
|
|
62
|
+
// Type-safe route builder with augmentation
|
|
63
|
+
export declare interface AugmentedRouteBuilder<TContext = object> {
|
|
64
|
+
get: <
|
|
65
|
+
TPath extends string,
|
|
66
|
+
TQuery extends Record<string, any> = object,
|
|
67
|
+
TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = [],
|
|
68
|
+
>(
|
|
69
|
+
path: TPath,
|
|
70
|
+
middleware: TMiddlewares,
|
|
71
|
+
handler: AugmentedRouteHandler<TPath, TQuery, never, TContext, TMiddlewares>
|
|
72
|
+
) => AugmentedRoute<TPath, TQuery, never, TContext, TMiddlewares>
|
|
73
|
+
post: <
|
|
74
|
+
TPath extends string,
|
|
75
|
+
TQuery extends Record<string, any> = object,
|
|
76
|
+
TBody = unknown,
|
|
77
|
+
TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = [],
|
|
78
|
+
>(
|
|
79
|
+
path: TPath,
|
|
80
|
+
middleware: TMiddlewares,
|
|
81
|
+
handler: AugmentedRouteHandler<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
82
|
+
) => AugmentedRoute<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
83
|
+
put: <
|
|
84
|
+
TPath extends string,
|
|
85
|
+
TQuery extends Record<string, any> = object,
|
|
86
|
+
TBody = unknown,
|
|
87
|
+
TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = [],
|
|
88
|
+
>(
|
|
89
|
+
path: TPath,
|
|
90
|
+
middleware: TMiddlewares,
|
|
91
|
+
handler: AugmentedRouteHandler<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
92
|
+
) => AugmentedRoute<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
93
|
+
patch: <
|
|
94
|
+
TPath extends string,
|
|
95
|
+
TQuery extends Record<string, any> = object,
|
|
96
|
+
TBody = unknown,
|
|
97
|
+
TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = [],
|
|
98
|
+
>(
|
|
99
|
+
path: TPath,
|
|
100
|
+
middleware: TMiddlewares,
|
|
101
|
+
handler: AugmentedRouteHandler<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
102
|
+
) => AugmentedRoute<TPath, TQuery, TBody, TContext, TMiddlewares>
|
|
103
|
+
delete: <
|
|
104
|
+
TPath extends string,
|
|
105
|
+
TQuery extends Record<string, any> = object,
|
|
106
|
+
TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = [],
|
|
107
|
+
>(
|
|
108
|
+
path: TPath,
|
|
109
|
+
middleware: TMiddlewares,
|
|
110
|
+
handler: AugmentedRouteHandler<TPath, TQuery, never, TContext, TMiddlewares>
|
|
111
|
+
) => AugmentedRoute<TPath, TQuery, never, TContext, TMiddlewares>
|
|
112
|
+
}
|
|
113
|
+
// Runtime augmentation helpers
|
|
114
|
+
export declare interface RuntimeAugmentation {
|
|
115
|
+
augmentRequest: <T>(request: Request, augmentation: T) => Request & T
|
|
116
|
+
extractAugmentation: <T>(request: Request & T) => T
|
|
117
|
+
hasAugmentation: <T>(request: Request, key: keyof T) => boolean
|
|
118
|
+
getAugmentation: <T, K extends keyof T>(request: Request & T, key: K) => T[K]
|
|
119
|
+
}
|
|
120
|
+
// Augmentation metadata
|
|
121
|
+
export declare interface AugmentationMetadata {
|
|
122
|
+
name: string
|
|
123
|
+
version?: string
|
|
124
|
+
description?: string
|
|
125
|
+
dependencies?: string[]
|
|
126
|
+
provides: string[]
|
|
127
|
+
requires?: string[]
|
|
128
|
+
}
|
|
129
|
+
// Augmentation registry
|
|
130
|
+
export declare interface AugmentationRegistry {
|
|
131
|
+
register: (
|
|
132
|
+
name: string,
|
|
133
|
+
middleware: TypedMiddleware<any, any, any, any>,
|
|
134
|
+
metadata: AugmentationMetadata
|
|
135
|
+
) => void
|
|
136
|
+
get: (name: string) => {
|
|
137
|
+
middleware: TypedMiddleware<any, any, any, any>
|
|
138
|
+
metadata: AugmentationMetadata
|
|
139
|
+
} | undefined
|
|
140
|
+
resolve: (requirements: string[]) => TypedMiddleware<any, any, any, any>[]
|
|
141
|
+
validate: (middlewares: TypedMiddleware<any, any, any, any>[]) => {
|
|
142
|
+
valid: boolean
|
|
143
|
+
errors: string[]
|
|
144
|
+
warnings: string[]
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Middleware augmentation extraction
|
|
148
|
+
export type ExtractMiddlewareAugmentation<T> = T extends TypedMiddleware<infer Input, infer Output, infer Context, any>
|
|
149
|
+
? {
|
|
150
|
+
input: Input
|
|
151
|
+
output: Output
|
|
152
|
+
context: Context
|
|
153
|
+
augmentation: Output extends Input & infer Aug ? Aug : object
|
|
154
|
+
}
|
|
155
|
+
: never
|
|
156
|
+
// Request augmentation through middleware chain
|
|
157
|
+
export type AugmentRequestThroughChain<TRequest, TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[]> = TMiddlewares extends readonly [infer First, ...infer Rest]
|
|
158
|
+
? First extends TypedMiddleware<TRequest, infer Output, any, any>
|
|
159
|
+
? Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
160
|
+
? AugmentRequestThroughChain<Output, Rest>
|
|
161
|
+
: Output
|
|
162
|
+
: TRequest
|
|
163
|
+
: TRequest
|
|
164
|
+
// Context accumulation through middleware chain
|
|
165
|
+
export type AccumulateContext<TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[]> = TMiddlewares extends readonly [infer First, ...infer Rest]
|
|
166
|
+
? First extends TypedMiddleware<any, any, infer Context, any>
|
|
167
|
+
? Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
168
|
+
? Context & AccumulateContext<Rest>
|
|
169
|
+
: Context
|
|
170
|
+
: object
|
|
171
|
+
: object
|
|
172
|
+
// Enhanced request with middleware augmentations
|
|
173
|
+
export type EnhancedRequest<TPath extends string = string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object, TAugmentations = object> = TypedRequest<TPath, TQuery, TBody, TContext> & {
|
|
174
|
+
// Core request properties
|
|
175
|
+
params: ExtractTypedParams<TPath>
|
|
176
|
+
query: ExtractQueryParams<TQuery>
|
|
177
|
+
body: TBody
|
|
178
|
+
context: TContext & TAugmentations
|
|
179
|
+
|
|
180
|
+
// Middleware augmentations (conditionally added)
|
|
181
|
+
user?: TAugmentations extends { auth: any }
|
|
182
|
+
? TAugmentations['auth']['user']
|
|
183
|
+
: never
|
|
184
|
+
|
|
185
|
+
isAuthenticated?: TAugmentations extends { auth: any }
|
|
186
|
+
? boolean
|
|
187
|
+
: never
|
|
188
|
+
|
|
189
|
+
permissions?: TAugmentations extends { authz: any }
|
|
190
|
+
? TAugmentations['authz']['permissions']
|
|
191
|
+
: never
|
|
192
|
+
|
|
193
|
+
hasPermission?: TAugmentations extends { authz: any }
|
|
194
|
+
? (permission: string) => boolean
|
|
195
|
+
: never
|
|
196
|
+
|
|
197
|
+
validatedParams?: TAugmentations extends { validation: any }
|
|
198
|
+
? TAugmentations['validation']['params']
|
|
199
|
+
: never
|
|
200
|
+
|
|
201
|
+
validatedQuery?: TAugmentations extends { validation: any }
|
|
202
|
+
? TAugmentations['validation']['query']
|
|
203
|
+
: never
|
|
204
|
+
|
|
205
|
+
validatedBody?: TAugmentations extends { validation: any }
|
|
206
|
+
? TAugmentations['validation']['body']
|
|
207
|
+
: never
|
|
208
|
+
|
|
209
|
+
rateLimit?: TAugmentations extends { rateLimit: any }
|
|
210
|
+
? TAugmentations['rateLimit']
|
|
211
|
+
: never
|
|
212
|
+
|
|
213
|
+
cache?: TAugmentations extends { cache: any }
|
|
214
|
+
? TAugmentations['cache']
|
|
215
|
+
: never
|
|
216
|
+
|
|
217
|
+
requestId?: TAugmentations extends { logging: any }
|
|
218
|
+
? string
|
|
219
|
+
: never
|
|
220
|
+
|
|
221
|
+
logger?: TAugmentations extends { logging: any }
|
|
222
|
+
? TAugmentations['logging']['logger']
|
|
223
|
+
: never
|
|
224
|
+
|
|
225
|
+
cors?: TAugmentations extends { cors: any }
|
|
226
|
+
? TAugmentations['cors']
|
|
227
|
+
: never
|
|
228
|
+
|
|
229
|
+
files?: TAugmentations extends { upload: any }
|
|
230
|
+
? TAugmentations['upload']['files']
|
|
231
|
+
: never
|
|
232
|
+
|
|
233
|
+
session?: TAugmentations extends { session: any }
|
|
234
|
+
? TAugmentations['session']
|
|
235
|
+
: never
|
|
236
|
+
}
|
|
237
|
+
// Middleware-aware route handler
|
|
238
|
+
export type AugmentedRouteHandler<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object, TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[] = []> = (
|
|
239
|
+
request: EnhancedRequest<
|
|
240
|
+
TPath,
|
|
241
|
+
TQuery,
|
|
242
|
+
TBody,
|
|
243
|
+
TContext,
|
|
244
|
+
AccumulateContext<TMiddlewares>
|
|
245
|
+
>
|
|
246
|
+
) => Promise<EnhancedResponse<AccumulateContext<TMiddlewares>>> | EnhancedResponse<AccumulateContext<TMiddlewares>>
|
|
247
|
+
// Type-safe middleware application
|
|
248
|
+
export type ApplyMiddleware<TRequest, TMiddleware extends TypedMiddleware<any, any, any, any>> = TMiddleware extends TypedMiddleware<TRequest, infer Output, infer Context, any>
|
|
249
|
+
? {
|
|
250
|
+
request: Output
|
|
251
|
+
context: Context
|
|
252
|
+
}
|
|
253
|
+
: never
|
|
254
|
+
// Sequential middleware application
|
|
255
|
+
export type ApplyMiddlewareSequence<TRequest, TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[]> = TMiddlewares extends readonly [infer First, ...infer Rest]
|
|
256
|
+
? First extends TypedMiddleware<TRequest, infer Output, infer Context, any>
|
|
257
|
+
? Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
258
|
+
? ApplyMiddlewareSequence<Output, Rest> extends {
|
|
259
|
+
request: infer FinalRequest
|
|
260
|
+
context: infer RestContext
|
|
261
|
+
}
|
|
262
|
+
? {
|
|
263
|
+
request: FinalRequest
|
|
264
|
+
context: Context & RestContext
|
|
265
|
+
}
|
|
266
|
+
: {
|
|
267
|
+
request: Output
|
|
268
|
+
context: Context
|
|
269
|
+
}
|
|
270
|
+
: {
|
|
271
|
+
request: Output
|
|
272
|
+
context: Context
|
|
273
|
+
}
|
|
274
|
+
: {
|
|
275
|
+
request: TRequest
|
|
276
|
+
context: object
|
|
277
|
+
}
|
|
278
|
+
: {
|
|
279
|
+
request: TRequest
|
|
280
|
+
context: object
|
|
281
|
+
}
|
|
282
|
+
// Conditional augmentation based on middleware presence
|
|
283
|
+
export type ConditionalAugmentation<TMiddlewares extends readonly TypedMiddleware<any, any, any, any>[], TAugmentation> = TMiddlewares extends readonly []
|
|
284
|
+
? object
|
|
285
|
+
: TAugmentation
|
|
286
|
+
// Authentication augmentation
|
|
287
|
+
export type AuthAugmentation<TUser = any> = ConditionalAugmentation<
|
|
288
|
+
[TypedMiddleware<any, any, { auth: { user: TUser } }, any>],
|
|
289
|
+
AuthenticatedRequest<TUser>
|
|
290
|
+
>
|
|
291
|
+
// Authorization augmentation
|
|
292
|
+
export type AuthzAugmentation<TPermissions extends string = string> = ConditionalAugmentation<
|
|
293
|
+
[TypedMiddleware<any, any, { authz: { permissions: TPermissions[] } }, any>],
|
|
294
|
+
AuthorizedRequest<TPermissions>
|
|
295
|
+
>
|
|
296
|
+
// Validation augmentation
|
|
297
|
+
export type ValidationAugmentation<TParams = any, TQuery = any, TBody = any> = ConditionalAugmentation<
|
|
298
|
+
[TypedMiddleware<any, any, { validation: { params: TParams, query: TQuery, body: TBody } }, any>],
|
|
299
|
+
ValidatedRequest<TParams, TQuery, TBody>
|
|
300
|
+
>
|
|
301
|
+
// Rate limiting augmentation
|
|
302
|
+
export type RateLimitAugmentation = ConditionalAugmentation<
|
|
303
|
+
[TypedMiddleware<any, any, { rateLimit: RateLimitedRequest['rateLimit'] }, any>],
|
|
304
|
+
RateLimitedRequest
|
|
305
|
+
>
|
|
306
|
+
// Caching augmentation
|
|
307
|
+
export type CacheAugmentation = ConditionalAugmentation<
|
|
308
|
+
[TypedMiddleware<any, any, { cache: CachedRequest['cache'] }, any>],
|
|
309
|
+
CachedRequest
|
|
310
|
+
>
|
|
311
|
+
// Logging augmentation
|
|
312
|
+
export type LoggingAugmentation = ConditionalAugmentation<
|
|
313
|
+
[TypedMiddleware<any, any, { logging: { requestId: string, logger: LoggedRequest['logger'] } }, any>],
|
|
314
|
+
LoggedRequest
|
|
315
|
+
>
|
|
316
|
+
// CORS augmentation
|
|
317
|
+
export type CORSAugmentation = ConditionalAugmentation<
|
|
318
|
+
[TypedMiddleware<any, any, { cors: CORSRequest['cors'] }, any>],
|
|
319
|
+
CORSRequest
|
|
320
|
+
>
|
|
321
|
+
// File upload augmentation
|
|
322
|
+
export type FileUploadAugmentation<TFiles extends Record<string, any> = Record<string, File>> = ConditionalAugmentation<
|
|
323
|
+
[TypedMiddleware<any, any, { upload: { files: TFiles } }, any>],
|
|
324
|
+
FileUploadRequest<TFiles>
|
|
325
|
+
>
|
|
326
|
+
// Session augmentation
|
|
327
|
+
export type SessionAugmentation<TSession = any> = ConditionalAugmentation<
|
|
328
|
+
[TypedMiddleware<any, any, { session: SessionRequest<TSession>['session'] }, any>],
|
|
329
|
+
SessionRequest<TSession>
|
|
330
|
+
>
|
|
331
|
+
// Combined augmentations
|
|
332
|
+
export type CombineAugmentations<T extends Record<string, any>[]> = T extends [
|
|
333
|
+
infer First,
|
|
334
|
+
...infer Rest,
|
|
335
|
+
]
|
|
336
|
+
? First extends Record<string, any>
|
|
337
|
+
? Rest extends Record<string, any>[]
|
|
338
|
+
? First & CombineAugmentations<Rest>
|
|
339
|
+
: First
|
|
340
|
+
: object
|
|
341
|
+
: object
|
|
342
|
+
// Middleware type detection
|
|
343
|
+
export type HasAuthMiddleware<T extends readonly TypedMiddleware<any, any, any, any>[]> = T extends readonly [infer First, ...infer Rest]
|
|
344
|
+
? First extends TypedMiddleware<any, any, { auth: any }, any>
|
|
345
|
+
? true
|
|
346
|
+
: Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
347
|
+
? HasAuthMiddleware<Rest>
|
|
348
|
+
: false
|
|
349
|
+
: false
|
|
350
|
+
export type HasValidationMiddleware<T extends readonly TypedMiddleware<any, any, any, any>[]> = T extends readonly [infer First, ...infer Rest]
|
|
351
|
+
? First extends TypedMiddleware<any, any, { validation: any }, any>
|
|
352
|
+
? true
|
|
353
|
+
: Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
354
|
+
? HasValidationMiddleware<Rest>
|
|
355
|
+
: false
|
|
356
|
+
: false
|
|
357
|
+
export type HasRateLimitMiddleware<T extends readonly TypedMiddleware<any, any, any, any>[]> = T extends readonly [infer First, ...infer Rest]
|
|
358
|
+
? First extends TypedMiddleware<any, any, { rateLimit: any }, any>
|
|
359
|
+
? true
|
|
360
|
+
: Rest extends readonly TypedMiddleware<any, any, any, any>[]
|
|
361
|
+
? HasRateLimitMiddleware<Rest>
|
|
362
|
+
: false
|
|
363
|
+
: false
|
|
364
|
+
// Augmentation validation
|
|
365
|
+
export type ValidateAugmentation<TRequest, TExpectedAugmentation> = TRequest extends TExpectedAugmentation
|
|
366
|
+
? true
|
|
367
|
+
: false
|
|
368
|
+
// Augmentation compatibility checking
|
|
369
|
+
export type AugmentationCompatible<TMiddleware1 extends TypedMiddleware<any, any, any, any>, TMiddleware2 extends TypedMiddleware<any, any, any, any>> = TMiddleware1 extends TypedMiddleware<any, infer Output1, any, any>
|
|
370
|
+
? TMiddleware2 extends TypedMiddleware<Output1, any, any, any>
|
|
371
|
+
? true
|
|
372
|
+
: false
|
|
373
|
+
: false
|