@stacksjs/bun-router 0.0.5 → 0.0.7
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/dist/auth.d.ts +134 -0
- package/dist/cache/lru-cache.d.ts +139 -0
- package/dist/cache/middleware-memoization.d.ts +151 -0
- package/dist/cache/route-cache-warmer.d.ts +161 -0
- package/dist/cache/sqlite-cache.d.ts +209 -0
- package/dist/cache/streaming-cache.d.ts +132 -0
- package/dist/cli/colors.d.ts +15 -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 +29 -0
- package/dist/cli/utils.d.ts +74 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/container/container.d.ts +273 -0
- package/dist/container/contextual-binding.d.ts +240 -0
- package/dist/container/decorators.d.ts +141 -0
- package/dist/container/service-provider.d.ts +285 -0
- package/dist/development/hot-reload.d.ts +187 -0
- package/dist/development/index.d.ts +167 -0
- package/dist/development/performance-profiler.d.ts +217 -0
- package/dist/development/route-debugger.d.ts +154 -0
- package/dist/development/route-inspector.d.ts +211 -0
- package/dist/development/typescript-utilities.d.ts +209 -0
- package/dist/docs.d.ts +11 -0
- package/dist/errors/circuit-breaker.d.ts +195 -0
- package/dist/errors/error-handler.d.ts +88 -0
- package/dist/errors/error-reporting.d.ts +144 -0
- package/dist/errors/exceptions.d.ts +184 -0
- package/dist/errors/graceful-degradation.d.ts +154 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/router-errors.d.ts +110 -0
- package/dist/file-serving/static-files.d.ts +143 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +375 -227
- package/dist/middleware/auth.d.ts +63 -0
- package/dist/middleware/content_security_policy.d.ts +53 -0
- package/dist/middleware/cors.d.ts +5 -0
- package/dist/middleware/csrf.d.ts +7 -0
- package/dist/middleware/ddos_protection.d.ts +39 -0
- package/dist/middleware/file_security.d.ts +26 -0
- package/dist/middleware/file_upload.d.ts +38 -0
- package/dist/middleware/helmet.d.ts +54 -0
- package/dist/middleware/index.d.ts +44 -0
- package/dist/middleware/input_validation.d.ts +45 -0
- package/dist/middleware/json_body.d.ts +4 -0
- package/dist/middleware/performance_alerting.d.ts +87 -0
- package/dist/middleware/performance_dashboard.d.ts +87 -0
- package/dist/middleware/performance_monitor.d.ts +209 -0
- package/dist/middleware/pipeline.d.ts +131 -0
- package/dist/middleware/rate_limit.d.ts +36 -0
- package/dist/middleware/request_id.d.ts +4 -0
- package/dist/middleware/request_signing.d.ts +153 -0
- package/dist/middleware/request_tracer.d.ts +72 -0
- package/dist/middleware/response_cache.d.ts +97 -0
- package/dist/middleware/security.d.ts +69 -0
- package/dist/middleware/security_suite.d.ts +46 -0
- package/dist/middleware/session.d.ts +23 -0
- package/dist/model-binding/index.d.ts +2 -0
- package/dist/model-binding/model-middleware.d.ts +118 -0
- package/dist/model-binding/model-registry.d.ts +164 -0
- package/dist/model-binding.d.ts +185 -0
- package/dist/model-resolver-factory.d.ts +31 -0
- package/dist/observability/correlation.d.ts +187 -0
- package/dist/observability/health-checks.d.ts +186 -0
- package/dist/observability/index.d.ts +60 -0
- package/dist/observability/integration.d.ts +147 -0
- package/dist/observability/metrics.d.ts +184 -0
- package/dist/observability/tracing.d.ts +187 -0
- package/dist/optimization/bun-utilities.d.ts +224 -0
- package/dist/query-builder-integration.d.ts +36 -0
- package/dist/request/context.d.ts +34 -0
- package/dist/request/enhanced-request.d.ts +213 -0
- package/dist/request/macros.d.ts +300 -0
- package/dist/response/macros.d.ts +245 -0
- package/dist/response/response-factory.d.ts +133 -0
- package/dist/router/api-routes.d.ts +5 -0
- package/dist/router/file-based-routing.d.ts +118 -0
- package/dist/router/file-streaming.d.ts +5 -0
- package/dist/router/fluent-router.d.ts +315 -0
- package/dist/router/fluent-routing.d.ts +271 -0
- package/dist/router/group-organization.d.ts +5 -0
- package/dist/router/handler-resolver.d.ts +24 -0
- package/dist/router/http-methods.d.ts +10 -0
- package/dist/router/index.d.ts +113 -0
- package/dist/router/middleware-groups.d.ts +94 -0
- package/dist/router/middleware-integration.d.ts +112 -0
- package/dist/router/middleware.d.ts +5 -0
- package/dist/router/model-binding.d.ts +5 -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 +153 -0
- package/dist/router/route-matching.d.ts +5 -0
- package/dist/router/route-trie.d.ts +114 -0
- package/dist/router/router.d.ts +276 -0
- package/dist/router/server.d.ts +5 -0
- package/dist/router/validation-integration.d.ts +170 -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 +129 -0
- package/dist/routing/route-throttling.d.ts +150 -0
- package/dist/routing/subdomain-routing.d.ts +206 -0
- package/dist/session/database-store.d.ts +51 -0
- package/dist/session/file-store.d.ts +22 -0
- package/dist/session/index.d.ts +106 -0
- package/dist/session/memory-store.d.ts +21 -0
- package/dist/session/redis-store.d.ts +31 -0
- package/dist/streaming/index.d.ts +3 -0
- package/dist/streaming/sse-handler.d.ts +138 -0
- package/dist/streaming/stream-handler.d.ts +114 -0
- package/dist/testing/auth-testing.d.ts +156 -0
- package/dist/testing/file-upload-testing.d.ts +190 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/middleware-testing.d.ts +138 -0
- package/dist/testing/model-binding-testing.d.ts +186 -0
- package/dist/testing/performance-testing.d.ts +235 -0
- package/dist/testing/test-client.d.ts +117 -0
- package/dist/testing/test-request.d.ts +85 -0
- package/dist/testing/test-response.d.ts +90 -0
- package/dist/testing/types.d.ts +207 -0
- package/dist/testing/websocket-testing.d.ts +227 -0
- package/dist/types/controller-types.d.ts +208 -0
- package/dist/types/core.d.ts +543 -0
- package/dist/types/middleware-types.d.ts +227 -0
- package/dist/types/request-response-augmentation.d.ts +261 -0
- package/dist/types/route-inference.d.ts +168 -0
- package/dist/types.d.ts +1776 -0
- package/dist/url.d.ts +56 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/query-preservation.d.ts +48 -0
- package/dist/utils.d.ts +69 -0
- package/dist/validation/validator.d.ts +140 -0
- package/dist/websocket/clustering.d.ts +185 -0
- package/package.json +3 -2
- package/src/auth.ts +469 -0
- package/src/cache/lru-cache.ts +457 -0
- package/src/cache/middleware-memoization.ts +531 -0
- package/src/cache/route-cache-warmer.ts +486 -0
- package/src/cache/sqlite-cache.ts +783 -0
- package/src/cache/streaming-cache.ts +572 -0
- package/src/cli/colors.ts +29 -0
- package/src/cli/index.ts +287 -0
- package/src/cli/middleware.ts +291 -0
- package/src/cli/openapi.ts +407 -0
- package/src/cli/router.ts +188 -0
- package/src/cli/routes.ts +265 -0
- package/src/cli/utils.ts +531 -0
- package/src/cli.ts +5 -0
- package/src/config.ts +322 -0
- package/src/container/container.ts +740 -0
- package/src/container/contextual-binding.ts +603 -0
- package/src/container/decorators.ts +359 -0
- package/src/container/service-provider.ts +596 -0
- package/src/development/hot-reload.ts +673 -0
- package/src/development/index.ts +499 -0
- package/src/development/performance-profiler.ts +717 -0
- package/src/development/route-debugger.ts +527 -0
- package/src/development/route-inspector.ts +749 -0
- package/src/development/typescript-utilities.ts +678 -0
- package/src/docs.ts +397 -0
- package/src/errors/circuit-breaker.ts +732 -0
- package/src/errors/error-handler.ts +569 -0
- package/src/errors/error-reporting.ts +672 -0
- package/src/errors/exceptions.ts +536 -0
- package/src/errors/graceful-degradation.ts +621 -0
- package/src/errors/index.ts +21 -0
- package/src/errors/router-errors.ts +632 -0
- package/src/file-serving/static-files.ts +581 -0
- package/src/index.ts +14 -0
- package/src/middleware/auth.ts +219 -0
- package/src/middleware/content_security_policy.ts +215 -0
- package/src/middleware/cors.ts +74 -0
- package/src/middleware/csrf.ts +108 -0
- package/src/middleware/ddos_protection.ts +255 -0
- package/src/middleware/file_security.ts +191 -0
- package/src/middleware/file_upload.ts +264 -0
- package/src/middleware/helmet.ts +268 -0
- package/src/middleware/index.ts +117 -0
- package/src/middleware/input_validation.ts +449 -0
- package/src/middleware/json_body.ts +37 -0
- package/src/middleware/performance_alerting.ts +538 -0
- package/src/middleware/performance_dashboard.ts +661 -0
- package/src/middleware/performance_monitor.ts +943 -0
- package/src/middleware/pipeline.ts +489 -0
- package/src/middleware/rate_limit.ts +245 -0
- package/src/middleware/request_id.ts +36 -0
- package/src/middleware/request_signing.ts +636 -0
- package/src/middleware/request_tracer.ts +636 -0
- package/src/middleware/response_cache.ts +743 -0
- package/src/middleware/security.ts +482 -0
- package/src/middleware/security_suite.ts +257 -0
- package/src/middleware/session.ts +91 -0
- package/src/model-binding/index.ts +18 -0
- package/src/model-binding/model-middleware.ts +425 -0
- package/src/model-binding/model-registry.ts +550 -0
- package/src/model-binding.ts +370 -0
- package/src/model-resolver-factory.ts +106 -0
- package/src/observability/correlation.ts +691 -0
- package/src/observability/health-checks.ts +729 -0
- package/src/observability/index.ts +184 -0
- package/src/observability/integration.ts +548 -0
- package/src/observability/metrics.ts +753 -0
- package/src/observability/tracing.ts +638 -0
- package/src/optimization/bun-utilities.ts +778 -0
- package/src/query-builder-integration.ts +137 -0
- package/src/request/context.ts +62 -0
- package/src/request/enhanced-request.ts +857 -0
- package/src/request/macros.ts +688 -0
- package/src/response/macros.ts +612 -0
- package/src/response/response-factory.ts +588 -0
- package/src/router/api-routes.ts +243 -0
- package/src/router/file-based-routing.ts +670 -0
- package/src/router/file-streaming.ts +372 -0
- package/src/router/fluent-router.ts +927 -0
- package/src/router/fluent-routing.ts +797 -0
- package/src/router/group-organization.ts +213 -0
- package/src/router/handler-resolver.ts +291 -0
- package/src/router/http-methods.ts +377 -0
- package/src/router/index.ts +185 -0
- package/src/router/middleware-groups.ts +222 -0
- package/src/router/middleware-integration.ts +399 -0
- package/src/router/middleware.ts +231 -0
- package/src/router/model-binding.ts +215 -0
- package/src/router/optimized-route-matching.ts +253 -0
- package/src/router/route-building.ts +212 -0
- package/src/router/route-compiler.ts +702 -0
- package/src/router/route-matching.ts +349 -0
- package/src/router/route-trie.ts +464 -0
- package/src/router/router.ts +1524 -0
- package/src/router/server.ts +429 -0
- package/src/router/validation-integration.ts +443 -0
- package/src/router/view-rendering.ts +233 -0
- package/src/router/websocket.ts +100 -0
- package/src/routing/route-caching.ts +402 -0
- package/src/routing/route-throttling.ts +469 -0
- package/src/routing/subdomain-routing.ts +492 -0
- package/src/session/database-store.ts +109 -0
- package/src/session/file-store.ts +148 -0
- package/src/session/index.ts +244 -0
- package/src/session/memory-store.ts +88 -0
- package/src/session/redis-store.ts +93 -0
- package/src/streaming/index.ts +17 -0
- package/src/streaming/sse-handler.ts +482 -0
- package/src/streaming/stream-handler.ts +552 -0
- package/src/testing/auth-testing.ts +446 -0
- package/src/testing/file-upload-testing.ts +543 -0
- package/src/testing/index.ts +10 -0
- package/src/testing/middleware-testing.ts +322 -0
- package/src/testing/model-binding-testing.ts +645 -0
- package/src/testing/performance-testing.ts +738 -0
- package/src/testing/test-client.ts +310 -0
- package/src/testing/test-request.ts +315 -0
- package/src/testing/test-response.ts +332 -0
- package/src/testing/types.ts +224 -0
- package/src/testing/websocket-testing.ts +590 -0
- package/src/types/controller-types.ts +385 -0
- package/src/types/core.ts +683 -0
- package/src/types/middleware-types.ts +419 -0
- package/src/types/request-response-augmentation.ts +489 -0
- package/src/types/route-inference.ts +357 -0
- package/src/types.ts +2049 -0
- package/src/url.ts +126 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/query-preservation.ts +201 -0
- package/src/utils.ts +327 -0
- package/src/validation/validator.ts +685 -0
- package/src/websocket/clustering.ts +762 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller Method Type Checking at Compile Time
|
|
3
|
+
*
|
|
4
|
+
* Advanced TypeScript utilities for compile-time controller method validation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { TypedMiddleware } from './middleware-types'
|
|
8
|
+
import type {
|
|
9
|
+
ExtractQueryParams,
|
|
10
|
+
ExtractTypedParams,
|
|
11
|
+
RouteHandler,
|
|
12
|
+
RouteMethod,
|
|
13
|
+
TypedRequest,
|
|
14
|
+
} from './route-inference'
|
|
15
|
+
|
|
16
|
+
// Base controller interface
|
|
17
|
+
export interface BaseController {
|
|
18
|
+
[key: string]: any
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Controller method metadata
|
|
22
|
+
export interface ControllerMethodMetadata {
|
|
23
|
+
path: string
|
|
24
|
+
method: RouteMethod
|
|
25
|
+
middleware?: TypedMiddleware<any, any, any, any>[]
|
|
26
|
+
description?: string
|
|
27
|
+
tags?: string[]
|
|
28
|
+
deprecated?: boolean
|
|
29
|
+
operationId?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Controller method decorator metadata
|
|
33
|
+
export interface MethodDecoratorMetadata extends ControllerMethodMetadata {
|
|
34
|
+
parameterTypes?: any[]
|
|
35
|
+
returnType?: any
|
|
36
|
+
target: any
|
|
37
|
+
propertyKey: string | symbol
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Extract controller method names
|
|
41
|
+
export type ControllerMethodNames<T> = {
|
|
42
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any ? K : never
|
|
43
|
+
}[keyof T]
|
|
44
|
+
|
|
45
|
+
// Extract controller methods
|
|
46
|
+
export type ControllerMethods<T> = Pick<T, ControllerMethodNames<T>>
|
|
47
|
+
|
|
48
|
+
// Controller method signature validation
|
|
49
|
+
export type ValidateControllerMethod<T> = T extends (
|
|
50
|
+
request: infer TRequest,
|
|
51
|
+
...args: any[]
|
|
52
|
+
) => infer TReturn
|
|
53
|
+
? TRequest extends TypedRequest<any, any, any, any>
|
|
54
|
+
? TReturn extends Promise<Response> | Response
|
|
55
|
+
? T
|
|
56
|
+
: `Invalid return type: Controller method must return Response or Promise<Response>`
|
|
57
|
+
: `Invalid parameter type: First parameter must be TypedRequest`
|
|
58
|
+
: `Invalid method signature: Controller method must be a function`
|
|
59
|
+
|
|
60
|
+
// Controller method type inference
|
|
61
|
+
export type InferControllerMethodType<T> = T extends (
|
|
62
|
+
request: TypedRequest<infer TPath, infer TQuery, infer TBody, infer TContext>,
|
|
63
|
+
...args: any[]
|
|
64
|
+
) => Promise<Response> | Response
|
|
65
|
+
? {
|
|
66
|
+
path: TPath
|
|
67
|
+
query: TQuery
|
|
68
|
+
body: TBody
|
|
69
|
+
context: TContext
|
|
70
|
+
params: ExtractTypedParams<TPath>
|
|
71
|
+
}
|
|
72
|
+
: never
|
|
73
|
+
|
|
74
|
+
// Controller route registration
|
|
75
|
+
export interface ControllerRoute<
|
|
76
|
+
TPath extends string = string,
|
|
77
|
+
TQuery extends Record<string, any> = object,
|
|
78
|
+
TBody = unknown,
|
|
79
|
+
TContext = object,
|
|
80
|
+
> {
|
|
81
|
+
method: RouteMethod
|
|
82
|
+
path: TPath
|
|
83
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>
|
|
84
|
+
controllerMethod: string
|
|
85
|
+
middleware?: TypedMiddleware<any, any, any, any>[]
|
|
86
|
+
metadata?: ControllerMethodMetadata
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Controller class decorator
|
|
90
|
+
export interface ControllerDecorator<TPrefix extends string = ''> {
|
|
91
|
+
prefix?: TPrefix
|
|
92
|
+
middleware?: TypedMiddleware<any, any, any, any>[]
|
|
93
|
+
tags?: string[]
|
|
94
|
+
description?: string
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Route method decorators
|
|
98
|
+
export type RouteDecorator<
|
|
99
|
+
TPath extends string,
|
|
100
|
+
TQuery extends Record<string, any> = object,
|
|
101
|
+
TBody = unknown,
|
|
102
|
+
> = <T extends BaseController>(
|
|
103
|
+
target: T,
|
|
104
|
+
propertyKey: keyof T,
|
|
105
|
+
descriptor: TypedPropertyDescriptor<RouteHandler<TPath, TQuery, TBody, any>>
|
|
106
|
+
) => void
|
|
107
|
+
|
|
108
|
+
// HTTP method decorators
|
|
109
|
+
export type GetDecorator<TPath extends string, TQuery extends Record<string, any> = object> =
|
|
110
|
+
RouteDecorator<TPath, TQuery, never>
|
|
111
|
+
|
|
112
|
+
export type PostDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> =
|
|
113
|
+
RouteDecorator<TPath, TQuery, TBody>
|
|
114
|
+
|
|
115
|
+
export type PutDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> =
|
|
116
|
+
RouteDecorator<TPath, TQuery, TBody>
|
|
117
|
+
|
|
118
|
+
export type PatchDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> =
|
|
119
|
+
RouteDecorator<TPath, TQuery, TBody>
|
|
120
|
+
|
|
121
|
+
export type DeleteDecorator<TPath extends string, TQuery extends Record<string, any> = object> =
|
|
122
|
+
RouteDecorator<TPath, TQuery, never>
|
|
123
|
+
|
|
124
|
+
// Parameter decorators
|
|
125
|
+
export interface ParameterDecorator<_T = any> {
|
|
126
|
+
<TController extends BaseController>(
|
|
127
|
+
target: TController,
|
|
128
|
+
propertyKey: keyof TController,
|
|
129
|
+
parameterIndex: number
|
|
130
|
+
): void
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Parameter extraction types
|
|
134
|
+
export type ParamDecorator<_TName extends string> = ParameterDecorator<string>
|
|
135
|
+
export type QueryDecorator<_TName extends string> = ParameterDecorator<string>
|
|
136
|
+
export type BodyDecorator<T = any> = ParameterDecorator<T>
|
|
137
|
+
export type HeaderDecorator<_TName extends string> = ParameterDecorator<string>
|
|
138
|
+
export type CookieDecorator<_TName extends string> = ParameterDecorator<string>
|
|
139
|
+
export type RequestDecorator = ParameterDecorator<Request>
|
|
140
|
+
export type ResponseDecorator = ParameterDecorator<Response>
|
|
141
|
+
|
|
142
|
+
// Controller method parameter types
|
|
143
|
+
export type ControllerMethodParams<T> = T extends (
|
|
144
|
+
...args: infer TParams
|
|
145
|
+
) => any
|
|
146
|
+
? TParams
|
|
147
|
+
: never
|
|
148
|
+
|
|
149
|
+
// Validate controller method parameters
|
|
150
|
+
export type ValidateControllerParams<T extends any[]> = {
|
|
151
|
+
[K in keyof T]: T[K] extends TypedRequest<any, any, any, any>
|
|
152
|
+
? T[K]
|
|
153
|
+
: T[K] extends string | number | boolean | object
|
|
154
|
+
? T[K]
|
|
155
|
+
: `Invalid parameter type at index ${K}: ${T[K]}`
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Controller dependency injection
|
|
159
|
+
export interface ControllerDependency<T = any> {
|
|
160
|
+
token: string | symbol | ((..._args: any[]) => any)
|
|
161
|
+
value?: T
|
|
162
|
+
factory?: () => T
|
|
163
|
+
singleton?: boolean
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface DependencyContainer {
|
|
167
|
+
register: <T>(dependency: ControllerDependency<T>) => void
|
|
168
|
+
resolve: <T>(token: string | symbol | ((..._args: any[]) => any)) => T
|
|
169
|
+
has: (token: string | symbol | ((..._args: any[]) => any)) => boolean
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Injectable decorator
|
|
173
|
+
export interface InjectableDecorator {
|
|
174
|
+
<T extends new (..._args: any[]) => any>(constructor: T): T
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Inject decorator
|
|
178
|
+
export interface InjectDecorator<T = any> {
|
|
179
|
+
(token: string | symbol | ((..._args: any[]) => any)): ParameterDecorator<T>
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Controller factory
|
|
183
|
+
export interface ControllerFactory<T extends BaseController> {
|
|
184
|
+
create: (container?: DependencyContainer) => T
|
|
185
|
+
getRoutes: () => ControllerRoute[]
|
|
186
|
+
getMetadata: () => ControllerDecorator
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Controller registry
|
|
190
|
+
export interface ControllerRegistry {
|
|
191
|
+
register: <T extends BaseController>(
|
|
192
|
+
controller: new (...args: any[]) => T,
|
|
193
|
+
metadata?: ControllerDecorator
|
|
194
|
+
) => void
|
|
195
|
+
|
|
196
|
+
get: <T extends BaseController>(
|
|
197
|
+
controller: new (...args: any[]) => T
|
|
198
|
+
) => ControllerFactory<T> | undefined
|
|
199
|
+
|
|
200
|
+
getAll: () => Array<{
|
|
201
|
+
controller: new (...args: any[]) => BaseController
|
|
202
|
+
factory: ControllerFactory<BaseController>
|
|
203
|
+
}>
|
|
204
|
+
|
|
205
|
+
resolve: (container?: DependencyContainer) => ControllerRoute[]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Controller method validation at compile time
|
|
209
|
+
export type ValidateController<T extends BaseController> = {
|
|
210
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any
|
|
211
|
+
? ValidateControllerMethod<T[K]> extends string
|
|
212
|
+
? ValidateControllerMethod<T[K]>
|
|
213
|
+
: T[K]
|
|
214
|
+
: T[K]
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Controller route extraction
|
|
218
|
+
export type ExtractControllerRoutes<T extends BaseController> = {
|
|
219
|
+
[K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
|
|
220
|
+
? ControllerRoute<TPath, TQuery, TBody, TContext>
|
|
221
|
+
: never
|
|
222
|
+
}[keyof T]
|
|
223
|
+
|
|
224
|
+
// Controller method binding
|
|
225
|
+
export type BindControllerMethod<
|
|
226
|
+
TController extends BaseController,
|
|
227
|
+
TMethod extends keyof TController,
|
|
228
|
+
> = TController[TMethod] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
|
|
229
|
+
// eslint-disable-next-line pickier/no-unused-vars
|
|
230
|
+
? (this: TController, _request: TypedRequest<TPath, TQuery, TBody, TContext>) => Promise<Response> | Response
|
|
231
|
+
: never
|
|
232
|
+
|
|
233
|
+
// Controller instance type
|
|
234
|
+
export type ControllerInstance<T extends BaseController> = {
|
|
235
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any
|
|
236
|
+
? BindControllerMethod<T, K>
|
|
237
|
+
: T[K]
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Controller method metadata extraction
|
|
241
|
+
export type ExtractMethodMetadata<T extends BaseController> = {
|
|
242
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any
|
|
243
|
+
? InferControllerMethodType<T[K]> extends never
|
|
244
|
+
? never
|
|
245
|
+
: {
|
|
246
|
+
method: K
|
|
247
|
+
route: InferControllerMethodType<T[K]>
|
|
248
|
+
metadata?: ControllerMethodMetadata
|
|
249
|
+
}
|
|
250
|
+
: never
|
|
251
|
+
}[keyof T]
|
|
252
|
+
|
|
253
|
+
// Controller validation errors
|
|
254
|
+
export type ControllerValidationError<T extends BaseController> = {
|
|
255
|
+
[K in keyof T]: ValidateController<T>[K] extends string
|
|
256
|
+
? { method: K, error: ValidateController<T>[K] }
|
|
257
|
+
: never
|
|
258
|
+
}[keyof T]
|
|
259
|
+
|
|
260
|
+
// Controller type guards
|
|
261
|
+
export type IsValidController<T> = T extends BaseController
|
|
262
|
+
? ControllerValidationError<T> extends never
|
|
263
|
+
? true
|
|
264
|
+
: false
|
|
265
|
+
: false
|
|
266
|
+
|
|
267
|
+
export type IsValidControllerMethod<T> = ValidateControllerMethod<T> extends string
|
|
268
|
+
? false
|
|
269
|
+
: true
|
|
270
|
+
|
|
271
|
+
// Controller composition
|
|
272
|
+
export type ComposeControllers<T extends readonly BaseController[]> = T extends readonly [
|
|
273
|
+
infer First,
|
|
274
|
+
...infer Rest,
|
|
275
|
+
]
|
|
276
|
+
? First extends BaseController
|
|
277
|
+
? Rest extends readonly BaseController[]
|
|
278
|
+
? First & ComposeControllers<Rest>
|
|
279
|
+
: First
|
|
280
|
+
: object
|
|
281
|
+
: object
|
|
282
|
+
|
|
283
|
+
// Controller middleware application
|
|
284
|
+
export type ApplyControllerMiddleware<
|
|
285
|
+
TController extends BaseController,
|
|
286
|
+
TMiddleware extends TypedMiddleware<any, any, any, any>,
|
|
287
|
+
> = {
|
|
288
|
+
[K in keyof TController]: TController[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
|
|
289
|
+
? TMiddleware extends TypedMiddleware<any, any, infer TNewContext, any>
|
|
290
|
+
? RouteHandler<TPath, TQuery, TBody, TContext & TNewContext>
|
|
291
|
+
: TController[K]
|
|
292
|
+
: TController[K]
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Controller route conflict detection
|
|
296
|
+
export type DetectControllerConflicts<T extends BaseController> = {
|
|
297
|
+
[K in keyof T]: {
|
|
298
|
+
[J in keyof T]: K extends J
|
|
299
|
+
? never
|
|
300
|
+
: T[K] extends RouteHandler<infer Path1, any, any, any>
|
|
301
|
+
? T[J] extends RouteHandler<infer Path2, any, any, any>
|
|
302
|
+
? Path1 extends Path2
|
|
303
|
+
? `Route conflict in controller: methods "${string & K}" and "${string & J}" both handle "${Path1}"`
|
|
304
|
+
: never
|
|
305
|
+
: never
|
|
306
|
+
: never
|
|
307
|
+
}[keyof T]
|
|
308
|
+
}[keyof T]
|
|
309
|
+
|
|
310
|
+
// Controller OpenAPI generation
|
|
311
|
+
export interface GenerateControllerOpenAPI<T extends BaseController> {
|
|
312
|
+
paths: {
|
|
313
|
+
[K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, any>
|
|
314
|
+
? {
|
|
315
|
+
[M in RouteMethod]: {
|
|
316
|
+
operationId: string & K
|
|
317
|
+
parameters: Array<{
|
|
318
|
+
name: keyof ExtractTypedParams<TPath>
|
|
319
|
+
in: 'path'
|
|
320
|
+
required: true
|
|
321
|
+
schema: { type: 'string' }
|
|
322
|
+
}> | Array<{
|
|
323
|
+
name: keyof ExtractQueryParams<TQuery>
|
|
324
|
+
in: 'query'
|
|
325
|
+
required: boolean
|
|
326
|
+
schema: { type: 'string' }
|
|
327
|
+
}>
|
|
328
|
+
requestBody?: TBody extends never ? never : {
|
|
329
|
+
content: {
|
|
330
|
+
'application/json': { schema: any }
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
responses: {
|
|
334
|
+
200: {
|
|
335
|
+
description: 'Success'
|
|
336
|
+
content: {
|
|
337
|
+
'application/json': { schema: any }
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
: never
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Controller testing utilities
|
|
348
|
+
export interface ControllerTestUtils<T extends BaseController> {
|
|
349
|
+
createInstance: (overrides?: Partial<T>) => T
|
|
350
|
+
mockMethod: <K extends keyof T>(method: K, implementation: T[K]) => void
|
|
351
|
+
callMethod: <K extends keyof T>(
|
|
352
|
+
method: K,
|
|
353
|
+
..._args: T[K] extends (..._a: infer TArgs) => any ? TArgs : never
|
|
354
|
+
) => T[K] extends (..._a: any[]) => infer TReturn ? TReturn : never
|
|
355
|
+
getRoutes: () => ControllerRoute[]
|
|
356
|
+
validateRoutes: () => ControllerValidationError<T>[]
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Controller performance monitoring
|
|
360
|
+
export interface ControllerPerformanceMetrics {
|
|
361
|
+
controllerName: string
|
|
362
|
+
methodName: string
|
|
363
|
+
executionTime: number
|
|
364
|
+
memoryUsage: number
|
|
365
|
+
callCount: number
|
|
366
|
+
errorCount: number
|
|
367
|
+
lastCalled: Date
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export type PerformanceTrackingController<T extends BaseController> = T & {
|
|
371
|
+
getPerformanceMetrics: () => ControllerPerformanceMetrics[]
|
|
372
|
+
resetMetrics: () => void
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Controller lifecycle hooks
|
|
376
|
+
export interface ControllerLifecycleHooks {
|
|
377
|
+
onInit?: () => Promise<void> | void
|
|
378
|
+
onDestroy?: () => Promise<void> | void
|
|
379
|
+
beforeMethod?: (methodName: string, args: any[]) => Promise<void> | void
|
|
380
|
+
afterMethod?: (methodName: string, result: any, args: any[]) => Promise<void> | void
|
|
381
|
+
onError?: (error: Error, methodName: string, args: any[]) => Promise<void> | void
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Controller with lifecycle
|
|
385
|
+
export type LifecycleController<T extends BaseController> = T & ControllerLifecycleHooks
|