fix(zod-openapi): infer env type parameter from middleware (#828)
* fix(zod-openapi): infer env type parameter from middleware * add testpull/830/head
parent
e37c31392c
commit
bbb48ef368
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@hono/zod-openapi': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
infer env type parameter from middleware
|
|
@ -269,9 +269,17 @@ export type MiddlewareToHandlerType<M extends MiddlewareHandler<any, any, any>[]
|
||||||
? Last // Return the last remaining handler in the array
|
? Last // Return the last remaining handler in the array
|
||||||
: never
|
: never
|
||||||
|
|
||||||
|
type RouteMiddlewareParams<R extends RouteConfig> = OfHandlerType<
|
||||||
|
MiddlewareToHandlerType<AsArray<R['middleware']>>
|
||||||
|
>
|
||||||
|
|
||||||
|
export type RouteConfigToEnv<R extends RouteConfig> = RouteMiddlewareParams<R> extends never
|
||||||
|
? Env
|
||||||
|
: RouteMiddlewareParams<R>['env']
|
||||||
|
|
||||||
export type RouteHandler<
|
export type RouteHandler<
|
||||||
R extends RouteConfig,
|
R extends RouteConfig,
|
||||||
E extends Env = Env,
|
E extends Env = RouteConfigToEnv<R>,
|
||||||
I extends Input = InputTypeParam<R> &
|
I extends Input = InputTypeParam<R> &
|
||||||
InputTypeQuery<R> &
|
InputTypeQuery<R> &
|
||||||
InputTypeHeader<R> &
|
InputTypeHeader<R> &
|
||||||
|
@ -299,7 +307,7 @@ export type RouteHandler<
|
||||||
|
|
||||||
export type RouteHook<
|
export type RouteHook<
|
||||||
R extends RouteConfig,
|
R extends RouteConfig,
|
||||||
E extends Env = Env,
|
E extends Env = RouteConfigToEnv<R>,
|
||||||
I extends Input = InputTypeParam<R> &
|
I extends Input = InputTypeParam<R> &
|
||||||
InputTypeQuery<R> &
|
InputTypeQuery<R> &
|
||||||
InputTypeHeader<R> &
|
InputTypeHeader<R> &
|
||||||
|
@ -381,7 +389,7 @@ export class OpenAPIHono<
|
||||||
handler: Handler<
|
handler: Handler<
|
||||||
// use the env from the middleware if it's defined
|
// use the env from the middleware if it's defined
|
||||||
R['middleware'] extends MiddlewareHandler[] | MiddlewareHandler
|
R['middleware'] extends MiddlewareHandler[] | MiddlewareHandler
|
||||||
? OfHandlerType<MiddlewareToHandlerType<AsArray<R['middleware']>>>['env'] & E
|
? RouteMiddlewareParams<R>['env'] & E
|
||||||
: E,
|
: E,
|
||||||
P,
|
P,
|
||||||
I,
|
I,
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import type { MiddlewareHandler } from 'hono'
|
||||||
import type { RouteHandler } from '../src'
|
import type { RouteHandler } from '../src'
|
||||||
import { OpenAPIHono, createRoute, z } from '../src'
|
import { OpenAPIHono, createRoute, z } from '../src'
|
||||||
|
|
||||||
|
@ -52,4 +53,40 @@ describe('supports async handler', () => {
|
||||||
hono.openapi(route, handler)
|
hono.openapi(route, handler)
|
||||||
hono.openapi(route, asyncHandler)
|
hono.openapi(route, asyncHandler)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('RouteHandler infers env type from middleware', () => {
|
||||||
|
type CustomEnv = { Variables: { customKey: string } }
|
||||||
|
|
||||||
|
const customMiddleware: MiddlewareHandler<CustomEnv> = (c, next) => {
|
||||||
|
c.set('customKey', 'customValue')
|
||||||
|
return next()
|
||||||
|
}
|
||||||
|
|
||||||
|
const routeWithMiddleware = createRoute({
|
||||||
|
method: 'get',
|
||||||
|
path: '/users',
|
||||||
|
middleware: [customMiddleware] as const,
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: z.object({
|
||||||
|
id: z.string(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: 'Retrieve the user',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const handler: RouteHandler<typeof routeWithMiddleware> = (c) => {
|
||||||
|
return c.json({
|
||||||
|
id: c.get('customKey'),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const hono = new OpenAPIHono()
|
||||||
|
hono.openapi(routeWithMiddleware, handler)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue