@minisylar/express-typed-router 1.0.0

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.
@@ -0,0 +1,270 @@
1
+ import express, { NextFunction, Request, Response } from "express";
2
+ import { ZodType, z } from "zod";
3
+
4
+ //#region src/zod-router.d.ts
5
+ /**
6
+ * Extract route parameters from Express.js route patterns.
7
+ *
8
+ * Supports all Express.js routing patterns:
9
+ * - Named parameters: /users/:userId → { userId: string }
10
+ * - Multiple parameters: /users/:userId/books/:bookId → { userId: string; bookId: string }
11
+ * - Parameters with separators: /flights/:from-:to → { from: string; to: string }
12
+ * - Dot notation: /plantae/:genus.:species → { genus: string; species: string }
13
+ * - Regex constraints: /user/:id(\\d+) → { id: string }
14
+ * - Optional parameters: /posts/:year/:month? → { year: string; month?: string }
15
+ * - Wildcard parameters: /files/* → { "0": string }
16
+ * - Multiple wildcards: /a/star/b/star → { "0": string; "1": string }
17
+ */
18
+
19
+ /**
20
+ * Extract route parameters from Express.js route patterns.
21
+ *
22
+ * Supports all Express.js routing patterns:
23
+ * - Named parameters: /users/:userId → { userId: string }
24
+ * - Multiple parameters: /users/:userId/books/:bookId → { userId: string; bookId: string }
25
+ * - Parameters with separators: /flights/:from-:to → { from: string; to: string }
26
+ * - Dot notation: /plantae/:genus.:species → { genus: string; species: string }
27
+ * - Regex constraints: /user/:id(\\d+) → { id: string }
28
+ * - Optional parameters: /posts/:year/:month? → { year: string; month?: string }
29
+ * - Wildcard parameters: /files/* → { "0": string }
30
+ * - Multiple wildcards: /a/star/b/star → { "0": string; "1": string }
31
+ */
32
+ type ExtractRouteParams<Path extends string> = string extends Path ? Record<string, string> : ExtractParams<Path>;
33
+ /**
34
+ * Main parameter extraction logic - enhanced for Express 5 support
35
+ */
36
+ type ExtractParams<Path extends string> = Path extends `${infer Before}{${infer OptionalContent}}${infer After}` ? ExtractOptionalSegment<OptionalContent> & ExtractParams<`${Before}${After}`> : Path extends `${infer _Before}:${infer Rest}` ? ExtractSingleParam<Rest> & ExtractParams<RemoveFirstParam<Path>> : Path extends `${infer _Before}*${infer After}` ? { [K in CountWildcards<_Before>]: string } & ExtractParams<After> : {};
37
+ /**
38
+ * Extract parameters from Express 5 optional segments in braces
39
+ * Handles patterns like {/:param}, {.:ext}, {/optional/:param}
40
+ */
41
+ type ExtractOptionalSegment<Content extends string> = Content extends `/:${infer Rest}` ? ExtractOptionalParam<Rest> : Content extends `.:${infer Rest}` ? ExtractOptionalParam<Rest> : Content extends `${infer _Path}:${infer Rest}` ? ExtractOptionalParam<Rest> : {};
42
+ /**
43
+ * Extract a single optional parameter from brace content
44
+ */
45
+ type ExtractOptionalParam<Rest extends string> = Rest extends `${infer ParamName}/${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}-${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}.${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}` ? { [K in ParamName]?: string } : {};
46
+ /**
47
+ * Extract a single parameter name from the rest of the path
48
+ * Enhanced to handle Express 5 patterns and optional parameters correctly
49
+ * Special handling for consecutive parameters like :from-:to
50
+ * Order matters: regex constraints must be handled before repeating parameters
51
+ */
52
+ type ExtractSingleParam<Rest extends string> = Rest extends `${infer ParamName}(${infer _Constraint})${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}-:${infer _NextParam}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}.:${infer _NextParam}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}?/${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?-${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?.${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?#${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?:${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}/${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}-${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}.${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}#${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}:${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}+${infer _After}` ? { [K in ParamName]: string[] } : Rest extends `${infer ParamName}*${infer _After}` ? { [K in ParamName]?: string[] } : Rest extends `${infer ParamName}?${infer _After}` ? { [K in ParamName]?: string } : Rest extends string ? Rest extends "" ? {} : Rest extends `${infer ParamName}?` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}+` ? { [K in ParamName]: string[] } : Rest extends `${infer ParamName}*` ? { [K in ParamName]?: string[] } : { [K in Rest]: string } : {};
53
+ /**
54
+ * Remove the first parameter from path to continue parsing
55
+ * Enhanced to handle Express 5 patterns and optional parameters
56
+ * Handles patterns like :from-:to by removing just :from and keeping -:to
57
+ * Order matters: regex constraints must be handled before repeating parameters
58
+ */
59
+ type RemoveFirstParam<Path extends string> = Path extends `${infer Before}:${infer Rest}` ? Rest extends `${infer _ParamName}(${infer _Constraint})${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}-:${infer After}` ? `${Before}-:${After}` : Rest extends `${infer _ParamName}.:${infer After}` ? `${Before}.:${After}` : Rest extends `${infer _ParamName}?/${infer After}` ? `${Before}/${After}` : Rest extends `${infer _ParamName}?-${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?.${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?#${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?:${infer After}` ? `${Before}:${After}` : Rest extends `${infer _ParamName}/${infer After}` ? `${Before}/${After}` : Rest extends `${infer _ParamName}-${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}.${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}#${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}:${infer After}` ? `${Before}:${After}` : Rest extends `${infer _ParamName}+${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}*${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?${infer After}` ? `${Before}${After}` : Before : Path;
60
+ /**
61
+ * Count wildcards to assign proper numeric indices
62
+ */
63
+ type CountWildcards<Path extends string, Count extends string = "0"> = Path extends `${infer _Before}*${infer Rest}` ? CountWildcards<Rest, IncrementWildcard<Count>> : Count;
64
+ /**
65
+ * Helper type to increment wildcard count as string
66
+ */
67
+ type IncrementWildcard<T extends string> = T extends "0" ? "1" : T extends "1" ? "2" : T extends "2" ? "3" : T extends "3" ? "4" : T extends "4" ? "5" : T extends "5" ? "6" : T extends "6" ? "7" : T extends "7" ? "8" : T extends "8" ? "9" : "10";
68
+ /**
69
+ * Express middleware that adds custom properties to the request object.
70
+ *
71
+ * @template T - The shape of the properties added to the request.
72
+ * @param req - The Express request object, extended with T.
73
+ * @param res - The Express response object.
74
+ * @param next - The next middleware function.
75
+ */
76
+ type TypedMiddleware<T extends Record<string, any>> = (req: Request & T, res: Response, next: NextFunction) => void | Promise<void>;
77
+ type InferMiddlewareProps<T extends readonly TypedMiddleware<any>[]> = T extends readonly [infer First, ...infer Rest] ? First extends TypedMiddleware<infer FirstType> ? Rest extends readonly TypedMiddleware<any>[] ? FirstType & InferMiddlewareProps<Rest> : FirstType : {} : {};
78
+ type ZodRequest<Path extends string = string, BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown, MiddlewareProps extends Record<string, any> = {}> = Omit<Request, "params" | "query" | "body"> & {
79
+ params: ExtractRouteParams<Path>;
80
+ body: BodySchema extends ZodType<any, any, any> ? z.infer<BodySchema> : unknown;
81
+ query: QuerySchema extends ZodType<any, any, any> ? z.infer<QuerySchema> : unknown;
82
+ } & MiddlewareProps;
83
+ type ZodRouteHandler<Path extends string = string, BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown, MiddlewareProps extends Record<string, any> = {}> = (req: ZodRequest<Path, BodySchema, QuerySchema, MiddlewareProps>, res: Response, next?: NextFunction) => void | Promise<void> | Response | Promise<Response>;
84
+ /**
85
+ * Options for defining a typed route, including schemas and middleware.
86
+ *
87
+ * @template BodySchema - Zod schema for request body validation.
88
+ * @template QuerySchema - Zod schema for query parameter validation.
89
+ * @property bodySchema - Optional Zod schema for validating the request body.
90
+ * @property querySchema - Optional Zod schema for validating the query string.
91
+ * @property middleware - Optional array of TypedMiddleware for this route.
92
+ */
93
+ interface RouteOptions<BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown> {
94
+ bodySchema?: BodySchema extends ZodType<any, any, any> ? BodySchema : never;
95
+ querySchema?: QuerySchema extends ZodType<any, any, any> ? QuerySchema : never;
96
+ middleware?: readonly TypedMiddleware<any>[];
97
+ }
98
+ type HttpMethod = "get" | "post" | "put" | "delete" | "patch" | "options" | "head" | "all";
99
+ declare class TypedRouter<RouterMiddlewareProps extends Record<string, any> = {}> {
100
+ private router;
101
+ constructor();
102
+ /**
103
+ * Add typed middleware that extends the request with additional properties
104
+ */
105
+ useTypedMiddleware<T extends Record<string, any>>(middleware: TypedMiddleware<T>): TypedRouter<RouterMiddlewareProps & T>;
106
+ /**
107
+ * Get the underlying Express router
108
+ */
109
+ getRouter(): express.Router;
110
+ get<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
111
+ get<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
112
+ get<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
113
+ middleware: Middleware;
114
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
115
+ get<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: RouteOptions<BodySchema, QuerySchema> & {
116
+ middleware: Middleware;
117
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
118
+ post<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
119
+ bodySchema: BodySchema;
120
+ querySchema?: QuerySchema;
121
+ middleware: Middleware;
122
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
123
+ post<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
124
+ bodySchema: BodySchema;
125
+ middleware: Middleware;
126
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
127
+ post<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
128
+ middleware: Middleware;
129
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
130
+ post<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
131
+ post<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
132
+ put<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
133
+ bodySchema: BodySchema;
134
+ querySchema?: QuerySchema;
135
+ middleware: Middleware;
136
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
137
+ put<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
138
+ bodySchema: BodySchema;
139
+ middleware: Middleware;
140
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
141
+ put<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
142
+ middleware: Middleware;
143
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
144
+ put<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
145
+ put<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
146
+ patch<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
147
+ bodySchema: BodySchema;
148
+ querySchema?: QuerySchema;
149
+ middleware: Middleware;
150
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
151
+ patch<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
152
+ bodySchema: BodySchema;
153
+ middleware: Middleware;
154
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
155
+ patch<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
156
+ middleware: Middleware;
157
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
158
+ patch<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
159
+ patch<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
160
+ delete<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
161
+ middleware: Middleware;
162
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
163
+ delete<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
164
+ querySchema: QuerySchema;
165
+ middleware: Middleware;
166
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
167
+ delete<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: {
168
+ querySchema: QuerySchema;
169
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
170
+ delete<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
171
+ options<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
172
+ middleware: Middleware;
173
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
174
+ options<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
175
+ head<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
176
+ middleware: Middleware;
177
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
178
+ head<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
179
+ querySchema: QuerySchema;
180
+ middleware: Middleware;
181
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
182
+ head<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: {
183
+ querySchema: QuerySchema;
184
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
185
+ head<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
186
+ all<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
187
+ bodySchema: BodySchema;
188
+ querySchema?: QuerySchema;
189
+ middleware: Middleware;
190
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
191
+ all<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
192
+ bodySchema: BodySchema;
193
+ middleware: Middleware;
194
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
195
+ all<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
196
+ middleware: Middleware;
197
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
198
+ all<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
199
+ all<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
200
+ private registerRoute;
201
+ private createBodyValidationMiddleware;
202
+ private createQueryValidationMiddleware;
203
+ }
204
+ /**
205
+ * Create a new strongly-typed Express router instance.
206
+ *
207
+ * This is the simplest way to get started with @minisylar/express-typed-router.
208
+ *
209
+ * @example
210
+ * import { createTypedRouter } from '@minisylar/express-typed-router';
211
+ *
212
+ * // Create a router and add a typed GET route
213
+ * const router = createTypedRouter();
214
+ * router.get('/hello/:name', (req, res) => {
215
+ * // req.params.name is typed as string
216
+ * res.json({ message: `Hello, ${req.params.name}!` });
217
+ * });
218
+ *
219
+ * // Use with Express
220
+ * import express from 'express';
221
+ * const app = express();
222
+ * app.use('/api', router.getRouter());
223
+ */
224
+ declare function createTypedRouter<RouterMiddlewareProps extends Record<string, any> = {}>(): TypedRouter<RouterMiddlewareProps>;
225
+ /**
226
+ * Configuration options for createTypedRouterWithConfig.
227
+ *
228
+ * @property validateInput - (Future) Whether to enable global input validation.
229
+ * @property errorHandler - Optional global error handler middleware for the router.
230
+ */
231
+ interface RouterConfig {
232
+ validateInput?: boolean;
233
+ errorHandler?: (error: any, req: Request, res: Response, next: NextFunction) => void;
234
+ }
235
+ /**
236
+ * Create a new typed router with optional configuration.
237
+ *
238
+ * Use this if you want to add a global error handler or future global options.
239
+ *
240
+ * @param config - Optional configuration for the router (e.g. error handler).
241
+ * @returns A new TypedRouter instance.
242
+ *
243
+ * @example
244
+ * import { createTypedRouterWithConfig } from '@minisylar/express-typed-router';
245
+ *
246
+ * const router = createTypedRouterWithConfig({
247
+ * errorHandler: (err, req, res, next) => {
248
+ * res.status(500).json({ error: 'Something went wrong', details: err });
249
+ * }
250
+ * });
251
+ */
252
+ declare function createTypedRouterWithConfig<RouterMiddlewareProps extends Record<string, any> = {}>(config?: RouterConfig): TypedRouter<RouterMiddlewareProps>;
253
+ /**
254
+ * Create a new typed router with pre-configured middleware.
255
+ *
256
+ * This is useful for setting up router-level middleware in a single call.
257
+ *
258
+ * @param middleware - One or more TypedMiddleware functions to apply to all routes.
259
+ * @returns A new TypedRouter instance with the middleware applied.
260
+ *
261
+ * @example
262
+ * import { createTypedRouterWithMiddleware } from '@minisylar/express-typed-router';
263
+ *
264
+ * const router = createTypedRouterWithMiddleware(authMiddleware, loggingMiddleware);
265
+ */
266
+ declare function createTypedRouterWithMiddleware<T extends Record<string, any>>(...middleware: TypedMiddleware<any>[]): TypedRouter<T>;
267
+
268
+ //#endregion
269
+ export { ExtractRouteParams, HttpMethod, RouteOptions, RouterConfig, TypedMiddleware, TypedRouter, ZodRequest, ZodRouteHandler, createTypedRouter, createTypedRouterWithConfig, createTypedRouterWithMiddleware };
270
+ //# sourceMappingURL=zod-router.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-router.d.cts","names":[],"sources":["../src/zod-router.d.ts"],"sourcesContent":null,"mappings":"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CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;AAqB7D,IAAW,oBAAiB;CAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;AAO5B,IAAW,eAAe;CAAC;CAAI,MAAM;CAAS,MAAM;CAAU,MAAM;AAAa;;;;;;;;;;;;;;;;;;AAkBjF,IAAE,8BAAA;CAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;;;;;;;;AAcF,IAAW,kCAAkC;CAAC;CAAI,MAAM;CAAQ,MAAM;CAAiB,MAAM;CAAG,MAAM;AAAY"}
@@ -0,0 +1,270 @@
1
+ import express, { NextFunction, Request, Response } from "express";
2
+ import { ZodType, z } from "zod";
3
+
4
+ //#region src/zod-router.d.ts
5
+ /**
6
+ * Extract route parameters from Express.js route patterns.
7
+ *
8
+ * Supports all Express.js routing patterns:
9
+ * - Named parameters: /users/:userId → { userId: string }
10
+ * - Multiple parameters: /users/:userId/books/:bookId → { userId: string; bookId: string }
11
+ * - Parameters with separators: /flights/:from-:to → { from: string; to: string }
12
+ * - Dot notation: /plantae/:genus.:species → { genus: string; species: string }
13
+ * - Regex constraints: /user/:id(\\d+) → { id: string }
14
+ * - Optional parameters: /posts/:year/:month? → { year: string; month?: string }
15
+ * - Wildcard parameters: /files/* → { "0": string }
16
+ * - Multiple wildcards: /a/star/b/star → { "0": string; "1": string }
17
+ */
18
+
19
+ /**
20
+ * Extract route parameters from Express.js route patterns.
21
+ *
22
+ * Supports all Express.js routing patterns:
23
+ * - Named parameters: /users/:userId → { userId: string }
24
+ * - Multiple parameters: /users/:userId/books/:bookId → { userId: string; bookId: string }
25
+ * - Parameters with separators: /flights/:from-:to → { from: string; to: string }
26
+ * - Dot notation: /plantae/:genus.:species → { genus: string; species: string }
27
+ * - Regex constraints: /user/:id(\\d+) → { id: string }
28
+ * - Optional parameters: /posts/:year/:month? → { year: string; month?: string }
29
+ * - Wildcard parameters: /files/* → { "0": string }
30
+ * - Multiple wildcards: /a/star/b/star → { "0": string; "1": string }
31
+ */
32
+ type ExtractRouteParams<Path extends string> = string extends Path ? Record<string, string> : ExtractParams<Path>;
33
+ /**
34
+ * Main parameter extraction logic - enhanced for Express 5 support
35
+ */
36
+ type ExtractParams<Path extends string> = Path extends `${infer Before}{${infer OptionalContent}}${infer After}` ? ExtractOptionalSegment<OptionalContent> & ExtractParams<`${Before}${After}`> : Path extends `${infer _Before}:${infer Rest}` ? ExtractSingleParam<Rest> & ExtractParams<RemoveFirstParam<Path>> : Path extends `${infer _Before}*${infer After}` ? { [K in CountWildcards<_Before>]: string } & ExtractParams<After> : {};
37
+ /**
38
+ * Extract parameters from Express 5 optional segments in braces
39
+ * Handles patterns like {/:param}, {.:ext}, {/optional/:param}
40
+ */
41
+ type ExtractOptionalSegment<Content extends string> = Content extends `/:${infer Rest}` ? ExtractOptionalParam<Rest> : Content extends `.:${infer Rest}` ? ExtractOptionalParam<Rest> : Content extends `${infer _Path}:${infer Rest}` ? ExtractOptionalParam<Rest> : {};
42
+ /**
43
+ * Extract a single optional parameter from brace content
44
+ */
45
+ type ExtractOptionalParam<Rest extends string> = Rest extends `${infer ParamName}/${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}-${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}.${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}` ? { [K in ParamName]?: string } : {};
46
+ /**
47
+ * Extract a single parameter name from the rest of the path
48
+ * Enhanced to handle Express 5 patterns and optional parameters correctly
49
+ * Special handling for consecutive parameters like :from-:to
50
+ * Order matters: regex constraints must be handled before repeating parameters
51
+ */
52
+ type ExtractSingleParam<Rest extends string> = Rest extends `${infer ParamName}(${infer _Constraint})${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}-:${infer _NextParam}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}.:${infer _NextParam}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}?/${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?-${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?.${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?#${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}?:${infer _After}` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}/${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}-${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}.${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}#${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}:${infer _After}` ? { [K in ParamName]: string } : Rest extends `${infer ParamName}+${infer _After}` ? { [K in ParamName]: string[] } : Rest extends `${infer ParamName}*${infer _After}` ? { [K in ParamName]?: string[] } : Rest extends `${infer ParamName}?${infer _After}` ? { [K in ParamName]?: string } : Rest extends string ? Rest extends "" ? {} : Rest extends `${infer ParamName}?` ? { [K in ParamName]?: string } : Rest extends `${infer ParamName}+` ? { [K in ParamName]: string[] } : Rest extends `${infer ParamName}*` ? { [K in ParamName]?: string[] } : { [K in Rest]: string } : {};
53
+ /**
54
+ * Remove the first parameter from path to continue parsing
55
+ * Enhanced to handle Express 5 patterns and optional parameters
56
+ * Handles patterns like :from-:to by removing just :from and keeping -:to
57
+ * Order matters: regex constraints must be handled before repeating parameters
58
+ */
59
+ type RemoveFirstParam<Path extends string> = Path extends `${infer Before}:${infer Rest}` ? Rest extends `${infer _ParamName}(${infer _Constraint})${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}-:${infer After}` ? `${Before}-:${After}` : Rest extends `${infer _ParamName}.:${infer After}` ? `${Before}.:${After}` : Rest extends `${infer _ParamName}?/${infer After}` ? `${Before}/${After}` : Rest extends `${infer _ParamName}?-${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?.${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?#${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?:${infer After}` ? `${Before}:${After}` : Rest extends `${infer _ParamName}/${infer After}` ? `${Before}/${After}` : Rest extends `${infer _ParamName}-${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}.${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}#${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}:${infer After}` ? `${Before}:${After}` : Rest extends `${infer _ParamName}+${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}*${infer After}` ? `${Before}${After}` : Rest extends `${infer _ParamName}?${infer After}` ? `${Before}${After}` : Before : Path;
60
+ /**
61
+ * Count wildcards to assign proper numeric indices
62
+ */
63
+ type CountWildcards<Path extends string, Count extends string = "0"> = Path extends `${infer _Before}*${infer Rest}` ? CountWildcards<Rest, IncrementWildcard<Count>> : Count;
64
+ /**
65
+ * Helper type to increment wildcard count as string
66
+ */
67
+ type IncrementWildcard<T extends string> = T extends "0" ? "1" : T extends "1" ? "2" : T extends "2" ? "3" : T extends "3" ? "4" : T extends "4" ? "5" : T extends "5" ? "6" : T extends "6" ? "7" : T extends "7" ? "8" : T extends "8" ? "9" : "10";
68
+ /**
69
+ * Express middleware that adds custom properties to the request object.
70
+ *
71
+ * @template T - The shape of the properties added to the request.
72
+ * @param req - The Express request object, extended with T.
73
+ * @param res - The Express response object.
74
+ * @param next - The next middleware function.
75
+ */
76
+ type TypedMiddleware<T extends Record<string, any>> = (req: Request & T, res: Response, next: NextFunction) => void | Promise<void>;
77
+ type InferMiddlewareProps<T extends readonly TypedMiddleware<any>[]> = T extends readonly [infer First, ...infer Rest] ? First extends TypedMiddleware<infer FirstType> ? Rest extends readonly TypedMiddleware<any>[] ? FirstType & InferMiddlewareProps<Rest> : FirstType : {} : {};
78
+ type ZodRequest<Path extends string = string, BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown, MiddlewareProps extends Record<string, any> = {}> = Omit<Request, "params" | "query" | "body"> & {
79
+ params: ExtractRouteParams<Path>;
80
+ body: BodySchema extends ZodType<any, any, any> ? z.infer<BodySchema> : unknown;
81
+ query: QuerySchema extends ZodType<any, any, any> ? z.infer<QuerySchema> : unknown;
82
+ } & MiddlewareProps;
83
+ type ZodRouteHandler<Path extends string = string, BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown, MiddlewareProps extends Record<string, any> = {}> = (req: ZodRequest<Path, BodySchema, QuerySchema, MiddlewareProps>, res: Response, next?: NextFunction) => void | Promise<void> | Response | Promise<Response>;
84
+ /**
85
+ * Options for defining a typed route, including schemas and middleware.
86
+ *
87
+ * @template BodySchema - Zod schema for request body validation.
88
+ * @template QuerySchema - Zod schema for query parameter validation.
89
+ * @property bodySchema - Optional Zod schema for validating the request body.
90
+ * @property querySchema - Optional Zod schema for validating the query string.
91
+ * @property middleware - Optional array of TypedMiddleware for this route.
92
+ */
93
+ interface RouteOptions<BodySchema extends ZodType<any, any, any> | unknown = unknown, QuerySchema extends ZodType<any, any, any> | unknown = unknown> {
94
+ bodySchema?: BodySchema extends ZodType<any, any, any> ? BodySchema : never;
95
+ querySchema?: QuerySchema extends ZodType<any, any, any> ? QuerySchema : never;
96
+ middleware?: readonly TypedMiddleware<any>[];
97
+ }
98
+ type HttpMethod = "get" | "post" | "put" | "delete" | "patch" | "options" | "head" | "all";
99
+ declare class TypedRouter<RouterMiddlewareProps extends Record<string, any> = {}> {
100
+ private router;
101
+ constructor();
102
+ /**
103
+ * Add typed middleware that extends the request with additional properties
104
+ */
105
+ useTypedMiddleware<T extends Record<string, any>>(middleware: TypedMiddleware<T>): TypedRouter<RouterMiddlewareProps & T>;
106
+ /**
107
+ * Get the underlying Express router
108
+ */
109
+ getRouter(): express.Router;
110
+ get<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
111
+ get<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
112
+ get<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
113
+ middleware: Middleware;
114
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
115
+ get<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: RouteOptions<BodySchema, QuerySchema> & {
116
+ middleware: Middleware;
117
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
118
+ post<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
119
+ bodySchema: BodySchema;
120
+ querySchema?: QuerySchema;
121
+ middleware: Middleware;
122
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
123
+ post<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
124
+ bodySchema: BodySchema;
125
+ middleware: Middleware;
126
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
127
+ post<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
128
+ middleware: Middleware;
129
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
130
+ post<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
131
+ post<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
132
+ put<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
133
+ bodySchema: BodySchema;
134
+ querySchema?: QuerySchema;
135
+ middleware: Middleware;
136
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
137
+ put<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
138
+ bodySchema: BodySchema;
139
+ middleware: Middleware;
140
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
141
+ put<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
142
+ middleware: Middleware;
143
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
144
+ put<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
145
+ put<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
146
+ patch<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
147
+ bodySchema: BodySchema;
148
+ querySchema?: QuerySchema;
149
+ middleware: Middleware;
150
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
151
+ patch<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
152
+ bodySchema: BodySchema;
153
+ middleware: Middleware;
154
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
155
+ patch<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
156
+ middleware: Middleware;
157
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
158
+ patch<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
159
+ patch<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
160
+ delete<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
161
+ middleware: Middleware;
162
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
163
+ delete<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
164
+ querySchema: QuerySchema;
165
+ middleware: Middleware;
166
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
167
+ delete<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: {
168
+ querySchema: QuerySchema;
169
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
170
+ delete<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
171
+ options<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
172
+ middleware: Middleware;
173
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
174
+ options<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
175
+ head<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
176
+ middleware: Middleware;
177
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
178
+ head<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
179
+ querySchema: QuerySchema;
180
+ middleware: Middleware;
181
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
182
+ head<Path extends string, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: {
183
+ querySchema: QuerySchema;
184
+ }, handler: ZodRouteHandler<Path, unknown, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
185
+ head<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
186
+ all<Path extends string, BodySchema extends ZodType<any, any, any>, QuerySchema extends ZodType<any, any, any> | unknown, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
187
+ bodySchema: BodySchema;
188
+ querySchema?: QuerySchema;
189
+ middleware: Middleware;
190
+ }, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
191
+ all<Path extends string, BodySchema extends ZodType<any, any, any>, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
192
+ bodySchema: BodySchema;
193
+ middleware: Middleware;
194
+ }, handler: ZodRouteHandler<Path, BodySchema, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
195
+ all<Path extends string, Middleware extends readonly TypedMiddleware<any>[]>(path: Path, options: {
196
+ middleware: Middleware;
197
+ }, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps & InferMiddlewareProps<Middleware>>): TypedRouter<RouterMiddlewareProps>;
198
+ all<Path extends string, BodySchema extends ZodType<any, any, any> | unknown, QuerySchema extends ZodType<any, any, any> | unknown>(path: Path, options: RouteOptions<BodySchema, QuerySchema>, handler: ZodRouteHandler<Path, BodySchema, QuerySchema, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
199
+ all<Path extends string>(path: Path, handler: ZodRouteHandler<Path, unknown, unknown, RouterMiddlewareProps>): TypedRouter<RouterMiddlewareProps>;
200
+ private registerRoute;
201
+ private createBodyValidationMiddleware;
202
+ private createQueryValidationMiddleware;
203
+ }
204
+ /**
205
+ * Create a new strongly-typed Express router instance.
206
+ *
207
+ * This is the simplest way to get started with @minisylar/express-typed-router.
208
+ *
209
+ * @example
210
+ * import { createTypedRouter } from '@minisylar/express-typed-router';
211
+ *
212
+ * // Create a router and add a typed GET route
213
+ * const router = createTypedRouter();
214
+ * router.get('/hello/:name', (req, res) => {
215
+ * // req.params.name is typed as string
216
+ * res.json({ message: `Hello, ${req.params.name}!` });
217
+ * });
218
+ *
219
+ * // Use with Express
220
+ * import express from 'express';
221
+ * const app = express();
222
+ * app.use('/api', router.getRouter());
223
+ */
224
+ declare function createTypedRouter<RouterMiddlewareProps extends Record<string, any> = {}>(): TypedRouter<RouterMiddlewareProps>;
225
+ /**
226
+ * Configuration options for createTypedRouterWithConfig.
227
+ *
228
+ * @property validateInput - (Future) Whether to enable global input validation.
229
+ * @property errorHandler - Optional global error handler middleware for the router.
230
+ */
231
+ interface RouterConfig {
232
+ validateInput?: boolean;
233
+ errorHandler?: (error: any, req: Request, res: Response, next: NextFunction) => void;
234
+ }
235
+ /**
236
+ * Create a new typed router with optional configuration.
237
+ *
238
+ * Use this if you want to add a global error handler or future global options.
239
+ *
240
+ * @param config - Optional configuration for the router (e.g. error handler).
241
+ * @returns A new TypedRouter instance.
242
+ *
243
+ * @example
244
+ * import { createTypedRouterWithConfig } from '@minisylar/express-typed-router';
245
+ *
246
+ * const router = createTypedRouterWithConfig({
247
+ * errorHandler: (err, req, res, next) => {
248
+ * res.status(500).json({ error: 'Something went wrong', details: err });
249
+ * }
250
+ * });
251
+ */
252
+ declare function createTypedRouterWithConfig<RouterMiddlewareProps extends Record<string, any> = {}>(config?: RouterConfig): TypedRouter<RouterMiddlewareProps>;
253
+ /**
254
+ * Create a new typed router with pre-configured middleware.
255
+ *
256
+ * This is useful for setting up router-level middleware in a single call.
257
+ *
258
+ * @param middleware - One or more TypedMiddleware functions to apply to all routes.
259
+ * @returns A new TypedRouter instance with the middleware applied.
260
+ *
261
+ * @example
262
+ * import { createTypedRouterWithMiddleware } from '@minisylar/express-typed-router';
263
+ *
264
+ * const router = createTypedRouterWithMiddleware(authMiddleware, loggingMiddleware);
265
+ */
266
+ declare function createTypedRouterWithMiddleware<T extends Record<string, any>>(...middleware: TypedMiddleware<any>[]): TypedRouter<T>;
267
+
268
+ //#endregion
269
+ export { ExtractRouteParams, HttpMethod, RouteOptions, RouterConfig, TypedMiddleware, TypedRouter, ZodRequest, ZodRouteHandler, createTypedRouter, createTypedRouterWithConfig, createTypedRouterWithMiddleware };
270
+ //# sourceMappingURL=zod-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-router.d.ts","names":[],"sources":["../src/zod-router.d.ts"],"sourcesContent":null,"mappings":"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CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;AAqB7D,IAAW,oBAAiB;CAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;AAO5B,IAAW,eAAe;CAAC;CAAI,MAAM;CAAS,MAAM;CAAU,MAAM;AAAa;;;;;;;;;;;;;;;;;;AAkBjF,IAAE,8BAAA;CAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;CAAA,MAAA;AAAA;;;;;;;;;;;;;;AAcF,IAAW,kCAAkC;CAAC;CAAI,MAAM;CAAQ,MAAM;CAAiB,MAAM;CAAG,MAAM;AAAY"}