@hono/zod-openapi 0.16.4 → 0.17.1

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/README.md CHANGED
@@ -51,7 +51,8 @@ const UserSchema = z
51
51
  .openapi('User')
52
52
  ```
53
53
 
54
- > [!TIP] > `UserSchema` schema will be registered as `"#/components/schemas/User"` refs in the OpenAPI document.
54
+ > [!TIP]
55
+ > `UserSchema` schema will be registered as `"#/components/schemas/User"` refs in the OpenAPI document.
55
56
  > If you want to register the schema as referenced components, use `.openapi()` method.
56
57
 
57
58
  Next, create a route:
@@ -284,7 +285,10 @@ const route = createRoute({
284
285
  request: {
285
286
  params: ParamsSchema,
286
287
  },
287
- middleware: [prettyJSON(), cache({ cacheName: 'my-cache' })],
288
+ middleware: [
289
+ prettyJSON(),
290
+ cache({ cacheName: 'my-cache' })
291
+ ] as const, // Use `as const` to ensure TypeScript infers the middleware's Context.
288
292
  responses: {
289
293
  200: {
290
294
  content: {
package/dist/index.d.mts CHANGED
@@ -85,7 +85,42 @@ type OpenAPIHonoOptions<E extends Env> = {
85
85
  defaultHook?: Hook<any, E, any, any>;
86
86
  };
87
87
  type HonoInit<E extends Env> = ConstructorParameters<typeof Hono>[0] & OpenAPIHonoOptions<E>;
88
- type RouteHandler<R extends RouteConfig, E extends Env = Env, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Handler<E, P, I, R extends {
88
+ /**
89
+ * Turns `T | T[] | undefined` into `T[]`
90
+ */
91
+ type AsArray<T> = T extends undefined ? [] : T extends any[] ? T : [T];
92
+ /**
93
+ * Like simplify but recursive
94
+ */
95
+ type DeepSimplify<T> = {
96
+ [KeyType in keyof T]: T[KeyType] extends object ? DeepSimplify<T[KeyType]> : T[KeyType];
97
+ } & {};
98
+ /**
99
+ * Helper to infer generics from {@link MiddlewareHandler}
100
+ */
101
+ type OfHandlerType<T extends MiddlewareHandler> = T extends MiddlewareHandler<infer E, infer P, infer I> ? {
102
+ env: E;
103
+ path: P;
104
+ input: I;
105
+ } : never;
106
+ /**
107
+ * Reduce a tuple of middleware handlers into a single
108
+ * handler representing the composition of all
109
+ * handlers.
110
+ */
111
+ type MiddlewareToHandlerType<M extends MiddlewareHandler<any, any, any>[]> = M extends [
112
+ infer First,
113
+ infer Second,
114
+ ...infer Rest
115
+ ] ? First extends MiddlewareHandler<any, any, any> ? Second extends MiddlewareHandler<any, any, any> ? Rest extends MiddlewareHandler<any, any, any>[] ? MiddlewareToHandlerType<[
116
+ MiddlewareHandler<DeepSimplify<OfHandlerType<First>['env'] & OfHandlerType<Second>['env']>, // Combine envs
117
+ OfHandlerType<First>['path'], // Keep path from First
118
+ OfHandlerType<First>['input']>,
119
+ ...Rest
120
+ ]> : never : never : never : M extends [infer Last] ? Last : never;
121
+ type RouteMiddlewareParams<R extends RouteConfig> = OfHandlerType<MiddlewareToHandlerType<AsArray<R['middleware']>>>;
122
+ type RouteConfigToEnv<R extends RouteConfig> = RouteMiddlewareParams<R> extends never ? Env : RouteMiddlewareParams<R>['env'];
123
+ type RouteHandler<R extends RouteConfig, E extends Env = RouteConfigToEnv<R>, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Handler<E, P, I, R extends {
89
124
  responses: {
90
125
  [statusCode: number]: {
91
126
  content: {
@@ -94,7 +129,7 @@ type RouteHandler<R extends RouteConfig, E extends Env = Env, I extends Input =
94
129
  };
95
130
  };
96
131
  } ? MaybePromise<RouteConfigToTypedResponse<R>> : MaybePromise<RouteConfigToTypedResponse<R>> | MaybePromise<Response>>;
97
- type RouteHook<R extends RouteConfig, E extends Env = Env, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Hook<I, E, P, RouteConfigToTypedResponse<R> | Response | Promise<Response> | void | Promise<void>>;
132
+ type RouteHook<R extends RouteConfig, E extends Env = RouteConfigToEnv<R>, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Hook<I, E, P, RouteConfigToTypedResponse<R> | Response | Promise<Response> | void | Promise<void>>;
98
133
  type OpenAPIObjectConfig = Parameters<InstanceType<typeof OpenApiGeneratorV3>['generateDocument']>[0];
99
134
  type OpenAPIObjectConfigure<E extends Env, P extends string> = OpenAPIObjectConfig | ((context: Context<E, P>) => OpenAPIObjectConfig);
100
135
  declare class OpenAPIHono<E extends Env = Env, S extends Schema = {}, BasePath extends string = '/'> extends Hono<E, S, BasePath> {
@@ -132,7 +167,7 @@ declare class OpenAPIHono<E extends Env = Env, S extends Schema = {}, BasePath e
132
167
  * }
133
168
  *)
134
169
  */
135
- openapi: <R extends RouteConfig, I extends Input = InputTypeBase<R, "params", "param"> & InputTypeBase<R, "query", "query"> & InputTypeBase<R, "headers", "header"> & InputTypeBase<R, "cookies", "cookie"> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R["path"]>>({ middleware: routeMiddleware, ...route }: R, handler: Handler<E, P, I, R extends {
170
+ openapi: <R extends RouteConfig, I extends Input = InputTypeBase<R, "params", "param"> & InputTypeBase<R, "query", "query"> & InputTypeBase<R, "headers", "header"> & InputTypeBase<R, "cookies", "cookie"> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R["path"]>>({ middleware: routeMiddleware, ...route }: R, handler: Handler<R['middleware'] extends MiddlewareHandler[] | MiddlewareHandler ? RouteMiddlewareParams<R>['env'] & E : E, P, I, R extends {
136
171
  responses: {
137
172
  [statusCode: number]: {
138
173
  content: {
@@ -164,4 +199,4 @@ declare const createRoute: <P extends string, R extends Omit<RouteConfig, "path"
164
199
  getRoutingPath(): RoutingPath<R['path']>;
165
200
  };
166
201
 
167
- export { type Hook, OpenAPIHono, type OpenAPIHonoOptions, type OpenAPIObjectConfigure, type RouteConfig, type RouteConfigToTypedResponse, type RouteHandler, type RouteHook, createRoute };
202
+ export { type DeepSimplify, type Hook, type MiddlewareToHandlerType, type OfHandlerType, OpenAPIHono, type OpenAPIHonoOptions, type OpenAPIObjectConfigure, type RouteConfig, type RouteConfigToEnv, type RouteConfigToTypedResponse, type RouteHandler, type RouteHook, createRoute };
package/dist/index.d.ts CHANGED
@@ -85,7 +85,42 @@ type OpenAPIHonoOptions<E extends Env> = {
85
85
  defaultHook?: Hook<any, E, any, any>;
86
86
  };
87
87
  type HonoInit<E extends Env> = ConstructorParameters<typeof Hono>[0] & OpenAPIHonoOptions<E>;
88
- type RouteHandler<R extends RouteConfig, E extends Env = Env, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Handler<E, P, I, R extends {
88
+ /**
89
+ * Turns `T | T[] | undefined` into `T[]`
90
+ */
91
+ type AsArray<T> = T extends undefined ? [] : T extends any[] ? T : [T];
92
+ /**
93
+ * Like simplify but recursive
94
+ */
95
+ type DeepSimplify<T> = {
96
+ [KeyType in keyof T]: T[KeyType] extends object ? DeepSimplify<T[KeyType]> : T[KeyType];
97
+ } & {};
98
+ /**
99
+ * Helper to infer generics from {@link MiddlewareHandler}
100
+ */
101
+ type OfHandlerType<T extends MiddlewareHandler> = T extends MiddlewareHandler<infer E, infer P, infer I> ? {
102
+ env: E;
103
+ path: P;
104
+ input: I;
105
+ } : never;
106
+ /**
107
+ * Reduce a tuple of middleware handlers into a single
108
+ * handler representing the composition of all
109
+ * handlers.
110
+ */
111
+ type MiddlewareToHandlerType<M extends MiddlewareHandler<any, any, any>[]> = M extends [
112
+ infer First,
113
+ infer Second,
114
+ ...infer Rest
115
+ ] ? First extends MiddlewareHandler<any, any, any> ? Second extends MiddlewareHandler<any, any, any> ? Rest extends MiddlewareHandler<any, any, any>[] ? MiddlewareToHandlerType<[
116
+ MiddlewareHandler<DeepSimplify<OfHandlerType<First>['env'] & OfHandlerType<Second>['env']>, // Combine envs
117
+ OfHandlerType<First>['path'], // Keep path from First
118
+ OfHandlerType<First>['input']>,
119
+ ...Rest
120
+ ]> : never : never : never : M extends [infer Last] ? Last : never;
121
+ type RouteMiddlewareParams<R extends RouteConfig> = OfHandlerType<MiddlewareToHandlerType<AsArray<R['middleware']>>>;
122
+ type RouteConfigToEnv<R extends RouteConfig> = RouteMiddlewareParams<R> extends never ? Env : RouteMiddlewareParams<R>['env'];
123
+ type RouteHandler<R extends RouteConfig, E extends Env = RouteConfigToEnv<R>, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Handler<E, P, I, R extends {
89
124
  responses: {
90
125
  [statusCode: number]: {
91
126
  content: {
@@ -94,7 +129,7 @@ type RouteHandler<R extends RouteConfig, E extends Env = Env, I extends Input =
94
129
  };
95
130
  };
96
131
  } ? MaybePromise<RouteConfigToTypedResponse<R>> : MaybePromise<RouteConfigToTypedResponse<R>> | MaybePromise<Response>>;
97
- type RouteHook<R extends RouteConfig, E extends Env = Env, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Hook<I, E, P, RouteConfigToTypedResponse<R> | Response | Promise<Response> | void | Promise<void>>;
132
+ type RouteHook<R extends RouteConfig, E extends Env = RouteConfigToEnv<R>, I extends Input = InputTypeParam<R> & InputTypeQuery<R> & InputTypeHeader<R> & InputTypeCookie<R> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R['path']>> = Hook<I, E, P, RouteConfigToTypedResponse<R> | Response | Promise<Response> | void | Promise<void>>;
98
133
  type OpenAPIObjectConfig = Parameters<InstanceType<typeof OpenApiGeneratorV3>['generateDocument']>[0];
99
134
  type OpenAPIObjectConfigure<E extends Env, P extends string> = OpenAPIObjectConfig | ((context: Context<E, P>) => OpenAPIObjectConfig);
100
135
  declare class OpenAPIHono<E extends Env = Env, S extends Schema = {}, BasePath extends string = '/'> extends Hono<E, S, BasePath> {
@@ -132,7 +167,7 @@ declare class OpenAPIHono<E extends Env = Env, S extends Schema = {}, BasePath e
132
167
  * }
133
168
  *)
134
169
  */
135
- openapi: <R extends RouteConfig, I extends Input = InputTypeBase<R, "params", "param"> & InputTypeBase<R, "query", "query"> & InputTypeBase<R, "headers", "header"> & InputTypeBase<R, "cookies", "cookie"> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R["path"]>>({ middleware: routeMiddleware, ...route }: R, handler: Handler<E, P, I, R extends {
170
+ openapi: <R extends RouteConfig, I extends Input = InputTypeBase<R, "params", "param"> & InputTypeBase<R, "query", "query"> & InputTypeBase<R, "headers", "header"> & InputTypeBase<R, "cookies", "cookie"> & InputTypeForm<R> & InputTypeJson<R>, P extends string = ConvertPathType<R["path"]>>({ middleware: routeMiddleware, ...route }: R, handler: Handler<R['middleware'] extends MiddlewareHandler[] | MiddlewareHandler ? RouteMiddlewareParams<R>['env'] & E : E, P, I, R extends {
136
171
  responses: {
137
172
  [statusCode: number]: {
138
173
  content: {
@@ -164,4 +199,4 @@ declare const createRoute: <P extends string, R extends Omit<RouteConfig, "path"
164
199
  getRoutingPath(): RoutingPath<R['path']>;
165
200
  };
166
201
 
167
- export { type Hook, OpenAPIHono, type OpenAPIHonoOptions, type OpenAPIObjectConfigure, type RouteConfig, type RouteConfigToTypedResponse, type RouteHandler, type RouteHook, createRoute };
202
+ export { type DeepSimplify, type Hook, type MiddlewareToHandlerType, type OfHandlerType, OpenAPIHono, type OpenAPIHonoOptions, type OpenAPIObjectConfigure, type RouteConfig, type RouteConfigToEnv, type RouteConfigToTypedResponse, type RouteHandler, type RouteHook, createRoute };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hono/zod-openapi",
3
- "version": "0.16.4",
3
+ "version": "0.17.1",
4
4
  "description": "A wrapper class of Hono which supports OpenAPI.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",