@dokploy/trpc-openapi 0.0.5 → 3.1.0-beta.0
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/LICENSE +4 -16
- package/README.md +166 -85
- package/dist/cjs/adapters/express.d.ts +6 -0
- package/dist/cjs/adapters/express.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/express.js +2 -2
- package/dist/cjs/adapters/express.js.map +1 -0
- package/dist/cjs/adapters/fastify.d.ts +9 -0
- package/dist/cjs/adapters/fastify.d.ts.map +1 -0
- package/dist/cjs/adapters/fastify.js +65 -0
- package/dist/cjs/adapters/fastify.js.map +1 -0
- package/dist/cjs/adapters/fetch.d.ts +8 -0
- package/dist/cjs/adapters/fetch.d.ts.map +1 -0
- package/dist/cjs/adapters/fetch.js +100 -0
- package/dist/cjs/adapters/fetch.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +9 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +25 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/koa.d.ts +9 -0
- package/dist/cjs/adapters/koa.d.ts.map +1 -0
- package/dist/cjs/adapters/koa.js +12 -0
- package/dist/cjs/adapters/koa.js.map +1 -0
- package/dist/cjs/adapters/next.d.ts +6 -0
- package/dist/cjs/adapters/next.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/next.js +15 -10
- package/dist/cjs/adapters/next.js.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/core.d.ts +4 -3
- package/dist/cjs/adapters/node-http/core.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/core.js +72 -49
- package/dist/cjs/adapters/node-http/core.js.map +1 -0
- package/dist/cjs/adapters/node-http/errors.d.ts +6 -0
- package/dist/cjs/adapters/node-http/errors.d.ts.map +1 -0
- package/dist/cjs/adapters/node-http/errors.js +94 -0
- package/dist/cjs/adapters/node-http/errors.js.map +1 -0
- package/dist/cjs/adapters/node-http/index.d.ts +5 -0
- package/dist/cjs/adapters/node-http/index.d.ts.map +1 -0
- package/dist/cjs/adapters/node-http/index.js +21 -0
- package/dist/cjs/adapters/node-http/index.js.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/input.d.ts +2 -2
- package/dist/cjs/adapters/node-http/input.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/input.js +7 -10
- package/dist/cjs/adapters/node-http/input.js.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/procedures.d.ts +2 -2
- package/dist/cjs/adapters/node-http/procedures.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/node-http/procedures.js +10 -21
- package/dist/cjs/adapters/node-http/procedures.js.map +1 -0
- package/dist/cjs/adapters/nuxt.d.ts +6 -0
- package/dist/cjs/adapters/nuxt.d.ts.map +1 -0
- package/dist/cjs/adapters/nuxt.js +50 -0
- package/dist/cjs/adapters/nuxt.js.map +1 -0
- package/dist/{adapters → cjs/adapters}/standalone.d.ts +3 -3
- package/dist/cjs/adapters/standalone.d.ts.map +1 -0
- package/dist/{adapters → cjs/adapters}/standalone.js +5 -1
- package/dist/cjs/adapters/standalone.js.map +1 -0
- package/dist/cjs/generator/index.d.ts +40 -0
- package/dist/cjs/generator/index.d.ts.map +1 -0
- package/dist/cjs/generator/index.js +33 -0
- package/dist/cjs/generator/index.js.map +1 -0
- package/dist/cjs/generator/paths.d.ts +16 -0
- package/dist/cjs/generator/paths.d.ts.map +1 -0
- package/dist/cjs/generator/paths.js +122 -0
- package/dist/cjs/generator/paths.js.map +1 -0
- package/dist/cjs/generator/schema.d.ts +15 -0
- package/dist/cjs/generator/schema.d.ts.map +1 -0
- package/dist/cjs/generator/schema.js +195 -0
- package/dist/cjs/generator/schema.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.d.ts +55 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +5 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/{adapters → cjs/utils}/index.js +4 -3
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/method.d.ts +6 -0
- package/dist/cjs/utils/method.d.ts.map +1 -0
- package/dist/cjs/utils/method.js +29 -0
- package/dist/cjs/utils/method.js.map +1 -0
- package/dist/cjs/utils/path.d.ts.map +1 -0
- package/dist/{utils → cjs/utils}/path.js +1 -1
- package/dist/cjs/utils/path.js.map +1 -0
- package/dist/cjs/utils/procedure.d.ts +22 -0
- package/dist/cjs/utils/procedure.d.ts.map +1 -0
- package/dist/cjs/utils/procedure.js +92 -0
- package/dist/cjs/utils/procedure.js.map +1 -0
- package/dist/cjs/utils/zod.d.ts +16 -0
- package/dist/cjs/utils/zod.d.ts.map +1 -0
- package/dist/cjs/utils/zod.js +96 -0
- package/dist/cjs/utils/zod.js.map +1 -0
- package/dist/esm/adapters/express.d.ts +6 -0
- package/dist/esm/adapters/express.d.ts.map +1 -0
- package/dist/esm/adapters/express.js.map +1 -0
- package/dist/esm/adapters/express.mjs +8 -0
- package/dist/esm/adapters/fastify.d.ts +9 -0
- package/dist/esm/adapters/fastify.d.ts.map +1 -0
- package/dist/esm/adapters/fastify.js.map +1 -0
- package/dist/esm/adapters/fastify.mjs +61 -0
- package/dist/esm/adapters/fetch.d.ts +8 -0
- package/dist/esm/adapters/fetch.d.ts.map +1 -0
- package/dist/esm/adapters/fetch.js.map +1 -0
- package/dist/esm/adapters/fetch.mjs +95 -0
- package/dist/esm/adapters/index.d.ts +9 -0
- package/dist/esm/adapters/index.d.ts.map +1 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/index.mjs +9 -0
- package/dist/esm/adapters/koa.d.ts +9 -0
- package/dist/esm/adapters/koa.d.ts.map +1 -0
- package/dist/esm/adapters/koa.js.map +1 -0
- package/dist/esm/adapters/koa.mjs +8 -0
- package/dist/esm/adapters/next.d.ts +6 -0
- package/dist/esm/adapters/next.d.ts.map +1 -0
- package/dist/esm/adapters/next.js.map +1 -0
- package/dist/esm/adapters/next.mjs +45 -0
- package/dist/esm/adapters/node-http/core.d.ts +7 -0
- package/dist/esm/adapters/node-http/core.d.ts.map +1 -0
- package/dist/esm/adapters/node-http/core.js.map +1 -0
- package/dist/esm/adapters/node-http/core.mjs +166 -0
- package/dist/esm/adapters/node-http/errors.d.ts +6 -0
- package/dist/esm/adapters/node-http/errors.d.ts.map +1 -0
- package/dist/esm/adapters/node-http/errors.js.map +1 -0
- package/dist/esm/adapters/node-http/errors.mjs +90 -0
- package/dist/esm/adapters/node-http/index.d.ts +5 -0
- package/dist/esm/adapters/node-http/index.d.ts.map +1 -0
- package/dist/esm/adapters/node-http/index.js.map +1 -0
- package/dist/esm/adapters/node-http/index.mjs +5 -0
- package/dist/esm/adapters/node-http/input.d.ts +4 -0
- package/dist/esm/adapters/node-http/input.d.ts.map +1 -0
- package/dist/esm/adapters/node-http/input.js.map +1 -0
- package/dist/esm/adapters/node-http/input.mjs +65 -0
- package/dist/esm/adapters/node-http/procedures.d.ts +12 -0
- package/dist/esm/adapters/node-http/procedures.d.ts.map +1 -0
- package/dist/esm/adapters/node-http/procedures.js.map +1 -0
- package/dist/esm/adapters/node-http/procedures.mjs +34 -0
- package/dist/esm/adapters/nuxt.d.ts +6 -0
- package/dist/esm/adapters/nuxt.d.ts.map +1 -0
- package/dist/esm/adapters/nuxt.js.map +1 -0
- package/dist/esm/adapters/nuxt.mjs +45 -0
- package/dist/esm/adapters/standalone.d.ts +6 -0
- package/dist/esm/adapters/standalone.d.ts.map +1 -0
- package/dist/esm/adapters/standalone.js.map +1 -0
- package/dist/esm/adapters/standalone.mjs +11 -0
- package/dist/esm/generator/index.d.ts +40 -0
- package/dist/esm/generator/index.d.ts.map +1 -0
- package/dist/esm/generator/index.js.map +1 -0
- package/dist/esm/generator/index.mjs +31 -0
- package/dist/esm/generator/paths.d.ts +16 -0
- package/dist/esm/generator/paths.d.ts.map +1 -0
- package/dist/esm/generator/paths.js.map +1 -0
- package/dist/esm/generator/paths.mjs +129 -0
- package/dist/esm/generator/schema.d.ts +15 -0
- package/dist/esm/generator/schema.d.ts.map +1 -0
- package/dist/esm/generator/schema.js.map +1 -0
- package/dist/esm/generator/schema.mjs +203 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +6 -0
- package/dist/esm/types.d.ts +55 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/utils/index.d.ts +5 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/index.mjs +5 -0
- package/dist/esm/utils/method.d.ts +6 -0
- package/dist/esm/utils/method.d.ts.map +1 -0
- package/dist/esm/utils/method.js.map +1 -0
- package/dist/esm/utils/method.mjs +22 -0
- package/dist/esm/utils/path.d.ts +4 -0
- package/dist/esm/utils/path.d.ts.map +1 -0
- package/dist/esm/utils/path.js.map +1 -0
- package/dist/esm/utils/path.mjs +11 -0
- package/dist/esm/utils/procedure.d.ts +22 -0
- package/dist/esm/utils/procedure.d.ts.map +1 -0
- package/dist/esm/utils/procedure.js.map +1 -0
- package/dist/esm/utils/procedure.mjs +85 -0
- package/dist/esm/utils/zod.d.ts +16 -0
- package/dist/esm/utils/zod.d.ts.map +1 -0
- package/dist/esm/utils/zod.js.map +1 -0
- package/dist/esm/utils/zod.mjs +82 -0
- package/package.json +49 -41
- package/dist/adapters/express.d.ts +0 -8
- package/dist/adapters/express.d.ts.map +0 -1
- package/dist/adapters/express.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -4
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/next.d.ts +0 -6
- package/dist/adapters/next.d.ts.map +0 -1
- package/dist/adapters/next.js.map +0 -1
- package/dist/adapters/node-http/core.d.ts.map +0 -1
- package/dist/adapters/node-http/core.js.map +0 -1
- package/dist/adapters/node-http/errors.d.ts +0 -4
- package/dist/adapters/node-http/errors.d.ts.map +0 -1
- package/dist/adapters/node-http/errors.js +0 -43
- package/dist/adapters/node-http/errors.js.map +0 -1
- package/dist/adapters/node-http/input.d.ts.map +0 -1
- package/dist/adapters/node-http/input.js.map +0 -1
- package/dist/adapters/node-http/procedures.d.ts.map +0 -1
- package/dist/adapters/node-http/procedures.js.map +0 -1
- package/dist/adapters/standalone.d.ts.map +0 -1
- package/dist/adapters/standalone.js.map +0 -1
- package/dist/generator/index.d.ts +0 -14
- package/dist/generator/index.d.ts.map +0 -1
- package/dist/generator/index.js +0 -39
- package/dist/generator/index.js.map +0 -1
- package/dist/generator/paths.d.ts +0 -4
- package/dist/generator/paths.d.ts.map +0 -1
- package/dist/generator/paths.js +0 -76
- package/dist/generator/paths.js.map +0 -1
- package/dist/generator/schema.d.ts +0 -7
- package/dist/generator/schema.d.ts.map +0 -1
- package/dist/generator/schema.js +0 -185
- package/dist/generator/schema.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -55
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/method.d.ts +0 -3
- package/dist/utils/method.d.ts.map +0 -1
- package/dist/utils/method.js +0 -11
- package/dist/utils/method.js.map +0 -1
- package/dist/utils/path.d.ts.map +0 -1
- package/dist/utils/path.js.map +0 -1
- package/dist/utils/procedure.d.ts +0 -15
- package/dist/utils/procedure.d.ts.map +0 -1
- package/dist/utils/procedure.js +0 -62
- package/dist/utils/procedure.js.map +0 -1
- package/dist/utils/zod.d.ts +0 -19
- package/dist/utils/zod.d.ts.map +0 -1
- package/dist/utils/zod.js +0 -99
- package/dist/utils/zod.js.map +0 -1
- /package/dist/{types.js → cjs/types.js} +0 -0
- /package/dist/{utils → cjs/utils}/path.d.ts +0 -0
package/LICENSE
CHANGED
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright
|
|
3
|
+
Copyright 2024 Mario Campa
|
|
4
4
|
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
11
6
|
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
14
8
|
|
|
15
|
-
THE SOFTWARE IS PROVIDED
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
9
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/trpc-openapi.svg">
|
|
3
|
+
</p>
|
|
3
4
|
<div align="center">
|
|
4
|
-
<h1>trpc-openapi</h1>
|
|
5
|
-
<a href="https://www.npmjs.com/package/trpc-openapi"><img src="https://img.shields.io/npm/v/trpc-openapi.svg?style=flat&color=brightgreen" target="_blank" /></a>
|
|
5
|
+
<h1>trpc-to-openapi</h1>
|
|
6
|
+
<a href="https://www.npmjs.com/package/trpc-to-openapi"><img src="https://img.shields.io/npm/v/trpc-to-openapi.svg?style=flat&color=brightgreen" target="_blank" /></a>
|
|
6
7
|
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-black" /></a>
|
|
7
|
-
<a href="https://trpc.io/discord" target="_blank"><img src="https://img.shields.io/badge/chat-discord-blue.svg" /></a>
|
|
8
8
|
<br />
|
|
9
9
|
<hr />
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
12
|
## **[OpenAPI](https://swagger.io/specification/) support for [tRPC](https://trpc.io/)** 🧩
|
|
15
13
|
|
|
14
|
+
- Support for tRPC ^11.1.0 and Zod ^4
|
|
15
|
+
- Easy REST endpoints for your tRPC procedures.
|
|
16
|
+
- Perfect for incremental adoption.
|
|
17
|
+
- Supports all OpenAPI versions.
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
Note: This project is a fork of a fork, with full credit to the original authors. It appears that the original author has abandoned the project, so I plan to add new features in the near future.
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
### Branch `dokploy-openapi-features` (Dokploy-style defaults)
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
This branch adds behavior used by [Dokploy](https://github.com/Dokploy/dokploy) for generating OpenAPI documents:
|
|
22
24
|
|
|
23
|
-
1.
|
|
24
|
-
2.
|
|
25
|
-
3.
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
1. **Optional input/output as required in OpenAPI** – Optional Zod fields are exposed as required in the OpenAPI spec by default.
|
|
26
|
+
2. **`.meta()` is optional** – Procedures are included in OpenAPI even without `.meta({ openapi: { ... } })`. Defaults: `method` (GET for queries, POST for mutations), `path` from procedure key (e.g. `user.list` → `/user/list`), `enabled: true`, `tags` from first path segment, `protect: true`.
|
|
27
|
+
3. **`override` and `additional` in `.meta().openapi`**
|
|
28
|
+
- **`override: true`** – Only the object you pass is used (no defaults).
|
|
29
|
+
- **`additional: true`** – Defaults are applied first, then merged with your `openapi` object.
|
|
30
|
+
- Otherwise (default) – Your `openapi` object is merged with defaults (your values take precedence where provided).
|
|
28
31
|
|
|
32
|
+
**tRPC v10:** This branch is built for `@trpc/server` ^11 and Zod ^4. If you use `@trpc/server` ^10 (e.g. ^10.45.x), consider [@dokploy/trpc-openapi](https://github.com/dokploy/trpc-openapi), which supports tRPC 10 and Zod 3/4.
|
|
29
33
|
|
|
30
34
|
## Usage
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
- Perfect for incremental adoption.
|
|
34
|
-
- OpenAPI version 3.0.3.
|
|
35
|
-
|
|
36
|
-
**1. Install `@dokploy/trpc-openapi`.**
|
|
36
|
+
**1. Install `trpc-to-openapi`.**
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
+
# pnpm
|
|
40
|
+
pnpm add trpc-to-openapi
|
|
39
41
|
# npm
|
|
40
|
-
npm install
|
|
42
|
+
npm install trpc-to-openapi
|
|
41
43
|
# yarn
|
|
42
|
-
yarn add
|
|
44
|
+
yarn add trpc-to-openapi
|
|
43
45
|
```
|
|
44
46
|
|
|
45
47
|
**2. Add `OpenApiMeta` to your tRPC instance.**
|
|
46
48
|
|
|
47
49
|
```typescript
|
|
48
50
|
import { initTRPC } from '@trpc/server';
|
|
49
|
-
import { OpenApiMeta } from '
|
|
51
|
+
import { OpenApiMeta } from 'trpc-to-openapi';
|
|
50
52
|
|
|
51
53
|
const t = initTRPC.meta<OpenApiMeta>().create(); /* 👈 */
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
**3. Enable `openapi` support for a procedure.**
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
58
|
```typescript
|
|
59
59
|
export const appRouter = t.router({
|
|
60
60
|
sayHello: t.procedure
|
|
@@ -63,6 +63,13 @@ export const appRouter = t.router({
|
|
|
63
63
|
.output(z.object({ greeting: z.string() }))
|
|
64
64
|
.query(({ input }) => {
|
|
65
65
|
return { greeting: `Hello ${input.name}!` };
|
|
66
|
+
}),
|
|
67
|
+
|
|
68
|
+
getStatus: t.procedure
|
|
69
|
+
.meta({ /* 👉 */ openapi: { method: 'GET', path: '/status' } })
|
|
70
|
+
.output(z.object({ status: z.string() }))
|
|
71
|
+
.query(() => {
|
|
72
|
+
return { status: 'healthy' };
|
|
66
73
|
});
|
|
67
74
|
});
|
|
68
75
|
```
|
|
@@ -70,27 +77,34 @@ export const appRouter = t.router({
|
|
|
70
77
|
**4. Generate an OpenAPI document.**
|
|
71
78
|
|
|
72
79
|
```typescript
|
|
73
|
-
import { generateOpenApiDocument } from 'trpc-openapi';
|
|
80
|
+
import { generateOpenApiDocument } from 'trpc-to-openapi';
|
|
74
81
|
|
|
75
82
|
import { appRouter } from '../appRouter';
|
|
83
|
+
import { UserSchema, ProductSchema } from '../schemas';
|
|
76
84
|
|
|
77
85
|
/* 👇 */
|
|
78
86
|
export const openApiDocument = generateOpenApiDocument(appRouter, {
|
|
79
87
|
title: 'tRPC OpenAPI',
|
|
80
88
|
version: '1.0.0',
|
|
81
89
|
baseUrl: 'http://localhost:3000',
|
|
90
|
+
defs: {
|
|
91
|
+
UserSchema,
|
|
92
|
+
ProductSchema,
|
|
93
|
+
},
|
|
82
94
|
});
|
|
83
95
|
```
|
|
84
96
|
|
|
85
|
-
**5. Add an `trpc-openapi` handler to your app.**
|
|
97
|
+
**5. Add an `trpc-to-openapi` handler to your app.**
|
|
86
98
|
|
|
87
|
-
We currently support adapters for [`Express`](http://expressjs.com/), [`Next.js`](https://nextjs.org/), [`
|
|
99
|
+
We currently support adapters for [`Express`](http://expressjs.com/), [`Next.js`](https://nextjs.org/), [`Fastify`](https://www.fastify.io/), [`Nuxt`](https://nuxtjs.org/) & [`Node:HTTP`](https://nodejs.org/api/http.html).
|
|
88
100
|
|
|
89
101
|
[`Fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API), [`Cloudflare Workers`](https://workers.cloudflare.com/) & more soon™, PRs are welcomed 🙌.
|
|
90
102
|
|
|
103
|
+
No support for AWS lambdas
|
|
104
|
+
|
|
91
105
|
```typescript
|
|
92
106
|
import http from 'http';
|
|
93
|
-
import { createOpenApiHttpHandler } from 'trpc-openapi';
|
|
107
|
+
import { createOpenApiHttpHandler } from 'trpc-to-openapi';
|
|
94
108
|
|
|
95
109
|
import { appRouter } from '../appRouter';
|
|
96
110
|
|
|
@@ -103,22 +117,29 @@ server.listen(3000);
|
|
|
103
117
|
|
|
104
118
|
```typescript
|
|
105
119
|
// client.ts
|
|
106
|
-
const res = await fetch('http://localhost:3000/say-hello?name=
|
|
107
|
-
const body = await res.json(); /* { greeting: 'Hello
|
|
120
|
+
const res = await fetch('http://localhost:3000/say-hello?name=OpenAPI', { method: 'GET' });
|
|
121
|
+
const body = await res.json(); /* { greeting: 'Hello OpenAPI!' } */
|
|
122
|
+
|
|
123
|
+
const statusRes = await fetch('http://localhost:3000/status', { method: 'GET' });
|
|
124
|
+
const statusBody = await statusRes.json(); /* { status: 'healthy' } */
|
|
108
125
|
```
|
|
109
126
|
|
|
110
127
|
## Requirements
|
|
111
128
|
|
|
112
129
|
Peer dependencies:
|
|
113
130
|
|
|
114
|
-
- [`tRPC`](https://github.com/trpc/trpc) Server
|
|
115
|
-
- [`Zod`](https://github.com/colinhacks/zod)
|
|
131
|
+
- [`tRPC`](https://github.com/trpc/trpc) Server v11 (`@trpc/server`) must be installed.
|
|
132
|
+
- [`Zod`](https://github.com/colinhacks/zod) v4 (`zod@^4.0.0`) must be installed.
|
|
116
133
|
|
|
117
134
|
For a procedure to support OpenAPI the following _must_ be true:
|
|
118
135
|
|
|
136
|
+
- An `output` parser is present AND uses `Zod` validation.
|
|
137
|
+
- If an `input` parser is present, it must use `Zod` validation.
|
|
138
|
+
- Query `input` parsers (when present) extend `Object<{ [string]: String | Number | BigInt | Date }>` or `Void`.
|
|
139
|
+
- Mutation `input` parsers (when present) extend `Object<{ [string]: AnyType }>` or `Void`.
|
|
119
140
|
- `meta.openapi.method` is `GET`, `POST`, `PATCH`, `PUT` or `DELETE`.
|
|
120
141
|
- `meta.openapi.path` is a string starting with `/`.
|
|
121
|
-
- `meta.openapi.path` parameters exist in `input` parser as `String | Number | BigInt | Date`
|
|
142
|
+
- `meta.openapi.path` parameters (when present) exist in `input` parser as `String | Number | BigInt | Date`
|
|
122
143
|
|
|
123
144
|
Please note:
|
|
124
145
|
|
|
@@ -128,7 +149,7 @@ Please note:
|
|
|
128
149
|
|
|
129
150
|
## HTTP Requests
|
|
130
151
|
|
|
131
|
-
Procedures with a `GET`/`DELETE` method will accept inputs via URL `query parameters`. Procedures with a `POST`/`PATCH`/`PUT` method will accept inputs via the `request body` with a `application/json`
|
|
152
|
+
Procedures with a `GET`/`DELETE` method will accept inputs via URL `query parameters`. Procedures with a `POST`/`PATCH`/`PUT` method will accept inputs via the `request body` with a `application/json` content type.
|
|
132
153
|
|
|
133
154
|
### Path parameters
|
|
134
155
|
|
|
@@ -151,10 +172,10 @@ export const appRouter = t.router({
|
|
|
151
172
|
});
|
|
152
173
|
|
|
153
174
|
// Client
|
|
154
|
-
const res = await fetch('http://localhost:3000/say-hello/
|
|
175
|
+
const res = await fetch('http://localhost:3000/say-hello/Lily?greeting=Hello' /* 👈 */, {
|
|
155
176
|
method: 'GET',
|
|
156
177
|
});
|
|
157
|
-
const body = await res.json(); /* { greeting: 'Hello
|
|
178
|
+
const body = await res.json(); /* { greeting: 'Hello Lily!' } */
|
|
158
179
|
```
|
|
159
180
|
|
|
160
181
|
### Request body
|
|
@@ -172,17 +193,17 @@ export const appRouter = t.router({
|
|
|
172
193
|
});
|
|
173
194
|
|
|
174
195
|
// Client
|
|
175
|
-
const res = await fetch('http://localhost:3000/say-hello/
|
|
196
|
+
const res = await fetch('http://localhost:3000/say-hello/Lily' /* 👈 */, {
|
|
176
197
|
method: 'POST',
|
|
177
198
|
headers: { 'Content-Type': 'application/json' },
|
|
178
199
|
body: JSON.stringify({ greeting: 'Hello' }),
|
|
179
200
|
});
|
|
180
|
-
const body = await res.json(); /* { greeting: 'Hello
|
|
201
|
+
const body = await res.json(); /* { greeting: 'Hello Lily!' } */
|
|
181
202
|
```
|
|
182
203
|
|
|
183
204
|
### Custom headers
|
|
184
205
|
|
|
185
|
-
Any custom headers can be specified in the `meta.openapi.
|
|
206
|
+
Any custom headers can be specified in the `meta.openapi.requestHeaders` and `meta.openapi.responseHeaders` zod object schema, these headers will not be validated. Please consider using [Authorization](#authorization) for first-class OpenAPI auth/security support.
|
|
186
207
|
|
|
187
208
|
## HTTP Responses
|
|
188
209
|
|
|
@@ -202,14 +223,14 @@ Explore a [complete example here](examples/with-nextjs/src/server/router.ts).
|
|
|
202
223
|
|
|
203
224
|
```typescript
|
|
204
225
|
import { TRPCError, initTRPC } from '@trpc/server';
|
|
205
|
-
import { OpenApiMeta } from '
|
|
226
|
+
import { OpenApiMeta } from 'trpc-to-openapi';
|
|
206
227
|
|
|
207
228
|
type User = { id: string; name: string };
|
|
208
229
|
|
|
209
230
|
const users: User[] = [
|
|
210
231
|
{
|
|
211
232
|
id: 'usr_123',
|
|
212
|
-
name: '
|
|
233
|
+
name: 'Lily',
|
|
213
234
|
},
|
|
214
235
|
];
|
|
215
236
|
|
|
@@ -247,7 +268,7 @@ const res = await fetch('http://localhost:3000/say-hello', {
|
|
|
247
268
|
method: 'GET',
|
|
248
269
|
headers: { Authorization: 'Bearer usr_123' } /* 👈 */,
|
|
249
270
|
});
|
|
250
|
-
const body = await res.json(); /* { greeting: 'Hello
|
|
271
|
+
const body = await res.json(); /* { greeting: 'Hello Lily!' } */
|
|
251
272
|
```
|
|
252
273
|
|
|
253
274
|
## Examples
|
|
@@ -261,7 +282,7 @@ Please see [full example here](examples/with-express).
|
|
|
261
282
|
```typescript
|
|
262
283
|
import { createExpressMiddleware } from '@trpc/server/adapters/express';
|
|
263
284
|
import express from 'express';
|
|
264
|
-
import { createOpenApiExpressMiddleware } from 'trpc-openapi';
|
|
285
|
+
import { createOpenApiExpressMiddleware } from 'trpc-to-openapi';
|
|
265
286
|
|
|
266
287
|
import { appRouter } from '../appRouter';
|
|
267
288
|
|
|
@@ -273,29 +294,51 @@ app.use('/api', createOpenApiExpressMiddleware({ router: appRouter })); /* 👈
|
|
|
273
294
|
app.listen(3000);
|
|
274
295
|
```
|
|
275
296
|
|
|
276
|
-
#### With Next.js
|
|
297
|
+
#### With Next.js app router
|
|
277
298
|
|
|
278
|
-
Please see [full example here](examples/with-nextjs).
|
|
299
|
+
Please see [full example here](examples/with-nextjs-appdir).
|
|
279
300
|
|
|
280
301
|
```typescript
|
|
281
|
-
//
|
|
282
|
-
import {
|
|
283
|
-
|
|
284
|
-
import {
|
|
302
|
+
// src/app/[...trpc]/route.ts
|
|
303
|
+
import { appRouter } from '~/server/api/root';
|
|
304
|
+
import { createContext } from '~/server/api/trpc';
|
|
305
|
+
import { type NextRequest } from 'next/server';
|
|
306
|
+
import { createOpenApiFetchHandler } from 'trpc-to-openapi';
|
|
307
|
+
|
|
308
|
+
export const dynamic = 'force-dynamic';
|
|
309
|
+
|
|
310
|
+
const handler = (req: NextRequest) => {
|
|
311
|
+
// Handle incoming OpenAPI requests
|
|
312
|
+
return createOpenApiFetchHandler({
|
|
313
|
+
endpoint: '/',
|
|
314
|
+
router: appRouter,
|
|
315
|
+
createContext: () => createContext(req),
|
|
316
|
+
req,
|
|
317
|
+
});
|
|
318
|
+
};
|
|
285
319
|
|
|
286
|
-
export
|
|
320
|
+
export {
|
|
321
|
+
handler as GET,
|
|
322
|
+
handler as POST,
|
|
323
|
+
handler as PUT,
|
|
324
|
+
handler as PATCH,
|
|
325
|
+
handler as DELETE,
|
|
326
|
+
handler as OPTIONS,
|
|
327
|
+
handler as HEAD,
|
|
328
|
+
};
|
|
287
329
|
```
|
|
288
330
|
|
|
289
|
-
#### With
|
|
331
|
+
#### With Next.js pages router
|
|
290
332
|
|
|
291
|
-
Please see [full example here](examples/with-
|
|
333
|
+
Please see [full example here](examples/with-nextjs).
|
|
292
334
|
|
|
293
335
|
```typescript
|
|
294
|
-
|
|
336
|
+
// pages/api/[...trpc].ts
|
|
337
|
+
import { createOpenApiNextHandler } from 'trpc-to-openapi';
|
|
295
338
|
|
|
296
|
-
import { appRouter } from '
|
|
339
|
+
import { appRouter } from '../../server/appRouter';
|
|
297
340
|
|
|
298
|
-
export
|
|
341
|
+
export default createOpenApiNextHandler({ router: appRouter });
|
|
299
342
|
```
|
|
300
343
|
|
|
301
344
|
#### With Fastify
|
|
@@ -305,7 +348,7 @@ Please see [full example here](examples/with-fastify).
|
|
|
305
348
|
```typescript
|
|
306
349
|
import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
|
|
307
350
|
import Fastify from 'fastify';
|
|
308
|
-
import { fastifyTRPCOpenApiPlugin } from 'trpc-openapi';
|
|
351
|
+
import { fastifyTRPCOpenApiPlugin } from 'trpc-to-openapi';
|
|
309
352
|
|
|
310
353
|
import { appRouter } from './router';
|
|
311
354
|
|
|
@@ -327,34 +370,36 @@ main();
|
|
|
327
370
|
|
|
328
371
|
Please see [full typings here](src/generator/index.ts).
|
|
329
372
|
|
|
330
|
-
| Property | Type
|
|
331
|
-
| ----------------- |
|
|
332
|
-
| `title` | `string`
|
|
333
|
-
| `description` | `string`
|
|
334
|
-
| `version` | `string`
|
|
335
|
-
| `baseUrl` | `string`
|
|
336
|
-
| `docsUrl` | `string`
|
|
337
|
-
| `tags` | `string[]`
|
|
338
|
-
| `securitySchemes` | `Record<string, SecuritySchemeObject>`
|
|
373
|
+
| Property | Type | Description | Required |
|
|
374
|
+
| ----------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | -------- |
|
|
375
|
+
| `title` | `string` | The title of the API. | `true` |
|
|
376
|
+
| `description` | `string` | A short description of the API. | `false` |
|
|
377
|
+
| `version` | `string` | The version of the OpenAPI document. | `true` |
|
|
378
|
+
| `baseUrl` | `string` | The base URL of the target server. | `true` |
|
|
379
|
+
| `docsUrl` | `string` | A URL to any external documentation. | `false` |
|
|
380
|
+
| `tags` | `string[]` | A list for ordering endpoint groups. | `false` |
|
|
381
|
+
| `securitySchemes` | `Record<string, SecuritySchemeObject>` | Defaults to `Authorization` header with `Bearer` scheme | `false` |
|
|
382
|
+
| `filter` | `(ctx: { metadata: { openapi: NonNullable<OpenApiMeta['openapi']> } & TMeta }) => boolean` | Optional filter function to include/exclude procedures from the generated OpenAPI document. | `false` |
|
|
339
383
|
|
|
340
384
|
#### OpenApiMeta
|
|
341
385
|
|
|
342
386
|
Please see [full typings here](src/types.ts).
|
|
343
387
|
|
|
344
|
-
| Property
|
|
345
|
-
|
|
|
346
|
-
| `enabled`
|
|
347
|
-
| `
|
|
348
|
-
| `
|
|
349
|
-
| `
|
|
350
|
-
| `
|
|
351
|
-
| `
|
|
352
|
-
| `
|
|
353
|
-
| `
|
|
354
|
-
| `
|
|
355
|
-
| `
|
|
356
|
-
| `
|
|
357
|
-
| `
|
|
388
|
+
| Property | Type | Description | Required | Default |
|
|
389
|
+
| -------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------- |
|
|
390
|
+
| `enabled` | `boolean` | Exposes this procedure to `trpc-to-openapi` adapters and on the OpenAPI document. | `false` | `true` |
|
|
391
|
+
| `method` | `HttpMethod` | HTTP method this endpoint is exposed on. Value can be `GET`, `POST`, `PATCH`, `PUT` or `DELETE`. | `true` | `undefined` |
|
|
392
|
+
| `path` | `string` | Pathname this endpoint is exposed on. Value must start with `/`, specify path parameters using `{}`. | `true` | `undefined` |
|
|
393
|
+
| `protect` | `boolean` | Requires this endpoint to use a security scheme. | `false` | `true` |
|
|
394
|
+
| `summary` | `string` | A short summary of the endpoint included in the OpenAPI document. | `false` | `undefined` |
|
|
395
|
+
| `description` | `string` | A verbose description of the endpoint included in the OpenAPI document. | `false` | `undefined` |
|
|
396
|
+
| `tags` | `string[]` | A list of tags used for logical grouping of endpoints in the OpenAPI document. | `false` | `undefined` |
|
|
397
|
+
| `requestHeaders` | `AnyZodObject` | A zod object schema describing any custom headers to add to the request for this endpoint in the OpenAPI document. | `false` | `undefined` |
|
|
398
|
+
| `responseHeaders` | `AnyZodObject` | A zod object schema describing any custom headers to add to the response for this endpoint in the OpenAPI document. | `false` | `undefined` |
|
|
399
|
+
| `successDescription` | `string` | A string to use as the description for a successful response. | `false` | `'Successful response'` |
|
|
400
|
+
| `errorResponses` | `number[] \| { [key: number]: string }` | A list of error response codes or an object of response codes and their description to add to the responses for this endpoint. | `false` | `undefined` |
|
|
401
|
+
| `contentTypes` | `OpenApiContentType[]` | A set of content types specified as accepted in the OpenAPI document. | `false` | `['application/json']` |
|
|
402
|
+
| `deprecated` | `boolean` | Whether or not to mark an endpoint as deprecated | `false` | `false` |
|
|
358
403
|
|
|
359
404
|
#### CreateOpenApiNodeHttpHandlerOptions
|
|
360
405
|
|
|
@@ -370,13 +415,49 @@ Please see [full typings here](src/adapters/node-http/core.ts).
|
|
|
370
415
|
|
|
371
416
|
---
|
|
372
417
|
|
|
373
|
-
_Still using tRPC v9? See our [`.interop()`](examples/with-interop) example._
|
|
374
|
-
|
|
375
418
|
## License
|
|
376
419
|
|
|
377
420
|
Distributed under the MIT License. See LICENSE for more information.
|
|
378
421
|
|
|
379
|
-
|
|
422
|
+
**Filtering Procedures in OpenAPI Output**
|
|
423
|
+
|
|
424
|
+
You can use the `filter` option to selectively include or exclude procedures from the generated OpenAPI document. The filter function receives a context object with the procedure's metadata. Return `true` to include the procedure, or `false` to exclude it.
|
|
425
|
+
|
|
426
|
+
**Example:**
|
|
427
|
+
|
|
428
|
+
```typescript
|
|
429
|
+
const appRouter = t.router({
|
|
430
|
+
publicProc: t.procedure
|
|
431
|
+
.meta({ openapi: { method: 'GET', path: '/public' }, isPublic: true })
|
|
432
|
+
.input(z.object({}))
|
|
433
|
+
.output(z.object({ result: z.string() }))
|
|
434
|
+
.query(() => ({ result: 'public' })),
|
|
435
|
+
privateProc: t.procedure
|
|
436
|
+
.meta({ openapi: { method: 'GET', path: '/private' }, isPublic: false })
|
|
437
|
+
.input(z.object({}))
|
|
438
|
+
.output(z.object({ result: z.string() }))
|
|
439
|
+
.query(() => ({ result: 'private' })),
|
|
440
|
+
});
|
|
380
441
|
|
|
381
|
-
|
|
382
|
-
|
|
442
|
+
// Only include procedures where isPublic is true
|
|
443
|
+
const openApiDocument = generateOpenApiDocument(appRouter, {
|
|
444
|
+
...defaultDocOpts,
|
|
445
|
+
filter: ({ metadata }) => metadata.isPublic === true,
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// openApiDocument.paths will only include '/public'
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
You can also pass a metadata generic to `generateOpenApiDocument` to get proper types for your custom metadata in the filter function:
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
// Define your custom metadata type
|
|
455
|
+
interface MyMeta {
|
|
456
|
+
isPublic: boolean;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const openApiDocument = generateOpenApiDocument<MyMeta>(appRouter, {
|
|
460
|
+
...defaultDocOpts,
|
|
461
|
+
filter: ({ metadata }) => metadata.isPublic === true,
|
|
462
|
+
});
|
|
463
|
+
```
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { OpenApiRouter } from '../types';
|
|
3
|
+
import { CreateOpenApiNodeHttpHandlerOptions } from './node-http';
|
|
4
|
+
export type CreateOpenApiExpressMiddlewareOptions<TRouter extends OpenApiRouter> = CreateOpenApiNodeHttpHandlerOptions<TRouter, Request, Response>;
|
|
5
|
+
export declare const createOpenApiExpressMiddleware: <TRouter extends OpenApiRouter>(opts: CreateOpenApiExpressMiddlewareOptions<TRouter>) => (req: Request, res: Response) => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../../src/adapters/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mCAAmC,EAAgC,MAAM,aAAa,CAAC;AAEhG,MAAM,MAAM,qCAAqC,CAAC,OAAO,SAAS,aAAa,IAC7E,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAElE,eAAO,MAAM,8BAA8B,GAAI,OAAO,SAAS,aAAa,EAC1E,MAAM,qCAAqC,CAAC,OAAO,CAAC,MAItC,KAAK,OAAO,EAAE,KAAK,QAAQ,kBAG1C,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createOpenApiExpressMiddleware = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_http_1 = require("./node-http");
|
|
5
5
|
const createOpenApiExpressMiddleware = (opts) => {
|
|
6
|
-
const openApiHttpHandler = (0,
|
|
6
|
+
const openApiHttpHandler = (0, node_http_1.createOpenApiNodeHttpHandler)(opts);
|
|
7
7
|
return async (req, res) => {
|
|
8
8
|
await openApiHttpHandler(req, res);
|
|
9
9
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/adapters/express.ts"],"names":[],"mappings":";;;AAGA,2CAAgG;AAKzF,MAAM,8BAA8B,GAAG,CAC5C,IAAoD,EACpD,EAAE;IACF,MAAM,kBAAkB,GAAG,IAAA,wCAA4B,EAAC,IAAI,CAAC,CAAC;IAE9D,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3C,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,8BAA8B,kCAQzC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AnyRouter } from '@trpc/server';
|
|
2
|
+
import { FastifyInstance } from 'fastify';
|
|
3
|
+
import { OpenApiRouter } from '../types';
|
|
4
|
+
import { CreateOpenApiNodeHttpHandlerOptions } from './node-http';
|
|
5
|
+
export type CreateOpenApiFastifyPluginOptions<TRouter extends OpenApiRouter> = CreateOpenApiNodeHttpHandlerOptions<TRouter, any, any> & {
|
|
6
|
+
basePath?: `/${string}`;
|
|
7
|
+
};
|
|
8
|
+
export declare function fastifyTRPCOpenApiPlugin<TRouter extends AnyRouter>(fastify: FastifyInstance, opts: CreateOpenApiFastifyPluginOptions<TRouter>, done: (err?: Error) => void): void;
|
|
9
|
+
//# sourceMappingURL=fastify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../../src/adapters/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAIxE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mCAAmC,EAAgC,MAAM,aAAa,CAAC;AAyBhG,MAAM,MAAM,iCAAiC,CAAC,OAAO,SAAS,aAAa,IACzE,mCAAmC,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG;IACvD,QAAQ,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;CACzB,CAAC;AAEJ,wBAAgB,wBAAwB,CAAC,OAAO,SAAS,SAAS,EAChE,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,iCAAiC,CAAC,OAAO,CAAC,EAChD,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,QAwE5B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fastifyTRPCOpenApiPlugin = fastifyTRPCOpenApiPlugin;
|
|
4
|
+
const node_http_1 = require("./node-http");
|
|
5
|
+
function fastifyTRPCOpenApiPlugin(fastify, opts, done) {
|
|
6
|
+
var _a;
|
|
7
|
+
let prefix = (_a = opts.basePath) !== null && _a !== void 0 ? _a : '';
|
|
8
|
+
// if prefix ends with a slash, remove it
|
|
9
|
+
if (prefix.endsWith('/')) {
|
|
10
|
+
prefix = prefix.slice(0, -1);
|
|
11
|
+
}
|
|
12
|
+
const openApiHttpHandler = (0, node_http_1.createOpenApiNodeHttpHandler)(opts);
|
|
13
|
+
fastify.route({
|
|
14
|
+
method: ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'],
|
|
15
|
+
url: `${prefix}/*`,
|
|
16
|
+
handler: async (request, reply) => {
|
|
17
|
+
const prefixRemovedFromUrl = request.url.replace(fastify.prefix, '').replace(prefix, '');
|
|
18
|
+
request.raw.url = prefixRemovedFromUrl;
|
|
19
|
+
// Add Node.js request methods to Fastify request
|
|
20
|
+
const requestWithNodeMethods = request;
|
|
21
|
+
// Add event emitter methods
|
|
22
|
+
requestWithNodeMethods.once = request.raw.once.bind(request.raw);
|
|
23
|
+
requestWithNodeMethods.on = request.raw.on.bind(request.raw);
|
|
24
|
+
requestWithNodeMethods.off = request.raw.off.bind(request.raw);
|
|
25
|
+
requestWithNodeMethods.destroy = request.raw.destroy.bind(request.raw);
|
|
26
|
+
// Add Node.js response methods to Fastify reply
|
|
27
|
+
const replyWithNodeMethods = reply;
|
|
28
|
+
// Add statusCode property
|
|
29
|
+
void Object.defineProperty(replyWithNodeMethods, 'statusCode', {
|
|
30
|
+
set(value) {
|
|
31
|
+
void reply.code(value);
|
|
32
|
+
},
|
|
33
|
+
get() {
|
|
34
|
+
return reply.raw.statusCode;
|
|
35
|
+
},
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
});
|
|
39
|
+
// Add setHeader method
|
|
40
|
+
replyWithNodeMethods.setHeader = (key, value) => {
|
|
41
|
+
void reply.header(key, value);
|
|
42
|
+
};
|
|
43
|
+
// Add end method
|
|
44
|
+
replyWithNodeMethods.end = (data) => {
|
|
45
|
+
if (!reply.sent) {
|
|
46
|
+
void reply.send(data);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
// Add properties and methods needed by incomingMessageToRequest
|
|
50
|
+
replyWithNodeMethods.socket = reply.raw.socket;
|
|
51
|
+
replyWithNodeMethods.connection = reply.raw.connection;
|
|
52
|
+
replyWithNodeMethods.finished = reply.raw.finished;
|
|
53
|
+
replyWithNodeMethods.headersSent = reply.raw.headersSent;
|
|
54
|
+
// Add event emitter methods
|
|
55
|
+
replyWithNodeMethods.once = reply.raw.once.bind(reply.raw);
|
|
56
|
+
replyWithNodeMethods.on = reply.raw.on.bind(reply.raw);
|
|
57
|
+
replyWithNodeMethods.off = reply.raw.off.bind(reply.raw);
|
|
58
|
+
replyWithNodeMethods.emit = reply.raw.emit.bind(reply.raw);
|
|
59
|
+
replyWithNodeMethods.removeListener = reply.raw.removeListener.bind(reply.raw);
|
|
60
|
+
return await openApiHttpHandler(requestWithNodeMethods, replyWithNodeMethods);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
done();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../../src/adapters/fastify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FetchHandlerOptions } from '@trpc/server/adapters/fetch';
|
|
2
|
+
import { OpenApiRouter } from '../types';
|
|
3
|
+
export type CreateOpenApiFetchHandlerOptions<TRouter extends OpenApiRouter> = Omit<FetchHandlerOptions<TRouter>, 'batching'> & {
|
|
4
|
+
req: Request;
|
|
5
|
+
endpoint: `/${string}`;
|
|
6
|
+
};
|
|
7
|
+
export declare const createOpenApiFetchHandler: <TRouter extends OpenApiRouter>(opts: CreateOpenApiFetchHandlerOptions<TRouter>) => Promise<Response>;
|
|
8
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/adapters/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,MAAM,gCAAgC,CAAC,OAAO,SAAS,aAAa,IAAI,IAAI,CAChF,mBAAmB,CAAC,OAAO,CAAC,EAC5B,UAAU,CACX,GAAG;IACF,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC;CACxB,CAAC;AAsEF,eAAO,MAAM,yBAAyB,GAAU,OAAO,SAAS,aAAa,EAC3E,MAAM,gCAAgC,CAAC,OAAO,CAAC,KAC9C,OAAO,CAAC,QAAQ,CAuClB,CAAC"}
|