@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.
Files changed (131) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +397 -0
  3. package/bin/cli.ts +9 -0
  4. package/dist/auth.d.ts +77 -0
  5. package/dist/cache/lru-cache.d.ts +88 -0
  6. package/dist/cache/middleware-memoization.d.ts +101 -0
  7. package/dist/cache/route-cache-warmer.d.ts +125 -0
  8. package/dist/cache/sqlite-cache.d.ts +114 -0
  9. package/dist/cache/streaming-cache.d.ts +86 -0
  10. package/dist/chunk-r15a48wc.js +25448 -0
  11. package/dist/cli/colors.d.ts +12 -0
  12. package/dist/cli/index.d.ts +10 -0
  13. package/dist/cli/middleware.d.ts +31 -0
  14. package/dist/cli/openapi.d.ts +17 -0
  15. package/dist/cli/router.d.ts +15 -0
  16. package/dist/cli/routes.d.ts +30 -0
  17. package/dist/cli/utils.d.ts +68 -0
  18. package/dist/cli.d.ts +0 -0
  19. package/dist/cli.js +3195 -0
  20. package/dist/config.d.ts +274 -0
  21. package/dist/container/container.d.ts +141 -0
  22. package/dist/container/contextual-binding.d.ts +112 -0
  23. package/dist/container/decorators.d.ts +114 -0
  24. package/dist/container/service-provider.d.ts +221 -0
  25. package/dist/development/hot-reload.d.ts +129 -0
  26. package/dist/development/index.d.ts +144 -0
  27. package/dist/development/performance-profiler.d.ts +152 -0
  28. package/dist/development/route-debugger.d.ts +102 -0
  29. package/dist/development/route-inspector.d.ts +142 -0
  30. package/dist/development/typescript-utilities.d.ts +116 -0
  31. package/dist/docs.d.ts +10 -0
  32. package/dist/errors/circuit-breaker.d.ts +138 -0
  33. package/dist/errors/error-handler.d.ts +57 -0
  34. package/dist/errors/error-reporting.d.ts +135 -0
  35. package/dist/errors/exceptions.d.ts +178 -0
  36. package/dist/errors/graceful-degradation.d.ts +130 -0
  37. package/dist/errors/index.d.ts +6 -0
  38. package/dist/errors/router-errors.d.ts +97 -0
  39. package/dist/file-serving/static-files.d.ts +98 -0
  40. package/dist/index.d.ts +10 -0
  41. package/dist/index.js +13417 -0
  42. package/dist/middleware/auth.d.ts +34 -0
  43. package/dist/middleware/content_security_policy.d.ts +54 -0
  44. package/dist/middleware/cors.d.ts +5 -0
  45. package/dist/middleware/csrf.d.ts +7 -0
  46. package/dist/middleware/ddos_protection.d.ts +47 -0
  47. package/dist/middleware/file_security.d.ts +23 -0
  48. package/dist/middleware/file_upload.d.ts +41 -0
  49. package/dist/middleware/helmet.d.ts +54 -0
  50. package/dist/middleware/index.d.ts +55 -0
  51. package/dist/middleware/input_validation.d.ts +46 -0
  52. package/dist/middleware/json_body.d.ts +4 -0
  53. package/dist/middleware/performance_alerting.d.ts +88 -0
  54. package/dist/middleware/performance_dashboard.d.ts +97 -0
  55. package/dist/middleware/performance_monitor.d.ts +236 -0
  56. package/dist/middleware/pipeline.d.ts +90 -0
  57. package/dist/middleware/rate_limit.d.ts +33 -0
  58. package/dist/middleware/request_id.d.ts +4 -0
  59. package/dist/middleware/request_signing.d.ts +96 -0
  60. package/dist/middleware/request_tracer.d.ts +76 -0
  61. package/dist/middleware/response_cache.d.ts +90 -0
  62. package/dist/middleware/security.d.ts +70 -0
  63. package/dist/middleware/security_suite.d.ts +46 -0
  64. package/dist/middleware/session.d.ts +7 -0
  65. package/dist/model-binding/index.d.ts +17 -0
  66. package/dist/model-binding/model-middleware.d.ts +80 -0
  67. package/dist/model-binding/model-registry.d.ts +125 -0
  68. package/dist/model-binding.d.ts +123 -0
  69. package/dist/model-resolver-factory.d.ts +31 -0
  70. package/dist/observability/correlation.d.ts +131 -0
  71. package/dist/observability/health-checks.d.ts +129 -0
  72. package/dist/observability/index.d.ts +92 -0
  73. package/dist/observability/integration.d.ts +112 -0
  74. package/dist/observability/metrics.d.ts +135 -0
  75. package/dist/observability/tracing.d.ts +112 -0
  76. package/dist/optimization/bun-utilities.d.ts +106 -0
  77. package/dist/query-builder-integration.d.ts +24 -0
  78. package/dist/request/enhanced-request.d.ts +143 -0
  79. package/dist/request/macros.d.ts +267 -0
  80. package/dist/response/macros.d.ts +207 -0
  81. package/dist/response/response-factory.d.ts +93 -0
  82. package/dist/router/file-based-routing.d.ts +40 -0
  83. package/dist/router/file-streaming.d.ts +6 -0
  84. package/dist/router/fluent-router.d.ts +179 -0
  85. package/dist/router/fluent-routing.d.ts +198 -0
  86. package/dist/router/group-organization.d.ts +5 -0
  87. package/dist/router/handler-resolver.d.ts +13 -0
  88. package/dist/router/http-methods.d.ts +10 -0
  89. package/dist/router/index.d.ts +114 -0
  90. package/dist/router/middleware-integration.d.ts +86 -0
  91. package/dist/router/middleware.d.ts +5 -0
  92. package/dist/router/model-binding.d.ts +7 -0
  93. package/dist/router/optimized-route-matching.d.ts +6 -0
  94. package/dist/router/route-building.d.ts +5 -0
  95. package/dist/router/route-compiler.d.ts +67 -0
  96. package/dist/router/route-matching.d.ts +5 -0
  97. package/dist/router/route-trie.d.ts +69 -0
  98. package/dist/router/router.d.ts +133 -0
  99. package/dist/router/server.d.ts +5 -0
  100. package/dist/router/validation-integration.d.ts +116 -0
  101. package/dist/router/view-rendering.d.ts +5 -0
  102. package/dist/router/websocket.d.ts +5 -0
  103. package/dist/routing/route-caching.d.ts +105 -0
  104. package/dist/routing/route-throttling.d.ts +112 -0
  105. package/dist/routing/subdomain-routing.d.ts +159 -0
  106. package/dist/streaming/index.d.ts +15 -0
  107. package/dist/streaming/sse-handler.d.ts +81 -0
  108. package/dist/streaming/stream-handler.d.ts +81 -0
  109. package/dist/testing/auth-testing.d.ts +107 -0
  110. package/dist/testing/file-upload-testing.d.ts +139 -0
  111. package/dist/testing/index.d.ts +10 -0
  112. package/dist/testing/middleware-testing.d.ts +99 -0
  113. package/dist/testing/model-binding-testing.d.ts +132 -0
  114. package/dist/testing/performance-testing.d.ts +202 -0
  115. package/dist/testing/test-client.d.ts +58 -0
  116. package/dist/testing/test-request.d.ts +43 -0
  117. package/dist/testing/test-response.d.ts +45 -0
  118. package/dist/testing/types.d.ts +206 -0
  119. package/dist/testing/websocket-testing.d.ts +170 -0
  120. package/dist/types/controller-types.d.ts +303 -0
  121. package/dist/types/core.d.ts +526 -0
  122. package/dist/types/middleware-types.d.ts +315 -0
  123. package/dist/types/request-response-augmentation.d.ts +373 -0
  124. package/dist/types/route-inference.d.ts +287 -0
  125. package/dist/types.d.ts +1620 -0
  126. package/dist/utils/index.d.ts +1 -0
  127. package/dist/utils/query-preservation.d.ts +31 -0
  128. package/dist/utils.d.ts +69 -0
  129. package/dist/validation/validator.d.ts +169 -0
  130. package/dist/websocket/clustering.d.ts +114 -0
  131. package/package.json +81 -0
@@ -0,0 +1,170 @@
1
+ import type { WSTestClient, WSTestMessage } from './types';
2
+ /**
3
+ * Factory functions
4
+ */
5
+ export declare function createWebSocketTester(): WebSocketTester;
6
+ export declare function createMockServerWebSocket(data?: any): MockServerWebSocket;
7
+ /**
8
+ * WebSocket handler testing utilities
9
+ */
10
+ export declare const wsHandlerMocks: {
11
+ /**
12
+ * Mock WebSocket open handler
13
+ */
14
+ onOpen: () => any;
15
+ /**
16
+ * Mock WebSocket message handler
17
+ */
18
+ onMessage: (response?: string | ArrayBuffer | Uint8Array) => any;
19
+ /**
20
+ * Mock WebSocket close handler
21
+ */
22
+ onClose: () => any;
23
+ /**
24
+ * Mock WebSocket error handler
25
+ */
26
+ onError: () => any;
27
+ /**
28
+ * Mock echo handler
29
+ */
30
+ echo: () => any;
31
+ /**
32
+ * Mock broadcast handler
33
+ */
34
+ broadcast: (clients: ServerWebSocket<any>[]) => any;
35
+ /**
36
+ * Mock chat room handler
37
+ */
38
+ chatRoom: (room: string) => any
39
+ };
40
+ /**
41
+ * WebSocket test scenarios
42
+ */
43
+ export declare const wsTestScenarios: {
44
+ /**
45
+ * Test basic connection and message exchange
46
+ */
47
+ basicConnection: () => any;
48
+ /**
49
+ * Test connection failure
50
+ */
51
+ connectionFailure: () => any;
52
+ /**
53
+ * Test message broadcasting
54
+ */
55
+ messageBroadcast: (clientCount: number?) => any;
56
+ /**
57
+ * Test ping/pong mechanism
58
+ */
59
+ pingPong: () => any;
60
+ /**
61
+ * Test connection timeout
62
+ */
63
+ connectionTimeout: () => any
64
+ };
65
+ /**
66
+ * WebSocket assertion helpers
67
+ */
68
+ export declare const wsAssertions: {
69
+ /**
70
+ * Assert WebSocket is connected
71
+ */
72
+ isConnected: (tester: WebSocketTester) => any;
73
+ /**
74
+ * Assert WebSocket is disconnected
75
+ */
76
+ isDisconnected: (tester: WebSocketTester) => any;
77
+ /**
78
+ * Assert message was sent
79
+ */
80
+ messageSent: (tester: WebSocketTester, expectedMessage: string | ArrayBuffer | Uint8Array) => any;
81
+ /**
82
+ * Assert number of messages sent
83
+ */
84
+ messageCount: (tester: WebSocketTester, expectedCount: number) => any;
85
+ /**
86
+ * Assert message type
87
+ */
88
+ messageType: (tester: WebSocketTester, index: number, expectedType: 'text' | 'binary') => any;
89
+ /**
90
+ * Assert ready state
91
+ */
92
+ readyState: (tester: WebSocketTester, expectedState: number) => any
93
+ };
94
+ /**
95
+ * WebSocket performance testing
96
+ */
97
+ export declare const wsPerformance: {
98
+ /**
99
+ * Test message throughput
100
+ */
101
+ testThroughput: ( messageCount: number?, messageSize: number?, ) => Promise<{ messagesPerSecond: number totalTime: number averageLatency: number }>;
102
+ /**
103
+ * Test concurrent connections
104
+ */
105
+ testConcurrentConnections: ( connectionCount: number?, ) => Promise<{ successfulConnections: number failedConnections: number averageConnectionTime: number }>
106
+ };
107
+ /**
108
+ * WebSocket test utilities
109
+ */
110
+ export declare const wsTestUtils: {
111
+ /**
112
+ * Create multiple connected clients
113
+ */
114
+ createClients: (count: number) => any;
115
+ /**
116
+ * Simulate network latency
117
+ */
118
+ withLatency: (tester: WebSocketTester, latencyMs: number) => any;
119
+ /**
120
+ * Simulate packet loss
121
+ */
122
+ withPacketLoss: (tester: WebSocketTester, lossRate: number) => any;
123
+ /**
124
+ * Create message generator
125
+ */
126
+ * messageGenerator(count: number, prefix: string = 'Message'): unknown
127
+ };
128
+ /**
129
+ * WebSocket testing utilities
130
+ */
131
+ export declare class WebSocketTester {
132
+ private messages: WSTestMessage[];
133
+ private isConnected: boolean;
134
+ private readyState: number;
135
+ private eventHandlers: Map<string, ((...args: any[]) => any)[]>;
136
+ constructor();
137
+ private setupEventHandlers(): void;
138
+ connect(): WebSocketTester;
139
+ disconnect(code?: number, reason?: string): WebSocketTester;
140
+ send(data: string | ArrayBuffer | Uint8Array): WebSocketTester;
141
+ receive(data: string | ArrayBuffer | Uint8Array): WebSocketTester;
142
+ ping(data?: Uint8Array): WebSocketTester;
143
+ pong(data?: Uint8Array): WebSocketTester;
144
+ on(event: string, handler: (...args: any[]) => any): WebSocketTester;
145
+ off(event: string, handler: (...args: any[]) => any): WebSocketTester;
146
+ private emit(event: string, data: any): void;
147
+ getSentMessages(): WSTestMessage[];
148
+ getMessagesByType(type: 'text' | 'binary'): WSTestMessage[];
149
+ clearMessages(): WebSocketTester;
150
+ getState(): { isConnected: boolean, readyState: number };
151
+ getTestClient(): WSTestClient;
152
+ }
153
+ /**
154
+ * Mock ServerWebSocket for testing
155
+ */
156
+ export declare class MockServerWebSocket {
157
+ private tester: WebSocketTester;
158
+ private _data: any;
159
+ constructor(data?: any);
160
+ send(message: string | ArrayBuffer | Uint8Array): void;
161
+ close(code?: number, reason?: string): void;
162
+ ping(data?: Uint8Array): void;
163
+ pong(data?: Uint8Array): void;
164
+ publish(topic: string, message: string | ArrayBuffer | Uint8Array): void;
165
+ subscribe(_topic: string): void;
166
+ unsubscribe(_topic: string): void;
167
+ isSubscribed(_topic: string): boolean;
168
+ cork(callback: () => void): void;
169
+ getTester(): WebSocketTester;
170
+ }
@@ -0,0 +1,303 @@
1
+ import type { ExtractQueryParams, ExtractTypedParams, RouteHandler, RouteMethod, TypedRequest, } from './route-inference';
2
+ import type { TypedMiddleware } from './middleware-types';
3
+ // Base controller interface
4
+ export declare interface BaseController {
5
+
6
+ }
7
+ // Controller method metadata
8
+ export declare interface ControllerMethodMetadata {
9
+ path: string
10
+ method: RouteMethod
11
+ middleware?: TypedMiddleware<any, any, any, any>[]
12
+ description?: string
13
+ tags?: string[]
14
+ deprecated?: boolean
15
+ operationId?: string
16
+ }
17
+ // Controller method decorator metadata
18
+ export declare interface MethodDecoratorMetadata extends ControllerMethodMetadata {
19
+ parameterTypes?: any[]
20
+ returnType?: any
21
+ target: any
22
+ propertyKey: string | symbol
23
+ }
24
+ // Controller route registration
25
+ export declare interface ControllerRoute<TPath extends string = string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object> {
26
+ method: RouteMethod
27
+ path: TPath
28
+ handler: RouteHandler<TPath, TQuery, TBody, TContext>
29
+ controllerMethod: string
30
+ middleware?: TypedMiddleware<any, any, any, any>[]
31
+ metadata?: ControllerMethodMetadata
32
+ }
33
+ // Controller class decorator
34
+ export declare interface ControllerDecorator<TPrefix extends string = ''> {
35
+ prefix?: TPrefix
36
+ middleware?: TypedMiddleware<any, any, any, any>[]
37
+ tags?: string[]
38
+ description?: string
39
+ }
40
+ // Parameter decorators
41
+ export declare interface ParameterDecorator<_T = any> {
42
+ (target: TController, propertyKey: keyof TController, parameterIndex: number): void
43
+ }
44
+ // Controller dependency injection
45
+ export declare interface ControllerDependency<T = any> {
46
+ token: string | symbol | ((...args: any[]) => any)
47
+ value?: T
48
+ factory?: () => T
49
+ singleton?: boolean
50
+ }
51
+ export declare interface DependencyContainer {
52
+ register: <T>(dependency: ControllerDependency<T>) => void
53
+ resolve: <T>(token: string | symbol | ((...args: any[]) => any)) => T
54
+ has: (token: string | symbol | ((...args: any[]) => any)) => boolean
55
+ }
56
+ // Injectable decorator
57
+ export declare interface InjectableDecorator {
58
+ (constructor: T): T
59
+ }
60
+ // Inject decorator
61
+ export declare interface InjectDecorator<T = any> {
62
+ (token: string | symbol | ((...args: any[]) => any)): ParameterDecorator<T>
63
+ }
64
+ // Controller factory
65
+ export declare interface ControllerFactory<T extends BaseController> {
66
+ create: (container?: DependencyContainer) => T
67
+ getRoutes: () => ControllerRoute[]
68
+ getMetadata: () => ControllerDecorator
69
+ }
70
+ // Controller registry
71
+ export declare interface ControllerRegistry {
72
+ register: <T extends BaseController>(
73
+ controller: new (...args: any[]) => T,
74
+ metadata?: ControllerDecorator
75
+ ) => void
76
+ get: <T extends BaseController>(
77
+ controller: new (...args: any[]) => T
78
+ ) => ControllerFactory<T> | undefined
79
+ getAll: () => Array<{
80
+ controller: new (...args: any[]) => BaseController
81
+ factory: ControllerFactory<BaseController>
82
+ }>
83
+ resolve: (container?: DependencyContainer) => ControllerRoute[]
84
+ }
85
+ // Controller OpenAPI generation
86
+ export declare interface GenerateControllerOpenAPI<T extends BaseController> {
87
+ paths: {
88
+ [K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, any>
89
+ ? {
90
+ [M in RouteMethod]: {
91
+ operationId: string & K
92
+ parameters: Array<{
93
+ name: keyof ExtractTypedParams<TPath>
94
+ in: 'path'
95
+ required: true
96
+ schema: { type: 'string' }
97
+ }> | Array<{
98
+ name: keyof ExtractQueryParams<TQuery>
99
+ in: 'query'
100
+ required: boolean
101
+ schema: { type: 'string' }
102
+ }>
103
+ requestBody?: TBody extends never ? never : {
104
+ content: {
105
+ 'application/json': { schema: any }
106
+ }
107
+ }
108
+ responses: {
109
+ 200: {
110
+ description: 'Success'
111
+ content: {
112
+ 'application/json': { schema: any }
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ : never
119
+ }
120
+ }
121
+ // Controller testing utilities
122
+ export declare interface ControllerTestUtils<T extends BaseController> {
123
+ createInstance: (overrides?: Partial<T>) => T
124
+ mockMethod: <K extends keyof T>(method: K, implementation: T[K]) => void
125
+ callMethod: <K extends keyof T>(
126
+ method: K,
127
+ ...args: T[K] extends (...args: infer TArgs) => any ? TArgs : never
128
+ ) => T[K] extends (...args: any[]) => infer TReturn ? TReturn : never
129
+ getRoutes: () => ControllerRoute[]
130
+ validateRoutes: () => ControllerValidationError<T>[]
131
+ }
132
+ // Controller performance monitoring
133
+ export declare interface ControllerPerformanceMetrics {
134
+ controllerName: string
135
+ methodName: string
136
+ executionTime: number
137
+ memoryUsage: number
138
+ callCount: number
139
+ errorCount: number
140
+ lastCalled: Date
141
+ }
142
+ // Controller lifecycle hooks
143
+ export declare interface ControllerLifecycleHooks {
144
+ onInit?: () => Promise<void> | void
145
+ onDestroy?: () => Promise<void> | void
146
+ beforeMethod?: (methodName: string, args: any[]) => Promise<void> | void
147
+ afterMethod?: (methodName: string, result: any, args: any[]) => Promise<void> | void
148
+ onError?: (error: Error, methodName: string, args: any[]) => Promise<void> | void
149
+ }
150
+ // Extract controller method names
151
+ export type ControllerMethodNames<T> = {
152
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never
153
+ }[keyof T]
154
+ // Extract controller methods
155
+ export type ControllerMethods<T> = Pick<T, ControllerMethodNames<T>>
156
+ // Controller method signature validation
157
+ export type ValidateControllerMethod<T> = T extends (
158
+ request: infer TRequest,
159
+ ...args: any[]
160
+ ) => infer TReturn
161
+ ? TRequest extends TypedRequest<any, any, any, any>
162
+ ? TReturn extends Promise<Response> | Response
163
+ ? T
164
+ : `Invalid return type: Controller method must return Response or Promise<Response>`
165
+ : `Invalid parameter type: First parameter must be TypedRequest`
166
+ : `Invalid method signature: Controller method must be a function`
167
+ // Controller method type inference
168
+ export type InferControllerMethodType<T> = T extends (
169
+ request: TypedRequest<infer TPath, infer TQuery, infer TBody, infer TContext>,
170
+ ...args: any[]
171
+ ) => Promise<Response> | Response
172
+ ? {
173
+ path: TPath
174
+ query: TQuery
175
+ body: TBody
176
+ context: TContext
177
+ params: ExtractTypedParams<TPath>
178
+ }
179
+ : never
180
+ // Route method decorators
181
+ export type RouteDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = <T extends BaseController>(
182
+ target: T,
183
+ propertyKey: keyof T,
184
+ descriptor: TypedPropertyDescriptor<RouteHandler<TPath, TQuery, TBody, any>>
185
+ ) => void
186
+ // HTTP method decorators
187
+ export type GetDecorator<TPath extends string, TQuery extends Record<string, any> = object> = RouteDecorator<TPath, TQuery, never>
188
+ export type PostDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>
189
+ export type PutDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>
190
+ export type PatchDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>
191
+ export type DeleteDecorator<TPath extends string, TQuery extends Record<string, any> = object> = RouteDecorator<TPath, TQuery, never>
192
+ // Parameter extraction types
193
+ export type ParamDecorator<_TName extends string> = ParameterDecorator<string>
194
+ export type QueryDecorator<_TName extends string> = ParameterDecorator<string>
195
+ export type BodyDecorator<T = any> = ParameterDecorator<T>
196
+ export type HeaderDecorator<_TName extends string> = ParameterDecorator<string>
197
+ export type CookieDecorator<_TName extends string> = ParameterDecorator<string>
198
+ export type RequestDecorator = ParameterDecorator<Request>
199
+ export type ResponseDecorator = ParameterDecorator<Response>
200
+ // Controller method parameter types
201
+ export type ControllerMethodParams<T> = T extends (
202
+ ...args: infer TParams
203
+ ) => any
204
+ ? TParams
205
+ : never
206
+ // Validate controller method parameters
207
+ export type ValidateControllerParams<T extends any[]> = {
208
+ [K in keyof T]: T[K] extends TypedRequest<any, any, any, any>
209
+ ? T[K]
210
+ : T[K] extends string | number | boolean | object
211
+ ? T[K]
212
+ : `Invalid parameter type at index ${K}: ${T[K]}`
213
+ }
214
+ // Controller method validation at compile time
215
+ export type ValidateController<T extends BaseController> = {
216
+ [K in keyof T]: T[K] extends (...args: any[]) => any
217
+ ? ValidateControllerMethod<T[K]> extends string
218
+ ? ValidateControllerMethod<T[K]>
219
+ : T[K]
220
+ : T[K]
221
+ }
222
+ // Controller route extraction
223
+ export type ExtractControllerRoutes<T extends BaseController> = {
224
+ [K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
225
+ ? ControllerRoute<TPath, TQuery, TBody, TContext>
226
+ : never
227
+ }[keyof T]
228
+ // Controller method binding
229
+ export type BindControllerMethod<TController extends BaseController, TMethod extends keyof TController> = TController[TMethod] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
230
+ ? (this: TController, request: TypedRequest<TPath, TQuery, TBody, TContext>) => Promise<Response> | Response
231
+ : never
232
+ // Controller instance type
233
+ export type ControllerInstance<T extends BaseController> = {
234
+ [K in keyof T]: T[K] extends (...args: any[]) => any
235
+ ? BindControllerMethod<T, K>
236
+ : T[K]
237
+ }
238
+ // Controller method metadata extraction
239
+ export type ExtractMethodMetadata<T extends BaseController> = {
240
+ [K in keyof T]: T[K] extends (...args: any[]) => any
241
+ ? InferControllerMethodType<T[K]> extends never
242
+ ? never
243
+ : {
244
+ method: K
245
+ route: InferControllerMethodType<T[K]>
246
+ metadata?: ControllerMethodMetadata
247
+ }
248
+ : never
249
+ }[keyof T]
250
+ // Controller validation errors
251
+ export type ControllerValidationError<T extends BaseController> = {
252
+ [K in keyof T]: ValidateController<T>[K] extends string
253
+ ? { method: K, error: ValidateController<T>[K] }
254
+ : never
255
+ }[keyof T]
256
+ // Controller type guards
257
+ export type IsValidController<T> = T extends BaseController
258
+ ? ControllerValidationError<T> extends never
259
+ ? true
260
+ : false
261
+ : false
262
+ export type IsValidControllerMethod<T> = ValidateControllerMethod<T> extends string
263
+ ? false
264
+ : true
265
+ // Controller composition
266
+ export type ComposeControllers<T extends readonly BaseController[]> = T extends readonly [
267
+ infer First,
268
+ ...infer Rest,
269
+ ]
270
+ ? First extends BaseController
271
+ ? Rest extends readonly BaseController[]
272
+ ? First & ComposeControllers<Rest>
273
+ : First
274
+ : object
275
+ : object
276
+ // Controller middleware application
277
+ export type ApplyControllerMiddleware<TController extends BaseController, TMiddleware extends TypedMiddleware<any, any, any, any>> = {
278
+ [K in keyof TController]: TController[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext>
279
+ ? TMiddleware extends TypedMiddleware<any, any, infer TNewContext, any>
280
+ ? RouteHandler<TPath, TQuery, TBody, TContext & TNewContext>
281
+ : TController[K]
282
+ : TController[K]
283
+ }
284
+ // Controller route conflict detection
285
+ export type DetectControllerConflicts<T extends BaseController> = {
286
+ [K in keyof T]: {
287
+ [J in keyof T]: K extends J
288
+ ? never
289
+ : T[K] extends RouteHandler<infer Path1, any, any, any>
290
+ ? T[J] extends RouteHandler<infer Path2, any, any, any>
291
+ ? Path1 extends Path2
292
+ ? `Route conflict in controller: methods "${string & K}" and "${string & J}" both handle "${Path1}"`
293
+ : never
294
+ : never
295
+ : never
296
+ }[keyof T]
297
+ }[keyof T]
298
+ export type PerformanceTrackingController<T extends BaseController> = T & {
299
+ getPerformanceMetrics: () => ControllerPerformanceMetrics[]
300
+ resetMetrics: () => void
301
+ }
302
+ // Controller with lifecycle
303
+ export type LifecycleController<T extends BaseController> = T & ControllerLifecycleHooks