diff --git a/.changeset/silly-chicken-suffer.md b/.changeset/silly-chicken-suffer.md new file mode 100644 index 00000000..72816706 --- /dev/null +++ b/.changeset/silly-chicken-suffer.md @@ -0,0 +1,5 @@ +--- +'@hono/zod-openapi': patch +--- + +Fix OpenAPI yaml with route middleware diff --git a/packages/zod-openapi/package.json b/packages/zod-openapi/package.json index 56261878..709da8df 100644 --- a/packages/zod-openapi/package.json +++ b/packages/zod-openapi/package.json @@ -48,11 +48,12 @@ "tsup": "^8.0.1", "typescript": "^5.4.4", "vitest": "^1.4.0", + "yaml": "^2.4.3", "zod": "^3.22.1" }, "dependencies": { "@asteasolutions/zod-to-openapi": "^7.0.0", - "@hono/zod-validator": "0.2.1" + "@hono/zod-validator": "0.2.2" }, "engines": { "node": ">=16.0.0" diff --git a/packages/zod-openapi/src/index.ts b/packages/zod-openapi/src/index.ts index 96f670c2..3c4f19c9 100644 --- a/packages/zod-openapi/src/index.ts +++ b/packages/zod-openapi/src/index.ts @@ -299,7 +299,7 @@ export class OpenAPIHono< InputTypeJson, P extends string = ConvertPathType >( - route: R, + {middleware: routeMiddleware, ...route}: R, handler: Handler< E, P, @@ -379,10 +379,10 @@ export class OpenAPIHono< } } - const middleware = route.middleware - ? Array.isArray(route.middleware) - ? route.middleware - : [route.middleware] + const middleware = routeMiddleware + ? Array.isArray(routeMiddleware) + ? routeMiddleware + : [routeMiddleware] : [] this.on( diff --git a/packages/zod-openapi/test/index.test.ts b/packages/zod-openapi/test/index.test.ts index e3286846..3fe43bf4 100644 --- a/packages/zod-openapi/test/index.test.ts +++ b/packages/zod-openapi/test/index.test.ts @@ -1,10 +1,12 @@ import type { RouteConfig } from '@asteasolutions/zod-to-openapi' import type { Context, TypedResponse } from 'hono' +import { bearerAuth } from 'hono/bearer-auth' import { hc } from 'hono/client' import { describe, it, expect, expectTypeOf } from 'vitest' import { OpenAPIHono, createRoute, z, RouteConfigToTypedResponse } from '../src/index' import { Expect, Equal } from 'hono/utils/types' import { ServerErrorStatusCode } from 'hono/utils/http-status' +import { stringify } from "yaml" describe('Constructor', () => { it('Should not require init object', () => { @@ -1489,27 +1491,67 @@ describe('RouteConfigToTypedResponse', () => { type Expected = | TypedResponse< - { - name: string - age: number - }, - 200, - 'json' - > + { + name: string + age: number + }, + 200, + 'json' + > | TypedResponse< - { - ok: boolean - }, - 400, - 'json' - > + { + ok: boolean + }, + 400, + 'json' + > | TypedResponse< - { - ok: boolean - }, - ServerErrorStatusCode, - 'json' - > + { + ok: boolean + }, + ServerErrorStatusCode, + 'json' + > type verify = Expect> }) }) + +describe("Generate YAML", () => { + it("Should generate YAML with Middleware", async () => { + const app = new OpenAPIHono() + app.openapi( + createRoute({ + method: 'get', + path: '/books', + middleware: [bearerAuth({ + verifyToken: (_, __) => { + return true; + }, + })], + responses: { + 200: { + description: 'Books', + content: { + 'application/json': { + schema: z.array( + z.object({ + title: z.string(), + }) + ), + }, + }, + }, + }, + }), + (c) => c.json([{ title: 'foo' }]) + ) + const doc = app.getOpenAPI31Document({ + openapi: '3.1.0', + info: { + title: 'My API', + version: '1.0.0', + } + }); + expect(() => stringify(doc)).to.not.throw(); + }) +}); diff --git a/packages/zod-openapi/yarn.lock b/packages/zod-openapi/yarn.lock index 7de12beb..4a98cd3a 100644 --- a/packages/zod-openapi/yarn.lock +++ b/packages/zod-openapi/yarn.lock @@ -593,13 +593,14 @@ __metadata: dependencies: "@asteasolutions/zod-to-openapi": "npm:^7.0.0" "@cloudflare/workers-types": "npm:^4.20240117.0" - "@hono/zod-validator": "npm:0.2.1" + "@hono/zod-validator": "npm:0.2.2" hono: "npm:^4.3.6" jest: "npm:^29.7.0" openapi3-ts: "npm:^4.1.2" tsup: "npm:^8.0.1" typescript: "npm:^5.4.4" vitest: "npm:^1.4.0" + yaml: "npm:^2.4.3" zod: "npm:^3.22.1" peerDependencies: hono: ">=4.3.6" @@ -607,13 +608,13 @@ __metadata: languageName: unknown linkType: soft -"@hono/zod-validator@npm:0.2.1": - version: 0.2.1 - resolution: "@hono/zod-validator@npm:0.2.1" +"@hono/zod-validator@npm:0.2.2": + version: 0.2.2 + resolution: "@hono/zod-validator@npm:0.2.2" peerDependencies: hono: ">=3.9.0" zod: ^3.19.1 - checksum: de399abc8ab26552111c745ae0ecad714af549e79b0412c2285d057bde72b434b09b8f9b65940d3a4b2dd82dcfb52e1601ac505effb410e4439e9c8835a99d7d + checksum: 3d6d03d28287e6f05e4cf5b86f3fa5fa386429a4212881f7344fe93272a69732ca8dd98634eb51df434b002230d2be2f3c6822f3b1ab320676932583856b30a5 languageName: node linkType: hard @@ -4835,6 +4836,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.4.3": + version: 2.4.3 + resolution: "yaml@npm:2.4.3" + bin: + yaml: bin.mjs + checksum: b4a9dea34265f000402c909144ac310be42c4526dfd16dff1aee2b04a0d94051713651c0cd2b0a3d8109266997422120f16a7934629d12f22dc215839ebbeccf + languageName: node + linkType: hard + "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" diff --git a/yarn.lock b/yarn.lock index ebb50a87..fdb377f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2168,13 +2168,14 @@ __metadata: dependencies: "@asteasolutions/zod-to-openapi": "npm:^7.0.0" "@cloudflare/workers-types": "npm:^4.20240117.0" - "@hono/zod-validator": "npm:0.2.1" + "@hono/zod-validator": "npm:0.2.2" hono: "npm:^4.3.6" jest: "npm:^29.7.0" openapi3-ts: "npm:^4.1.2" tsup: "npm:^8.0.1" typescript: "npm:^5.4.4" vitest: "npm:^1.4.0" + yaml: "npm:^2.4.3" zod: "npm:^3.22.1" peerDependencies: hono: ">=4.3.6" @@ -2182,17 +2183,7 @@ __metadata: languageName: unknown linkType: soft -"@hono/zod-validator@npm:0.2.1": - version: 0.2.1 - resolution: "@hono/zod-validator@npm:0.2.1" - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - checksum: de399abc8ab26552111c745ae0ecad714af549e79b0412c2285d057bde72b434b09b8f9b65940d3a4b2dd82dcfb52e1601ac505effb410e4439e9c8835a99d7d - languageName: node - linkType: hard - -"@hono/zod-validator@workspace:packages/zod-validator": +"@hono/zod-validator@npm:0.2.2, @hono/zod-validator@workspace:packages/zod-validator": version: 0.0.0-use.local resolution: "@hono/zod-validator@workspace:packages/zod-validator" dependencies: @@ -19176,6 +19167,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.4.3": + version: 2.4.3 + resolution: "yaml@npm:2.4.3" + bin: + yaml: bin.mjs + checksum: b4a9dea34265f000402c909144ac310be42c4526dfd16dff1aee2b04a0d94051713651c0cd2b0a3d8109266997422120f16a7934629d12f22dc215839ebbeccf + languageName: node + linkType: hard + "yargs-parser@npm:^18.1.2, yargs-parser@npm:^18.1.3": version: 18.1.3 resolution: "yargs-parser@npm:18.1.3"