@@ -2,7 +2,7 @@ import { performance } from 'node:perf_hooks';
22import { setTimeout , clearTimeout } from 'node:timers' ;
33import { nanoid } from 'nanoid' ;
44import type { IError , Middleware , NextHandler , Polka , Request , Response } from 'polka' ;
5- import type { ZodType } from 'zod' ;
5+ import type { z , ZodType } from 'zod' ;
66import { context } from '../context.js' ;
77import { jsonParser } from '../middleware/jsonParser.js' ;
88import { validate } from '../middleware/validate.js' ;
@@ -33,13 +33,20 @@ export interface RouteInfo {
3333}
3434
3535// TODO: More generics?
36- export type TRequest < TBody > = Omit < Request , 'body' > & { body : TBody ; trackingId : string } ;
36+ export type TRequest < TBodyOrQueryZodType extends ZodType < any > | never > = Omit < Request , 'body' | 'query' > & {
37+ body : TBodyOrQueryZodType extends never ? never : z . infer < TBodyOrQueryZodType > ;
38+ query : TBodyOrQueryZodType extends never ? never : z . infer < TBodyOrQueryZodType > ;
39+ trackingId : string ;
40+ } ;
3741
3842/**
3943 * Represents a route on the server
4044 */
41- export abstract class Route < TResult , TBodyOrQuery > {
42- public readonly __internalOnlyHereForTypeInferrenceDoNotUse__ ! : { bodyOrQuery : TBodyOrQuery ; result : TResult } ;
45+ export abstract class Route < TResult , TBodyOrQueryZodType extends ZodType < any > | never > {
46+ public readonly __internalOnlyHereForTypeInferrenceDoNotUse__ ! : {
47+ bodyOrQuery : z . infer < TBodyOrQueryZodType > ;
48+ result : TResult ;
49+ } ;
4350
4451 /**
4552 * Base route information
@@ -49,30 +56,30 @@ export abstract class Route<TResult, TBodyOrQuery> {
4956 /**
5057 * Middleware to use for this route - needs to be overriden by subclasses
5158 */
52- public readonly middleware : Middleware < TRequest < unknown > > [ ] = [ ] ;
59+ public readonly middleware : Middleware < TRequest < any > > [ ] = [ ] ;
5360
5461 /**
5562 * Schema to use for body validation. Implicitly appends a jsonParser to the middleware
5663 */
57- public readonly bodyValidationSchema : ZodType < TBodyOrQuery > | null = null ;
64+ public readonly bodyValidationSchema : TBodyOrQueryZodType | null = null ;
5865
5966 /**
6067 * Schema to use for query validation.
6168 */
62- public readonly queryValidationSchema : ZodType < TBodyOrQuery > | null = null ;
69+ public readonly queryValidationSchema : TBodyOrQueryZodType | null = null ;
6370
6471 /**
6572 * Handles a request to this route
6673 */
67- public abstract handle ( req : TRequest < TBodyOrQuery > , res : Response , next : NextHandler ) : unknown ;
74+ public abstract handle ( req : TRequest < z . infer < TBodyOrQueryZodType > > , res : Response , next : NextHandler ) : unknown ;
6875
6976 /**
7077 * Registers this route
7178 *
7279 * @param server - The Polka webserver to register this route onto
7380 */
74- public register ( server : Polka < TRequest < unknown > > ) : void {
75- const middleware : Middleware < TRequest < unknown > > [ ] = [
81+ public register ( server : Polka < TRequest < any > > ) : void {
82+ const middleware : Middleware < TRequest < any > > [ ] = [
7683 async ( req , res , next ) => {
7784 req . trackingId = nanoid ( 10 ) ;
7885
@@ -124,7 +131,7 @@ export abstract class Route<TResult, TBodyOrQuery> {
124131 { trackingId : req . trackingId , method : req . method , path : req . path } ,
125132 'passing to route handler from middleware' ,
126133 ) ;
127- await this . handle ( req as TRequest < TBodyOrQuery > , res , next ) ;
134+ await this . handle ( req as TRequest < z . infer < TBodyOrQueryZodType > > , res , next ) ;
128135 context . logger . info (
129136 { trackingId : req . trackingId , method : req . method , path : req . path } ,
130137 'route handler complete' ,
@@ -148,8 +155,8 @@ export type ParseHTTPParameters<
148155export type InferRouteMethod < TRoute extends Route < any , any > > = TRoute [ 'info' ] [ 'method' ] ;
149156export type InferRouteResult < TRoute > = TRoute extends Route < infer TResult , any > ? TResult : never ;
150157export type InferRouteBodyOrQuery < TRoute extends Route < any , any > > =
151- TRoute [ 'bodyValidationSchema' ] extends ZodType < infer Body >
158+ TRoute [ 'bodyValidationSchema' ] extends ZodType < any , infer Body >
152159 ? Body
153- : TRoute [ 'queryValidationSchema' ] extends ZodType < infer Query >
160+ : TRoute [ 'queryValidationSchema' ] extends ZodType < any , infer Query >
154161 ? Query
155162 : never ;
0 commit comments