@stacksjs/bun-router 0.0.2 → 0.0.3
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/{chunk-r15a48wc.js → chunk-cjdekj87.js} +536 -98
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.js +454 -119
- package/package.json +6 -8
- package/dist/auth.d.ts +0 -77
- package/dist/cache/lru-cache.d.ts +0 -88
- package/dist/cache/middleware-memoization.d.ts +0 -101
- package/dist/cache/route-cache-warmer.d.ts +0 -125
- package/dist/cache/sqlite-cache.d.ts +0 -114
- package/dist/cache/streaming-cache.d.ts +0 -86
- package/dist/cli/colors.d.ts +0 -12
- package/dist/cli/index.d.ts +0 -10
- package/dist/cli/middleware.d.ts +0 -31
- package/dist/cli/openapi.d.ts +0 -17
- package/dist/cli/router.d.ts +0 -15
- package/dist/cli/routes.d.ts +0 -30
- package/dist/cli/utils.d.ts +0 -68
- package/dist/config.d.ts +0 -274
- package/dist/container/container.d.ts +0 -141
- package/dist/container/contextual-binding.d.ts +0 -112
- package/dist/container/decorators.d.ts +0 -114
- package/dist/container/service-provider.d.ts +0 -221
- package/dist/development/hot-reload.d.ts +0 -129
- package/dist/development/index.d.ts +0 -144
- package/dist/development/performance-profiler.d.ts +0 -152
- package/dist/development/route-debugger.d.ts +0 -102
- package/dist/development/route-inspector.d.ts +0 -142
- package/dist/development/typescript-utilities.d.ts +0 -116
- package/dist/docs.d.ts +0 -10
- package/dist/errors/circuit-breaker.d.ts +0 -138
- package/dist/errors/error-handler.d.ts +0 -57
- package/dist/errors/error-reporting.d.ts +0 -135
- package/dist/errors/exceptions.d.ts +0 -178
- package/dist/errors/graceful-degradation.d.ts +0 -130
- package/dist/errors/index.d.ts +0 -6
- package/dist/errors/router-errors.d.ts +0 -97
- package/dist/file-serving/static-files.d.ts +0 -98
- package/dist/middleware/auth.d.ts +0 -34
- package/dist/middleware/content_security_policy.d.ts +0 -54
- package/dist/middleware/cors.d.ts +0 -5
- package/dist/middleware/csrf.d.ts +0 -7
- package/dist/middleware/ddos_protection.d.ts +0 -47
- package/dist/middleware/file_security.d.ts +0 -23
- package/dist/middleware/file_upload.d.ts +0 -41
- package/dist/middleware/helmet.d.ts +0 -54
- package/dist/middleware/index.d.ts +0 -55
- package/dist/middleware/input_validation.d.ts +0 -46
- package/dist/middleware/json_body.d.ts +0 -4
- package/dist/middleware/performance_alerting.d.ts +0 -88
- package/dist/middleware/performance_dashboard.d.ts +0 -97
- package/dist/middleware/performance_monitor.d.ts +0 -236
- package/dist/middleware/pipeline.d.ts +0 -90
- package/dist/middleware/rate_limit.d.ts +0 -33
- package/dist/middleware/request_id.d.ts +0 -4
- package/dist/middleware/request_signing.d.ts +0 -96
- package/dist/middleware/request_tracer.d.ts +0 -76
- package/dist/middleware/response_cache.d.ts +0 -90
- package/dist/middleware/security.d.ts +0 -70
- package/dist/middleware/security_suite.d.ts +0 -46
- package/dist/middleware/session.d.ts +0 -7
- package/dist/model-binding/index.d.ts +0 -17
- package/dist/model-binding/model-middleware.d.ts +0 -80
- package/dist/model-binding/model-registry.d.ts +0 -125
- package/dist/model-binding.d.ts +0 -123
- package/dist/model-resolver-factory.d.ts +0 -31
- package/dist/observability/correlation.d.ts +0 -131
- package/dist/observability/health-checks.d.ts +0 -129
- package/dist/observability/index.d.ts +0 -92
- package/dist/observability/integration.d.ts +0 -112
- package/dist/observability/metrics.d.ts +0 -135
- package/dist/observability/tracing.d.ts +0 -112
- package/dist/optimization/bun-utilities.d.ts +0 -106
- package/dist/query-builder-integration.d.ts +0 -24
- package/dist/request/enhanced-request.d.ts +0 -143
- package/dist/request/macros.d.ts +0 -267
- package/dist/response/macros.d.ts +0 -207
- package/dist/response/response-factory.d.ts +0 -93
- package/dist/router/file-based-routing.d.ts +0 -40
- package/dist/router/file-streaming.d.ts +0 -6
- package/dist/router/fluent-router.d.ts +0 -179
- package/dist/router/fluent-routing.d.ts +0 -198
- package/dist/router/group-organization.d.ts +0 -5
- package/dist/router/handler-resolver.d.ts +0 -13
- package/dist/router/http-methods.d.ts +0 -10
- package/dist/router/index.d.ts +0 -114
- package/dist/router/middleware-integration.d.ts +0 -86
- package/dist/router/middleware.d.ts +0 -5
- package/dist/router/model-binding.d.ts +0 -7
- package/dist/router/optimized-route-matching.d.ts +0 -6
- package/dist/router/route-building.d.ts +0 -5
- package/dist/router/route-compiler.d.ts +0 -67
- package/dist/router/route-matching.d.ts +0 -5
- package/dist/router/route-trie.d.ts +0 -69
- package/dist/router/router.d.ts +0 -133
- package/dist/router/server.d.ts +0 -5
- package/dist/router/validation-integration.d.ts +0 -116
- package/dist/router/view-rendering.d.ts +0 -5
- package/dist/router/websocket.d.ts +0 -5
- package/dist/routing/route-caching.d.ts +0 -105
- package/dist/routing/route-throttling.d.ts +0 -112
- package/dist/routing/subdomain-routing.d.ts +0 -159
- package/dist/streaming/index.d.ts +0 -15
- package/dist/streaming/sse-handler.d.ts +0 -81
- package/dist/streaming/stream-handler.d.ts +0 -81
- package/dist/testing/auth-testing.d.ts +0 -107
- package/dist/testing/file-upload-testing.d.ts +0 -139
- package/dist/testing/index.d.ts +0 -10
- package/dist/testing/middleware-testing.d.ts +0 -99
- package/dist/testing/model-binding-testing.d.ts +0 -132
- package/dist/testing/performance-testing.d.ts +0 -202
- package/dist/testing/test-client.d.ts +0 -58
- package/dist/testing/test-request.d.ts +0 -43
- package/dist/testing/test-response.d.ts +0 -45
- package/dist/testing/types.d.ts +0 -206
- package/dist/testing/websocket-testing.d.ts +0 -170
- package/dist/types/controller-types.d.ts +0 -303
- package/dist/types/core.d.ts +0 -526
- package/dist/types/middleware-types.d.ts +0 -315
- package/dist/types/request-response-augmentation.d.ts +0 -373
- package/dist/types/route-inference.d.ts +0 -287
- package/dist/types.d.ts +0 -1620
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/query-preservation.d.ts +0 -31
- package/dist/utils.d.ts +0 -69
- package/dist/validation/validator.d.ts +0 -169
- package/dist/websocket/clustering.d.ts +0 -114
|
@@ -1,170 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,303 +0,0 @@
|
|
|
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
|