@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 +6 -2
- package/dist/index.d.mts +39 -4
- package/dist/index.d.ts +39 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,7 +51,8 @@ const UserSchema = z
|
|
|
51
51
|
.openapi('User')
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
> [!TIP]
|
|
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: [
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 };
|