@orpc/zod 2.0.0-beta.3 β 2.0.0-beta.31
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 +71 -101
- package/dist/index.d.mts +269 -4
- package/dist/index.d.ts +269 -4
- package/dist/index.mjs +58 -7
- package/package.json +14 -3
package/README.md
CHANGED
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
<a href="https://codecov.io/gh/middleapi/orpc">
|
|
5
5
|
<img alt="codecov" src="https://codecov.io/gh/middleapi/orpc/branch/main/graph/badge.svg">
|
|
6
6
|
</a>
|
|
7
|
-
<a href="https://
|
|
7
|
+
<a href="https://npmx.dev/package/@orpc/zod">
|
|
8
8
|
<img alt="weekly downloads" src="https://img.shields.io/npm/dw/%40orpc%2Fzod?logo=npm" />
|
|
9
9
|
</a>
|
|
10
|
+
<a href="https://app.codspeed.io/middleapi/orpc?utm_source=badge">
|
|
11
|
+
<img alt="CodSpeed" src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" />
|
|
12
|
+
</a>
|
|
10
13
|
<a href="https://github.com/middleapi/orpc/blob/main/LICENSE">
|
|
11
14
|
<img alt="MIT License" src="https://img.shields.io/github/license/middleapi/orpc?logo=open-source-initiative" />
|
|
12
15
|
</a>
|
|
@@ -26,60 +29,63 @@ You can read the documentation [here](https://orpc.dev).
|
|
|
26
29
|
|
|
27
30
|
**Core**
|
|
28
31
|
|
|
29
|
-
- [@orpc/contract](https://
|
|
30
|
-
- [@orpc/server](https://
|
|
31
|
-
- [@orpc/client](https://
|
|
32
|
-
- [@orpc/openapi](https://
|
|
32
|
+
- [@orpc/contract](https://npmx.dev/package/@orpc/contract): Define API contract as the single source of truth.
|
|
33
|
+
- [@orpc/server](https://npmx.dev/package/@orpc/server): Build APIs or implement contracts.
|
|
34
|
+
- [@orpc/client](https://npmx.dev/package/@orpc/client): Consume APIs with end-to-end type safety.
|
|
35
|
+
- [@orpc/openapi](https://npmx.dev/package/@orpc/openapi): Add OpenAPI compatibility to APIs.
|
|
33
36
|
|
|
34
37
|
**Schema validation**
|
|
35
38
|
|
|
36
|
-
- [@orpc/zod](https://
|
|
37
|
-
- [@orpc/valibot](https://
|
|
38
|
-
- [@orpc/arktype](https://
|
|
39
|
+
- [@orpc/zod](https://npmx.dev/package/@orpc/zod): Integrate with [Zod](https://zod.dev/).
|
|
40
|
+
- [@orpc/valibot](https://npmx.dev/package/@orpc/valibot): Integrate with [Valibot](https://valibot.dev/).
|
|
41
|
+
- [@orpc/arktype](https://npmx.dev/package/@orpc/arktype): Integrate with [ArkType](https://arktype.io/).
|
|
39
42
|
|
|
40
|
-
**
|
|
43
|
+
**Built-in features**
|
|
41
44
|
|
|
42
|
-
- [@orpc/
|
|
43
|
-
- [@orpc/
|
|
44
|
-
- [@orpc/
|
|
45
|
+
- [@orpc/publisher](https://npmx.dev/package/@orpc/publisher): Pub/Sub with memory, Redis, and Upstash adapters.
|
|
46
|
+
- [@orpc/ratelimit](https://npmx.dev/package/@orpc/ratelimit): Rate limiting with memory, Redis, and Upstash adapters.
|
|
47
|
+
- [@orpc/hibernation](https://npmx.dev/package/@orpc/hibernation): Leverage Hibernation APIs like [Cloudflare's Hibernation WebSocket](https://developers.cloudflare.com/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api).
|
|
48
|
+
- [@orpc/json-schema](https://npmx.dev/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
|
|
45
49
|
|
|
46
|
-
**
|
|
50
|
+
**Framework & ecosystem integrations**
|
|
47
51
|
|
|
48
|
-
- [@orpc/
|
|
49
|
-
- [@orpc/
|
|
50
|
-
- [@orpc/
|
|
52
|
+
- [@orpc/next](https://npmx.dev/package/@orpc/next): Integrate with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
|
|
53
|
+
- [@orpc/ai-sdk](https://npmx.dev/package/@orpc/ai-sdk): Turn contracts and procedures into [AI SDK](https://ai-sdk.dev/) tools.
|
|
54
|
+
- [@orpc/tanstack-query](https://npmx.dev/package/@orpc/tanstack-query): Integrate with [TanStack Query](https://tanstack.com/query/latest).
|
|
55
|
+
- [@orpc/pinia-colada](https://npmx.dev/package/@orpc/pinia-colada): Integrate with [Pinia Colada](https://pinia-colada.esm.dev/).
|
|
56
|
+
- [@orpc/swr](https://npmx.dev/package/@orpc/swr): Integrate with [SWR](https://swr.vercel.app/).
|
|
57
|
+
- [@orpc/experimental-msw](https://npmx.dev/package/@orpc/experimental-msw): Mock procedures with [Mock Service Worker](https://mswjs.io/).
|
|
58
|
+
- [@orpc/experimental-effect](https://npmx.dev/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
|
|
59
|
+
- [@orpc/nest](https://npmx.dev/package/@orpc/nest): Implement your contract with [NestJS](https://nestjs.com/).
|
|
60
|
+
- [@orpc/node](https://npmx.dev/package/@orpc/node): [Node.js](https://nodejs.org/) plugins for static file serving and large uploads.
|
|
61
|
+
- [@orpc/bun](https://npmx.dev/package/@orpc/bun): Adapters for [Bun's Redis](https://bun.sh/).
|
|
62
|
+
- [@orpc/cloudflare](https://npmx.dev/package/@orpc/cloudflare): Adapters for [Cloudflare's RateLimit and Durable Objects](https://developers.cloudflare.com/workers/).
|
|
63
|
+
- [@orpc/trpc](https://npmx.dev/package/@orpc/trpc): Reuse existing [tRPC](https://trpc.io/) routers within oRPC.
|
|
51
64
|
|
|
52
65
|
**Observability**
|
|
53
66
|
|
|
54
|
-
- [@orpc/opentelemetry](https://
|
|
55
|
-
- [@orpc/pino](https://
|
|
56
|
-
- [@orpc/evlog](https://
|
|
67
|
+
- [@orpc/opentelemetry](https://npmx.dev/package/@orpc/opentelemetry): Integrate with [OpenTelemetry](https://opentelemetry.io/) for distributed tracing.
|
|
68
|
+
- [@orpc/pino](https://npmx.dev/package/@orpc/pino): Integrate with [Pino](https://getpino.io/) for logging.
|
|
69
|
+
- [@orpc/evlog](https://npmx.dev/package/@orpc/evlog): Integrate with [Evlog](https://evlog.dev/) for logging.
|
|
57
70
|
|
|
58
71
|
## Sponsors
|
|
59
72
|
|
|
60
|
-
Like what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going
|
|
61
|
-
|
|
62
|
-
### π Platinum Sponsor
|
|
73
|
+
Like what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going through [GitHub Sponsors](https://github.com/sponsors/dinwwwh) or [Open Collective](https://opencollective.com/middleapi). Every bit helps! π
|
|
63
74
|
|
|
64
75
|
<table>
|
|
65
76
|
<tr>
|
|
66
|
-
<td
|
|
77
|
+
<td width="2000"><a href="https://screenshotone.com/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener" title="The screenshot API for developers"><img src="https://avatars.githubusercontent.com/u/97035603?v=4" width="64" align="left" hspace="12" alt="ScreenshotOne.com"/><b>ScreenshotOne.com</b></a><br /><sub>The screenshot API for developers</sub></td>
|
|
67
78
|
</tr>
|
|
68
|
-
</table>
|
|
69
|
-
|
|
70
|
-
### π₯ Silver Sponsor
|
|
71
|
-
|
|
72
|
-
<table>
|
|
73
79
|
<tr>
|
|
74
|
-
<td
|
|
80
|
+
<td width="2000"><a href="https://misskey.io/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Decentralized microblogging SNS born on Earth"><img src="https://github.com/MisskeyIO.png" width="64" align="left" hspace="12" alt="MisskeyHQ"/><b>MisskeyHQ</b></a><br /><sub>Decentralized microblogging SNS born on Earth</sub></td>
|
|
75
81
|
</tr>
|
|
76
82
|
</table>
|
|
77
83
|
|
|
78
|
-
###
|
|
84
|
+
### Organization Sponsors
|
|
79
85
|
|
|
80
86
|
<table>
|
|
81
87
|
<tr>
|
|
82
|
-
<td align="center"><a href="https://
|
|
88
|
+
<td align="center"><a href="https://lnmarkets.com/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="LN Markets"><img src="https://avatars.githubusercontent.com/u/70597625?v=4" width="167" alt="LN Markets"/><br />LN Markets</a></td>
|
|
83
89
|
</tr>
|
|
84
90
|
</table>
|
|
85
91
|
|
|
@@ -87,26 +93,26 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
|
|
|
87
93
|
|
|
88
94
|
<table>
|
|
89
95
|
<tr>
|
|
90
|
-
<td align="center"><a href="https://github.com/hrmcdonald?ref=
|
|
91
|
-
<td align="center"><a href="https://
|
|
92
|
-
<td align="center"><a href="https://github.com/
|
|
93
|
-
<td align="center"><a href="https://
|
|
94
|
-
<td align="center"><a href="https://github.com/
|
|
95
|
-
<td align="center"><a href="https://github.com/
|
|
96
|
+
<td align="center"><a href="https://github.com/hrmcdonald?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Reece McDonald"><img src="https://avatars.githubusercontent.com/u/39349270?v=4" width="139" alt="Reece McDonald"/><br />Reece McDonald</a></td>
|
|
97
|
+
<td align="center"><a href="https://soymilk.party/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="γγγγγ¨γΌγ«γ
"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&v=4" width="139" alt="γγγγγ¨γΌγ«γ
"/><br />γγγγγ¨γΌγ«γ
</a></td>
|
|
98
|
+
<td align="center"><a href="https://github.com/nicognaW?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="nk"><img src="https://avatars.githubusercontent.com/u/66731869?u=4699bda3a9092d3ec34fbd959450767bcc8b8b6d&v=4" width="139" alt="nk"/><br />nk</a></td>
|
|
99
|
+
<td align="center"><a href="https://supastarter.dev/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="supastarter"><img src="https://avatars.githubusercontent.com/u/110960143?v=4" width="139" alt="supastarter"/><br />supastarter</a></td>
|
|
100
|
+
<td align="center"><a href="https://github.com/divmgl?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Dexter Miguel"><img src="https://avatars.githubusercontent.com/u/5452298?u=645993204be8696c085ecf0d228c3062efe2ed65&v=4" width="139" alt="Dexter Miguel"/><br />Dexter Miguel</a></td>
|
|
101
|
+
<td align="center"><a href="https://github.com/herrfugbaum?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="herrfugbaum"><img src="https://avatars.githubusercontent.com/u/12859776?u=644dc1666d0220bc0468eb0de3c56b919f635b16&v=4" width="139" alt="herrfugbaum"/><br />herrfugbaum</a></td>
|
|
96
102
|
</tr>
|
|
97
103
|
<tr>
|
|
98
|
-
<td align="center"><a href="https://
|
|
99
|
-
<td align="center"><a href="https://
|
|
100
|
-
<td align="center"><a href="https://github.
|
|
101
|
-
<td align="center"><a href="https://
|
|
102
|
-
<td align="center"><a href="https://
|
|
103
|
-
<td align="center"><a href="https://github.com/
|
|
104
|
+
<td align="center"><a href="https://laststance.io/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ryota Murakami"><img src="https://avatars.githubusercontent.com/u/5501268?u=599389e03340734325726ca3f8f423c021d47d7f&v=4" width="139" alt="Ryota Murakami"/><br />Ryota Murakami</a></td>
|
|
105
|
+
<td align="center"><a href="https://cra.mr/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="David Cramer"><img src="https://avatars.githubusercontent.com/u/23610?v=4" width="139" alt="David Cramer"/><br />David Cramer</a></td>
|
|
106
|
+
<td align="center"><a href="https://valerii15298.github.io/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Valerii Petryniak"><img src="https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&v=4" width="139" alt="Valerii Petryniak"/><br />Valerii Petryniak</a></td>
|
|
107
|
+
<td align="center"><a href="https://letstri.dev/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Valerii Strilets"><img src="https://avatars.githubusercontent.com/u/13253748?u=c7b10399ccc8f8081e24db94ec32cd9858e86ac3&v=4" width="139" alt="Valerii Strilets"/><br />Valerii Strilets</a></td>
|
|
108
|
+
<td align="center"><a href="https://blacklight.sh/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kyle Mistele"><img src="https://avatars.githubusercontent.com/u/18430555?u=3afebeb81de666e35aaac3ed46f14159d7603ffb&v=4" width="139" alt="Kyle Mistele"/><br />Kyle Mistele</a></td>
|
|
109
|
+
<td align="center"><a href="https://github.com/christ12938?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="christ12938"><img src="https://avatars.githubusercontent.com/u/25758598?v=4" width="139" alt="christ12938"/><br />christ12938</a></td>
|
|
104
110
|
</tr>
|
|
105
111
|
<tr>
|
|
106
|
-
<td align="center"><a href="https://github.com/
|
|
107
|
-
<td align="center"><a href="https://github.com/
|
|
108
|
-
<td align="center"><a href="https://github.com/
|
|
109
|
-
<td align="center"><a href="https://github.com/
|
|
112
|
+
<td align="center"><a href="https://github.com/Ryanjso?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ryan Soderberg"><img src="https://avatars.githubusercontent.com/u/39172778?u=5ed913c31d57e7221b75784abcad48c7ebddde27&v=4" width="139" alt="Ryan Soderberg"/><br />Ryan Soderberg</a></td>
|
|
113
|
+
<td align="center"><a href="https://github.com/itigoore01?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="shota"><img src="https://avatars.githubusercontent.com/u/11831107?u=c976a6dc7e055eb026304c46c99100ed22b0c8e0&v=4" width="139" alt="shota"/><br />shota</a></td>
|
|
114
|
+
<td align="center"><a href="https://github.com/ellis-driscoll?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ellis Driscoll"><img src="https://avatars.githubusercontent.com/u/70685966?u=c5f95bc33b5991d9744abe00052542e4a2ed3cb9&v=4" width="139" alt="Ellis Driscoll"/><br />Ellis Driscoll</a></td>
|
|
115
|
+
<td align="center"><a href="https://github.com/hoangbn?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Hoang Nguyen"><img src="https://avatars.githubusercontent.com/u/38968280?u=c90084c6de65c56facabab7ba13a72a49ddbc3e4&v=4" width="139" alt="Hoang Nguyen"/><br />Hoang Nguyen</a></td>
|
|
110
116
|
</tr>
|
|
111
117
|
</table>
|
|
112
118
|
|
|
@@ -114,67 +120,31 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
|
|
|
114
120
|
|
|
115
121
|
<table>
|
|
116
122
|
<tr>
|
|
117
|
-
<td align="center"><a href="https://github.com/rhinodavid?ref=
|
|
118
|
-
<td align="center"><a href="https://
|
|
119
|
-
<td align="center"><a href="https://github.com/aidansunbury?ref=
|
|
120
|
-
<td align="center"><a href="https://github.com/soonoo?ref=
|
|
121
|
-
<td align="center"><a href="https://
|
|
122
|
-
<td align="center"><a href="https://github.com/pumpkinlink?ref=
|
|
123
|
-
<td align="center"><a href="https://github.com/christopher-kapic?ref=
|
|
123
|
+
<td align="center"><a href="https://github.com/rhinodavid?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="David Walsh"><img src="https://avatars.githubusercontent.com/u/5778036?u=b5521f07d2f88c3db2a0dae62b5f2f8357214af0&v=4" width="119" alt="David Walsh"/><br />David Walsh</a></td>
|
|
124
|
+
<td align="center"><a href="https://robbevaes.be/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Robbe Vaes"><img src="https://avatars.githubusercontent.com/u/44748019?u=e0232402c045ad4eac7cbd217f1f47e083103b89&v=4" width="119" alt="Robbe Vaes"/><br />Robbe Vaes</a></td>
|
|
125
|
+
<td align="center"><a href="https://github.com/aidansunbury?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Aidan Sunbury"><img src="https://avatars.githubusercontent.com/u/64103161?v=4" width="119" alt="Aidan Sunbury"/><br />Aidan Sunbury</a></td>
|
|
126
|
+
<td align="center"><a href="https://github.com/soonoo?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="soonoo"><img src="https://avatars.githubusercontent.com/u/5436405?u=5d0b4aa955c87e30e6bda7f0cccae5402da99528&v=4" width="119" alt="soonoo"/><br />soonoo</a></td>
|
|
127
|
+
<td align="center"><a href="https://kevinporten.dev/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kevin Porten"><img src="https://avatars.githubusercontent.com/u/1839345?u=dc2263d5cfe0d927ce1a0be04a1d55dd6b55405c&v=4" width="119" alt="Kevin Porten"/><br />Kevin Porten</a></td>
|
|
128
|
+
<td align="center"><a href="https://github.com/pumpkinlink?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Denis"><img src="https://avatars.githubusercontent.com/u/11864620?u=5f47bbe6c65d0f6f5cf011021490238e4b0593d0&v=4" width="119" alt="Denis"/><br />Denis</a></td>
|
|
129
|
+
<td align="center"><a href="https://github.com/christopher-kapic?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Christopher Kapic"><img src="https://avatars.githubusercontent.com/u/59740769?u=e7ad4b72b5bf6c9eb1644c26dbf3332a8f987377&v=4" width="119" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
|
|
124
130
|
</tr>
|
|
125
131
|
<tr>
|
|
126
|
-
<td align="center"><a href="
|
|
127
|
-
<td align="center"><a href="https://
|
|
128
|
-
<td align="center"><a href="https://github.com/Titoine?ref=
|
|
129
|
-
<td align="center"><a href="https://
|
|
130
|
-
<td align="center"><a href="https://
|
|
131
|
-
<td align="center"><a href="https://
|
|
132
|
-
<td align="center"><a href="https://
|
|
132
|
+
<td align="center"><a href="http://ballingt.com/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Tom Ballinger"><img src="https://avatars.githubusercontent.com/u/458879?u=4b045ac75d721b6ac2b42a74d7d37f61f0414031&v=4" width="119" alt="Tom Ballinger"/><br />Tom Ballinger</a></td>
|
|
133
|
+
<td align="center"><a href="https://lee-sam.com/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Sam"><img src="https://avatars.githubusercontent.com/u/102863520?u=3c89611f549d5070be232eb4532f690c8f2e7a65&v=4" width="119" alt="Sam"/><br />Sam</a></td>
|
|
134
|
+
<td align="center"><a href="https://github.com/Titoine?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Titoine"><img src="https://avatars.githubusercontent.com/u/3514286?u=1bb1e86b0c99c8a1121372e56d51a177eea12191&v=4" width="119" alt="Titoine"/><br />Titoine</a></td>
|
|
135
|
+
<td align="center"><a href="https://rigtch.fm/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Igor Makowski"><img src="https://avatars.githubusercontent.com/u/56691628?u=ee8c879478f7c151b9156aef6c74243fa3e247a8&v=4" width="119" alt="Igor Makowski"/><br />Igor Makowski</a></td>
|
|
136
|
+
<td align="center"><a href="https://blog.cwang.io/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="hanayashiki"><img src="https://avatars.githubusercontent.com/u/26056783?u=06c3b9205a16fd41a871e82da1cc2a09306d53f5&v=4" width="119" alt="hanayashiki"/><br />hanayashiki</a></td>
|
|
137
|
+
<td align="center"><a href="https://dubinets.io/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Lev Dubinets"><img src="https://avatars.githubusercontent.com/u/3114081?u=f547f5d5012cab54851f1b1ad72d10e537f78fc2&v=4" width="119" alt="Lev Dubinets"/><br />Lev Dubinets</a></td>
|
|
138
|
+
<td align="center"><a href="https://bika.ai/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kelly Peilin Chan"><img src="https://avatars.githubusercontent.com/u/520852?u=6b0f7105f694e7b5cacf410a3f04c7044b469dc8&v=4" width="119" alt="Kelly Peilin Chan"/><br />Kelly Peilin Chan</a></td>
|
|
133
139
|
</tr>
|
|
134
140
|
<tr>
|
|
135
|
-
<td align="center"><a href="https://
|
|
136
|
-
<td align="center"><a href="https://
|
|
137
|
-
<td align="center"><a href="https://
|
|
141
|
+
<td align="center"><a href="https://guyariely.com/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Guy Ariely"><img src="https://avatars.githubusercontent.com/u/42813496?u=edb6b7f563bf28e160a290832e7da57c0506f8ca&v=4" width="119" alt="Guy Ariely"/><br />Guy Ariely</a></td>
|
|
142
|
+
<td align="center"><a href="https://piscis.dev/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Alex"><img src="https://avatars.githubusercontent.com/u/326163?u=b245f368bd940cf51d08c0b6bf55f8257f359437&v=4" width="119" alt="Alex"/><br />Alex</a></td>
|
|
143
|
+
<td align="center"><a href="https://opensource.gubanov.eu/?ref=middleapi&utm_source=middleapi&utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Andrey Gubanov"><img src="https://avatars.githubusercontent.com/u/1082083?u=c5f2daf7ebece498e85c83367bb37b4e10e2649d&v=4" width="119" alt="Andrey Gubanov"/><br />Andrey Gubanov</a></td>
|
|
138
144
|
</tr>
|
|
139
145
|
</table>
|
|
140
146
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
<p>
|
|
144
|
-
<a href="https://github.com/MrMaxie?ref=orpc" target="_blank" rel="noopener" title="Maxie"><img src="https://avatars.githubusercontent.com/u/3857836?u=5e6b57973d4385d655663ffdd836e487856f2984&v=4" width="32" height="32" alt="Maxie" /></a>
|
|
145
|
-
<a href="https://github.com/Stijn-Timmer?ref=orpc" target="_blank" rel="noopener" title="Stijn Timmer"><img src="https://avatars.githubusercontent.com/u/100147665?u=106b2c18e9c98a61861b4ee7fc100f5b9906a6c9&v=4" width="32" height="32" alt="Stijn Timmer" /></a>
|
|
146
|
-
<a href="https://github.com/u1-liquid?ref=orpc" target="_blank" rel="noopener" title="γγγγγ¨γΌγ«γ
"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&v=4" width="32" height="32" alt="γγγγγ¨γΌγ«γ
" /></a>
|
|
147
|
-
<a href="https://github.com/zuplo?ref=orpc" target="_blank" rel="noopener" title="Zuplo"><img src="https://avatars.githubusercontent.com/u/85497839?v=4" width="32" height="32" alt="Zuplo" /></a>
|
|
148
|
-
<a href="https://github.com/motopods?ref=orpc" target="_blank" rel="noopener" title="motopods"><img src="https://avatars.githubusercontent.com/u/58200641?v=4" width="32" height="32" alt="motopods" /></a>
|
|
149
|
-
<a href="https://github.com/franciscohermida?ref=orpc" target="_blank" rel="noopener" title="Francisco Hermida"><img src="https://avatars.githubusercontent.com/u/483242?u=bbcbc80eb9d8781ff401f7dafc3b59cd7bea0561&v=4" width="32" height="32" alt="Francisco Hermida" /></a>
|
|
150
|
-
<a href="https://github.com/theoludwig?ref=orpc" target="_blank" rel="noopener" title="ThΓ©o LUDWIG"><img src="https://avatars.githubusercontent.com/u/25207499?u=a6a9653725a2f574c07893748806668e0598cdbe&v=4" width="32" height="32" alt="ThΓ©o LUDWIG" /></a>
|
|
151
|
-
<a href="https://github.com/abhay-ramesh?ref=orpc" target="_blank" rel="noopener" title="Abhay Ramesh"><img src="https://avatars.githubusercontent.com/u/66196314?u=c5c2b0327b26606c2efcfaf17046ab18c3d25c57&v=4" width="32" height="32" alt="Abhay Ramesh" /></a>
|
|
152
|
-
<a href="https://github.com/shr-ink?ref=orpc" target="_blank" rel="noopener" title="shr.ink oΓΌ"><img src="https://avatars.githubusercontent.com/u/139700438?v=4" width="32" height="32" alt="shr.ink oΓΌ" /></a>
|
|
153
|
-
<a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=24e8dd943cfc862aa284d858a023532c75071ade&v=4" width="32" height="32" alt="0x4e32" /></a>
|
|
154
|
-
<a href="https://github.com/yzuyr?ref=orpc" target="_blank" rel="noopener" title="Ryuz"><img src="https://avatars.githubusercontent.com/u/196539378?u=d38374588d219b6748b16406982f6559411466d4&v=4" width="32" height="32" alt="Ryuz" /></a>
|
|
155
|
-
<a href="https://github.com/happyboy2022?ref=orpc" target="_blank" rel="noopener" title="happyboy"><img src="https://avatars.githubusercontent.com/u/103669586?u=65b49c4b893ed3703909fbb3a7a22313f3f9c121&v=4" width="32" height="32" alt="happyboy" /></a>
|
|
156
|
-
<a href="https://github.com/YiCChi?ref=orpc" target="_blank" rel="noopener" title="yicchi"><img src="https://avatars.githubusercontent.com/u/86967274?u=6c2756f09fe15dd94d572f560e979cd157982852&v=4" width="32" height="32" alt="yicchi" /></a>
|
|
157
|
-
<a href="https://github.com/cloudycotton?ref=orpc" target="_blank" rel="noopener" title="Saksham"><img src="https://avatars.githubusercontent.com/u/168998965?u=9b9634a5aed66a51c1b880663272725b00b92b14&v=4" width="32" height="32" alt="Saksham" /></a>
|
|
158
|
-
<a href="https://github.com/hrynevychroman?ref=orpc" target="_blank" rel="noopener" title="Roman Hrynevych"><img src="https://avatars.githubusercontent.com/u/82209198?u=1a1d111ab3d589855b9cc8a7fefb1b5c6a4fbbaf&v=4" width="32" height="32" alt="Roman Hrynevych" /></a>
|
|
159
|
-
<a href="https://github.com/rokitgg?ref=orpc" target="_blank" rel="noopener" title="rokitg"><img src="https://avatars.githubusercontent.com/u/125133357?u=06c74aefaa2236b06a2e5fba5a5c612339f45912&v=4" width="32" height="32" alt="rokitg" /></a>
|
|
160
|
-
<a href="https://github.com/omarkhatibgg?ref=orpc" target="_blank" rel="noopener" title="Omar Khatib"><img src="https://avatars.githubusercontent.com/u/9054278?u=afbba7331b85c51b8eee4130f5fd31b1017dc919&v=4" width="32" height="32" alt="Omar Khatib" /></a>
|
|
161
|
-
<a href="https://github.com/YuSabo90002?ref=orpc" target="_blank" rel="noopener" title="Yu-Sabo"><img src="https://avatars.githubusercontent.com/u/13120582?v=4" width="32" height="32" alt="Yu-Sabo" /></a>
|
|
162
|
-
<a href="https://github.com/bapspatil?ref=orpc" target="_blank" rel="noopener" title="Bapusaheb Patil"><img src="https://avatars.githubusercontent.com/u/16699418?u=6d9d8e0a64a6f91ca1c4d559c72d931172bdcbbd&v=4" width="32" height="32" alt="Bapusaheb Patil" /></a>
|
|
163
|
-
<a href="https://github.com/ripgrim?ref=orpc" target="_blank" rel="noopener" title="grim"><img src="https://avatars.githubusercontent.com/u/75869731?u=b17c42ec2309552fdb822a86b25a2f99146a4d72&v=4" width="32" height="32" alt="grim" /></a>
|
|
164
|
-
<a href="https://github.com/nelsonlaidev?ref=orpc" target="_blank" rel="noopener" title="Nelson Lai"><img src="https://avatars.githubusercontent.com/u/75498339?u=2fc0e0b95dd184c5ffb744df977cb15a18b60672&v=4" width="32" height="32" alt="Nelson Lai" /></a>
|
|
165
|
-
<a href="https://github.com/nguyenlc1993?ref=orpc" target="_blank" rel="noopener" title="LΓͺ Cao NguyΓͺn"><img src="https://avatars.githubusercontent.com/u/13871971?u=83c8b69d9e35b589c4e1f066cc113b1d9461386f&v=4" width="32" height="32" alt="LΓͺ Cao NguyΓͺn" /></a>
|
|
166
|
-
<a href="https://github.com/wobsoriano?ref=orpc" target="_blank" rel="noopener" title="Robert Soriano"><img src="https://avatars.githubusercontent.com/u/13049130?u=6d72104182e7c9ed25934815313fb69107332111&v=4" width="32" height="32" alt="Robert Soriano" /></a>
|
|
167
|
-
<a href="https://github.com/SKostyukovich?ref=orpc" target="_blank" rel="noopener" title="SKostyukovich"><img src="https://avatars.githubusercontent.com/u/10700067?v=4" width="32" height="32" alt="SKostyukovich" /></a>
|
|
168
|
-
<a href="https://github.com/FabworksHQ?ref=orpc" target="_blank" rel="noopener" title="Fabworks"><img src="https://avatars.githubusercontent.com/u/160179500?v=4" width="32" height="32" alt="Fabworks" /></a>
|
|
169
|
-
<a href="https://github.com/NovakAnton?ref=orpc" target="_blank" rel="noopener" title="Novak Antonijevic"><img src="https://avatars.githubusercontent.com/u/157126729?u=ae49fa22292d55c0434ff0ca008206155b18663b&v=4" width="32" height="32" alt="Novak Antonijevic" /></a>
|
|
170
|
-
<a href="https://github.com/laduniestu?ref=orpc" target="_blank" rel="noopener" title="Laduni Estu Syalwa"><img src="https://avatars.githubusercontent.com/u/44757637?u=a2fc1ea8f7d827a96721176f79d30592d1c48059&v=4" width="32" height="32" alt="Laduni Estu Syalwa" /></a>
|
|
171
|
-
<a href="https://github.com/yukimotochern?ref=orpc" target="_blank" rel="noopener" title="Chen, Zhi-Yuan"><img src="https://avatars.githubusercontent.com/u/20896173?u=945c33fc21725e4d566a0d02afc54b136ca1d67a&v=4" width="32" height="32" alt="Chen, Zhi-Yuan" /></a>
|
|
172
|
-
<a href="https://github.com/illarionvk?ref=orpc" target="_blank" rel="noopener" title="Illarion Koperski"><img src="https://avatars.githubusercontent.com/u/5012724?u=7cfa13652f7ac5fb3c56d880e3eb3fbe40c3ea34&v=4" width="32" height="32" alt="Illarion Koperski" /></a>
|
|
173
|
-
<a href="https://github.com/steelbrain?ref=orpc" target="_blank" rel="noopener" title="Anees Iqbal"><img src="https://avatars.githubusercontent.com/u/4278113?u=22b80b5399eed68ac76cd58b02961b0481f1db11&v=4" width="32" height="32" alt="Anees Iqbal" /></a>
|
|
174
|
-
<a href="https://github.com/Scrumplex?ref=orpc" target="_blank" rel="noopener" title="Sefa Eyeoglu"><img src="https://avatars.githubusercontent.com/u/11587657?u=ab503582165c0bbff0cca47ce31c9450bb1553c9&v=4" width="32" height="32" alt="Sefa Eyeoglu" /></a>
|
|
175
|
-
<a href="https://github.com/ChromeGG?ref=orpc" target="_blank" rel="noopener" title="Adam Tkaczyk"><img src="https://avatars.githubusercontent.com/u/39050595?u=a58ca6042a6950e94e6e92442db76ef584279bc0&v=4" width="32" height="32" alt="Adam Tkaczyk" /></a>
|
|
176
|
-
<a href="https://github.com/plancraft?ref=orpc" target="_blank" rel="noopener" title="plancraft"><img src="https://avatars.githubusercontent.com/u/46482287?v=4" width="32" height="32" alt="plancraft" /></a>
|
|
177
|
-
</p>
|
|
147
|
+
With thanks to [37 past sponsors](https://htmlpreview.github.io/?https://github.com/middleapi/static/blob/main/sponsors.svg) who helped get oRPC here.
|
|
178
148
|
|
|
179
149
|
## References
|
|
180
150
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,15 +1,280 @@
|
|
|
1
1
|
import { JsonSchemaConverter, AnySchema, JsonSchemaConverterDirection, JsonSchema } from '@orpc/json-schema';
|
|
2
|
-
import
|
|
2
|
+
import * as zod_v4_core from 'zod/v4/core';
|
|
3
|
+
import { ToJSONSchemaParams, $input, $output } from 'zod/v4/core';
|
|
4
|
+
import * as json_schema_typed from 'json-schema-typed';
|
|
3
5
|
|
|
4
6
|
interface ZodToJsonSchemaConverterOptions extends Omit<ToJSONSchemaParams, 'target' | 'io'> {
|
|
7
|
+
/**
|
|
8
|
+
* Caches conversion results in a WeakMap keyed by the Zod schema instance,
|
|
9
|
+
* so converting the same schema again is free.
|
|
10
|
+
*
|
|
11
|
+
* When enabled, repeated conversions return the same JSON schema object,
|
|
12
|
+
* so treat returned schemas as immutable.
|
|
13
|
+
*
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
cache?: boolean;
|
|
5
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Converts Zod schemas into JSON Schema using Zod's built-in `toJSONSchema`,
|
|
20
|
+
* with additional support for types such as `z.bigint()`, `z.date()`, `z.set()`, and `z.map()`.
|
|
21
|
+
*
|
|
22
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
23
|
+
*/
|
|
6
24
|
declare class ZodToJsonSchemaConverter implements JsonSchemaConverter {
|
|
7
|
-
private readonly
|
|
8
|
-
|
|
25
|
+
private readonly toJSONSchemaParams;
|
|
26
|
+
private readonly cache;
|
|
27
|
+
constructor({ cache, ...toJSONSchemaParams }?: ZodToJsonSchemaConverterOptions);
|
|
9
28
|
condition(schema: AnySchema | undefined, _direction: JsonSchemaConverterDirection): boolean;
|
|
10
29
|
convert(schema: AnySchema | undefined, direction: JsonSchemaConverterDirection): [jsonSchema: JsonSchema, optional: boolean];
|
|
30
|
+
private convertUncached;
|
|
11
31
|
private convertZod;
|
|
32
|
+
private getCustomJsonSchema;
|
|
12
33
|
}
|
|
13
34
|
|
|
14
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Zod registry for customizing generated JSON schema, can use both for .input and .output
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { JSON_SCHEMA_REGISTRY } from '@orpc/zod'
|
|
41
|
+
*
|
|
42
|
+
* const user = z.object({
|
|
43
|
+
* name: z.string(),
|
|
44
|
+
* age: z.number(),
|
|
45
|
+
* })
|
|
46
|
+
*
|
|
47
|
+
* JSON_SCHEMA_REGISTRY.add(user, {
|
|
48
|
+
* examples: [{ name: 'John', age: 20 }],
|
|
49
|
+
* })
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
53
|
+
*/
|
|
54
|
+
declare const JSON_SCHEMA_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
55
|
+
$anchor?: string;
|
|
56
|
+
$comment?: string;
|
|
57
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
58
|
+
$dynamicAnchor?: string;
|
|
59
|
+
$dynamicRef?: string;
|
|
60
|
+
$id?: string;
|
|
61
|
+
$ref?: string;
|
|
62
|
+
$schema?: string;
|
|
63
|
+
$vocabulary?: Record<string, string>;
|
|
64
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
65
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
66
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
67
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
68
|
+
const?: typeof $input | typeof $output | undefined;
|
|
69
|
+
contains?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
70
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
71
|
+
contentMediaType?: string;
|
|
72
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
73
|
+
default?: typeof $input | typeof $output | undefined;
|
|
74
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
75
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
76
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
77
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
78
|
+
deprecated?: boolean;
|
|
79
|
+
description?: string;
|
|
80
|
+
else?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
81
|
+
enum?: ((typeof $input | typeof $output)[] | readonly (typeof $input | typeof $output)[]) | undefined;
|
|
82
|
+
examples?: ((typeof $input | typeof $output)[] | readonly (typeof $input | typeof $output)[]) | undefined;
|
|
83
|
+
exclusiveMaximum?: number;
|
|
84
|
+
exclusiveMinimum?: number;
|
|
85
|
+
format?: string;
|
|
86
|
+
if?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
87
|
+
items?: json_schema_typed.JSONSchema;
|
|
88
|
+
maxContains?: number;
|
|
89
|
+
maximum?: number;
|
|
90
|
+
maxItems?: number;
|
|
91
|
+
maxLength?: number;
|
|
92
|
+
maxProperties?: number;
|
|
93
|
+
minContains?: number;
|
|
94
|
+
minimum?: number;
|
|
95
|
+
minItems?: number;
|
|
96
|
+
minLength?: number;
|
|
97
|
+
minProperties?: number;
|
|
98
|
+
multipleOf?: number;
|
|
99
|
+
not?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
100
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
101
|
+
pattern?: string;
|
|
102
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
103
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
104
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
105
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
106
|
+
readOnly?: boolean;
|
|
107
|
+
required?: string[] | readonly string[];
|
|
108
|
+
then?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
109
|
+
title?: string;
|
|
110
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
111
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
112
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
113
|
+
uniqueItems?: boolean;
|
|
114
|
+
writeOnly?: boolean;
|
|
115
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
116
|
+
/**
|
|
117
|
+
* Zod registry for customizing generated JSON schema, only useful for .input
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* import { JSON_SCHEMA_INPUT_REGISTRY } from '@orpc/zod'
|
|
122
|
+
*
|
|
123
|
+
* const user = z.object({
|
|
124
|
+
* name: z.string(),
|
|
125
|
+
* age: z.string().transform(v => Number(v)),
|
|
126
|
+
* })
|
|
127
|
+
*
|
|
128
|
+
* JSON_SCHEMA_INPUT_REGISTRY.add(user, {
|
|
129
|
+
* examples: [{ name: 'John', age: "20" }],
|
|
130
|
+
* })
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
134
|
+
*/
|
|
135
|
+
declare const JSON_SCHEMA_INPUT_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
136
|
+
$anchor?: string;
|
|
137
|
+
$comment?: string;
|
|
138
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
139
|
+
$dynamicAnchor?: string;
|
|
140
|
+
$dynamicRef?: string;
|
|
141
|
+
$id?: string;
|
|
142
|
+
$ref?: string;
|
|
143
|
+
$schema?: string;
|
|
144
|
+
$vocabulary?: Record<string, string>;
|
|
145
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
146
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
147
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
148
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
149
|
+
const?: typeof $input | undefined;
|
|
150
|
+
contains?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
151
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
152
|
+
contentMediaType?: string;
|
|
153
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
154
|
+
default?: typeof $input | undefined;
|
|
155
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
156
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
157
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
158
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
159
|
+
deprecated?: boolean;
|
|
160
|
+
description?: string;
|
|
161
|
+
else?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
162
|
+
enum?: ((typeof $input)[] | readonly (typeof $input)[]) | undefined;
|
|
163
|
+
examples?: ((typeof $input)[] | readonly (typeof $input)[]) | undefined;
|
|
164
|
+
exclusiveMaximum?: number;
|
|
165
|
+
exclusiveMinimum?: number;
|
|
166
|
+
format?: string;
|
|
167
|
+
if?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
168
|
+
items?: json_schema_typed.JSONSchema;
|
|
169
|
+
maxContains?: number;
|
|
170
|
+
maximum?: number;
|
|
171
|
+
maxItems?: number;
|
|
172
|
+
maxLength?: number;
|
|
173
|
+
maxProperties?: number;
|
|
174
|
+
minContains?: number;
|
|
175
|
+
minimum?: number;
|
|
176
|
+
minItems?: number;
|
|
177
|
+
minLength?: number;
|
|
178
|
+
minProperties?: number;
|
|
179
|
+
multipleOf?: number;
|
|
180
|
+
not?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
181
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
182
|
+
pattern?: string;
|
|
183
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
184
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
185
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
186
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
187
|
+
readOnly?: boolean;
|
|
188
|
+
required?: string[] | readonly string[];
|
|
189
|
+
then?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
190
|
+
title?: string;
|
|
191
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
192
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
193
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
194
|
+
uniqueItems?: boolean;
|
|
195
|
+
writeOnly?: boolean;
|
|
196
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
197
|
+
/**
|
|
198
|
+
* Zod registry for customizing generated JSON schema, only useful for .output
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```ts
|
|
202
|
+
* import { JSON_SCHEMA_OUTPUT_REGISTRY } from '@orpc/zod'
|
|
203
|
+
*
|
|
204
|
+
* const user = z.object({
|
|
205
|
+
* name: z.string(),
|
|
206
|
+
* age: z.string().transform(v => Number(v)),
|
|
207
|
+
* })
|
|
208
|
+
*
|
|
209
|
+
* JSON_SCHEMA_OUTPUT_REGISTRY.add(user, {
|
|
210
|
+
* examples: [{ name: 'John', age: 20 }],
|
|
211
|
+
* })
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
215
|
+
*/
|
|
216
|
+
declare const JSON_SCHEMA_OUTPUT_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
217
|
+
$anchor?: string;
|
|
218
|
+
$comment?: string;
|
|
219
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
220
|
+
$dynamicAnchor?: string;
|
|
221
|
+
$dynamicRef?: string;
|
|
222
|
+
$id?: string;
|
|
223
|
+
$ref?: string;
|
|
224
|
+
$schema?: string;
|
|
225
|
+
$vocabulary?: Record<string, string>;
|
|
226
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
227
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
228
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
229
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
230
|
+
const?: typeof $output | undefined;
|
|
231
|
+
contains?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
232
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
233
|
+
contentMediaType?: string;
|
|
234
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
235
|
+
default?: typeof $output | undefined;
|
|
236
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
237
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
238
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
239
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
240
|
+
deprecated?: boolean;
|
|
241
|
+
description?: string;
|
|
242
|
+
else?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
243
|
+
enum?: ((typeof $output)[] | readonly (typeof $output)[]) | undefined;
|
|
244
|
+
examples?: ((typeof $output)[] | readonly (typeof $output)[]) | undefined;
|
|
245
|
+
exclusiveMaximum?: number;
|
|
246
|
+
exclusiveMinimum?: number;
|
|
247
|
+
format?: string;
|
|
248
|
+
if?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
249
|
+
items?: json_schema_typed.JSONSchema;
|
|
250
|
+
maxContains?: number;
|
|
251
|
+
maximum?: number;
|
|
252
|
+
maxItems?: number;
|
|
253
|
+
maxLength?: number;
|
|
254
|
+
maxProperties?: number;
|
|
255
|
+
minContains?: number;
|
|
256
|
+
minimum?: number;
|
|
257
|
+
minItems?: number;
|
|
258
|
+
minLength?: number;
|
|
259
|
+
minProperties?: number;
|
|
260
|
+
multipleOf?: number;
|
|
261
|
+
not?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
262
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
263
|
+
pattern?: string;
|
|
264
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
265
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
266
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
267
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
268
|
+
readOnly?: boolean;
|
|
269
|
+
required?: string[] | readonly string[];
|
|
270
|
+
then?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
271
|
+
title?: string;
|
|
272
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
273
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
274
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
275
|
+
uniqueItems?: boolean;
|
|
276
|
+
writeOnly?: boolean;
|
|
277
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
278
|
+
|
|
279
|
+
export { JSON_SCHEMA_INPUT_REGISTRY, JSON_SCHEMA_OUTPUT_REGISTRY, JSON_SCHEMA_REGISTRY, ZodToJsonSchemaConverter };
|
|
15
280
|
export type { ZodToJsonSchemaConverterOptions };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,280 @@
|
|
|
1
1
|
import { JsonSchemaConverter, AnySchema, JsonSchemaConverterDirection, JsonSchema } from '@orpc/json-schema';
|
|
2
|
-
import
|
|
2
|
+
import * as zod_v4_core from 'zod/v4/core';
|
|
3
|
+
import { ToJSONSchemaParams, $input, $output } from 'zod/v4/core';
|
|
4
|
+
import * as json_schema_typed from 'json-schema-typed';
|
|
3
5
|
|
|
4
6
|
interface ZodToJsonSchemaConverterOptions extends Omit<ToJSONSchemaParams, 'target' | 'io'> {
|
|
7
|
+
/**
|
|
8
|
+
* Caches conversion results in a WeakMap keyed by the Zod schema instance,
|
|
9
|
+
* so converting the same schema again is free.
|
|
10
|
+
*
|
|
11
|
+
* When enabled, repeated conversions return the same JSON schema object,
|
|
12
|
+
* so treat returned schemas as immutable.
|
|
13
|
+
*
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
cache?: boolean;
|
|
5
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Converts Zod schemas into JSON Schema using Zod's built-in `toJSONSchema`,
|
|
20
|
+
* with additional support for types such as `z.bigint()`, `z.date()`, `z.set()`, and `z.map()`.
|
|
21
|
+
*
|
|
22
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
23
|
+
*/
|
|
6
24
|
declare class ZodToJsonSchemaConverter implements JsonSchemaConverter {
|
|
7
|
-
private readonly
|
|
8
|
-
|
|
25
|
+
private readonly toJSONSchemaParams;
|
|
26
|
+
private readonly cache;
|
|
27
|
+
constructor({ cache, ...toJSONSchemaParams }?: ZodToJsonSchemaConverterOptions);
|
|
9
28
|
condition(schema: AnySchema | undefined, _direction: JsonSchemaConverterDirection): boolean;
|
|
10
29
|
convert(schema: AnySchema | undefined, direction: JsonSchemaConverterDirection): [jsonSchema: JsonSchema, optional: boolean];
|
|
30
|
+
private convertUncached;
|
|
11
31
|
private convertZod;
|
|
32
|
+
private getCustomJsonSchema;
|
|
12
33
|
}
|
|
13
34
|
|
|
14
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Zod registry for customizing generated JSON schema, can use both for .input and .output
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { JSON_SCHEMA_REGISTRY } from '@orpc/zod'
|
|
41
|
+
*
|
|
42
|
+
* const user = z.object({
|
|
43
|
+
* name: z.string(),
|
|
44
|
+
* age: z.number(),
|
|
45
|
+
* })
|
|
46
|
+
*
|
|
47
|
+
* JSON_SCHEMA_REGISTRY.add(user, {
|
|
48
|
+
* examples: [{ name: 'John', age: 20 }],
|
|
49
|
+
* })
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
53
|
+
*/
|
|
54
|
+
declare const JSON_SCHEMA_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
55
|
+
$anchor?: string;
|
|
56
|
+
$comment?: string;
|
|
57
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
58
|
+
$dynamicAnchor?: string;
|
|
59
|
+
$dynamicRef?: string;
|
|
60
|
+
$id?: string;
|
|
61
|
+
$ref?: string;
|
|
62
|
+
$schema?: string;
|
|
63
|
+
$vocabulary?: Record<string, string>;
|
|
64
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
65
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
66
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
67
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
68
|
+
const?: typeof $input | typeof $output | undefined;
|
|
69
|
+
contains?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
70
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
71
|
+
contentMediaType?: string;
|
|
72
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
73
|
+
default?: typeof $input | typeof $output | undefined;
|
|
74
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
75
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
76
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
77
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
78
|
+
deprecated?: boolean;
|
|
79
|
+
description?: string;
|
|
80
|
+
else?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
81
|
+
enum?: ((typeof $input | typeof $output)[] | readonly (typeof $input | typeof $output)[]) | undefined;
|
|
82
|
+
examples?: ((typeof $input | typeof $output)[] | readonly (typeof $input | typeof $output)[]) | undefined;
|
|
83
|
+
exclusiveMaximum?: number;
|
|
84
|
+
exclusiveMinimum?: number;
|
|
85
|
+
format?: string;
|
|
86
|
+
if?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
87
|
+
items?: json_schema_typed.JSONSchema;
|
|
88
|
+
maxContains?: number;
|
|
89
|
+
maximum?: number;
|
|
90
|
+
maxItems?: number;
|
|
91
|
+
maxLength?: number;
|
|
92
|
+
maxProperties?: number;
|
|
93
|
+
minContains?: number;
|
|
94
|
+
minimum?: number;
|
|
95
|
+
minItems?: number;
|
|
96
|
+
minLength?: number;
|
|
97
|
+
minProperties?: number;
|
|
98
|
+
multipleOf?: number;
|
|
99
|
+
not?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
100
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
101
|
+
pattern?: string;
|
|
102
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
103
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
104
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
105
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
106
|
+
readOnly?: boolean;
|
|
107
|
+
required?: string[] | readonly string[];
|
|
108
|
+
then?: json_schema_typed.JSONSchema<typeof $input | typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
109
|
+
title?: string;
|
|
110
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
111
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
112
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
113
|
+
uniqueItems?: boolean;
|
|
114
|
+
writeOnly?: boolean;
|
|
115
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
116
|
+
/**
|
|
117
|
+
* Zod registry for customizing generated JSON schema, only useful for .input
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* import { JSON_SCHEMA_INPUT_REGISTRY } from '@orpc/zod'
|
|
122
|
+
*
|
|
123
|
+
* const user = z.object({
|
|
124
|
+
* name: z.string(),
|
|
125
|
+
* age: z.string().transform(v => Number(v)),
|
|
126
|
+
* })
|
|
127
|
+
*
|
|
128
|
+
* JSON_SCHEMA_INPUT_REGISTRY.add(user, {
|
|
129
|
+
* examples: [{ name: 'John', age: "20" }],
|
|
130
|
+
* })
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
134
|
+
*/
|
|
135
|
+
declare const JSON_SCHEMA_INPUT_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
136
|
+
$anchor?: string;
|
|
137
|
+
$comment?: string;
|
|
138
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
139
|
+
$dynamicAnchor?: string;
|
|
140
|
+
$dynamicRef?: string;
|
|
141
|
+
$id?: string;
|
|
142
|
+
$ref?: string;
|
|
143
|
+
$schema?: string;
|
|
144
|
+
$vocabulary?: Record<string, string>;
|
|
145
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
146
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
147
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
148
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
149
|
+
const?: typeof $input | undefined;
|
|
150
|
+
contains?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
151
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
152
|
+
contentMediaType?: string;
|
|
153
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
154
|
+
default?: typeof $input | undefined;
|
|
155
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
156
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
157
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
158
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
159
|
+
deprecated?: boolean;
|
|
160
|
+
description?: string;
|
|
161
|
+
else?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
162
|
+
enum?: ((typeof $input)[] | readonly (typeof $input)[]) | undefined;
|
|
163
|
+
examples?: ((typeof $input)[] | readonly (typeof $input)[]) | undefined;
|
|
164
|
+
exclusiveMaximum?: number;
|
|
165
|
+
exclusiveMinimum?: number;
|
|
166
|
+
format?: string;
|
|
167
|
+
if?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
168
|
+
items?: json_schema_typed.JSONSchema;
|
|
169
|
+
maxContains?: number;
|
|
170
|
+
maximum?: number;
|
|
171
|
+
maxItems?: number;
|
|
172
|
+
maxLength?: number;
|
|
173
|
+
maxProperties?: number;
|
|
174
|
+
minContains?: number;
|
|
175
|
+
minimum?: number;
|
|
176
|
+
minItems?: number;
|
|
177
|
+
minLength?: number;
|
|
178
|
+
minProperties?: number;
|
|
179
|
+
multipleOf?: number;
|
|
180
|
+
not?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
181
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
182
|
+
pattern?: string;
|
|
183
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
184
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
185
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
186
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
187
|
+
readOnly?: boolean;
|
|
188
|
+
required?: string[] | readonly string[];
|
|
189
|
+
then?: json_schema_typed.JSONSchema<typeof $input, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
190
|
+
title?: string;
|
|
191
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
192
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
193
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
194
|
+
uniqueItems?: boolean;
|
|
195
|
+
writeOnly?: boolean;
|
|
196
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
197
|
+
/**
|
|
198
|
+
* Zod registry for customizing generated JSON schema, only useful for .output
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```ts
|
|
202
|
+
* import { JSON_SCHEMA_OUTPUT_REGISTRY } from '@orpc/zod'
|
|
203
|
+
*
|
|
204
|
+
* const user = z.object({
|
|
205
|
+
* name: z.string(),
|
|
206
|
+
* age: z.string().transform(v => Number(v)),
|
|
207
|
+
* })
|
|
208
|
+
*
|
|
209
|
+
* JSON_SCHEMA_OUTPUT_REGISTRY.add(user, {
|
|
210
|
+
* examples: [{ name: 'John', age: 20 }],
|
|
211
|
+
* })
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* @see {@link https://orpc.dev/docs/integrations/zod | Zod Integration}
|
|
215
|
+
*/
|
|
216
|
+
declare const JSON_SCHEMA_OUTPUT_REGISTRY: zod_v4_core.$ZodRegistry<{
|
|
217
|
+
$anchor?: string;
|
|
218
|
+
$comment?: string;
|
|
219
|
+
$defs?: Record<string, json_schema_typed.JSONSchema>;
|
|
220
|
+
$dynamicAnchor?: string;
|
|
221
|
+
$dynamicRef?: string;
|
|
222
|
+
$id?: string;
|
|
223
|
+
$ref?: string;
|
|
224
|
+
$schema?: string;
|
|
225
|
+
$vocabulary?: Record<string, string>;
|
|
226
|
+
additionalItems?: json_schema_typed.JSONSchema;
|
|
227
|
+
additionalProperties?: json_schema_typed.JSONSchema;
|
|
228
|
+
allOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
229
|
+
anyOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
230
|
+
const?: typeof $output | undefined;
|
|
231
|
+
contains?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
232
|
+
contentEncoding?: "7bit" | "8bit" | "base64" | "binary" | "ietf-token" | "quoted-printable" | "x-token";
|
|
233
|
+
contentMediaType?: string;
|
|
234
|
+
contentSchema?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
235
|
+
default?: typeof $output | undefined;
|
|
236
|
+
definitions?: Record<string, json_schema_typed.JSONSchema>;
|
|
237
|
+
dependencies?: Record<string, (string[] | readonly string[]) | json_schema_typed.JSONSchema>;
|
|
238
|
+
dependentRequired?: Record<string, string[] | readonly string[]>;
|
|
239
|
+
dependentSchemas?: Record<string, json_schema_typed.JSONSchema>;
|
|
240
|
+
deprecated?: boolean;
|
|
241
|
+
description?: string;
|
|
242
|
+
else?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
243
|
+
enum?: ((typeof $output)[] | readonly (typeof $output)[]) | undefined;
|
|
244
|
+
examples?: ((typeof $output)[] | readonly (typeof $output)[]) | undefined;
|
|
245
|
+
exclusiveMaximum?: number;
|
|
246
|
+
exclusiveMinimum?: number;
|
|
247
|
+
format?: string;
|
|
248
|
+
if?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
249
|
+
items?: json_schema_typed.JSONSchema;
|
|
250
|
+
maxContains?: number;
|
|
251
|
+
maximum?: number;
|
|
252
|
+
maxItems?: number;
|
|
253
|
+
maxLength?: number;
|
|
254
|
+
maxProperties?: number;
|
|
255
|
+
minContains?: number;
|
|
256
|
+
minimum?: number;
|
|
257
|
+
minItems?: number;
|
|
258
|
+
minLength?: number;
|
|
259
|
+
minProperties?: number;
|
|
260
|
+
multipleOf?: number;
|
|
261
|
+
not?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
262
|
+
oneOf?: (json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue>[]) | undefined;
|
|
263
|
+
pattern?: string;
|
|
264
|
+
patternProperties?: Record<string, json_schema_typed.JSONSchema>;
|
|
265
|
+
prefixItems?: (json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[] | readonly json_schema_typed.JSONSchema<any, json_schema_typed.JSONSchema.TypeValue>[]) | json_schema_typed.JSONSchema;
|
|
266
|
+
properties?: Record<string, json_schema_typed.JSONSchema>;
|
|
267
|
+
propertyNames?: json_schema_typed.JSONSchema;
|
|
268
|
+
readOnly?: boolean;
|
|
269
|
+
required?: string[] | readonly string[];
|
|
270
|
+
then?: json_schema_typed.JSONSchema<typeof $output, json_schema_typed.JSONSchema.TypeValue> | undefined;
|
|
271
|
+
title?: string;
|
|
272
|
+
type?: json_schema_typed.JSONSchema.TypeValue | undefined;
|
|
273
|
+
unevaluatedItems?: json_schema_typed.JSONSchema;
|
|
274
|
+
unevaluatedProperties?: json_schema_typed.JSONSchema;
|
|
275
|
+
uniqueItems?: boolean;
|
|
276
|
+
writeOnly?: boolean;
|
|
277
|
+
}, zod_v4_core.$ZodType<unknown, unknown, zod_v4_core.$ZodTypeInternals<unknown, unknown>>>;
|
|
278
|
+
|
|
279
|
+
export { JSON_SCHEMA_INPUT_REGISTRY, JSON_SCHEMA_OUTPUT_REGISTRY, JSON_SCHEMA_REGISTRY, ZodToJsonSchemaConverter };
|
|
15
280
|
export type { ZodToJsonSchemaConverterOptions };
|
package/dist/index.mjs
CHANGED
|
@@ -1,15 +1,37 @@
|
|
|
1
|
-
import { JsonSchemaXNativeType, JsonSchemaFormat } from '@orpc/json-schema';
|
|
2
|
-
import { toJSONSchema } from 'zod/v4/core';
|
|
1
|
+
import { JsonSchemaXNativeType, JsonSchemaFormat, encodeJsonPointerSegment } from '@orpc/json-schema';
|
|
2
|
+
import { registry, toJSONSchema, globalRegistry } from 'zod/v4/core';
|
|
3
|
+
|
|
4
|
+
const JSON_SCHEMA_REGISTRY = registry();
|
|
5
|
+
const JSON_SCHEMA_INPUT_REGISTRY = registry();
|
|
6
|
+
const JSON_SCHEMA_OUTPUT_REGISTRY = registry();
|
|
3
7
|
|
|
4
8
|
class ZodToJsonSchemaConverter {
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
toJSONSchemaParams;
|
|
10
|
+
cache;
|
|
11
|
+
constructor({ cache, ...toJSONSchemaParams } = {}) {
|
|
12
|
+
this.toJSONSchemaParams = toJSONSchemaParams;
|
|
13
|
+
if (cache) {
|
|
14
|
+
this.cache = { input: /* @__PURE__ */ new WeakMap(), output: /* @__PURE__ */ new WeakMap() };
|
|
15
|
+
}
|
|
7
16
|
}
|
|
8
17
|
condition(schema, _direction) {
|
|
9
18
|
return schema?.["~standard"].vendor === "zod";
|
|
10
19
|
}
|
|
11
20
|
convert(schema, direction) {
|
|
12
21
|
const zodSchema = schema;
|
|
22
|
+
if (this.cache) {
|
|
23
|
+
const cached = this.cache[direction].get(zodSchema);
|
|
24
|
+
if (cached) {
|
|
25
|
+
return cached;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const result = this.convertUncached(zodSchema, direction);
|
|
29
|
+
if (this.cache) {
|
|
30
|
+
this.cache[direction].set(zodSchema, result);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
convertUncached(zodSchema, direction) {
|
|
13
35
|
const jsonSchema = this.convertZod(zodSchema, direction);
|
|
14
36
|
let optional = false;
|
|
15
37
|
try {
|
|
@@ -24,7 +46,7 @@ class ZodToJsonSchemaConverter {
|
|
|
24
46
|
convertZod(schema, direction) {
|
|
25
47
|
const jsonSchema = toJSONSchema(schema, {
|
|
26
48
|
unrepresentable: "any",
|
|
27
|
-
...this.
|
|
49
|
+
...this.toJSONSchemaParams,
|
|
28
50
|
target: "draft-2020-12",
|
|
29
51
|
io: direction,
|
|
30
52
|
override: (ctx) => {
|
|
@@ -55,12 +77,41 @@ class ZodToJsonSchemaConverter {
|
|
|
55
77
|
};
|
|
56
78
|
ctx.jsonSchema["x-native-type"] = JsonSchemaXNativeType.Map;
|
|
57
79
|
}
|
|
58
|
-
this.
|
|
80
|
+
const customJsonSchema = this.getCustomJsonSchema(ctx.zodSchema, direction);
|
|
81
|
+
if (customJsonSchema) {
|
|
82
|
+
Object.assign(ctx.jsonSchema, customJsonSchema);
|
|
83
|
+
}
|
|
84
|
+
this.toJSONSchemaParams.override?.(ctx);
|
|
59
85
|
}
|
|
60
86
|
});
|
|
61
87
|
const { $schema, ...rest } = jsonSchema;
|
|
88
|
+
const registry = this.toJSONSchemaParams.metadata ?? globalRegistry;
|
|
89
|
+
const { id } = registry.get(schema) || {};
|
|
90
|
+
if (typeof id === "string" && rest.$ref === void 0) {
|
|
91
|
+
const { $defs = {}, ...restWithoutDefs } = rest;
|
|
92
|
+
let defName = id;
|
|
93
|
+
let index = 0;
|
|
94
|
+
while (defName in $defs) {
|
|
95
|
+
defName = `${defName}__${index++}`;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
$ref: `#/$defs/${encodeJsonPointerSegment(defName)}`,
|
|
99
|
+
$defs: {
|
|
100
|
+
...$defs,
|
|
101
|
+
[defName]: restWithoutDefs
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
62
105
|
return rest;
|
|
63
106
|
}
|
|
107
|
+
getCustomJsonSchema(schema, direction) {
|
|
108
|
+
const general = JSON_SCHEMA_REGISTRY.get(schema);
|
|
109
|
+
const directional = direction === "input" ? JSON_SCHEMA_INPUT_REGISTRY.get(schema) : JSON_SCHEMA_OUTPUT_REGISTRY.get(schema);
|
|
110
|
+
if (general === void 0 && directional === void 0) {
|
|
111
|
+
return void 0;
|
|
112
|
+
}
|
|
113
|
+
return { ...general, ...directional };
|
|
114
|
+
}
|
|
64
115
|
}
|
|
65
116
|
|
|
66
|
-
export { ZodToJsonSchemaConverter };
|
|
117
|
+
export { JSON_SCHEMA_INPUT_REGISTRY, JSON_SCHEMA_OUTPUT_REGISTRY, JSON_SCHEMA_REGISTRY, ZodToJsonSchemaConverter };
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orpc/zod",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.0.0-beta.
|
|
4
|
+
"version": "2.0.0-beta.31",
|
|
5
|
+
"description": "Zod integration for oRPC: convert Zod schemas into JSON Schema for OpenAPI generation",
|
|
5
6
|
"license": "MIT",
|
|
7
|
+
"funding": [
|
|
8
|
+
"https://github.com/sponsors/dinwwwh",
|
|
9
|
+
"https://opencollective.com/middleapi"
|
|
10
|
+
],
|
|
6
11
|
"homepage": "https://orpc.dev",
|
|
7
12
|
"repository": {
|
|
8
13
|
"type": "git",
|
|
@@ -11,7 +16,12 @@
|
|
|
11
16
|
},
|
|
12
17
|
"keywords": [
|
|
13
18
|
"orpc",
|
|
14
|
-
"zod"
|
|
19
|
+
"zod",
|
|
20
|
+
"json-schema",
|
|
21
|
+
"openapi",
|
|
22
|
+
"validation",
|
|
23
|
+
"typescript",
|
|
24
|
+
"typesafe"
|
|
15
25
|
],
|
|
16
26
|
"sideEffects": false,
|
|
17
27
|
"exports": {
|
|
@@ -29,7 +39,8 @@
|
|
|
29
39
|
"zod": ">=4.3.5"
|
|
30
40
|
},
|
|
31
41
|
"dependencies": {
|
|
32
|
-
"
|
|
42
|
+
"json-schema-typed": "^8.0.2",
|
|
43
|
+
"@orpc/json-schema": "2.0.0-beta.31"
|
|
33
44
|
},
|
|
34
45
|
"devDependencies": {
|
|
35
46
|
"zod": "^4.4.3"
|