honojs-middleware/packages/zod-openapi
github-actions[bot] 5e9f4f55a4
Version Packages (#122)
2023-08-19 02:54:34 +09:00
..
src feat: zod-openapi (#118) 2023-08-19 02:43:36 +09:00
test feat: zod-openapi (#118) 2023-08-19 02:43:36 +09:00
CHANGELOG.md Version Packages (#122) 2023-08-19 02:54:34 +09:00
README.md docs: fixed readme (#121) 2023-08-19 02:50:37 +09:00
package.json Version Packages (#122) 2023-08-19 02:54:34 +09:00
tsconfig.json feat: zod-openapi (#118) 2023-08-19 02:43:36 +09:00

README.md

Zod OpenAPI Hono

A wrapper class for Hono that supports OpenAPI. With it, you can validate values and types using Zod and generate OpenAPI Swagger documentation. This is based on Zod to OpenAPI. For details on creating schemas and defining routes, please refer to this resource.

This is not a middleware but hosted on this monorepo

Usage

Install

npm i hono zod @hono/zod-openapi

Write your application

Define schemas:

import { z } from '@hono/zod-openapi'

const ParamsSchema = z.object({
  id: z
    .string()
    .min(3)
    .openapi({
      param: {
        name: 'id',
        in: 'path',
      },
      example: '1212121',
    }),
})

const UserSchema = z
  .object({
    id: z.number().openapi({
      example: 123,
    }),
    name: z.string().openapi({
      example: 'John Doe',
    }),
    age: z.number().openapi({
      example: 42,
    }),
  })
  .openapi('User')

Create routes:

import { createRoute } from '@hono/zod-openapi'

const route = createRoute({
  method: 'get',
  path: '/users/:id',
  request: {
    params: ParamsSchema,
  },
  responses: {
    200: {
      content: {
        'application/json': {
          schema: UserSchema,
        },
      },
      description: 'Get the user',
    },
    400: {
      content: {
        'application/json': {
          schema: ErrorSchema,
        },
      },
      description: 'Error!',
    },
  },
})

Create the App:

import { OpenAPIHono } from '@hono/zod-openapi'

const app = new OpenAPIHono()

app.openapi(
  route,
  (c) => {
    const { id } = c.req.valid('param')
    return c.jsonT({
      id: Number(id),
      age: 20,
      name: 'Ultra-man',
    })
  },
  (result, c) => {
    if (!result.success) {
      const res = c.jsonT(
        {
          ok: false,
        },
        400
      )
      return res
    }
  }
)

app.doc('/doc', {
  openapi: '3.0.0',
  info: {
    version: '1.0.0',
    title: 'My API',
  },
})

Author

Yusuke Wada https://github.com/yusukebe

License

MIT