@orpc/openapi 2.0.0-beta.1 → 2.0.0-beta.11
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 +21 -18
- package/dist/adapters/fetch/index.d.mts +1 -1
- package/dist/adapters/fetch/index.d.ts +1 -1
- package/dist/adapters/fetch/index.mjs +1 -1
- package/dist/adapters/node/index.d.mts +1 -1
- package/dist/adapters/node/index.d.ts +1 -1
- package/dist/adapters/node/index.mjs +1 -1
- package/dist/adapters/standard/index.d.mts +1 -1
- package/dist/adapters/standard/index.d.ts +1 -1
- package/dist/adapters/standard/index.mjs +1 -1
- package/dist/index.d.mts +25 -3
- package/dist/index.d.ts +25 -3
- package/dist/index.mjs +39 -10
- package/dist/shared/{openapi.C9Olbxd5.d.ts → openapi.7vgmPxca.d.ts} +19 -12
- package/dist/shared/{openapi.CcyUEuTs.mjs → openapi.CTlpLuKN.mjs} +50 -45
- package/dist/shared/{openapi.Drd1OtzG.d.mts → openapi.CX6Ri5dP.d.mts} +19 -12
- package/package.json +28 -12
package/README.md
CHANGED
|
@@ -26,10 +26,10 @@ You can read the documentation [here](https://orpc.dev).
|
|
|
26
26
|
|
|
27
27
|
**Core**
|
|
28
28
|
|
|
29
|
-
- [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Define
|
|
30
|
-
- [@orpc/server](https://www.npmjs.com/package/@orpc/server):
|
|
31
|
-
- [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume
|
|
32
|
-
- [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi):
|
|
29
|
+
- [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Define API contract as the single source of truth.
|
|
30
|
+
- [@orpc/server](https://www.npmjs.com/package/@orpc/server): Build APIs or implement contracts.
|
|
31
|
+
- [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume APIs with end-to-end type safety.
|
|
32
|
+
- [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Add OpenAPI compatibility to APIs.
|
|
33
33
|
|
|
34
34
|
**Schema validation**
|
|
35
35
|
|
|
@@ -37,23 +37,25 @@ You can read the documentation [here](https://orpc.dev).
|
|
|
37
37
|
- [@orpc/valibot](https://www.npmjs.com/package/@orpc/valibot): Integrate with [Valibot](https://valibot.dev/).
|
|
38
38
|
- [@orpc/arktype](https://www.npmjs.com/package/@orpc/arktype): Integrate with [ArkType](https://arktype.io/).
|
|
39
39
|
|
|
40
|
+
**Built-in features**
|
|
41
|
+
|
|
42
|
+
- [@orpc/publisher](https://www.npmjs.com/package/@orpc/publisher): Pub/Sub with memory, Redis, and Upstash adapters.
|
|
43
|
+
- [@orpc/ratelimit](https://www.npmjs.com/package/@orpc/ratelimit): Rate limiting with memory, Redis, and Upstash adapters.
|
|
44
|
+
- [@orpc/json-schema](https://www.npmjs.com/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
|
|
45
|
+
|
|
40
46
|
**Framework & ecosystem integrations**
|
|
41
47
|
|
|
42
|
-
- [@orpc/next](https://www.npmjs.com/package/@orpc/
|
|
48
|
+
- [@orpc/next](https://www.npmjs.com/package/@orpc/next): Integrate with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
|
|
43
49
|
- [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): Integrate with [TanStack Query](https://tanstack.com/query/latest).
|
|
44
50
|
- [@orpc/experimental-effect](https://www.npmjs.com/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- [@orpc/publisher](https://www.npmjs.com/package/@orpc/publisher): Pub/Sub.
|
|
49
|
-
- [@orpc/ratelimit](https://www.npmjs.com/package/@orpc/ratelimit): Rate limiting.
|
|
50
|
-
- [@orpc/json-schema](https://www.npmjs.com/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
|
|
51
|
+
- [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Implement your contract with [NestJS](https://nestjs.com/).
|
|
52
|
+
- [@orpc/bun](https://www.npmjs.com/package/@orpc/bun): Adapters for [Bun's Redis](https://bun.sh/).
|
|
51
53
|
|
|
52
54
|
**Observability**
|
|
53
55
|
|
|
54
|
-
- [@orpc/opentelemetry](https://www.npmjs.com/package/@orpc/opentelemetry):
|
|
55
|
-
- [@orpc/pino](https://www.npmjs.com/package/@orpc/pino):
|
|
56
|
-
- [@orpc/evlog](https://www.npmjs.com/package/@orpc/evlog):
|
|
56
|
+
- [@orpc/opentelemetry](https://www.npmjs.com/package/@orpc/opentelemetry): Integrate with [OpenTelemetry](https://opentelemetry.io/) for distributed tracing.
|
|
57
|
+
- [@orpc/pino](https://www.npmjs.com/package/@orpc/pino): Integrate with [Pino](https://getpino.io/) for logging.
|
|
58
|
+
- [@orpc/evlog](https://www.npmjs.com/package/@orpc/evlog): Integrate with [Evlog](https://evlog.dev/) for logging.
|
|
57
59
|
|
|
58
60
|
## Sponsors
|
|
59
61
|
|
|
@@ -115,25 +117,25 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
|
|
|
115
117
|
<table>
|
|
116
118
|
<tr>
|
|
117
119
|
<td align="center"><a href="https://github.com/rhinodavid?ref=orpc" target="_blank" rel="noopener" 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>
|
|
120
|
+
<td align="center"><a href="https://github.com/Nic13Gamer?ref=orpc" target="_blank" rel="noopener" title="Nicholas"><img src="https://avatars.githubusercontent.com/u/54724556?u=56a7ab430ce7a80d648ab6eba051d454a818ed0b&v=4" width="119" alt="Nicholas"/><br />Nicholas</a></td>
|
|
118
121
|
<td align="center"><a href="https://github.com/Robbe95?ref=orpc" target="_blank" rel="noopener" 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>
|
|
119
122
|
<td align="center"><a href="https://github.com/aidansunbury?ref=orpc" target="_blank" rel="noopener" title="Aidan Sunbury"><img src="https://avatars.githubusercontent.com/u/64103161?v=4" width="119" alt="Aidan Sunbury"/><br />Aidan Sunbury</a></td>
|
|
120
123
|
<td align="center"><a href="https://github.com/soonoo?ref=orpc" target="_blank" rel="noopener" title="soonoo"><img src="https://avatars.githubusercontent.com/u/5436405?u=5d0b4aa955c87e30e6bda7f0cccae5402da99528&v=4" width="119" alt="soonoo"/><br />soonoo</a></td>
|
|
121
124
|
<td align="center"><a href="https://github.com/kporten?ref=orpc" target="_blank" rel="noopener" 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>
|
|
122
125
|
<td align="center"><a href="https://github.com/pumpkinlink?ref=orpc" target="_blank" rel="noopener" title="Denis"><img src="https://avatars.githubusercontent.com/u/11864620?u=5f47bbe6c65d0f6f5cf011021490238e4b0593d0&v=4" width="119" alt="Denis"/><br />Denis</a></td>
|
|
123
|
-
<td align="center"><a href="https://github.com/christopher-kapic?ref=orpc" target="_blank" rel="noopener" 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
126
|
</tr>
|
|
125
127
|
<tr>
|
|
128
|
+
<td align="center"><a href="https://github.com/christopher-kapic?ref=orpc" target="_blank" rel="noopener" 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>
|
|
126
129
|
<td align="center"><a href="https://github.com/thomasballinger?ref=orpc" target="_blank" rel="noopener" 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>
|
|
127
130
|
<td align="center"><a href="https://github.com/SSam0419?ref=orpc" target="_blank" rel="noopener" title="Sam"><img src="https://avatars.githubusercontent.com/u/102863520?u=3c89611f549d5070be232eb4532f690c8f2e7a65&v=4" width="119" alt="Sam"/><br />Sam</a></td>
|
|
128
131
|
<td align="center"><a href="https://github.com/Titoine?ref=orpc" target="_blank" rel="noopener" title="Titoine"><img src="https://avatars.githubusercontent.com/u/3514286?u=1bb1e86b0c99c8a1121372e56d51a177eea12191&v=4" width="119" alt="Titoine"/><br />Titoine</a></td>
|
|
129
132
|
<td align="center"><a href="https://github.com/Mnigos?ref=orpc" target="_blank" rel="noopener" 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>
|
|
130
133
|
<td align="center"><a href="https://github.com/hanayashiki?ref=orpc" target="_blank" rel="noopener" title="hanayashiki"><img src="https://avatars.githubusercontent.com/u/26056783?u=06c3b9205a16fd41a871e82da1cc2a09306d53f5&v=4" width="119" alt="hanayashiki"/><br />hanayashiki</a></td>
|
|
131
134
|
<td align="center"><a href="https://github.com/ldub?ref=orpc" target="_blank" rel="noopener" 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>
|
|
132
|
-
<td align="center"><a href="https://github.com/mr-kelly?ref=orpc" target="_blank" rel="noopener" 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
135
|
</tr>
|
|
134
136
|
<tr>
|
|
137
|
+
<td align="center"><a href="https://github.com/mr-kelly?ref=orpc" target="_blank" rel="noopener" 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>
|
|
135
138
|
<td align="center"><a href="https://github.com/piscis?ref=orpc" target="_blank" rel="noopener" title="Alex"><img src="https://avatars.githubusercontent.com/u/326163?u=b245f368bd940cf51d08c0b6bf55f8257f359437&v=4" width="119" alt="Alex"/><br />Alex</a></td>
|
|
136
|
-
<td align="center"><a href="https://github.com/nattstack?ref=orpc" target="_blank" rel="noopener" title="nattstack"><img src="https://avatars.githubusercontent.com/u/31426677?u=fa9dbb8b3e66eb0ea3c88db5dc07f31c8c5418fe&v=4" width="119" alt="nattstack"/><br />nattstack</a></td>
|
|
137
139
|
<td align="center"><a href="https://github.com/finom?ref=orpc" target="_blank" rel="noopener" title="Andrey Gubanov"><img src="https://avatars.githubusercontent.com/u/1082083?u=29e91400dbd4a9c217048a8f59562c4f740498e6&v=4" width="119" alt="Andrey Gubanov"/><br />Andrey Gubanov</a></td>
|
|
138
140
|
</tr>
|
|
139
141
|
</table>
|
|
@@ -150,7 +152,7 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
|
|
|
150
152
|
<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
153
|
<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
154
|
<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=
|
|
155
|
+
<a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=505e54608466ab53754f702973687b04c6424c1f&v=4" width="32" height="32" alt="0x4e32" /></a>
|
|
154
156
|
<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
157
|
<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
158
|
<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>
|
|
@@ -172,6 +174,7 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
|
|
|
172
174
|
<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
175
|
<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
176
|
<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>
|
|
177
|
+
<a href="https://github.com/nattstack?ref=orpc" target="_blank" rel="noopener" title="Natt"><img src="https://avatars.githubusercontent.com/u/31426677?u=fa9dbb8b3e66eb0ea3c88db5dc07f31c8c5418fe&v=4" width="32" height="32" alt="Natt" /></a>
|
|
175
178
|
<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
179
|
<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
180
|
</p>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Router } from '@orpc/server';
|
|
2
2
|
import { FetchHandler, FetchHandlerOptions } from '@orpc/server/fetch';
|
|
3
3
|
import { StandardHandlerOptions } from '@orpc/server/standard';
|
|
4
|
-
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.
|
|
4
|
+
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.CX6Ri5dP.mjs';
|
|
5
5
|
import { ClientContext } from '@orpc/client';
|
|
6
6
|
import { FetchLinkTransportOptions } from '@orpc/client/fetch';
|
|
7
7
|
import { StandardLink, StandardLinkOptions } from '@orpc/client/standard';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Router } from '@orpc/server';
|
|
2
2
|
import { FetchHandler, FetchHandlerOptions } from '@orpc/server/fetch';
|
|
3
3
|
import { StandardHandlerOptions } from '@orpc/server/standard';
|
|
4
|
-
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.
|
|
4
|
+
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.7vgmPxca.js';
|
|
5
5
|
import { ClientContext } from '@orpc/client';
|
|
6
6
|
import { FetchLinkTransportOptions } from '@orpc/client/fetch';
|
|
7
7
|
import { StandardLink, StandardLinkOptions } from '@orpc/client/standard';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FetchHandler } from '@orpc/server/fetch';
|
|
2
2
|
import { StandardHandler } from '@orpc/server/standard';
|
|
3
|
-
import { O as OpenAPIHandlerCodec } from '../../shared/openapi.
|
|
3
|
+
import { O as OpenAPIHandlerCodec } from '../../shared/openapi.CTlpLuKN.mjs';
|
|
4
4
|
import { FetchLinkTransport } from '@orpc/client/fetch';
|
|
5
5
|
import { StandardLink } from '@orpc/client/standard';
|
|
6
6
|
import { O as OpenAPILinkCodec } from '../../shared/openapi.B2SK0ZAr.mjs';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Router } from '@orpc/server';
|
|
2
2
|
import { NodeHttpHandler, NodeHttpHandlerOptions } from '@orpc/server/node';
|
|
3
3
|
import { StandardHandlerOptions } from '@orpc/server/standard';
|
|
4
|
-
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.
|
|
4
|
+
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.CX6Ri5dP.mjs';
|
|
5
5
|
import '@orpc/client';
|
|
6
6
|
import '@orpc/shared';
|
|
7
7
|
import '@standardserver/core';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context, Router } from '@orpc/server';
|
|
2
2
|
import { NodeHttpHandler, NodeHttpHandlerOptions } from '@orpc/server/node';
|
|
3
3
|
import { StandardHandlerOptions } from '@orpc/server/standard';
|
|
4
|
-
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.
|
|
4
|
+
import { O as OpenAPIHandlerCodecOptions } from '../../shared/openapi.7vgmPxca.js';
|
|
5
5
|
import '@orpc/client';
|
|
6
6
|
import '@orpc/shared';
|
|
7
7
|
import '@standardserver/core';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NodeHttpHandler } from '@orpc/server/node';
|
|
2
2
|
import { StandardHandler } from '@orpc/server/standard';
|
|
3
|
-
import { O as OpenAPIHandlerCodec } from '../../shared/openapi.
|
|
3
|
+
import { O as OpenAPIHandlerCodec } from '../../shared/openapi.CTlpLuKN.mjs';
|
|
4
4
|
import '@orpc/client';
|
|
5
5
|
import '@orpc/server';
|
|
6
6
|
import '@orpc/shared';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { a as OpenAPIHandlerCodec, b as
|
|
1
|
+
export { a as OpenAPIHandlerCodec, b as OpenAPIHandlerCodecCore, c as OpenAPIHandlerCodecCoreOptions, O as OpenAPIHandlerCodecOptions, d as OpenAPIMatcher, e as OpenAPIMatcherOptions } from '../../shared/openapi.CX6Ri5dP.mjs';
|
|
2
2
|
import { ClientContext, ClientOptions, AnyORPCError } from '@orpc/client';
|
|
3
3
|
import { StandardLinkCodec, StandardLinkCodecDecodedResponse } from '@orpc/client/standard';
|
|
4
4
|
import { RouterContract } from '@orpc/contract';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { a as OpenAPIHandlerCodec, b as
|
|
1
|
+
export { a as OpenAPIHandlerCodec, b as OpenAPIHandlerCodecCore, c as OpenAPIHandlerCodecCoreOptions, O as OpenAPIHandlerCodecOptions, d as OpenAPIMatcher, e as OpenAPIMatcherOptions } from '../../shared/openapi.7vgmPxca.js';
|
|
2
2
|
import { ClientContext, ClientOptions, AnyORPCError } from '@orpc/client';
|
|
3
3
|
import { StandardLinkCodec, StandardLinkCodecDecodedResponse } from '@orpc/client/standard';
|
|
4
4
|
import { RouterContract } from '@orpc/contract';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { O as OpenAPIHandlerCodec, a as
|
|
1
|
+
export { O as OpenAPIHandlerCodec, a as OpenAPIHandlerCodecCore, b as OpenAPIMatcher } from '../../shared/openapi.CTlpLuKN.mjs';
|
|
2
2
|
export { O as OpenAPILinkCodec, a as OpenAPILinkCodecError } from '../../shared/openapi.B2SK0ZAr.mjs';
|
|
3
3
|
import '@orpc/client';
|
|
4
4
|
import '@orpc/server';
|
package/dist/index.d.mts
CHANGED
|
@@ -9,7 +9,7 @@ export { d as JsonifiedArray, O as OpenAPIOperationObject } from './shared/opena
|
|
|
9
9
|
export { a as OpenAPIFunction, O as OpenAPIMeta, b as OpenAPIMetaPlugin, c as OpenAPIMethodMetaPlugin, d as OpenAPIPathMetaPlugin, e as OpenAPIPrefixMetaPlugin, f as OpenAPISpecMetaPlugin, g as getOpenAPIMeta, o as openapi } from './shared/openapi.BcEtAxQj.mjs';
|
|
10
10
|
import { JsonSchemaConverter, JsonSchema } from '@orpc/json-schema';
|
|
11
11
|
import { AnyRouter, AnyProcedure } from '@orpc/server';
|
|
12
|
-
|
|
12
|
+
export { StandardBodyHint } from '@standardserver/core';
|
|
13
13
|
import '@hey-api/spec-types';
|
|
14
14
|
|
|
15
15
|
interface ContractJsonifiedCaller<TClientContext extends ClientContext> {
|
|
@@ -25,6 +25,11 @@ interface ContractJsonifiedCallerOptions<TClientContext extends ClientContext> e
|
|
|
25
25
|
}
|
|
26
26
|
declare function createContractJsonifiedCaller<TClientContext extends ClientContext>(link: ClientLink<TClientContext>, options?: ContractJsonifiedCallerOptions<TClientContext>): ContractJsonifiedCaller<TClientContext>;
|
|
27
27
|
|
|
28
|
+
declare const DEFAULT_OPENAPI_METHOD = "POST";
|
|
29
|
+
declare const DEFAULT_OPENAPI_SUCCESS_DESCRIPTION = "OK";
|
|
30
|
+
declare const DEFAULT_OPENAPI_INPUT_STRUCTURE = "compact";
|
|
31
|
+
declare const DEFAULT_OPENAPI_OUTPUT_STRUCTURE = "compact";
|
|
32
|
+
|
|
28
33
|
declare class OpenAPIGeneratorError extends TypeError {
|
|
29
34
|
}
|
|
30
35
|
interface OpenAPIGeneratorOptions {
|
|
@@ -84,6 +89,23 @@ declare class OpenAPIGenerator {
|
|
|
84
89
|
private errorResponse;
|
|
85
90
|
}
|
|
86
91
|
|
|
92
|
+
type PopulatedContractRouterOpenAPIPaths<T extends RouterContract> = T extends ProcedureContract<infer UInputSchema, infer UOutputSchema, infer UErrors> ? ProcedureContract<UInputSchema, UOutputSchema, UErrors> : {
|
|
93
|
+
[K in keyof T]: T[K] extends RouterContract ? PopulatedContractRouterOpenAPIPaths<T[K]> : never;
|
|
94
|
+
};
|
|
95
|
+
interface PopulateRouterContractOpenAPIPathsOptions {
|
|
96
|
+
/**
|
|
97
|
+
* Base path segments.
|
|
98
|
+
*/
|
|
99
|
+
path?: undefined | string[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Automatically populates missing openapi.path using router structure.
|
|
103
|
+
*
|
|
104
|
+
* Builds paths by joining router keys with `/`.
|
|
105
|
+
* Useful when you want to ensure all contracts define openapi.path, such as for NestJS integration requirements.
|
|
106
|
+
*/
|
|
107
|
+
declare function populateRouterContractOpenAPIPaths<T extends RouterContract>(router: T, options?: PopulateRouterContractOpenAPIPathsOptions): PopulatedContractRouterOpenAPIPaths<T>;
|
|
108
|
+
|
|
87
109
|
/**
|
|
88
110
|
* Dynamic parameters are always returned in path order.
|
|
89
111
|
*/
|
|
@@ -94,5 +116,5 @@ declare function getDynamicPathParams(path: `/${string}`): {
|
|
|
94
116
|
allowsSlash: boolean;
|
|
95
117
|
}[] | undefined;
|
|
96
118
|
|
|
97
|
-
export { JsonifiedClient, JsonifiedClientError, JsonifiedValue, OpenAPIDocument, OpenAPIGenerator, OpenAPIGeneratorError, OpenAPISerializer, createContractJsonifiedCaller, getDynamicPathParams };
|
|
98
|
-
export type { ContractJsonifiedCaller, ContractJsonifiedCallerOptions, OpenAPIGeneratorGenerateOptions, OpenAPIGeneratorOptions };
|
|
119
|
+
export { DEFAULT_OPENAPI_INPUT_STRUCTURE, DEFAULT_OPENAPI_METHOD, DEFAULT_OPENAPI_OUTPUT_STRUCTURE, DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, JsonifiedClient, JsonifiedClientError, JsonifiedValue, OpenAPIDocument, OpenAPIGenerator, OpenAPIGeneratorError, OpenAPISerializer, createContractJsonifiedCaller, getDynamicPathParams, populateRouterContractOpenAPIPaths };
|
|
120
|
+
export type { ContractJsonifiedCaller, ContractJsonifiedCallerOptions, OpenAPIGeneratorGenerateOptions, OpenAPIGeneratorOptions, PopulateRouterContractOpenAPIPathsOptions, PopulatedContractRouterOpenAPIPaths };
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { d as JsonifiedArray, O as OpenAPIOperationObject } from './shared/opena
|
|
|
9
9
|
export { a as OpenAPIFunction, O as OpenAPIMeta, b as OpenAPIMetaPlugin, c as OpenAPIMethodMetaPlugin, d as OpenAPIPathMetaPlugin, e as OpenAPIPrefixMetaPlugin, f as OpenAPISpecMetaPlugin, g as getOpenAPIMeta, o as openapi } from './shared/openapi.BQzzr4-4.js';
|
|
10
10
|
import { JsonSchemaConverter, JsonSchema } from '@orpc/json-schema';
|
|
11
11
|
import { AnyRouter, AnyProcedure } from '@orpc/server';
|
|
12
|
-
|
|
12
|
+
export { StandardBodyHint } from '@standardserver/core';
|
|
13
13
|
import '@hey-api/spec-types';
|
|
14
14
|
|
|
15
15
|
interface ContractJsonifiedCaller<TClientContext extends ClientContext> {
|
|
@@ -25,6 +25,11 @@ interface ContractJsonifiedCallerOptions<TClientContext extends ClientContext> e
|
|
|
25
25
|
}
|
|
26
26
|
declare function createContractJsonifiedCaller<TClientContext extends ClientContext>(link: ClientLink<TClientContext>, options?: ContractJsonifiedCallerOptions<TClientContext>): ContractJsonifiedCaller<TClientContext>;
|
|
27
27
|
|
|
28
|
+
declare const DEFAULT_OPENAPI_METHOD = "POST";
|
|
29
|
+
declare const DEFAULT_OPENAPI_SUCCESS_DESCRIPTION = "OK";
|
|
30
|
+
declare const DEFAULT_OPENAPI_INPUT_STRUCTURE = "compact";
|
|
31
|
+
declare const DEFAULT_OPENAPI_OUTPUT_STRUCTURE = "compact";
|
|
32
|
+
|
|
28
33
|
declare class OpenAPIGeneratorError extends TypeError {
|
|
29
34
|
}
|
|
30
35
|
interface OpenAPIGeneratorOptions {
|
|
@@ -84,6 +89,23 @@ declare class OpenAPIGenerator {
|
|
|
84
89
|
private errorResponse;
|
|
85
90
|
}
|
|
86
91
|
|
|
92
|
+
type PopulatedContractRouterOpenAPIPaths<T extends RouterContract> = T extends ProcedureContract<infer UInputSchema, infer UOutputSchema, infer UErrors> ? ProcedureContract<UInputSchema, UOutputSchema, UErrors> : {
|
|
93
|
+
[K in keyof T]: T[K] extends RouterContract ? PopulatedContractRouterOpenAPIPaths<T[K]> : never;
|
|
94
|
+
};
|
|
95
|
+
interface PopulateRouterContractOpenAPIPathsOptions {
|
|
96
|
+
/**
|
|
97
|
+
* Base path segments.
|
|
98
|
+
*/
|
|
99
|
+
path?: undefined | string[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Automatically populates missing openapi.path using router structure.
|
|
103
|
+
*
|
|
104
|
+
* Builds paths by joining router keys with `/`.
|
|
105
|
+
* Useful when you want to ensure all contracts define openapi.path, such as for NestJS integration requirements.
|
|
106
|
+
*/
|
|
107
|
+
declare function populateRouterContractOpenAPIPaths<T extends RouterContract>(router: T, options?: PopulateRouterContractOpenAPIPathsOptions): PopulatedContractRouterOpenAPIPaths<T>;
|
|
108
|
+
|
|
87
109
|
/**
|
|
88
110
|
* Dynamic parameters are always returned in path order.
|
|
89
111
|
*/
|
|
@@ -94,5 +116,5 @@ declare function getDynamicPathParams(path: `/${string}`): {
|
|
|
94
116
|
allowsSlash: boolean;
|
|
95
117
|
}[] | undefined;
|
|
96
118
|
|
|
97
|
-
export { JsonifiedClient, JsonifiedClientError, JsonifiedValue, OpenAPIDocument, OpenAPIGenerator, OpenAPIGeneratorError, OpenAPISerializer, createContractJsonifiedCaller, getDynamicPathParams };
|
|
98
|
-
export type { ContractJsonifiedCaller, ContractJsonifiedCallerOptions, OpenAPIGeneratorGenerateOptions, OpenAPIGeneratorOptions };
|
|
119
|
+
export { DEFAULT_OPENAPI_INPUT_STRUCTURE, DEFAULT_OPENAPI_METHOD, DEFAULT_OPENAPI_OUTPUT_STRUCTURE, DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, JsonifiedClient, JsonifiedClientError, JsonifiedValue, OpenAPIDocument, OpenAPIGenerator, OpenAPIGeneratorError, OpenAPISerializer, createContractJsonifiedCaller, getDynamicPathParams, populateRouterContractOpenAPIPaths };
|
|
120
|
+
export type { ContractJsonifiedCaller, ContractJsonifiedCallerOptions, OpenAPIGeneratorGenerateOptions, OpenAPIGeneratorOptions, PopulateRouterContractOpenAPIPathsOptions, PopulatedContractRouterOpenAPIPaths };
|
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
export { B as BracketNotationSerializer } from './shared/openapi.Bt87OzTt.mjs';
|
|
2
|
-
import { createContractCaller, getEventIteratorSchemaDetails } from '@orpc/contract';
|
|
3
|
-
import { g as
|
|
4
|
-
export {
|
|
2
|
+
import { createContractCaller, getEventIteratorSchemaDetails, ProcedureContract, resolveMetaPlugins } from '@orpc/contract';
|
|
3
|
+
import { O as OpenAPISerializer, D as DEFAULT_OPENAPI_METHOD, g as getDynamicPathParams, a as DEFAULT_OPENAPI_INPUT_STRUCTURE, c as DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, b as DEFAULT_OPENAPI_OUTPUT_STRUCTURE } from './shared/openapi.DmAa7YPO.mjs';
|
|
4
|
+
export { d as OpenAPIJsonSerializer } from './shared/openapi.DmAa7YPO.mjs';
|
|
5
|
+
import { g as getOpenAPIMeta, o as openapi } from './shared/openapi.B9PQzqBn.mjs';
|
|
5
6
|
import { COMMON_ERROR_STATUS_MAP } from '@orpc/client';
|
|
6
7
|
export { COMMON_ERROR_STATUS_MAP } from '@orpc/client';
|
|
7
|
-
import { DelegatingJsonSchemaConverter, StandardJsonSchemaConverter, combineJsonSchemasWithComposition, isUnconstrainedSchema, extractJsonObjectSchemaEntries, combineJsonObjectSchemaEntries, isJsonPrimitiveSchema, matchArrayableJsonSchema,
|
|
8
|
+
import { DelegatingJsonSchemaConverter, StandardJsonSchemaConverter, combineJsonSchemasWithComposition, isUnconstrainedSchema, extractJsonObjectSchemaEntries, combineJsonObjectSchemaEntries, flattenJsonUnionSchema, isJsonPrimitiveSchema, matchArrayableJsonSchema, ensureJsonSchemaObject, isJsonFileSchema, mapJsonSchemaRefs, encodeJsonPointerSegment, decodeJsonPointerSegment } from '@orpc/json-schema';
|
|
8
9
|
import { walkProcedureContractsAsync, DEFAULT_SUCCESS_STATUS, DEFAULT_ERROR_STATUS } from '@orpc/server';
|
|
9
|
-
import { toArray, clone, value, pathToHttpPath, mergeHttpPath, stringifyJSON, findDeepMatches, isPlainObject, isDeepEqual } from '@orpc/shared';
|
|
10
|
-
import { O as OpenAPISerializer, D as DEFAULT_OPENAPI_METHOD, g as getDynamicPathParams, a as DEFAULT_OPENAPI_INPUT_STRUCTURE, c as DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, b as DEFAULT_OPENAPI_OUTPUT_STRUCTURE } from './shared/openapi.DmAa7YPO.mjs';
|
|
11
|
-
export { d as OpenAPIJsonSerializer } from './shared/openapi.DmAa7YPO.mjs';
|
|
10
|
+
import { toArray, clone, value, pathToHttpPath, mergeHttpPath, stringifyJSON, findDeepMatches, isPlainObject, isDeepEqual, isTypescriptObject } from '@orpc/shared';
|
|
12
11
|
import '@standardserver/core';
|
|
13
12
|
|
|
14
13
|
function createContractJsonifiedCaller(link, options = {}) {
|
|
@@ -202,9 +201,9 @@ ${errors.join("\n\n")}`
|
|
|
202
201
|
};
|
|
203
202
|
delete parameter.schema;
|
|
204
203
|
} else if (style === void 0) {
|
|
205
|
-
if (!isJsonPrimitiveSchema(
|
|
204
|
+
if (flattenJsonUnionSchema(schema2).some((s) => !isJsonPrimitiveSchema(s))) {
|
|
206
205
|
const arrayable = matchArrayableJsonSchema(schema2);
|
|
207
|
-
if (!arrayable ||
|
|
206
|
+
if (!arrayable || flattenJsonUnionSchema(arrayable[0]).some((s) => !isJsonPrimitiveSchema(s))) {
|
|
208
207
|
parameter.style = "deepObject";
|
|
209
208
|
parameter.explode = true;
|
|
210
209
|
}
|
|
@@ -898,4 +897,34 @@ function rewriteComponentSchemaRefs(schema, renameMap) {
|
|
|
898
897
|
});
|
|
899
898
|
}
|
|
900
899
|
|
|
901
|
-
|
|
900
|
+
function populateRouterContractOpenAPIPaths(router, options = {}) {
|
|
901
|
+
const path = toArray(options.path);
|
|
902
|
+
if (router instanceof ProcedureContract) {
|
|
903
|
+
if (getOpenAPIMeta(router)?.path !== void 0) {
|
|
904
|
+
return router;
|
|
905
|
+
}
|
|
906
|
+
const [meta, metaPlugins] = resolveMetaPlugins(
|
|
907
|
+
router["~orpc"].meta,
|
|
908
|
+
router["~orpc"].metaPlugins,
|
|
909
|
+
[openapi({ path: pathToHttpPath(path) })]
|
|
910
|
+
);
|
|
911
|
+
return new ProcedureContract({
|
|
912
|
+
...router["~orpc"],
|
|
913
|
+
meta,
|
|
914
|
+
metaPlugins
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
if (!isTypescriptObject(router)) {
|
|
918
|
+
return router;
|
|
919
|
+
}
|
|
920
|
+
const populated = {};
|
|
921
|
+
for (const key in router) {
|
|
922
|
+
populated[key] = populateRouterContractOpenAPIPaths(
|
|
923
|
+
router[key],
|
|
924
|
+
{ ...options, path: [...path, key] }
|
|
925
|
+
);
|
|
926
|
+
}
|
|
927
|
+
return populated;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
export { DEFAULT_OPENAPI_INPUT_STRUCTURE, DEFAULT_OPENAPI_METHOD, DEFAULT_OPENAPI_OUTPUT_STRUCTURE, DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, OpenAPIGenerator, OpenAPIGeneratorError, OpenAPISerializer, createContractJsonifiedCaller, getDynamicPathParams, getOpenAPIMeta, openapi, populateRouterContractOpenAPIPaths };
|
|
@@ -31,9 +31,7 @@ declare class OpenAPIMatcher {
|
|
|
31
31
|
private resolveProcedure;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
interface OpenAPIHandlerCodecOptions<_T extends Context> extends OpenAPIMatcherOptions {
|
|
34
|
+
interface OpenAPIHandlerCodecCoreOptions<_T extends Context> {
|
|
37
35
|
/**
|
|
38
36
|
* Override the default OpenAPI serializer.
|
|
39
37
|
*/
|
|
@@ -55,21 +53,30 @@ interface OpenAPIHandlerCodecOptions<_T extends Context> extends OpenAPIMatcherO
|
|
|
55
53
|
*/
|
|
56
54
|
customErrorResponseBodyEncoder?: (error: AnyORPCError) => unknown;
|
|
57
55
|
}
|
|
58
|
-
declare class
|
|
59
|
-
private readonly matcher;
|
|
56
|
+
declare class OpenAPIHandlerCodecCore<T extends Context> {
|
|
60
57
|
private readonly serializer;
|
|
61
58
|
private readonly errorStatusMap;
|
|
62
59
|
private readonly customErrorResponseBodySerializer;
|
|
63
|
-
constructor(
|
|
64
|
-
|
|
60
|
+
constructor(options?: OpenAPIHandlerCodecCoreOptions<T>);
|
|
61
|
+
decodeInput(matched: {
|
|
62
|
+
procedure: AnyProcedure;
|
|
63
|
+
params?: undefined | Record<string, string>;
|
|
64
|
+
}, request: StandardLazyRequest): Promise<unknown>;
|
|
65
65
|
/**
|
|
66
|
-
* @throws {
|
|
66
|
+
* @throws {TypeError} If `outputStructure` is "detailed" and the output doesn't match the expected structure.
|
|
67
67
|
*/
|
|
68
|
-
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[]
|
|
69
|
-
encodeError(error: AnyORPCError
|
|
68
|
+
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[]): Promisable<StandardResponse>;
|
|
69
|
+
encodeError(error: AnyORPCError): Promisable<StandardResponse>;
|
|
70
70
|
private deserializeQuery;
|
|
71
71
|
private deserializeParams;
|
|
72
72
|
}
|
|
73
|
+
interface OpenAPIHandlerCodecOptions<T extends Context> extends OpenAPIHandlerCodecCoreOptions<T>, OpenAPIMatcherOptions {
|
|
74
|
+
}
|
|
75
|
+
declare class OpenAPIHandlerCodec<T extends Context> extends OpenAPIHandlerCodecCore<T> implements StandardHandlerCodec<T> {
|
|
76
|
+
private readonly matcher;
|
|
77
|
+
constructor(router: AnyRouter, options?: OpenAPIHandlerCodecOptions<T>);
|
|
78
|
+
resolveProcedure(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
|
|
79
|
+
}
|
|
73
80
|
|
|
74
|
-
export { OpenAPIHandlerCodec as a,
|
|
75
|
-
export type { OpenAPIHandlerCodecOptions as O, OpenAPIMatcherOptions as
|
|
81
|
+
export { OpenAPIHandlerCodec as a, OpenAPIHandlerCodecCore as b, OpenAPIMatcher as d };
|
|
82
|
+
export type { OpenAPIHandlerCodecOptions as O, OpenAPIHandlerCodecCoreOptions as c, OpenAPIMatcherOptions as e };
|
|
@@ -124,62 +124,48 @@ function decodeParams(params) {
|
|
|
124
124
|
return Object.fromEntries(Object.entries(params).map(([key, val]) => [key, tryDecodeURIComponent(val)]));
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
class
|
|
128
|
-
}
|
|
129
|
-
class OpenAPIHandlerCodec {
|
|
130
|
-
matcher;
|
|
127
|
+
class OpenAPIHandlerCodecCore {
|
|
131
128
|
serializer;
|
|
132
129
|
errorStatusMap;
|
|
133
130
|
customErrorResponseBodySerializer;
|
|
134
|
-
constructor(
|
|
135
|
-
this.matcher = new OpenAPIMatcher(router, options);
|
|
131
|
+
constructor(options = {}) {
|
|
136
132
|
this.serializer = options.serializer ?? new OpenAPISerializer();
|
|
137
133
|
this.errorStatusMap = options.errorStatusMap ?? COMMON_ERROR_STATUS_MAP;
|
|
138
134
|
this.customErrorResponseBodySerializer = options.customErrorResponseBodyEncoder;
|
|
139
135
|
}
|
|
140
|
-
async
|
|
141
|
-
const [
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const data = request.method === "GET" ? query : this.serializer.deserialize(await request.resolveBody(meta?.requestBodyHint));
|
|
156
|
-
if (data === void 0) {
|
|
157
|
-
return params;
|
|
158
|
-
}
|
|
159
|
-
if (!params || Object.keys(params).length < 1) {
|
|
160
|
-
return data;
|
|
161
|
-
}
|
|
162
|
-
if (isPlainObject(data)) {
|
|
163
|
-
return {
|
|
164
|
-
...params,
|
|
165
|
-
...data
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
return data;
|
|
169
|
-
}
|
|
136
|
+
async decodeInput(matched, request) {
|
|
137
|
+
const [_, search] = parseStandardUrl(request.url);
|
|
138
|
+
const meta = getOpenAPIMeta(matched.procedure);
|
|
139
|
+
const inputStructure = meta?.inputStructure ?? DEFAULT_OPENAPI_INPUT_STRUCTURE;
|
|
140
|
+
const params = this.deserializeParams(matched.params, meta?.paramsStyles);
|
|
141
|
+
const query = this.deserializeQuery(search, meta?.queryStyles);
|
|
142
|
+
if (inputStructure === "compact") {
|
|
143
|
+
const data = request.method === "GET" ? query : this.serializer.deserialize(await request.resolveBody(meta?.requestBodyHint));
|
|
144
|
+
if (data === void 0) {
|
|
145
|
+
return params;
|
|
146
|
+
}
|
|
147
|
+
if (!params || Object.keys(params).length < 1) {
|
|
148
|
+
return data;
|
|
149
|
+
}
|
|
150
|
+
if (isPlainObject(data)) {
|
|
170
151
|
return {
|
|
171
|
-
params,
|
|
172
|
-
|
|
173
|
-
headers: request.headers,
|
|
174
|
-
body: this.serializer.deserialize(await request.resolveBody(meta?.requestBodyHint))
|
|
152
|
+
...params,
|
|
153
|
+
...data
|
|
175
154
|
};
|
|
176
155
|
}
|
|
156
|
+
return data;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
params,
|
|
160
|
+
query,
|
|
161
|
+
headers: request.headers,
|
|
162
|
+
body: this.serializer.deserialize(await request.resolveBody(meta?.requestBodyHint))
|
|
177
163
|
};
|
|
178
164
|
}
|
|
179
165
|
/**
|
|
180
|
-
* @throws {
|
|
166
|
+
* @throws {TypeError} If `outputStructure` is "detailed" and the output doesn't match the expected structure.
|
|
181
167
|
*/
|
|
182
|
-
encodeOutput(output, procedure, path
|
|
168
|
+
encodeOutput(output, procedure, path) {
|
|
183
169
|
const meta = getOpenAPIMeta(procedure);
|
|
184
170
|
const successStatus = meta?.successStatus ?? DEFAULT_SUCCESS_STATUS;
|
|
185
171
|
const outputStructure = meta?.outputStructure ?? DEFAULT_OPENAPI_OUTPUT_STRUCTURE;
|
|
@@ -191,7 +177,7 @@ class OpenAPIHandlerCodec {
|
|
|
191
177
|
};
|
|
192
178
|
}
|
|
193
179
|
if (!isValidDetailedOutput(output)) {
|
|
194
|
-
throw new
|
|
180
|
+
throw new TypeError(`
|
|
195
181
|
Invalid "detailed" output structure returned by procedure (${path.join(".")}):
|
|
196
182
|
\u2022 Expected an object with optional properties:
|
|
197
183
|
- status (number 200-399)
|
|
@@ -209,7 +195,7 @@ class OpenAPIHandlerCodec {
|
|
|
209
195
|
body: this.serializer.serialize(output.body)
|
|
210
196
|
};
|
|
211
197
|
}
|
|
212
|
-
encodeError(error
|
|
198
|
+
encodeError(error) {
|
|
213
199
|
const status = this.errorStatusMap[error.code] ?? DEFAULT_ERROR_STATUS;
|
|
214
200
|
return {
|
|
215
201
|
status,
|
|
@@ -276,6 +262,25 @@ class OpenAPIHandlerCodec {
|
|
|
276
262
|
return parsed;
|
|
277
263
|
}
|
|
278
264
|
}
|
|
265
|
+
class OpenAPIHandlerCodec extends OpenAPIHandlerCodecCore {
|
|
266
|
+
matcher;
|
|
267
|
+
constructor(router, options = {}) {
|
|
268
|
+
super(options);
|
|
269
|
+
this.matcher = new OpenAPIMatcher(router, options);
|
|
270
|
+
}
|
|
271
|
+
async resolveProcedure(request, options) {
|
|
272
|
+
const [pathname] = parseStandardUrl(request.url);
|
|
273
|
+
const matched = await this.matcher.match(request.method, pathname, options.prefix);
|
|
274
|
+
if (!matched) {
|
|
275
|
+
return void 0;
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
procedure: matched.procedure,
|
|
279
|
+
path: matched.path,
|
|
280
|
+
decodeInput: () => this.decodeInput(matched, request)
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
279
284
|
function isValidDetailedOutput(output) {
|
|
280
285
|
if (!isTypescriptObject(output)) {
|
|
281
286
|
return false;
|
|
@@ -310,4 +315,4 @@ function decodeDelimitedObject(value, delimiter) {
|
|
|
310
315
|
return obj;
|
|
311
316
|
}
|
|
312
317
|
|
|
313
|
-
export { OpenAPIHandlerCodec as O,
|
|
318
|
+
export { OpenAPIHandlerCodec as O, OpenAPIHandlerCodecCore as a, OpenAPIMatcher as b };
|
|
@@ -31,9 +31,7 @@ declare class OpenAPIMatcher {
|
|
|
31
31
|
private resolveProcedure;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
interface OpenAPIHandlerCodecOptions<_T extends Context> extends OpenAPIMatcherOptions {
|
|
34
|
+
interface OpenAPIHandlerCodecCoreOptions<_T extends Context> {
|
|
37
35
|
/**
|
|
38
36
|
* Override the default OpenAPI serializer.
|
|
39
37
|
*/
|
|
@@ -55,21 +53,30 @@ interface OpenAPIHandlerCodecOptions<_T extends Context> extends OpenAPIMatcherO
|
|
|
55
53
|
*/
|
|
56
54
|
customErrorResponseBodyEncoder?: (error: AnyORPCError) => unknown;
|
|
57
55
|
}
|
|
58
|
-
declare class
|
|
59
|
-
private readonly matcher;
|
|
56
|
+
declare class OpenAPIHandlerCodecCore<T extends Context> {
|
|
60
57
|
private readonly serializer;
|
|
61
58
|
private readonly errorStatusMap;
|
|
62
59
|
private readonly customErrorResponseBodySerializer;
|
|
63
|
-
constructor(
|
|
64
|
-
|
|
60
|
+
constructor(options?: OpenAPIHandlerCodecCoreOptions<T>);
|
|
61
|
+
decodeInput(matched: {
|
|
62
|
+
procedure: AnyProcedure;
|
|
63
|
+
params?: undefined | Record<string, string>;
|
|
64
|
+
}, request: StandardLazyRequest): Promise<unknown>;
|
|
65
65
|
/**
|
|
66
|
-
* @throws {
|
|
66
|
+
* @throws {TypeError} If `outputStructure` is "detailed" and the output doesn't match the expected structure.
|
|
67
67
|
*/
|
|
68
|
-
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[]
|
|
69
|
-
encodeError(error: AnyORPCError
|
|
68
|
+
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[]): Promisable<StandardResponse>;
|
|
69
|
+
encodeError(error: AnyORPCError): Promisable<StandardResponse>;
|
|
70
70
|
private deserializeQuery;
|
|
71
71
|
private deserializeParams;
|
|
72
72
|
}
|
|
73
|
+
interface OpenAPIHandlerCodecOptions<T extends Context> extends OpenAPIHandlerCodecCoreOptions<T>, OpenAPIMatcherOptions {
|
|
74
|
+
}
|
|
75
|
+
declare class OpenAPIHandlerCodec<T extends Context> extends OpenAPIHandlerCodecCore<T> implements StandardHandlerCodec<T> {
|
|
76
|
+
private readonly matcher;
|
|
77
|
+
constructor(router: AnyRouter, options?: OpenAPIHandlerCodecOptions<T>);
|
|
78
|
+
resolveProcedure(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
|
|
79
|
+
}
|
|
73
80
|
|
|
74
|
-
export { OpenAPIHandlerCodec as a,
|
|
75
|
-
export type { OpenAPIHandlerCodecOptions as O, OpenAPIMatcherOptions as
|
|
81
|
+
export { OpenAPIHandlerCodec as a, OpenAPIHandlerCodecCore as b, OpenAPIMatcher as d };
|
|
82
|
+
export type { OpenAPIHandlerCodecOptions as O, OpenAPIHandlerCodecCoreOptions as c, OpenAPIMatcherOptions as e };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orpc/openapi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.0.0-beta.
|
|
4
|
+
"version": "2.0.0-beta.11",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://orpc.dev",
|
|
7
7
|
"repository": {
|
|
@@ -57,22 +57,38 @@
|
|
|
57
57
|
"files": [
|
|
58
58
|
"dist"
|
|
59
59
|
],
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"@scalar/api-reference": ">=1.57.2",
|
|
62
|
+
"@types/swagger-ui": ">=5.32.0",
|
|
63
|
+
"swagger-ui": ">=5.32.6"
|
|
64
|
+
},
|
|
65
|
+
"peerDependenciesMeta": {
|
|
66
|
+
"@scalar/api-reference": {
|
|
67
|
+
"optional": true
|
|
68
|
+
},
|
|
69
|
+
"@types/swagger-ui": {
|
|
70
|
+
"optional": true
|
|
71
|
+
},
|
|
72
|
+
"swagger-ui": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
60
76
|
"dependencies": {
|
|
61
77
|
"@hey-api/spec-types": "0.0.0-next-20260408030107",
|
|
78
|
+
"@standardserver/core": "^0.0.25",
|
|
79
|
+
"@standardserver/fetch": "^0.0.25",
|
|
80
|
+
"rou3": "^0.8.1",
|
|
81
|
+
"@orpc/client": "2.0.0-beta.11",
|
|
82
|
+
"@orpc/shared": "2.0.0-beta.11",
|
|
83
|
+
"@orpc/server": "2.0.0-beta.11",
|
|
84
|
+
"@orpc/json-schema": "2.0.0-beta.11",
|
|
85
|
+
"@orpc/contract": "2.0.0-beta.11"
|
|
86
|
+
},
|
|
87
|
+
"devDependencies": {
|
|
62
88
|
"@scalar/api-reference": "^1.57.2",
|
|
63
|
-
"@standardserver/core": "^0.0.24",
|
|
64
|
-
"@standardserver/fetch": "^0.0.24",
|
|
65
89
|
"@types/swagger-ui": "^5.32.0",
|
|
66
|
-
"
|
|
90
|
+
"fastify": "^5.8.5",
|
|
67
91
|
"swagger-ui": "^5.32.6",
|
|
68
|
-
"@orpc/client": "2.0.0-beta.1",
|
|
69
|
-
"@orpc/server": "2.0.0-beta.1",
|
|
70
|
-
"@orpc/shared": "2.0.0-beta.1",
|
|
71
|
-
"@orpc/contract": "2.0.0-beta.1",
|
|
72
|
-
"@orpc/json-schema": "2.0.0-beta.1"
|
|
73
|
-
},
|
|
74
|
-
"devDependencies": {
|
|
75
|
-
"fastify": "^5.6.2",
|
|
76
92
|
"zod": "^4.4.3"
|
|
77
93
|
},
|
|
78
94
|
"scripts": {
|