@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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Parameter Type Inference
|
|
3
|
+
*
|
|
4
|
+
* Advanced TypeScript utilities for inferring route parameter types from URL patterns
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Base types for route parameter extraction
|
|
8
|
+
export type ExtractRouteParams<T extends string> = T extends `${infer _Start}:${infer Param}/${infer Rest}`
|
|
9
|
+
? { [K in Param]: string } & ExtractRouteParams<`/${Rest}`>
|
|
10
|
+
: T extends `${infer _Start}:${infer Param}?${infer Rest}`
|
|
11
|
+
? { [K in Param]?: string } & ExtractRouteParams<Rest>
|
|
12
|
+
: T extends `${infer _Start}:${infer Param}`
|
|
13
|
+
? { [K in Param]: string }
|
|
14
|
+
: T extends `${infer _Start}*${infer Rest}`
|
|
15
|
+
? { '*': string } & ExtractRouteParams<Rest>
|
|
16
|
+
: Record<string, never>
|
|
17
|
+
|
|
18
|
+
// Advanced parameter extraction with type constraints
|
|
19
|
+
export type ExtractTypedParams<T extends string> = T extends `${infer _Start}:${infer Param}<${infer Type}>${infer Rest}`
|
|
20
|
+
? { [K in Param]: ParseParamType<Type> } & ExtractTypedParams<Rest>
|
|
21
|
+
: T extends `${infer _Start}:${infer Param}/${infer Rest}`
|
|
22
|
+
? { [K in Param]: string } & ExtractTypedParams<`/${Rest}`>
|
|
23
|
+
: T extends `${infer _Start}:${infer Param}?${infer Rest}`
|
|
24
|
+
? { [K in Param]?: string } & ExtractTypedParams<Rest>
|
|
25
|
+
: T extends `${infer _Start}:${infer Param}`
|
|
26
|
+
? { [K in Param]: string }
|
|
27
|
+
: Record<string, never>
|
|
28
|
+
|
|
29
|
+
// Type parsing for parameter constraints
|
|
30
|
+
export type ParseParamType<T extends string> =
|
|
31
|
+
T extends 'number' | 'int' | 'integer' ? number :
|
|
32
|
+
T extends 'boolean' | 'bool' ? boolean :
|
|
33
|
+
T extends 'date' ? Date :
|
|
34
|
+
T extends 'uuid' ? string :
|
|
35
|
+
T extends 'email' ? string :
|
|
36
|
+
T extends 'url' ? string :
|
|
37
|
+
T extends `enum(${infer Values})` ? ParseEnumValues<Values> :
|
|
38
|
+
T extends `range(${infer _Min},${infer _Max})` ? number :
|
|
39
|
+
T extends `length(${infer _MinMax})` ? string :
|
|
40
|
+
T extends `pattern(${infer _Pattern})` ? string :
|
|
41
|
+
string
|
|
42
|
+
|
|
43
|
+
// Enum value parsing
|
|
44
|
+
export type ParseEnumValues<T extends string> = T extends `${infer First}|${infer Rest}`
|
|
45
|
+
? First | ParseEnumValues<Rest>
|
|
46
|
+
: T
|
|
47
|
+
|
|
48
|
+
// Query parameter extraction
|
|
49
|
+
export type ExtractQueryParams<T extends Record<string, any>> = {
|
|
50
|
+
[K in keyof T]: T[K] extends 'string' ? string :
|
|
51
|
+
T[K] extends 'number' ? number :
|
|
52
|
+
T[K] extends 'boolean' ? boolean :
|
|
53
|
+
T[K] extends 'string[]' ? string[] :
|
|
54
|
+
T[K] extends 'number[]' ? number[] :
|
|
55
|
+
T[K] extends { type: infer Type, required: true } ?
|
|
56
|
+
Type extends 'string' ? string :
|
|
57
|
+
Type extends 'number' ? number :
|
|
58
|
+
Type extends 'boolean' ? boolean : string :
|
|
59
|
+
T[K] extends { type: infer Type, required: false } ?
|
|
60
|
+
Type extends 'string' ? string | undefined :
|
|
61
|
+
Type extends 'number' ? number | undefined :
|
|
62
|
+
Type extends 'boolean' ? boolean | undefined : string | undefined :
|
|
63
|
+
string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Route pattern validation
|
|
67
|
+
export type ValidateRoutePattern<T extends string> =
|
|
68
|
+
T extends `${infer _}:${infer _Param}:${infer _}`
|
|
69
|
+
? `Invalid route pattern: consecutive parameters not allowed in "${T}"`
|
|
70
|
+
: T extends `${infer _}::${infer _}`
|
|
71
|
+
? `Invalid route pattern: empty parameter name in "${T}"`
|
|
72
|
+
: T extends `${infer _}:${infer Param}`
|
|
73
|
+
? Param extends `${infer Name}${infer Rest}`
|
|
74
|
+
? Name extends ''
|
|
75
|
+
? `Invalid route pattern: empty parameter name in "${T}"`
|
|
76
|
+
: Rest extends `<${infer Type}>`
|
|
77
|
+
? ValidateParamType<Type> extends never
|
|
78
|
+
? `Invalid parameter type "${Type}" in route "${T}"`
|
|
79
|
+
: T
|
|
80
|
+
: T
|
|
81
|
+
: T
|
|
82
|
+
: T
|
|
83
|
+
|
|
84
|
+
// Parameter type validation
|
|
85
|
+
export type ValidateParamType<T extends string> =
|
|
86
|
+
T extends 'string' | 'number' | 'int' | 'integer' | 'boolean' | 'bool' | 'date' | 'uuid' | 'email' | 'url'
|
|
87
|
+
? T
|
|
88
|
+
: T extends `enum(${infer Values})`
|
|
89
|
+
? Values extends '' ? never : T
|
|
90
|
+
: T extends `range(${infer Min},${infer Max})`
|
|
91
|
+
? Min extends `${number}`
|
|
92
|
+
? Max extends `${number}` ? T : never
|
|
93
|
+
: never
|
|
94
|
+
: T extends `length(${infer MinMax})`
|
|
95
|
+
? MinMax extends `${number}` | `${number},${number}` ? T : never
|
|
96
|
+
: T extends `pattern(${infer Pattern})`
|
|
97
|
+
? Pattern extends '' ? never : T
|
|
98
|
+
: never
|
|
99
|
+
|
|
100
|
+
// Route method types
|
|
101
|
+
export type RouteMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'
|
|
102
|
+
|
|
103
|
+
// Route handler type with inferred parameters
|
|
104
|
+
export type RouteHandler<
|
|
105
|
+
TPath extends string,
|
|
106
|
+
TQuery extends Record<string, any> = Record<string, never>,
|
|
107
|
+
TBody = unknown,
|
|
108
|
+
TContext = Record<string, never>,
|
|
109
|
+
> = (_request: TypedRequest<TPath, TQuery, TBody, TContext>) => Promise<Response> | Response
|
|
110
|
+
|
|
111
|
+
// Typed request interface
|
|
112
|
+
export interface TypedRequest<
|
|
113
|
+
TPath extends string = string,
|
|
114
|
+
TQuery extends Record<string, any> = Record<string, never>,
|
|
115
|
+
TBody = unknown,
|
|
116
|
+
TContext = Record<string, never>,
|
|
117
|
+
> extends Omit<Request, 'body'> {
|
|
118
|
+
params: ExtractTypedParams<TPath>
|
|
119
|
+
query: ExtractQueryParams<TQuery>
|
|
120
|
+
body: TBody
|
|
121
|
+
context: TContext
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Route definition with type inference
|
|
125
|
+
export interface TypedRoute<
|
|
126
|
+
TPath extends string,
|
|
127
|
+
TQuery extends Record<string, any> = Record<string, never>,
|
|
128
|
+
TBody = unknown,
|
|
129
|
+
TContext = Record<string, never>,
|
|
130
|
+
> {
|
|
131
|
+
method: RouteMethod
|
|
132
|
+
path: ValidateRoutePattern<TPath>
|
|
133
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>
|
|
134
|
+
middleware?: TypedMiddleware<any, any, any, TContext>[]
|
|
135
|
+
schema?: {
|
|
136
|
+
params?: RouteParamSchema<ExtractTypedParams<TPath>>
|
|
137
|
+
query?: TQuery
|
|
138
|
+
body?: BodySchema<TBody>
|
|
139
|
+
response?: ResponseSchema
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Parameter schema for validation
|
|
144
|
+
export type RouteParamSchema<T extends Record<string, any>> = {
|
|
145
|
+
[K in keyof T]: {
|
|
146
|
+
type: T[K] extends string ? 'string' :
|
|
147
|
+
T[K] extends number ? 'number' :
|
|
148
|
+
T[K] extends boolean ? 'boolean' :
|
|
149
|
+
T[K] extends Date ? 'date' : 'string'
|
|
150
|
+
required?: boolean
|
|
151
|
+
pattern?: string
|
|
152
|
+
min?: number
|
|
153
|
+
max?: number
|
|
154
|
+
enum?: T[K][]
|
|
155
|
+
transform?: (value: string) => T[K]
|
|
156
|
+
validate?: (value: T[K]) => boolean | string
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Body schema types
|
|
161
|
+
export interface BodySchema<T = unknown> {
|
|
162
|
+
type: 'json' | 'form' | 'text' | 'buffer' | 'stream'
|
|
163
|
+
schema?: T extends object ? {
|
|
164
|
+
[K in keyof T]: {
|
|
165
|
+
type: T[K] extends string ? 'string' :
|
|
166
|
+
T[K] extends number ? 'number' :
|
|
167
|
+
T[K] extends boolean ? 'boolean' :
|
|
168
|
+
T[K] extends Date ? 'date' :
|
|
169
|
+
T[K] extends Array<infer _U> ? 'array' : 'object'
|
|
170
|
+
required?: boolean
|
|
171
|
+
items?: T[K] extends Array<infer _U> ? BodySchema<_U> : never
|
|
172
|
+
properties?: T[K] extends object ? BodySchema<T[K]> : never
|
|
173
|
+
}
|
|
174
|
+
} : never
|
|
175
|
+
required?: (keyof T)[]
|
|
176
|
+
additionalProperties?: boolean
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Response schema types
|
|
180
|
+
export interface ResponseSchema {
|
|
181
|
+
[statusCode: number]: {
|
|
182
|
+
description?: string
|
|
183
|
+
headers?: Record<string, string>
|
|
184
|
+
content?: {
|
|
185
|
+
'application/json'?: any
|
|
186
|
+
'text/plain'?: string
|
|
187
|
+
'text/html'?: string
|
|
188
|
+
'application/octet-stream'?: ArrayBuffer
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Utility types for route building
|
|
194
|
+
export type InferRouteParams<T> = T extends TypedRoute<infer Path, any, any, any>
|
|
195
|
+
? ExtractTypedParams<Path>
|
|
196
|
+
: never
|
|
197
|
+
|
|
198
|
+
export type InferRouteQuery<T> = T extends TypedRoute<any, infer Query, any, any>
|
|
199
|
+
? ExtractQueryParams<Query>
|
|
200
|
+
: never
|
|
201
|
+
|
|
202
|
+
export type InferRouteBody<T> = T extends TypedRoute<any, any, infer Body, any>
|
|
203
|
+
? Body
|
|
204
|
+
: never
|
|
205
|
+
|
|
206
|
+
export type InferRouteContext<T> = T extends TypedRoute<any, any, any, infer Context>
|
|
207
|
+
? Context
|
|
208
|
+
: never
|
|
209
|
+
|
|
210
|
+
// Route group types
|
|
211
|
+
export interface RouteGroup<TPrefix extends string = '', TContext = object> {
|
|
212
|
+
prefix: TPrefix
|
|
213
|
+
middleware?: TypedMiddleware<any, any, any, TContext>[]
|
|
214
|
+
routes: TypedRoute<any, any, any, TContext>[]
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Middleware type (forward declaration - will be defined in middleware types)
|
|
218
|
+
export interface TypedMiddleware<
|
|
219
|
+
TRequest = any,
|
|
220
|
+
TResponse = any,
|
|
221
|
+
TNext = any,
|
|
222
|
+
_TContext = Record<string, never>,
|
|
223
|
+
> {
|
|
224
|
+
(request: TRequest, next: TNext): Promise<TResponse> | TResponse
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Route builder helper types
|
|
228
|
+
export interface RouteBuilder<TContext = object> {
|
|
229
|
+
get: <TPath extends string, TQuery extends Record<string, any> = object>(
|
|
230
|
+
path: ValidateRoutePattern<TPath>,
|
|
231
|
+
handler: RouteHandler<TPath, TQuery, never, TContext>
|
|
232
|
+
) => TypedRoute<TPath, TQuery, never, TContext>
|
|
233
|
+
|
|
234
|
+
post: <TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown>(
|
|
235
|
+
path: ValidateRoutePattern<TPath>,
|
|
236
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>
|
|
237
|
+
) => TypedRoute<TPath, TQuery, TBody, TContext>
|
|
238
|
+
|
|
239
|
+
put: <TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown>(
|
|
240
|
+
path: ValidateRoutePattern<TPath>,
|
|
241
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>
|
|
242
|
+
) => TypedRoute<TPath, TQuery, TBody, TContext>
|
|
243
|
+
|
|
244
|
+
patch: <TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown>(
|
|
245
|
+
path: ValidateRoutePattern<TPath>,
|
|
246
|
+
handler: RouteHandler<TPath, TQuery, TBody, TContext>
|
|
247
|
+
) => TypedRoute<TPath, TQuery, TBody, TContext>
|
|
248
|
+
|
|
249
|
+
delete: <TPath extends string, TQuery extends Record<string, any> = object>(
|
|
250
|
+
path: ValidateRoutePattern<TPath>,
|
|
251
|
+
handler: RouteHandler<TPath, TQuery, never, TContext>
|
|
252
|
+
) => TypedRoute<TPath, TQuery, never, TContext>
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Advanced pattern matching types
|
|
256
|
+
export type MatchRoute<TPattern extends string, TPath extends string> =
|
|
257
|
+
TPattern extends `${infer Start}:${infer _Param}/${infer Rest}`
|
|
258
|
+
? TPath extends `${Start}${infer Value}/${infer PathRest}`
|
|
259
|
+
? Value extends ''
|
|
260
|
+
? false
|
|
261
|
+
: MatchRoute<`/${Rest}`, `/${PathRest}`>
|
|
262
|
+
: false
|
|
263
|
+
: TPattern extends `${infer Start}:${infer _Param}`
|
|
264
|
+
? TPath extends `${Start}${infer Value}`
|
|
265
|
+
? Value extends '' ? false : true
|
|
266
|
+
: false
|
|
267
|
+
: TPattern extends TPath
|
|
268
|
+
? true
|
|
269
|
+
: false
|
|
270
|
+
|
|
271
|
+
// Route parameter extraction at runtime
|
|
272
|
+
export type ExtractParamsFromPath<TPattern extends string, TPath extends string> =
|
|
273
|
+
TPattern extends `${infer Start}:${infer _Param}/${infer Rest}`
|
|
274
|
+
? TPath extends `${Start}${infer Value}/${infer PathRest}`
|
|
275
|
+
? { [K in _Param]: Value } & ExtractParamsFromPath<`/${Rest}`, `/${PathRest}`>
|
|
276
|
+
: Record<string, never>
|
|
277
|
+
: TPattern extends `${infer Start}:${infer _Param}`
|
|
278
|
+
? TPath extends `${Start}${infer Value}`
|
|
279
|
+
? { [K in _Param]: Value }
|
|
280
|
+
: Record<string, never>
|
|
281
|
+
: Record<string, never>
|
|
282
|
+
|
|
283
|
+
// Type-safe route registration
|
|
284
|
+
export interface TypeSafeRouter<TContext = object> {
|
|
285
|
+
register: <TPath extends string, TQuery extends Record<string, any> = object, TBody = unknown>(
|
|
286
|
+
route: TypedRoute<TPath, TQuery, TBody, TContext>
|
|
287
|
+
) => void
|
|
288
|
+
|
|
289
|
+
group: <TPrefix extends string>(
|
|
290
|
+
prefix: TPrefix,
|
|
291
|
+
configure: (builder: RouteBuilder<TContext>) => void
|
|
292
|
+
) => RouteGroup<TPrefix, TContext>
|
|
293
|
+
|
|
294
|
+
use: <TNewContext>(
|
|
295
|
+
middleware: TypedMiddleware<any, any, any, TNewContext>
|
|
296
|
+
) => TypeSafeRouter<TContext & TNewContext>
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Compile-time route validation
|
|
300
|
+
export type ValidateRoutes<T extends readonly TypedRoute<any, any, any, any>[]> = {
|
|
301
|
+
[K in keyof T]: T[K] extends TypedRoute<infer Path, any, any, any>
|
|
302
|
+
? ValidateRoutePattern<Path> extends `Invalid ${string}`
|
|
303
|
+
? ValidateRoutePattern<Path>
|
|
304
|
+
: T[K]
|
|
305
|
+
: T[K]
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Route conflict detection
|
|
309
|
+
export type DetectRouteConflicts<T extends readonly TypedRoute<any, any, any, any>[]> = {
|
|
310
|
+
[K in keyof T]: {
|
|
311
|
+
[J in keyof T]: K extends J
|
|
312
|
+
? never
|
|
313
|
+
: T[K] extends TypedRoute<infer Path1, any, any, any>
|
|
314
|
+
? T[J] extends TypedRoute<infer Path2, any, any, any>
|
|
315
|
+
? Path1 extends Path2
|
|
316
|
+
? `Route conflict: "${Path1}" is defined multiple times`
|
|
317
|
+
: never
|
|
318
|
+
: never
|
|
319
|
+
: never
|
|
320
|
+
}[keyof T]
|
|
321
|
+
}[keyof T]
|
|
322
|
+
|
|
323
|
+
// OpenAPI schema generation types
|
|
324
|
+
export interface GenerateOpenAPISchema<T extends TypedRoute<any, any, any, any>> {
|
|
325
|
+
paths: {
|
|
326
|
+
[K in T extends TypedRoute<infer Path, any, any, any> ? Path : never]: {
|
|
327
|
+
[M in T extends TypedRoute<any, any, any, any> ? Lowercase<T['method']> : never]: {
|
|
328
|
+
parameters?: Array<{
|
|
329
|
+
name: string
|
|
330
|
+
in: 'path' | 'query'
|
|
331
|
+
required: boolean
|
|
332
|
+
schema: { type: string, format?: string }
|
|
333
|
+
}>
|
|
334
|
+
requestBody?: {
|
|
335
|
+
content: {
|
|
336
|
+
'application/json': { schema: any }
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
responses: {
|
|
340
|
+
[status: number]: {
|
|
341
|
+
description: string
|
|
342
|
+
content?: {
|
|
343
|
+
'application/json': { schema: any }
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Type utilities for testing
|
|
353
|
+
export type AssertEqual<T, U> = T extends U ? U extends T ? true : false : false
|
|
354
|
+
export type AssertExtends<T, U> = T extends U ? true : false
|
|
355
|
+
export type AssertNotEqual<T, U> = AssertEqual<T, U> extends true ? false : true
|
|
356
|
+
|
|
357
|
+
// All types are already exported individually above
|