@dokploy/trpc-openapi 0.0.6 → 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.
Files changed (241) hide show
  1. package/LICENSE +4 -16
  2. package/README.md +166 -85
  3. package/dist/cjs/adapters/express.d.ts +6 -0
  4. package/dist/cjs/adapters/express.d.ts.map +1 -0
  5. package/dist/{adapters → cjs/adapters}/express.js +2 -2
  6. package/dist/cjs/adapters/express.js.map +1 -0
  7. package/dist/cjs/adapters/fastify.d.ts +9 -0
  8. package/dist/cjs/adapters/fastify.d.ts.map +1 -0
  9. package/dist/cjs/adapters/fastify.js +65 -0
  10. package/dist/cjs/adapters/fastify.js.map +1 -0
  11. package/dist/cjs/adapters/fetch.d.ts +8 -0
  12. package/dist/cjs/adapters/fetch.d.ts.map +1 -0
  13. package/dist/cjs/adapters/fetch.js +100 -0
  14. package/dist/cjs/adapters/fetch.js.map +1 -0
  15. package/dist/cjs/adapters/index.d.ts +9 -0
  16. package/dist/cjs/adapters/index.d.ts.map +1 -0
  17. package/dist/cjs/adapters/index.js +25 -0
  18. package/dist/cjs/adapters/index.js.map +1 -0
  19. package/dist/cjs/adapters/koa.d.ts +9 -0
  20. package/dist/cjs/adapters/koa.d.ts.map +1 -0
  21. package/dist/cjs/adapters/koa.js +12 -0
  22. package/dist/cjs/adapters/koa.js.map +1 -0
  23. package/dist/cjs/adapters/next.d.ts +6 -0
  24. package/dist/cjs/adapters/next.d.ts.map +1 -0
  25. package/dist/{adapters → cjs/adapters}/next.js +15 -10
  26. package/dist/cjs/adapters/next.js.map +1 -0
  27. package/dist/{adapters → cjs/adapters}/node-http/core.d.ts +4 -3
  28. package/dist/cjs/adapters/node-http/core.d.ts.map +1 -0
  29. package/dist/{adapters → cjs/adapters}/node-http/core.js +72 -49
  30. package/dist/cjs/adapters/node-http/core.js.map +1 -0
  31. package/dist/cjs/adapters/node-http/errors.d.ts +6 -0
  32. package/dist/cjs/adapters/node-http/errors.d.ts.map +1 -0
  33. package/dist/cjs/adapters/node-http/errors.js +94 -0
  34. package/dist/cjs/adapters/node-http/errors.js.map +1 -0
  35. package/dist/cjs/adapters/node-http/index.d.ts +5 -0
  36. package/dist/cjs/adapters/node-http/index.d.ts.map +1 -0
  37. package/dist/cjs/adapters/node-http/index.js +21 -0
  38. package/dist/cjs/adapters/node-http/index.js.map +1 -0
  39. package/dist/{adapters → cjs/adapters}/node-http/input.d.ts +2 -2
  40. package/dist/cjs/adapters/node-http/input.d.ts.map +1 -0
  41. package/dist/{adapters → cjs/adapters}/node-http/input.js +7 -10
  42. package/dist/cjs/adapters/node-http/input.js.map +1 -0
  43. package/dist/{adapters → cjs/adapters}/node-http/procedures.d.ts +2 -2
  44. package/dist/cjs/adapters/node-http/procedures.d.ts.map +1 -0
  45. package/dist/{adapters → cjs/adapters}/node-http/procedures.js +10 -21
  46. package/dist/cjs/adapters/node-http/procedures.js.map +1 -0
  47. package/dist/cjs/adapters/nuxt.d.ts +6 -0
  48. package/dist/cjs/adapters/nuxt.d.ts.map +1 -0
  49. package/dist/cjs/adapters/nuxt.js +50 -0
  50. package/dist/cjs/adapters/nuxt.js.map +1 -0
  51. package/dist/{adapters → cjs/adapters}/standalone.d.ts +3 -3
  52. package/dist/cjs/adapters/standalone.d.ts.map +1 -0
  53. package/dist/{adapters → cjs/adapters}/standalone.js +5 -1
  54. package/dist/cjs/adapters/standalone.js.map +1 -0
  55. package/dist/cjs/generator/index.d.ts +40 -0
  56. package/dist/cjs/generator/index.d.ts.map +1 -0
  57. package/dist/cjs/generator/index.js +33 -0
  58. package/dist/cjs/generator/index.js.map +1 -0
  59. package/dist/cjs/generator/paths.d.ts +16 -0
  60. package/dist/cjs/generator/paths.d.ts.map +1 -0
  61. package/dist/cjs/generator/paths.js +122 -0
  62. package/dist/cjs/generator/paths.js.map +1 -0
  63. package/dist/cjs/generator/schema.d.ts +15 -0
  64. package/dist/cjs/generator/schema.d.ts.map +1 -0
  65. package/dist/cjs/generator/schema.js +195 -0
  66. package/dist/cjs/generator/schema.js.map +1 -0
  67. package/dist/cjs/index.d.ts +6 -0
  68. package/dist/cjs/index.d.ts.map +1 -0
  69. package/dist/cjs/index.js +24 -0
  70. package/dist/cjs/index.js.map +1 -0
  71. package/dist/cjs/types.d.ts +55 -0
  72. package/dist/cjs/types.d.ts.map +1 -0
  73. package/dist/cjs/types.js.map +1 -0
  74. package/dist/cjs/utils/index.d.ts +5 -0
  75. package/dist/cjs/utils/index.d.ts.map +1 -0
  76. package/dist/{adapters → cjs/utils}/index.js +4 -3
  77. package/dist/cjs/utils/index.js.map +1 -0
  78. package/dist/cjs/utils/method.d.ts +6 -0
  79. package/dist/cjs/utils/method.d.ts.map +1 -0
  80. package/dist/cjs/utils/method.js +29 -0
  81. package/dist/cjs/utils/method.js.map +1 -0
  82. package/dist/cjs/utils/path.d.ts.map +1 -0
  83. package/dist/{utils → cjs/utils}/path.js +1 -1
  84. package/dist/cjs/utils/path.js.map +1 -0
  85. package/dist/cjs/utils/procedure.d.ts +22 -0
  86. package/dist/cjs/utils/procedure.d.ts.map +1 -0
  87. package/dist/cjs/utils/procedure.js +92 -0
  88. package/dist/cjs/utils/procedure.js.map +1 -0
  89. package/dist/cjs/utils/zod.d.ts +16 -0
  90. package/dist/cjs/utils/zod.d.ts.map +1 -0
  91. package/dist/cjs/utils/zod.js +96 -0
  92. package/dist/cjs/utils/zod.js.map +1 -0
  93. package/dist/esm/adapters/express.d.ts +6 -0
  94. package/dist/esm/adapters/express.d.ts.map +1 -0
  95. package/dist/esm/adapters/express.js.map +1 -0
  96. package/dist/esm/adapters/express.mjs +8 -0
  97. package/dist/esm/adapters/fastify.d.ts +9 -0
  98. package/dist/esm/adapters/fastify.d.ts.map +1 -0
  99. package/dist/esm/adapters/fastify.js.map +1 -0
  100. package/dist/esm/adapters/fastify.mjs +61 -0
  101. package/dist/esm/adapters/fetch.d.ts +8 -0
  102. package/dist/esm/adapters/fetch.d.ts.map +1 -0
  103. package/dist/esm/adapters/fetch.js.map +1 -0
  104. package/dist/esm/adapters/fetch.mjs +95 -0
  105. package/dist/esm/adapters/index.d.ts +9 -0
  106. package/dist/esm/adapters/index.d.ts.map +1 -0
  107. package/dist/esm/adapters/index.js.map +1 -0
  108. package/dist/esm/adapters/index.mjs +9 -0
  109. package/dist/esm/adapters/koa.d.ts +9 -0
  110. package/dist/esm/adapters/koa.d.ts.map +1 -0
  111. package/dist/esm/adapters/koa.js.map +1 -0
  112. package/dist/esm/adapters/koa.mjs +8 -0
  113. package/dist/esm/adapters/next.d.ts +6 -0
  114. package/dist/esm/adapters/next.d.ts.map +1 -0
  115. package/dist/esm/adapters/next.js.map +1 -0
  116. package/dist/esm/adapters/next.mjs +45 -0
  117. package/dist/esm/adapters/node-http/core.d.ts +7 -0
  118. package/dist/esm/adapters/node-http/core.d.ts.map +1 -0
  119. package/dist/esm/adapters/node-http/core.js.map +1 -0
  120. package/dist/esm/adapters/node-http/core.mjs +166 -0
  121. package/dist/esm/adapters/node-http/errors.d.ts +6 -0
  122. package/dist/esm/adapters/node-http/errors.d.ts.map +1 -0
  123. package/dist/esm/adapters/node-http/errors.js.map +1 -0
  124. package/dist/esm/adapters/node-http/errors.mjs +90 -0
  125. package/dist/esm/adapters/node-http/index.d.ts +5 -0
  126. package/dist/esm/adapters/node-http/index.d.ts.map +1 -0
  127. package/dist/esm/adapters/node-http/index.js.map +1 -0
  128. package/dist/esm/adapters/node-http/index.mjs +5 -0
  129. package/dist/esm/adapters/node-http/input.d.ts +4 -0
  130. package/dist/esm/adapters/node-http/input.d.ts.map +1 -0
  131. package/dist/esm/adapters/node-http/input.js.map +1 -0
  132. package/dist/esm/adapters/node-http/input.mjs +65 -0
  133. package/dist/esm/adapters/node-http/procedures.d.ts +12 -0
  134. package/dist/esm/adapters/node-http/procedures.d.ts.map +1 -0
  135. package/dist/esm/adapters/node-http/procedures.js.map +1 -0
  136. package/dist/esm/adapters/node-http/procedures.mjs +34 -0
  137. package/dist/esm/adapters/nuxt.d.ts +6 -0
  138. package/dist/esm/adapters/nuxt.d.ts.map +1 -0
  139. package/dist/esm/adapters/nuxt.js.map +1 -0
  140. package/dist/esm/adapters/nuxt.mjs +45 -0
  141. package/dist/esm/adapters/standalone.d.ts +6 -0
  142. package/dist/esm/adapters/standalone.d.ts.map +1 -0
  143. package/dist/esm/adapters/standalone.js.map +1 -0
  144. package/dist/esm/adapters/standalone.mjs +11 -0
  145. package/dist/esm/generator/index.d.ts +40 -0
  146. package/dist/esm/generator/index.d.ts.map +1 -0
  147. package/dist/esm/generator/index.js.map +1 -0
  148. package/dist/esm/generator/index.mjs +31 -0
  149. package/dist/esm/generator/paths.d.ts +16 -0
  150. package/dist/esm/generator/paths.d.ts.map +1 -0
  151. package/dist/esm/generator/paths.js.map +1 -0
  152. package/dist/esm/generator/paths.mjs +129 -0
  153. package/dist/esm/generator/schema.d.ts +15 -0
  154. package/dist/esm/generator/schema.d.ts.map +1 -0
  155. package/dist/esm/generator/schema.js.map +1 -0
  156. package/dist/esm/generator/schema.mjs +203 -0
  157. package/dist/esm/index.d.ts +6 -0
  158. package/dist/esm/index.d.ts.map +1 -0
  159. package/dist/esm/index.js.map +1 -0
  160. package/dist/esm/index.mjs +6 -0
  161. package/dist/esm/types.d.ts +55 -0
  162. package/dist/esm/types.d.ts.map +1 -0
  163. package/dist/esm/types.js.map +1 -0
  164. package/dist/esm/types.mjs +2 -0
  165. package/dist/esm/utils/index.d.ts +5 -0
  166. package/dist/esm/utils/index.d.ts.map +1 -0
  167. package/dist/esm/utils/index.js.map +1 -0
  168. package/dist/esm/utils/index.mjs +5 -0
  169. package/dist/esm/utils/method.d.ts +6 -0
  170. package/dist/esm/utils/method.d.ts.map +1 -0
  171. package/dist/esm/utils/method.js.map +1 -0
  172. package/dist/esm/utils/method.mjs +22 -0
  173. package/dist/esm/utils/path.d.ts +4 -0
  174. package/dist/esm/utils/path.d.ts.map +1 -0
  175. package/dist/esm/utils/path.js.map +1 -0
  176. package/dist/esm/utils/path.mjs +11 -0
  177. package/dist/esm/utils/procedure.d.ts +22 -0
  178. package/dist/esm/utils/procedure.d.ts.map +1 -0
  179. package/dist/esm/utils/procedure.js.map +1 -0
  180. package/dist/esm/utils/procedure.mjs +85 -0
  181. package/dist/esm/utils/zod.d.ts +16 -0
  182. package/dist/esm/utils/zod.d.ts.map +1 -0
  183. package/dist/esm/utils/zod.js.map +1 -0
  184. package/dist/esm/utils/zod.mjs +82 -0
  185. package/package.json +49 -41
  186. package/dist/adapters/express.d.ts +0 -8
  187. package/dist/adapters/express.d.ts.map +0 -1
  188. package/dist/adapters/express.js.map +0 -1
  189. package/dist/adapters/index.d.ts +0 -4
  190. package/dist/adapters/index.d.ts.map +0 -1
  191. package/dist/adapters/index.js.map +0 -1
  192. package/dist/adapters/next.d.ts +0 -6
  193. package/dist/adapters/next.d.ts.map +0 -1
  194. package/dist/adapters/next.js.map +0 -1
  195. package/dist/adapters/node-http/core.d.ts.map +0 -1
  196. package/dist/adapters/node-http/core.js.map +0 -1
  197. package/dist/adapters/node-http/errors.d.ts +0 -4
  198. package/dist/adapters/node-http/errors.d.ts.map +0 -1
  199. package/dist/adapters/node-http/errors.js +0 -43
  200. package/dist/adapters/node-http/errors.js.map +0 -1
  201. package/dist/adapters/node-http/input.d.ts.map +0 -1
  202. package/dist/adapters/node-http/input.js.map +0 -1
  203. package/dist/adapters/node-http/procedures.d.ts.map +0 -1
  204. package/dist/adapters/node-http/procedures.js.map +0 -1
  205. package/dist/adapters/standalone.d.ts.map +0 -1
  206. package/dist/adapters/standalone.js.map +0 -1
  207. package/dist/generator/index.d.ts +0 -14
  208. package/dist/generator/index.d.ts.map +0 -1
  209. package/dist/generator/index.js +0 -39
  210. package/dist/generator/index.js.map +0 -1
  211. package/dist/generator/paths.d.ts +0 -4
  212. package/dist/generator/paths.d.ts.map +0 -1
  213. package/dist/generator/paths.js +0 -76
  214. package/dist/generator/paths.js.map +0 -1
  215. package/dist/generator/schema.d.ts +0 -7
  216. package/dist/generator/schema.d.ts.map +0 -1
  217. package/dist/generator/schema.js +0 -185
  218. package/dist/generator/schema.js.map +0 -1
  219. package/dist/index.d.ts +0 -6
  220. package/dist/index.d.ts.map +0 -1
  221. package/dist/index.js +0 -11
  222. package/dist/index.js.map +0 -1
  223. package/dist/types.d.ts +0 -55
  224. package/dist/types.d.ts.map +0 -1
  225. package/dist/types.js.map +0 -1
  226. package/dist/utils/method.d.ts +0 -3
  227. package/dist/utils/method.d.ts.map +0 -1
  228. package/dist/utils/method.js +0 -11
  229. package/dist/utils/method.js.map +0 -1
  230. package/dist/utils/path.d.ts.map +0 -1
  231. package/dist/utils/path.js.map +0 -1
  232. package/dist/utils/procedure.d.ts +0 -14
  233. package/dist/utils/procedure.d.ts.map +0 -1
  234. package/dist/utils/procedure.js +0 -62
  235. package/dist/utils/procedure.js.map +0 -1
  236. package/dist/utils/zod.d.ts +0 -19
  237. package/dist/utils/zod.d.ts.map +0 -1
  238. package/dist/utils/zod.js +0 -104
  239. package/dist/utils/zod.js.map +0 -1
  240. /package/dist/{types.js → cjs/types.js} +0 -0
  241. /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 (c) 2021 James Berry <jb@jamesbe.com>
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 "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
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
- ![trpc-openapi](assets/trpc-openapi-readme.png)
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
- # Note
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
- We use this package to generate OpenAPI documents for our tRPC endpoints in https://github.com/Dokploy/dokploy
21
+ ### Branch `dokploy-openapi-features` (Dokploy-style defaults)
20
22
 
21
- We make some changes to make input, output and meta parameters be optional by default.
23
+ This branch adds behavior used by [Dokploy](https://github.com/Dokploy/dokploy) for generating OpenAPI documents:
22
24
 
23
- 1. We make optional input and output parameters required by default.
24
- 2. We make .meta optional for all procedures.
25
- 3. Introduce 2 flags to .meta() to override and additional parameters.
26
- 4. `override` parameter overrides the default value and will take the whole object of openapi.
27
- 5. `additional` parameters will be default values + the values provided in the openapi object.
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
- - Easy REST endpoints for your tRPC procedures.
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 @dokploy/trpc-openapi
42
+ npm install trpc-to-openapi
41
43
  # yarn
42
- yarn add @dokploy/trpc-openapi
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 '@dokploy/trpc-openapi';
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/), [`Serverless`](https://www.serverless.com/), [`Fastify`](https://www.fastify.io/), [`Nuxt`](https://nuxtjs.org/) & [`Node:HTTP`](https://nodejs.org/api/http.html).
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=James', { method: 'GET' });
107
- const body = await res.json(); /* { greeting: 'Hello James!' } */
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 v10 (`@trpc/server`) must be installed.
115
- - [`Zod`](https://github.com/colinhacks/zod) v3 (`zod@^3.14.4`) must be installed (recommended `^3.20.0`).
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` or `application/x-www-form-urlencoded` content type.
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/James?greeting=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 James!' } */
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/James' /* 👈 */, {
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 James!' } */
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.headers` array, these headers will not be validated on request. Please consider using [Authorization](#authorization) for first-class OpenAPI auth/security support.
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 '@dokploy/trpc-openapi';
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: 'James',
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 James!' } */
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
- // pages/api/[...trpc].ts
282
- import { createOpenApiNextHandler } from 'trpc-openapi';
283
-
284
- import { appRouter } from '../../server/appRouter';
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 default createOpenApiNextHandler({ router: appRouter });
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 AWS Lambda
331
+ #### With Next.js pages router
290
332
 
291
- Please see [full example here](examples/with-serverless).
333
+ Please see [full example here](examples/with-nextjs).
292
334
 
293
335
  ```typescript
294
- import { createOpenApiAwsLambdaHandler } from 'trpc-openapi';
336
+ // pages/api/[...trpc].ts
337
+ import { createOpenApiNextHandler } from 'trpc-to-openapi';
295
338
 
296
- import { appRouter } from './appRouter';
339
+ import { appRouter } from '../../server/appRouter';
297
340
 
298
- export const openApi = createOpenApiAwsLambdaHandler({ router: appRouter });
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 | Description | Required |
331
- | ----------------- | -------------------------------------- | ------------------------------------------------------- | -------- |
332
- | `title` | `string` | The title of the API. | `true` |
333
- | `description` | `string` | A short description of the API. | `false` |
334
- | `version` | `string` | The version of the OpenAPI document. | `true` |
335
- | `baseUrl` | `string` | The base URL of the target server. | `true` |
336
- | `docsUrl` | `string` | A URL to any external documentation. | `false` |
337
- | `tags` | `string[]` | A list for ordering endpoint groups. | `false` |
338
- | `securitySchemes` | `Record<string, SecuritySchemeObject>` | Defaults to `Authorization` header with `Bearer` scheme | `false` |
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 | Type | Description | Required | Default |
345
- | -------------- | ------------------- | ---------------------------------------------------------------------------------------------------- | -------- | ---------------------- |
346
- | `enabled` | `boolean` | Exposes this procedure to `trpc-openapi` adapters and on the OpenAPI document. | `false` | `true` |
347
- | `override` | `boolean` | Overrides the default value of the parameter. | `false` | `false` |
348
- | `additional` | `boolean` | Adds the parameter to the default value of the parameter.
349
- | `method` | `HttpMethod` | HTTP method this endpoint is exposed on. Value can be `GET`, `POST`, `PATCH`, `PUT` or `DELETE`. | `true` | `undefined` |
350
- | `path` | `string` | Pathname this endpoint is exposed on. Value must start with `/`, specify path parameters using `{}`. | `true` | `undefined` |
351
- | `protect` | `boolean` | Requires this endpoint to use a security scheme. | `false` | `false` |
352
- | `summary` | `string` | A short summary of the endpoint included in the OpenAPI document. | `false` | `undefined` |
353
- | `description` | `string` | A verbose description of the endpoint included in the OpenAPI document. | `false` | `undefined` |
354
- | `tags` | `string[]` | A list of tags used for logical grouping of endpoints in the OpenAPI document. | `false` | `undefined` |
355
- | `headers` | `ParameterObject[]` | An array of custom headers to add for this endpoint in the OpenAPI document. | `false` | `undefined` |
356
- | `contentTypes` | `ContentType[]` | A set of content types specified as accepted in the OpenAPI document. | `false` | `['application/json']` |
357
- | `deprecated` | `boolean` | Whether or not to mark an endpoint as deprecated | `false` | `false` |
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
- ## Contact
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
- James Berry - Follow me on Twitter [@jlalmes](https://twitter.com/jlalmes) 💚
382
- # trpc-openapi
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 core_1 = require("./node-http/core");
4
+ const node_http_1 = require("./node-http");
5
5
  const createOpenApiExpressMiddleware = (opts) => {
6
- const openApiHttpHandler = (0, core_1.createOpenApiNodeHttpHandler)(opts);
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"}