# openapi-zod

> Generate zod schemas from Swagger OpenAPI specs

Latest version **0.2.7** (published 2023-06-19) · MIT license · 0 weekly downloads

## Install

```sh
npm install openapi-zod
pnpm add openapi-zod
yarn add openapi-zod
bun add openapi-zod
```

Provides the command `openapi-zod`.

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.2.7 |
| Published | 2023-06-19 |
| First published | 2022-12-06 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 9 |
| Unpacked size | 272.2 KB |
| Known vulnerabilities | 0 (+17 in 2 direct dependencies) |
| Install scripts | no |
| Maintainers | mkarwayfare |
| Keywords | swagger, zod, typescript, ts, openapi, codegen, generation, openapi 3, node |

## Links

- npm: https://www.npmjs.com/package/openapi-zod
- Repository: https://github.com/wayfare-ai/openapi-zod
- Homepage: https://github.com/wayfare-ai/openapi-zod#readme
- Issues: https://github.com/wayfare-ai/openapi-zod/issues
- npm.io page: https://npm.io/package/openapi-zod

## Dependencies (9)

- [zod](https://npm.io/package/zod.md) ^3.19.1
- [lodash](https://npm.io/package/lodash.md) ^4.17.21
- [undici](https://npm.io/package/undici.md) ^5.12.0
- [js-yaml](https://npm.io/package/js-yaml.md) ^4.1.0
- [fast-glob](https://npm.io/package/fast-glob.md) ^3.2.12
- [array-move](https://npm.io/package/array-move.md) ^4.0.0
- [ansi-colors](https://npm.io/package/ansi-colors.md) ^4.1.3
- [yargs-parser](https://npm.io/package/yargs-parser.md) ^21.1.1
- [supports-color](https://npm.io/package/supports-color.md) ^9.2.3

## Alternatives

- [csv-to-markdown-table](https://npm.io/package/csv-to-markdown-table.md) — 47.0K weekly downloads
- [@sapphire/ratelimits](https://npm.io/package/@sapphire/ratelimits.md) — 4.4K weekly downloads
- [js-csvparser](https://npm.io/package/js-csvparser.md) — 2.0K weekly downloads
- [@adadapted/js-sdk](https://npm.io/package/@adadapted/js-sdk.md) — 251 weekly downloads
- [@grapecity/spread-sheets-sparklines](https://npm.io/package/@grapecity/spread-sheets-sparklines.md) — 103 weekly downloads

## Recent versions

- 0.2.7 (latest) — 2023-06-19
- 0.2.6 — 2023-06-06
- 0.2.5 — 2023-06-05
- 0.2.2 — 2023-06-01
- 0.2.1 — 2023-05-17
- 0.1.19 — 2023-04-26
- 0.1.18 — 2023-04-26
- 0.1.16 — 2023-01-27
- 0.1.15 — 2023-01-25
- 0.1.14 — 2023-01-16
- 0.1.13 — 2023-01-13
- 0.1.12 — 2023-01-11
- 0.1.11 — 2023-01-11
- 0.1.9 — 2023-01-10
- 0.1.8 — 2023-01-06
- … 6 more at https://npm.io/package/openapi-zod/versions

## README

[![version(scoped)](https://img.shields.io/npm/v/openapi-zod.svg)](https://www.npmjs.com/package/openapi-zod)
[![npm downloads (weekly)](https://img.shields.io/npm/dw/openapi-zod)](https://www.npmjs.com/package/openapi-zod)

<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->

[![All Contributors](https://img.shields.io/badge/all_contributors-55-orange.svg?style=flat-square)](#contributors-)

<!-- ALL-CONTRIBUTORS-BADGE:END -->

# 📘️ openapi-zod

🚀 Convert static [OpenAPI](https://spec.openapis.org/oas/latest.html) schemas to Zod schemas quickly using pure Node.js. Fast, lightweight, (almost) dependency-free, and no Java/node-gyp/running OpenAPI servers necessary.

This started as a fork of [openapi-typescript](https://github.com/drwpow/openapi-typescript)

**Dislcaimer**

> Use at your own risk! Any changes between this and the fork source [openapi-typescript](https://github.com/drwpow/openapi-typescript) should be considered un-tested, undocumented.

**Features**

- ✅ Supports YAML and JSON formats
- ✅ Supports advanced OpenAPI 3.1 features like [discriminators](https://spec.openapis.org/oas/v3.1.0#discriminator-object)
- ✅ Supports loading via remote URL (simple authentication supported with the `--auth` flag)
- ✅ Supports remote references: `$ref: "external.yaml#components/schemas/User"`
- ✅ Fetches remote schemas quickly using [undici](https://www.npmjs.com/package/undici)

**Examples**

👀 [See examples](./examples/)

## Usage

Note:️ openapi-zod requires **VALID** OpenAPI 3.x schemas to work, and this library does not handle validation. There are several quality tools that handle this like [@apidevtools/swagger-parser](https://www.npmjs.com/package/@apidevtools/swagger-parser). Make sure to validate your schemas first!

Secondly, because of circular references within external $ref fields, the corresponding external namespace rarely works as intended. Hence we recommend using a tool like [redocly cli](https://redocly.com/docs/cli/) (their bundle and join scripts) to merge all your api specs into one, and then using openapi-zod on the resulting file.

Also, since javascript has two types of optionals, i.e. `null` and `undefined`, and undefined gets converted to nulls for some serializers, you should ensure that anytime you are parsing a result, that you have deleted any nulls and undefined fields first. To do that, you can use the following helper type and function

```typescript
export type RecursivelyReplaceNullWithUndefined<T> = T extends null
  ? undefined
  : T extends (infer U)[]
  ? RecursivelyReplaceNullWithUndefined<U>[]
  : T extends Record<string, unknown>
  ? { [K in keyof T]: RecursivelyReplaceNullWithUndefined<T[K]> }
  : T;

/**
 * Recursively deletes any fields that are null and undefined. That way when serializing the json, undefineds wont turn into nulls
 */
export const deleteNullsAndUndefined = <T>(obj: T): RecursivelyReplaceNullWithUndefined<T> => {
  if (obj == null) return undefined as any;

  if (Array.isArray(obj)) {
    return obj.map((o) => deleteNullsAndUndefined(0)) as any;
  }
  let newObj: any = {};
  Object.keys(obj).forEach((key) => {
    if ((obj as any)[key] === Object((obj as any)[key])) newObj[key] = deleteNullsAndUndefined((obj as any)[key]);
    else if ((obj as any)[key] != null) newObj[key] = (obj as any)[key];
  });
  return newObj;
};
```

### 🖥️ CLI

#### 🗄️ Reading a local schema

```bash
npx openapi-zod schema.yaml --output schema.ts

# 🔭 Loading spec from schema.yaml…
# 🚀 schema.yaml -> schema.ts [250ms]
```

##### 🦠 Globbing local schemas

```bash
npx openapi-zod "specs/**/*.yaml" --output schemas/

# 🔭 Loading spec from specs/one.yaml…
# 🔭 Loading spec from specs/two.yaml…
# 🔭 Loading spec from specs/three.yaml…
# 🚀 specs/one.yaml -> schemas/specs/one.ts [250ms]
# 🚀 specs/two.yaml -> schemas/specs/two.ts [250ms]
# 🚀 specs/three.yaml -> schemas/specs/three.ts [250ms]
```

_Thanks, [@sharmarajdaksh](https://github.com/sharmarajdaksh)!_

#### ☁️ Reading remote schemas

```bash
npx openapi-zod https://petstore3.swagger.io/api/v3/openapi.yaml --output petstore.d.ts

# 🔭 Loading spec from https://petstore3.swagger.io/api/v3/openapi.yaml…
# 🚀 https://petstore3.swagger.io/api/v3/openapi.yaml -> petstore.d.ts [650ms]
```

_Thanks, [@psmyrdek](https://github.com/psmyrdek)!_

#### ⚾ Fetching data

##### Simple example

Any fetch call can be typed from the `paths` like so:

TODO

### 📖 Options

The following flags can be appended to the CLI command.

| Option                    | Alias | Default  | Description                                                                                                                  |
| :------------------------ | :---- | :------: | :--------------------------------------------------------------------------------------------------------------------------- |
| `--help`                  |       |          | Display inline help message and exit                                                                                         |
| `--version`               |       |          | Display this library’s version and exit                                                                                      |
| `--output [location]`     | `-o`  | (stdout) | Where should the output file be saved?                                                                                       |
| `--auth [token]`          |       |          | Provide an auth token to be passed along in the request (only if accessing a private schema)                                 |
| `--header`                | `-x`  |          | Provide an array of or singular headers as an alternative to a JSON object. Each header must follow the `key: value` pattern |
| `--headers-object="{…}"`  | `-h`  |          | Provide a JSON object as string of HTTP headers for remote schema request. This will take priority over `--header`           |
| `--http-method`           | `-m`  |  `GET`   | Provide the HTTP Verb/Method for fetching a schema from a remote URL                                                         |
| `--additional-properties` |       | `false`  | Allow arbitrary properties for all schema objects without `additionalProperties: false`                                      |
| `--default-non-nullable`  |       | `false`  | Treat schema objects with default values as non-nullable                                                                     |
| `--alphabetize`           |       | `false`  | Sort types alphabetically                                                                                                    |

### 🐢 Node

```bash
npm i --save-dev openapi-zod
```

```js
import fs from "node:fs";
import openapiZod from "openapi-zod";

// example 1: load [object] as schema (JSON only)
const schema = await fs.promises.readFile("spec.json", "utf8"); // must be OpenAPI JSON
const output = await openapiZod(JSON.parse(schema));

// example 2: load [string] as local file (YAML or JSON; released in v4.0)
const localPath = new URL("./spec.yaml", import.meta.url); // may be YAML or JSON format
const output = await openapiZod(localPath);

// example 3: load [string] as remote URL (YAML or JSON; released in v4.0)
const output = await openapiZod("https://myurl.com/v1/openapi.yaml");
```

The Node API may be useful if dealing with dynamically-created schemas, or you’re using within context of a larger application. Pass in either a JSON-friendly object to load a schema from memory, or a string to load a schema from a local file or remote URL (it will load the file quickly using built-in Node methods). Note that a YAML string isn’t supported in the Node.js API; either use the CLI or convert to JSON using [js-yaml](https://www.npmjs.com/package/js-yaml) first.

#### 📖 Node options

The Node API supports all the [CLI flags](#--options) above in `camelCase` format, plus the following additional options:

| Name            |    Type    | Default | Description                                                               |
| :-------------- | :--------: | :------ | :------------------------------------------------------------------------ |
| `commentHeader` |  `string`  |         | Override the default “This file was auto-generated …” file heading        |
| `inject`        |  `string`  |         | Inject arbitrary zod schemas into the start of the file                   |
| `transform`     | `Function` |         | Override the default Schema Object ➝ zod transformer in certain scenarios |
| `postTransform` | `Function` |         | Same as `transform` but runs _after_ the zod transformation               |

#### 🤖 transform / postTransform

If using the Node.js API, you can override the normal Schema Object transformer with your own. This is useful for providing enhanced functionality for specific parts of your schema.

For example, say your schema has the following property:

```yaml
properties:
  updated_at:
    type: string
    format: date-time
```

By default, openapiZod will generate `updated_at?: string;` because it’s not sure which format you want by `"date-time"` (formats are nonstandard and can be whatever you’d like). But we can enhance this by providing our own custom formatter, like so:

```js
const types = openapiZod(mySchema, {
  transform(schemaObject, metadata): string {
    if ("format" in schemaObject && schemaObject.format === "date-time") {
      return "z.date()";
    }
  },
});
```

That would result in the following change:

```diff
-  updated_at: z.string(),
+  updated_at: z.date(),
```

Any [Schema Object](https://spec.openapis.org/oas/latest.html#schema-object) present in your schema will be run through this formatter (even remote ones!). Also be sure to check the `metadata` parameter for additional context that may be helpful.

There are many other uses for this besides checking `format`. Because this must return a **string** you can produce any arbitrary TypeScript code you’d like (even your own custom types).

✨ Don’t forget about `postTransform()` as well! It works the same way, but runs _after_ the zod transformation so you can extend/modify types as-needed.

## 🏅 Project Goals

1. Support converting any valid OpenAPI schema to zod schemas, no matter how complicated.
1. This library does **NOT** validate your schema, there are other libraries for that.
1. The generated zod schemas **must** match your schema as closely as possible (e.g. no renaming to `PascalCase`)
1. This library should never require Java, node-gyp, or some other complex environment to work. This should require Node.js and nothing else.
1. This library will never require a running OpenAPI server to work.

## 🤝 Contributing

PRs are welcome! Please see our [CONTRIBUTING.md](./CONTRIBUTING.md) guide.

### Contributors ✨ (From the original openapi-typescript package)

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center"><a href="https://pow.rs"><img src="https://avatars3.githubusercontent.com/u/1369770?v=4?s=100" width="100px;" alt="Drew Powers"/><br /><sub><b>Drew Powers</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dangodev" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dangodev" title="Documentation">📖</a> <a href="#infra-dangodev" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dangodev" title="Tests">⚠️</a></td>
      <td align="center"><a href="http://smyrdek.com"><img src="https://avatars1.githubusercontent.com/u/6187417?v=4?s=100" width="100px;" alt="Przemek Smyrdek"/><br /><sub><b>Przemek Smyrdek</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=psmyrdek" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=psmyrdek" title="Documentation">📖</a> <a href="#ideas-psmyrdek" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=psmyrdek" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://danielenman.com"><img src="https://avatars3.githubusercontent.com/u/432487?v=4?s=100" width="100px;" alt="Dan Enman"/><br /><sub><b>Dan Enman</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aenmand" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=enmand" title="Code">💻</a></td>
      <td align="center"><a href="http://atlefren.net"><img src="https://avatars2.githubusercontent.com/u/1829927?v=4?s=100" width="100px;" alt="Atle Frenvik Sveen"/><br /><sub><b>Atle Frenvik Sveen</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=atlefren" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=atlefren" title="Documentation">📖</a> <a href="#ideas-atlefren" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=atlefren" title="Tests">⚠️</a></td>
      <td align="center"><a href="http://www.timdewolf.com"><img src="https://avatars0.githubusercontent.com/u/4455209?v=4?s=100" width="100px;" alt="Tim de Wolf"/><br /><sub><b>Tim de Wolf</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tpdewolf" title="Code">💻</a> <a href="#ideas-tpdewolf" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center"><a href="https://github.com/tombarton"><img src="https://avatars1.githubusercontent.com/u/6222711?v=4?s=100" width="100px;" alt="Tom Barton"/><br /><sub><b>Tom Barton</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tombarton" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tombarton" title="Documentation">📖</a> <a href="#ideas-tombarton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tombarton" title="Tests">⚠️</a></td>
      <td align="center"><a href="http://www.viig.no"><img src="https://avatars0.githubusercontent.com/u/1080888?v=4?s=100" width="100px;" alt="Sven Nicolai Viig"/><br /><sub><b>Sven Nicolai Viig</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Asvnv" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=svnv" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=svnv" title="Tests">⚠️</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://toot.cafe/@sorin"><img src="https://avatars1.githubusercontent.com/u/2109702?v=4?s=100" width="100px;" alt="Sorin Davidoi"/><br /><sub><b>Sorin Davidoi</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Asorin-davidoi" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=sorin-davidoi" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=sorin-davidoi" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/scvnathan"><img src="https://avatars3.githubusercontent.com/u/73474?v=4?s=100" width="100px;" alt="Nathan Schneirov"/><br /><sub><b>Nathan Schneirov</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=scvnathan" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=scvnathan" title="Documentation">📖</a> <a href="#ideas-scvnathan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=scvnathan" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://lbenie.xyz/"><img src="https://avatars1.githubusercontent.com/u/7316046?v=4?s=100" width="100px;" alt="Lucien Bénié"/><br /><sub><b>Lucien Bénié</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=lbenie" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=lbenie" title="Documentation">📖</a> <a href="#ideas-lbenie" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=lbenie" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://boris.sh"><img src="https://avatars1.githubusercontent.com/u/17952318?v=4?s=100" width="100px;" alt="Boris K"/><br /><sub><b>Boris K</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=bokub" title="Documentation">📖</a></td>
      <td align="center"><a href="https://twitter.com/antonk52"><img src="https://avatars1.githubusercontent.com/u/5817809?v=4?s=100" width="100px;" alt="Anton"/><br /><sub><b>Anton</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aantonk52" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=antonk52" title="Code">💻</a> <a href="#ideas-antonk52" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=antonk52" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/tshelburne"><img src="https://avatars3.githubusercontent.com/u/1202267?v=4?s=100" width="100px;" alt="Tim Shelburne"/><br /><sub><b>Tim Shelburne</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tshelburne" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tshelburne" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://typeofweb.com"><img src="https://avatars0.githubusercontent.com/u/1338731?v=4?s=100" width="100px;" alt="Michał Miszczyszyn"/><br /><sub><b>Michał Miszczyszyn</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=mmiszy" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/skh-"><img src="https://avatars1.githubusercontent.com/u/1292598?v=4?s=100" width="100px;" alt="Sam K Hall"/><br /><sub><b>Sam K Hall</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=skh-" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=skh-" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/BlooJeans"><img src="https://avatars2.githubusercontent.com/u/1751182?v=4?s=100" width="100px;" alt="Matt Jeanes"/><br /><sub><b>Matt Jeanes</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=BlooJeans" title="Code">💻</a></td>
      <td align="center"><a href="https://www.selbekk.io"><img src="https://avatars1.githubusercontent.com/u/1307267?v=4?s=100" width="100px;" alt="Kristofer Giltvedt Selbekk"/><br /><sub><b>Kristofer Giltvedt Selbekk</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=selbekk" title="Code">💻</a></td>
      <td align="center"><a href="https://mause.me"><img src="https://avatars2.githubusercontent.com/u/1405026?v=4?s=100" width="100px;" alt="Elliana May"/><br /><sub><b>Elliana May</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Mause" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Mause" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/henhal"><img src="https://avatars3.githubusercontent.com/u/9608258?v=4?s=100" width="100px;" alt="Henrik Hall"/><br /><sub><b>Henrik Hall</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=henhal" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=henhal" title="Documentation">📖</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=henhal" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://dev.to/gr2m"><img src="https://avatars3.githubusercontent.com/u/39992?v=4?s=100" width="100px;" alt="Gregor Martynus"/><br /><sub><b>Gregor Martynus</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=gr2m" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=gr2m" title="Tests">⚠️</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Agr2m" title="Bug reports">🐛</a></td>
      <td align="center"><a href="http://samn.co.uk"><img src="https://avatars2.githubusercontent.com/u/408983?v=4?s=100" width="100px;" alt="Sam Mesterton-Gibbons"/><br /><sub><b>Sam Mesterton-Gibbons</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=samdbmg" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Asamdbmg" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=samdbmg" title="Tests">⚠️</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://rendall.dev"><img src="https://avatars2.githubusercontent.com/u/293263?v=4?s=100" width="100px;" alt="Rendall"/><br /><sub><b>Rendall</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=rendall" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Arendall" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=rendall" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://massaioli.wordpress.com"><img src="https://avatars3.githubusercontent.com/u/149178?v=4?s=100" width="100px;" alt="Robert Massaioli"/><br /><sub><b>Robert Massaioli</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=robertmassaioli" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Arobertmassaioli" title="Bug reports">🐛</a></td>
      <td align="center"><a href="http://jankuca.com"><img src="https://avatars3.githubusercontent.com/u/367262?v=4?s=100" width="100px;" alt="Jan Kuča"/><br /><sub><b>Jan Kuča</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=jankuca" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=jankuca" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/th-m"><img src="https://avatars3.githubusercontent.com/u/13792029?v=4?s=100" width="100px;" alt="Thomas Valadez"/><br /><sub><b>Thomas Valadez</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=th-m" title="Documentation">📖</a></td>
      <td align="center"><a href="https://asithadesilva.com"><img src="https://avatars1.githubusercontent.com/u/3814354?v=4?s=100" width="100px;" alt="Asitha de Silva"/><br /><sub><b>Asitha de Silva</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=asithade" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aasithade" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://github.com/MikeYermolayev"><img src="https://avatars2.githubusercontent.com/u/8783498?v=4?s=100" width="100px;" alt="Mikhail Yermolayev"/><br /><sub><b>Mikhail Yermolayev</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3AMikeYermolayev" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://github.com/radist2s"><img src="https://avatars.githubusercontent.com/u/725645?v=4?s=100" width="100px;" alt="Alex Batalov"/><br /><sub><b>Alex Batalov</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=radist2s" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=radist2s" title="Tests">⚠️</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/FedeBev"><img src="https://avatars.githubusercontent.com/u/22151395?v=4?s=100" width="100px;" alt="Federico Bevione"/><br /><sub><b>Federico Bevione</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3AFedeBev" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=FedeBev" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=FedeBev" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/yamacent"><img src="https://avatars.githubusercontent.com/u/8544439?v=4?s=100" width="100px;" alt="Daisuke Yamamoto"/><br /><sub><b>Daisuke Yamamoto</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=yamacent" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Ayamacent" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=yamacent" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/dnalborczyk"><img src="https://avatars.githubusercontent.com/u/2903325?v=4?s=100" width="100px;" alt="dnalborczyk"/><br /><sub><b>dnalborczyk</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dnalborczyk" title="Documentation">📖</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dnalborczyk" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dnalborczyk" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://github.com/FabioWanner"><img src="https://avatars.githubusercontent.com/u/46821078?v=4?s=100" width="100px;" alt="FabioWanner"/><br /><sub><b>FabioWanner</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3AFabioWanner" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=FabioWanner" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=FabioWanner" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://www.ashsmith.io"><img src="https://avatars.githubusercontent.com/u/1086841?v=4?s=100" width="100px;" alt="Ash Smith"/><br /><sub><b>Ash Smith</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ashsmith" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aashsmith" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ashsmith" title="Tests">⚠️</a></td>
      <td align="center"><a href="http://mehalter.com"><img src="https://avatars.githubusercontent.com/u/1591837?v=4?s=100" width="100px;" alt="Micah Halter"/><br /><sub><b>Micah Halter</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=mehalter" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=mehalter" title="Tests">⚠️</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Amehalter" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://github.com/Chrg1001"><img src="https://avatars.githubusercontent.com/u/40189653?v=4?s=100" width="100px;" alt="Yuto Yoshihara"/><br /><sub><b>Yuto Yoshihara</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Chrg1001" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3AChrg1001" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Chrg1001" title="Tests">⚠️</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/sharmarajdaksh"><img src="https://avatars.githubusercontent.com/u/33689528?v=4?s=100" width="100px;" alt="Dakshraj Sharma"/><br /><sub><b>Dakshraj Sharma</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=sharmarajdaksh" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/shuluster"><img src="https://avatars.githubusercontent.com/u/1707910?v=4?s=100" width="100px;" alt="Shaosu Liu"/><br /><sub><b>Shaosu Liu</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=shuluster" title="Code">💻</a></td>
      <td align="center"><a href="https://vytenis.kuciauskas.lt"><img src="https://avatars.githubusercontent.com/u/468006?v=4?s=100" width="100px;" alt="Vytenis"/><br /><sub><b>Vytenis</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=FDiskas" title="Code">💻</a></td>
      <td align="center"><a href="http://www.zornwebdev.com"><img src="https://avatars.githubusercontent.com/u/22532542?v=4?s=100" width="100px;" alt="Eric Zorn"/><br /><sub><b>Eric Zorn</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ericzorn93" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ericzorn93" title="Tests">⚠️</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ericzorn93" title="Documentation">📖</a></td>
      <td align="center"><a href="https://www.mbelsky.com/"><img src="https://avatars.githubusercontent.com/u/3923527?v=4?s=100" width="100px;" alt="Max Belsky"/><br /><sub><b>Max Belsky</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=mbelsky" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Ambelsky" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://github.com/Peteck"><img src="https://avatars.githubusercontent.com/u/1520592?v=4?s=100" width="100px;" alt="Peter Bech"/><br /><sub><b>Peter Bech</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Peteck" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3APeteck" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://rusty.today"><img src="https://avatars.githubusercontent.com/u/731941?v=4?s=100" width="100px;" alt="Rusty Conover"/><br /><sub><b>Rusty Conover</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=rustyconover" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://github.com/bunkscene"><img src="https://avatars.githubusercontent.com/u/2693678?v=4?s=100" width="100px;" alt="Dave Carlson"/><br /><sub><b>Dave Carlson</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=bunkscene" title="Code">💻</a></td>
      <td align="center"><a href="https://ottomated.net"><img src="https://avatars.githubusercontent.com/u/31470743?v=4?s=100" width="100px;" alt="ottomated"/><br /><sub><b>ottomated</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ottomated" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aottomated" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://karanarqq.dev"><img src="https://avatars.githubusercontent.com/u/28733669?v=4?s=100" width="100px;" alt="Artem Shuvaev"/><br /><sub><b>Artem Shuvaev</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=sadfsdfdsa" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Asadfsdfdsa" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://github.com/ajaishankar"><img src="https://avatars.githubusercontent.com/u/328008?v=4?s=100" width="100px;" alt="ajaishankar"/><br /><sub><b>ajaishankar</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=ajaishankar" title="Documentation">📖</a></td>
      <td align="center"><a href="http://www.dominikdosoudil.cz"><img src="https://avatars.githubusercontent.com/u/15929942?v=4?s=100" width="100px;" alt="Dominik Dosoudil"/><br /><sub><b>Dominik Dosoudil</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dominikdosoudil" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=dominikdosoudil" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://kgtkr.net/"><img src="https://avatars.githubusercontent.com/u/17868838?v=4?s=100" width="100px;" alt="tkr"/><br /><sub><b>tkr</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=kgtkr" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=kgtkr" title="Documentation">📖</a></td>
      <td align="center"><a href="https://github.com/berzi"><img src="https://avatars.githubusercontent.com/u/32619123?v=4?s=100" width="100px;" alt="berzi"/><br /><sub><b>berzi</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=berzi" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=berzi" title="Documentation">📖</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=berzi" title="Tests">⚠️</a></td>
    </tr>
    <tr>
      <td align="center"><a href="https://philip-trauner.me"><img src="https://avatars.githubusercontent.com/u/9287847?v=4?s=100" width="100px;" alt="Philip Trauner"/><br /><sub><b>Philip Trauner</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=PhilipTrauner" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=PhilipTrauner" title="Documentation">📖</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=PhilipTrauner" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://powell-v2.github.io/"><img src="https://avatars.githubusercontent.com/u/25308326?v=4?s=100" width="100px;" alt="Pavel Yermolin"/><br /><sub><b>Pavel Yermolin</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Powell-v2" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Powell-v2" title="Documentation">📖</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Powell-v2" title="Tests">⚠️</a></td>
      <td align="center"><a href="http://www.duncanbeevers.com"><img src="https://avatars.githubusercontent.com/u/7367?v=4?s=100" width="100px;" alt="Duncan Beevers"/><br /><sub><b>Duncan Beevers</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=duncanbeevers" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Aduncanbeevers" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=duncanbeevers" title="Tests">⚠️</a></td>
      <td align="center"><a href="https://t.me/tkukushkin"><img src="https://avatars.githubusercontent.com/u/1482516?v=4?s=100" width="100px;" alt="Timofey Kukushkin"/><br /><sub><b>Timofey Kukushkin</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tkukushkin" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=tkukushkin" title="Tests">⚠️</a> <a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3Atkukushkin" title="Bug reports">🐛</a></td>
      <td align="center"><a href="https://semigradsky.dev/"><img src="https://avatars.githubusercontent.com/u/1198848?v=4?s=100" width="100px;" alt="Dmitry Semigradsky"/><br /><sub><b>Dmitry Semigradsky</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/issues?q=author%3ASemigradsky" title="Bug reports">🐛</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Semigradsky" title="Tests">⚠️</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=Semigradsky" title="Code">💻</a></td>
      <td align="center"><a href="http://jeremyliberman.com/"><img src="https://avatars.githubusercontent.com/u/2754163?v=4?s=100" width="100px;" alt="Jeremy Liberman"/><br /><sub><b>Jeremy Liberman</b></sub></a><br /><a href="https://github.com/wayfare-ai/openapi-zod/commits?author=MrLeebo" title="Code">💻</a> <a href="https://github.com/wayfare-ai/openapi-zod/commits?author=MrLeebo" title="Tests">⚠️</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification.
Contributions of any kind welcome!

---
_Source: https://npm.io/package/openapi-zod · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
