@@ -35,6 +35,8 @@ type RouteOptions<
35
35
QueryParamsOutput ,
36
36
RequestBodyInput ,
37
37
RequestBodyOutput ,
38
+ Req extends Request ,
39
+ Res extends Response ,
38
40
> = {
39
41
operationId : string ,
40
42
method : Method ,
@@ -43,37 +45,39 @@ type RouteOptions<
43
45
tags : string [ ] ,
44
46
pathParams ?: ZodType < PathParamsOutput , ZodTypeDef , PathParamsInput > ,
45
47
queryParams ?: ZodType < QueryParamsOutput , ZodTypeDef , QueryParamsInput > ,
46
- action : ( source : ActionSource < PathParamsOutput , QueryParamsOutput , RequestBodyOutput > ) => Response | Promise < Response > ,
48
+ action : ( source : ActionSource < PathParamsOutput , QueryParamsOutput , RequestBodyOutput > ) => Response | Promise < Res > ,
47
49
responses : Record < string , ResponseDefinition > ,
48
- handleErrors ?: ( errorType : typeof customErrorTypes [ number ] | "UNKNOWN_ERROR" , issues ?: ZodIssue [ ] ) => Response ,
50
+ handleErrors ?: ( errorType : typeof customErrorTypes [ number ] | "UNKNOWN_ERROR" , issues ?: ZodIssue [ ] ) => Res ,
51
+ middleware ?: ( hander : RouteMethodHandler < PathParamsInput , Req , Res > ) =>
52
+ RouteMethodHandler < PathParamsInput , Req , Res > ,
49
53
} & ( RouteWithBody < RequestBodyInput , RequestBodyOutput > | RouteWithoutBody ) ;
50
54
51
- function defineRoute < M extends HttpMethod , PPI , PPO , QPI , QPO , RBI , RBO > ( input : RouteOptions < M , PPI , PPO , QPI , QPO , RBI , RBO > ) {
52
- const handler : RouteMethodHandler < PPI > = async ( request , props ) => {
55
+ function defineRoute < M extends HttpMethod , PPI , PPO , QPI , QPO , RBI , RBO , MwReq extends Request , MwRes extends Response > ( input : RouteOptions < M , PPI , PPO , QPI , QPO , RBI , RBO , MwReq , MwRes > ) {
56
+ const handler : RouteMethodHandler < PPI , MwReq , MwRes > = async ( request , props ) => {
53
57
try {
54
58
const { searchParams } = new URL ( request . url ) ;
55
59
const pathParams = parsePathParams ( props . params , input . pathParams ) as PPO ;
56
60
const queryParams = parseSearchParams ( searchParams , input . queryParams ) as QPO ;
57
61
const body = await parseRequestBody ( request , input . method , input . requestBody ?? undefined , input . hasFormData ) as RBO ;
58
- return await input . action ( { pathParams, queryParams, body } ) ;
62
+ return await input . action ( { pathParams, queryParams, body } ) as MwRes ;
59
63
} catch ( error ) {
60
64
if ( input . handleErrors ) {
61
65
if ( error instanceof Error ) {
62
66
const errorMessage = error . message as typeof customErrorTypes [ number ] ;
63
67
if ( customErrorTypes . includes ( errorMessage ) ) {
64
- return input . handleErrors ( errorMessage , error . cause as ZodIssue [ ] ) ;
68
+ return input . handleErrors ( errorMessage , error . cause as ZodIssue [ ] ) as MwRes ;
65
69
}
66
70
}
67
- return input . handleErrors ( "UNKNOWN_ERROR" ) ;
71
+ return input . handleErrors ( "UNKNOWN_ERROR" ) as MwRes ;
68
72
}
69
73
if ( error instanceof Error ) {
70
74
switch ( error . message ) {
71
75
case "PARSE_FORM_DATA" :
72
76
case "PARSE_REQUEST_BODY" :
73
77
case "PARSE_SEARCH_PARAMS" :
74
- return new Response ( null , { status : 400 } ) ;
78
+ return new Response ( null , { status : 400 } ) as MwRes ;
75
79
case "PARSE_PATH_PARAMS" :
76
- return new Response ( null , { status : 404 } ) ;
80
+ return new Response ( null , { status : 404 } ) as MwRes ;
77
81
case "UNNECESSARY_PATH_PARAMS" : {
78
82
if ( process . env . NODE_ENV !== "production" ) {
79
83
// eslint-disable-next-line no-console
@@ -86,7 +90,7 @@ function defineRoute<M extends HttpMethod, PPI, PPO, QPI, QPO, RBI, RBO>(input:
86
90
}
87
91
}
88
92
}
89
- return new Response ( null , { status : 500 } ) ;
93
+ return new Response ( null , { status : 500 } ) as MwRes ;
90
94
}
91
95
} ;
92
96
@@ -112,7 +116,11 @@ function defineRoute<M extends HttpMethod, PPI, PPO, QPI, QPO, RBI, RBO>(input:
112
116
responses : responses ,
113
117
} ;
114
118
115
- return { [ input . method ] : handler } as RouteHandler < M , PPI > ;
119
+ if ( input . middleware ) {
120
+ return { [ input . method ] : input . middleware ( handler ) } as RouteHandler < M , PPI , MwReq , MwRes > ;
121
+ }
122
+
123
+ return { [ input . method ] : handler } as RouteHandler < M , PPI , MwReq , MwRes > ;
116
124
}
117
125
118
126
export default defineRoute ;
0 commit comments