Skip to content

Commit

Permalink
feat(zod-openapi): allow multiple mimetype (#710)
Browse files Browse the repository at this point in the history
* feat(zod-openapi): allow multiple mimetype

Signed-off-by: Axel Meinhardt <26243798+ameinhardt@users.noreply.github.com>

* simplify the test

---------

Signed-off-by: Axel Meinhardt <26243798+ameinhardt@users.noreply.github.com>
Co-authored-by: Yusuke Wada <yusuke@kamawada.com>
  • Loading branch information
ameinhardt and yusukebe committed Aug 25, 2024
1 parent c49996d commit dadf5ce
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/clean-buses-shop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@hono/zod-openapi': minor
---

Allow multiple mime type response
2 changes: 1 addition & 1 deletion packages/zod-openapi/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ export type RouteConfigToTypedResponse<R extends RouteConfig> = {
: TypedResponse<
JSONParsed<ExtractContent<R['responses'][Status]['content']>>,
ExtractStatusCode<Status>,
'json'
'json' | 'text'
>
}[keyof R['responses'] & RouteConfigStatusCode]

Expand Down
61 changes: 58 additions & 3 deletions packages/zod-openapi/test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { OpenAPIHono, createRoute, z } from '../src/index'
import type { Equal, Expect } from 'hono/utils/types'
import type { ServerErrorStatusCode } from 'hono/utils/http-status'
import { stringify } from 'yaml'
import { accepts } from 'hono/accepts'

describe('Constructor', () => {
it('Should not require init object', () => {
Expand Down Expand Up @@ -788,6 +789,60 @@ describe('JSON and Form', () => {
})
})

describe('JSON and Text response', () => {
const route = createRoute({
method: 'get',
path: '/hello',
responses: {
200: {
content: {
'application/json': {
schema: z.object({}),
},
'text/plain': {
schema: z.string(),
},
},
description: 'response',
},
},
})

const app = new OpenAPIHono()

app.openapi(route, (c) => {
const mimeTypes = ['application/json', 'text/plain']
if (
accepts(c, {
default: mimeTypes[0],
header: 'Accept',
supports: mimeTypes,
}) === mimeTypes[0]
) {
return c.json({})
}
return c.text('')
})

test('should respond with JSON fallback', async () => {
const res = await app.request('/hello', {
method: 'GET',
})
expect(res.status).toBe(200)
expect(await res.json()).toEqual({})
})
test('should respond with Text', async () => {
const res = await app.request('/hello', {
method: 'GET',
headers: {
accept: 'text/plain',
},
})
expect(res.status).toBe(200)
expect(await res.text()).toEqual('')
})
})

describe('Input types', () => {
const ParamsSchema = z.object({
id: z
Expand Down Expand Up @@ -1724,21 +1779,21 @@ describe('RouteConfigToTypedResponse', () => {
age: number
},
200,
'json'
'json' | 'text'
>
| TypedResponse<
{
ok: boolean
},
400,
'json'
'json' | 'text'
>
| TypedResponse<
{
ok: boolean
},
ServerErrorStatusCode,
'json'
'json' | 'text'
>
type verify = Expect<Equal<Expected, Actual>>
})
Expand Down

0 comments on commit dadf5ce

Please sign in to comment.