@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,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller Method Type Checking at Compile Time
|
|
3
|
+
*
|
|
4
|
+
* Advanced TypeScript utilities for compile-time controller method validation
|
|
5
|
+
*/
|
|
6
|
+
import type { TypedMiddleware } from './middleware-types';
|
|
7
|
+
import type { ExtractQueryParams, ExtractTypedParams, RouteHandler, RouteMethod, TypedRequest } from './route-inference';
|
|
8
|
+
export interface BaseController {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export interface ControllerMethodMetadata {
|
|
12
|
+
path: string;
|
|
13
|
+
method: RouteMethod;
|
|
14
|
+
middleware?: TypedMiddleware<any, any, any, any>[];
|
|
15
|
+
description?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
deprecated?: boolean;
|
|
18
|
+
operationId?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MethodDecoratorMetadata extends ControllerMethodMetadata {
|
|
21
|
+
parameterTypes?: any[];
|
|
22
|
+
returnType?: any;
|
|
23
|
+
target: any;
|
|
24
|
+
propertyKey: string | symbol;
|
|
25
|
+
}
|
|
26
|
+
export type ControllerMethodNames<T> = {
|
|
27
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any ? K : never;
|
|
28
|
+
}[keyof T];
|
|
29
|
+
export type ControllerMethods<T> = Pick<T, ControllerMethodNames<T>>;
|
|
30
|
+
export type ValidateControllerMethod<T> = T extends (request: infer TRequest, ...args: any[]) => infer TReturn ? TRequest extends TypedRequest<any, any, any, any> ? TReturn extends Promise<Response> | Response ? T : `Invalid return type: Controller method must return Response or Promise<Response>` : `Invalid parameter type: First parameter must be TypedRequest` : `Invalid method signature: Controller method must be a function`;
|
|
31
|
+
export type InferControllerMethodType<T> = T extends (request: TypedRequest<infer TPath, infer TQuery, infer TBody, infer TContext>, ...args: any[]) => Promise<Response> | Response ? {
|
|
32
|
+
path: TPath;
|
|
33
|
+
query: TQuery;
|
|
34
|
+
body: TBody;
|
|
35
|
+
context: TContext;
|
|
36
|
+
params: ExtractTypedParams<TPath>;
|
|
37
|
+
} : never;
|
|
38
|
+
export interface ControllerRoute<TPath extends string = string, TQuery extends Record<string, any> = object, TBody = unknown, TContext = object> {
|
|
39
|
+
method: RouteMethod;
|
|
40
|
+
path: TPath;
|
|
41
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>;
|
|
42
|
+
controllerMethod: string;
|
|
43
|
+
middleware?: TypedMiddleware<any, any, any, any>[];
|
|
44
|
+
metadata?: ControllerMethodMetadata;
|
|
45
|
+
}
|
|
46
|
+
export interface ControllerDecorator<TPrefix extends string = ''> {
|
|
47
|
+
prefix?: TPrefix;
|
|
48
|
+
middleware?: TypedMiddleware<any, any, any, any>[];
|
|
49
|
+
tags?: string[];
|
|
50
|
+
description?: string;
|
|
51
|
+
}
|
|
52
|
+
export type RouteDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = <T extends BaseController>(target: T, propertyKey: keyof T, descriptor: TypedPropertyDescriptor<RouteHandler<TPath, TQuery, TBody, any>>) => void;
|
|
53
|
+
export type GetDecorator<TPath extends string, TQuery extends Record<string, any> = object> = RouteDecorator<TPath, TQuery, never>;
|
|
54
|
+
export type PostDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>;
|
|
55
|
+
export type PutDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>;
|
|
56
|
+
export type PatchDecorator<TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown> = RouteDecorator<TPath, TQuery, TBody>;
|
|
57
|
+
export type DeleteDecorator<TPath extends string, TQuery extends Record<string, any> = object> = RouteDecorator<TPath, TQuery, never>;
|
|
58
|
+
export interface ParameterDecorator<_T = any> {
|
|
59
|
+
<TController extends BaseController>(target: TController, propertyKey: keyof TController, parameterIndex: number): void;
|
|
60
|
+
}
|
|
61
|
+
export type ParamDecorator<_TName extends string> = ParameterDecorator<string>;
|
|
62
|
+
export type QueryDecorator<_TName extends string> = ParameterDecorator<string>;
|
|
63
|
+
export type BodyDecorator<T = any> = ParameterDecorator<T>;
|
|
64
|
+
export type HeaderDecorator<_TName extends string> = ParameterDecorator<string>;
|
|
65
|
+
export type CookieDecorator<_TName extends string> = ParameterDecorator<string>;
|
|
66
|
+
export type RequestDecorator = ParameterDecorator<Request>;
|
|
67
|
+
export type ResponseDecorator = ParameterDecorator<Response>;
|
|
68
|
+
export type ControllerMethodParams<T> = T extends (...args: infer TParams) => any ? TParams : never;
|
|
69
|
+
export type ValidateControllerParams<T extends any[]> = {
|
|
70
|
+
[K in keyof T]: T[K] extends TypedRequest<any, any, any, any> ? T[K] : T[K] extends string | number | boolean | object ? T[K] : `Invalid parameter type at index ${K}: ${T[K]}`;
|
|
71
|
+
};
|
|
72
|
+
export interface ControllerDependency<T = any> {
|
|
73
|
+
token: string | symbol | ((..._args: any[]) => any);
|
|
74
|
+
value?: T;
|
|
75
|
+
factory?: () => T;
|
|
76
|
+
singleton?: boolean;
|
|
77
|
+
}
|
|
78
|
+
export interface DependencyContainer {
|
|
79
|
+
register: <T>(dependency: ControllerDependency<T>) => void;
|
|
80
|
+
resolve: <T>(token: string | symbol | ((..._args: any[]) => any)) => T;
|
|
81
|
+
has: (token: string | symbol | ((..._args: any[]) => any)) => boolean;
|
|
82
|
+
}
|
|
83
|
+
export interface InjectableDecorator {
|
|
84
|
+
<T extends new (..._args: any[]) => any>(constructor: T): T;
|
|
85
|
+
}
|
|
86
|
+
export interface InjectDecorator<T = any> {
|
|
87
|
+
(token: string | symbol | ((..._args: any[]) => any)): ParameterDecorator<T>;
|
|
88
|
+
}
|
|
89
|
+
export interface ControllerFactory<T extends BaseController> {
|
|
90
|
+
create: (container?: DependencyContainer) => T;
|
|
91
|
+
getRoutes: () => ControllerRoute[];
|
|
92
|
+
getMetadata: () => ControllerDecorator;
|
|
93
|
+
}
|
|
94
|
+
export interface ControllerRegistry {
|
|
95
|
+
register: <T extends BaseController>(controller: new (...args: any[]) => T, metadata?: ControllerDecorator) => void;
|
|
96
|
+
get: <T extends BaseController>(controller: new (...args: any[]) => T) => ControllerFactory<T> | undefined;
|
|
97
|
+
getAll: () => Array<{
|
|
98
|
+
controller: new (...args: any[]) => BaseController;
|
|
99
|
+
factory: ControllerFactory<BaseController>;
|
|
100
|
+
}>;
|
|
101
|
+
resolve: (container?: DependencyContainer) => ControllerRoute[];
|
|
102
|
+
}
|
|
103
|
+
export type ValidateController<T extends BaseController> = {
|
|
104
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any ? ValidateControllerMethod<T[K]> extends string ? ValidateControllerMethod<T[K]> : T[K] : T[K];
|
|
105
|
+
};
|
|
106
|
+
export type ExtractControllerRoutes<T extends BaseController> = {
|
|
107
|
+
[K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext> ? ControllerRoute<TPath, TQuery, TBody, TContext> : never;
|
|
108
|
+
}[keyof T];
|
|
109
|
+
export type BindControllerMethod<TController extends BaseController, TMethod extends keyof TController> = TController[TMethod] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext> ? (this: TController, _request: TypedRequest<TPath, TQuery, TBody, TContext>) => Promise<Response> | Response : never;
|
|
110
|
+
export type ControllerInstance<T extends BaseController> = {
|
|
111
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any ? BindControllerMethod<T, K> : T[K];
|
|
112
|
+
};
|
|
113
|
+
export type ExtractMethodMetadata<T extends BaseController> = {
|
|
114
|
+
[K in keyof T]: T[K] extends (..._args: any[]) => any ? InferControllerMethodType<T[K]> extends never ? never : {
|
|
115
|
+
method: K;
|
|
116
|
+
route: InferControllerMethodType<T[K]>;
|
|
117
|
+
metadata?: ControllerMethodMetadata;
|
|
118
|
+
} : never;
|
|
119
|
+
}[keyof T];
|
|
120
|
+
export type ControllerValidationError<T extends BaseController> = {
|
|
121
|
+
[K in keyof T]: ValidateController<T>[K] extends string ? {
|
|
122
|
+
method: K;
|
|
123
|
+
error: ValidateController<T>[K];
|
|
124
|
+
} : never;
|
|
125
|
+
}[keyof T];
|
|
126
|
+
export type IsValidController<T> = T extends BaseController ? ControllerValidationError<T> extends never ? true : false : false;
|
|
127
|
+
export type IsValidControllerMethod<T> = ValidateControllerMethod<T> extends string ? false : true;
|
|
128
|
+
export type ComposeControllers<T extends readonly BaseController[]> = T extends readonly [
|
|
129
|
+
infer First,
|
|
130
|
+
...infer Rest
|
|
131
|
+
] ? First extends BaseController ? Rest extends readonly BaseController[] ? First & ComposeControllers<Rest> : First : object : object;
|
|
132
|
+
export type ApplyControllerMiddleware<TController extends BaseController, TMiddleware extends TypedMiddleware<any, any, any, any>> = {
|
|
133
|
+
[K in keyof TController]: TController[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, infer TContext> ? TMiddleware extends TypedMiddleware<any, any, infer TNewContext, any> ? RouteHandler<TPath, TQuery, TBody, TContext & TNewContext> : TController[K] : TController[K];
|
|
134
|
+
};
|
|
135
|
+
export type DetectControllerConflicts<T extends BaseController> = {
|
|
136
|
+
[K in keyof T]: {
|
|
137
|
+
[J in keyof T]: K extends J ? never : T[K] extends RouteHandler<infer Path1, any, any, any> ? T[J] extends RouteHandler<infer Path2, any, any, any> ? Path1 extends Path2 ? `Route conflict in controller: methods "${string & K}" and "${string & J}" both handle "${Path1}"` : never : never : never;
|
|
138
|
+
}[keyof T];
|
|
139
|
+
}[keyof T];
|
|
140
|
+
export interface GenerateControllerOpenAPI<T extends BaseController> {
|
|
141
|
+
paths: {
|
|
142
|
+
[K in keyof T]: T[K] extends RouteHandler<infer TPath, infer TQuery, infer TBody, any> ? {
|
|
143
|
+
[M in RouteMethod]: {
|
|
144
|
+
operationId: string & K;
|
|
145
|
+
parameters: Array<{
|
|
146
|
+
name: keyof ExtractTypedParams<TPath>;
|
|
147
|
+
in: 'path';
|
|
148
|
+
required: true;
|
|
149
|
+
schema: {
|
|
150
|
+
type: 'string';
|
|
151
|
+
};
|
|
152
|
+
}> | Array<{
|
|
153
|
+
name: keyof ExtractQueryParams<TQuery>;
|
|
154
|
+
in: 'query';
|
|
155
|
+
required: boolean;
|
|
156
|
+
schema: {
|
|
157
|
+
type: 'string';
|
|
158
|
+
};
|
|
159
|
+
}>;
|
|
160
|
+
requestBody?: TBody extends never ? never : {
|
|
161
|
+
content: {
|
|
162
|
+
'application/json': {
|
|
163
|
+
schema: any;
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
responses: {
|
|
168
|
+
200: {
|
|
169
|
+
description: 'Success';
|
|
170
|
+
content: {
|
|
171
|
+
'application/json': {
|
|
172
|
+
schema: any;
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
} : never;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export interface ControllerTestUtils<T extends BaseController> {
|
|
182
|
+
createInstance: (overrides?: Partial<T>) => T;
|
|
183
|
+
mockMethod: <K extends keyof T>(method: K, implementation: T[K]) => void;
|
|
184
|
+
callMethod: <K extends keyof T>(method: K, ..._args: T[K] extends (..._a: infer TArgs) => any ? TArgs : never) => T[K] extends (..._a: any[]) => infer TReturn ? TReturn : never;
|
|
185
|
+
getRoutes: () => ControllerRoute[];
|
|
186
|
+
validateRoutes: () => ControllerValidationError<T>[];
|
|
187
|
+
}
|
|
188
|
+
export interface ControllerPerformanceMetrics {
|
|
189
|
+
controllerName: string;
|
|
190
|
+
methodName: string;
|
|
191
|
+
executionTime: number;
|
|
192
|
+
memoryUsage: number;
|
|
193
|
+
callCount: number;
|
|
194
|
+
errorCount: number;
|
|
195
|
+
lastCalled: Date;
|
|
196
|
+
}
|
|
197
|
+
export type PerformanceTrackingController<T extends BaseController> = T & {
|
|
198
|
+
getPerformanceMetrics: () => ControllerPerformanceMetrics[];
|
|
199
|
+
resetMetrics: () => void;
|
|
200
|
+
};
|
|
201
|
+
export interface ControllerLifecycleHooks {
|
|
202
|
+
onInit?: () => Promise<void> | void;
|
|
203
|
+
onDestroy?: () => Promise<void> | void;
|
|
204
|
+
beforeMethod?: (methodName: string, args: any[]) => Promise<void> | void;
|
|
205
|
+
afterMethod?: (methodName: string, result: any, args: any[]) => Promise<void> | void;
|
|
206
|
+
onError?: (error: Error, methodName: string, args: any[]) => Promise<void> | void;
|
|
207
|
+
}
|
|
208
|
+
export type LifecycleController<T extends BaseController> = T & ControllerLifecycleHooks;
|