@orpc/nest 2.0.0-beta.2 → 2.0.0-beta.21

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.
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Standard Server
3
+ Copyright (c) 2023 oRPC
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,14 +1,17 @@
1
1
  <h1 align="center">oRPC - Typesafe APIs Made Simple 🪄</h1>
2
2
 
3
3
  <div align="center">
4
- <a href="https://codecov.io/gh/middleapi/orpc-nest">
5
- <img alt="codecov" src="https://codecov.io/gh/middleapi/orpc-nest/branch/main/graph/badge.svg">
4
+ <a href="https://codecov.io/gh/middleapi/orpc">
5
+ <img alt="codecov" src="https://codecov.io/gh/middleapi/orpc/branch/main/graph/badge.svg">
6
6
  </a>
7
7
  <a href="https://www.npmjs.com/package/@orpc/nest">
8
8
  <img alt="weekly downloads" src="https://img.shields.io/npm/dw/%40orpc%2Fnest?logo=npm" />
9
9
  </a>
10
- <a href="https://github.com/middleapi/orpc-nest/blob/main/LICENCE">
11
- <img alt="MIT License" src="https://img.shields.io/github/license/middleapi/orpc-nest?logo=open-source-initiative" />
10
+ <a href="https://app.codspeed.io/middleapi/orpc?utm_source=badge">
11
+ <img alt="CodSpeed" src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" />
12
+ </a>
13
+ <a href="https://github.com/middleapi/orpc/blob/main/LICENSE">
14
+ <img alt="MIT License" src="https://img.shields.io/github/license/middleapi/orpc?logo=open-source-initiative" />
12
15
  </a>
13
16
  <a href="https://discord.gg/TXEbwRBvQn">
14
17
  <img alt="Discord" src="https://img.shields.io/discord/1308966753044398161?color=7389D8&label&logo=discord&logoColor=ffffff" />
@@ -26,10 +29,10 @@ You can read the documentation [here](https://orpc.dev).
26
29
 
27
30
  **Core**
28
31
 
29
- - [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Define type-safe contracts for your API.
30
- - [@orpc/server](https://www.npmjs.com/package/@orpc/server): Implement your API or contract on the server.
31
- - [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume your API from the client with full type safety.
32
- - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Bring OpenAPI compatibility to your APIs.
32
+ - [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Define API contract as the single source of truth.
33
+ - [@orpc/server](https://www.npmjs.com/package/@orpc/server): Build APIs or implement contracts.
34
+ - [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume APIs with end-to-end type safety.
35
+ - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Add OpenAPI compatibility to APIs.
33
36
 
34
37
  **Schema validation**
35
38
 
@@ -39,22 +42,28 @@ You can read the documentation [here](https://orpc.dev).
39
42
 
40
43
  **Built-in features**
41
44
 
42
- - [@orpc/publisher](https://www.npmjs.com/package/@orpc/publisher): Pub/Sub.
43
- - [@orpc/ratelimit](https://www.npmjs.com/package/@orpc/ratelimit): Rate limiting.
45
+ - [@orpc/publisher](https://www.npmjs.com/package/@orpc/publisher): Pub/Sub with memory, Redis, and Upstash adapters.
46
+ - [@orpc/ratelimit](https://www.npmjs.com/package/@orpc/ratelimit): Rate limiting with memory, Redis, and Upstash adapters.
44
47
  - [@orpc/json-schema](https://www.npmjs.com/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
45
48
 
46
49
  **Framework & ecosystem integrations**
47
50
 
48
- - [@orpc/next](https://www.npmjs.com/package/@orpc/react): Use oRPC with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
51
+ - [@orpc/next](https://www.npmjs.com/package/@orpc/next): Integrate with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
52
+ - [@orpc/ai-sdk](https://www.npmjs.com/package/@orpc/ai-sdk): Turn contracts and procedures into [AI SDK](https://ai-sdk.dev/) tools.
49
53
  - [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): Integrate with [TanStack Query](https://tanstack.com/query/latest).
54
+ - [@orpc/pinia-colada](https://www.npmjs.com/package/@orpc/pinia-colada): Integrate with [Pinia Colada](https://pinia-colada.esm.dev/).
55
+ - [@orpc/swr](https://www.npmjs.com/package/@orpc/swr): Integrate with [SWR](https://swr.vercel.app/).
50
56
  - [@orpc/experimental-effect](https://www.npmjs.com/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
51
57
  - [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Implement your contract with [NestJS](https://nestjs.com/).
58
+ - [@orpc/bun](https://www.npmjs.com/package/@orpc/bun): Adapters for [Bun's Redis](https://bun.sh/).
59
+ - [@orpc/cloudflare](https://www.npmjs.com/package/@orpc/cloudflare): Adapters for [Cloudflare's RateLimit and Durable Objects](https://developers.cloudflare.com/workers/).
60
+ - [@orpc/trpc](https://www.npmjs.com/package/@orpc/trpc): Reuse existing [tRPC](https://trpc.io/) routers within oRPC.
52
61
 
53
62
  **Observability**
54
63
 
55
- - [@orpc/opentelemetry](https://www.npmjs.com/package/@orpc/opentelemetry): Instrument your API with [OpenTelemetry](https://opentelemetry.io/).
56
- - [@orpc/pino](https://www.npmjs.com/package/@orpc/pino): Log with [Pino](https://getpino.io/).
57
- - [@orpc/evlog](https://www.npmjs.com/package/@orpc/evlog): Log with [Evlog](https://evlog.dev/).
64
+ - [@orpc/opentelemetry](https://www.npmjs.com/package/@orpc/opentelemetry): Integrate with [OpenTelemetry](https://opentelemetry.io/) for distributed tracing.
65
+ - [@orpc/pino](https://www.npmjs.com/package/@orpc/pino): Integrate with [Pino](https://getpino.io/) for logging.
66
+ - [@orpc/evlog](https://www.npmjs.com/package/@orpc/evlog): Integrate with [Evlog](https://evlog.dev/) for logging.
58
67
 
59
68
  ## Sponsors
60
69
 
@@ -100,12 +109,10 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
100
109
  <td align="center"><a href="https://github.com/valerii15298?ref=orpc" target="_blank" rel="noopener" title="Valerii Petryniak"><img src="https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&amp;v=4" width="139" alt="Valerii Petryniak"/><br />Valerii Petryniak</a></td>
101
110
  <td align="center"><a href="https://github.com/letstri?ref=orpc" target="_blank" rel="noopener" title="Valerii Strilets"><img src="https://avatars.githubusercontent.com/u/13253748?u=c7b10399ccc8f8081e24db94ec32cd9858e86ac3&amp;v=4" width="139" alt="Valerii Strilets"/><br />Valerii Strilets</a></td>
102
111
  <td align="center"><a href="https://github.com/K-Mistele?ref=orpc" target="_blank" rel="noopener" title="Kyle Mistele"><img src="https://avatars.githubusercontent.com/u/18430555?u=3afebeb81de666e35aaac3ed46f14159d7603ffb&amp;v=4" width="139" alt="Kyle Mistele"/><br />Kyle Mistele</a></td>
103
- <td align="center"><a href="https://github.com/andrewpeters9?ref=orpc" target="_blank" rel="noopener" title="Andrew Peters"><img src="https://avatars.githubusercontent.com/u/36251325?v=4" width="139" alt="Andrew Peters"/><br />Andrew Peters</a></td>
104
112
  <td align="center"><a href="https://github.com/R44VC0RP?ref=orpc" target="_blank" rel="noopener" title="Ryan Vogel"><img src="https://avatars.githubusercontent.com/u/89211796?u=1857347b9787d8d8a7ea5bfc333f96be92d5a683&amp;v=4" width="139" alt="Ryan Vogel"/><br />Ryan Vogel</a></td>
113
+ <td align="center"><a href="https://github.com/christ12938?ref=orpc" target="_blank" rel="noopener" title="christ12938"><img src="https://avatars.githubusercontent.com/u/25758598?v=4" width="139" alt="christ12938"/><br />christ12938</a></td>
105
114
  </tr>
106
115
  <tr>
107
- <td align="center"><a href="https://github.com/christ12938?ref=orpc" target="_blank" rel="noopener" title="christ12938"><img src="https://avatars.githubusercontent.com/u/25758598?v=4" width="139" alt="christ12938"/><br />christ12938</a></td>
108
- <td align="center"><a href="https://github.com/peter-adam-dy?ref=orpc" target="_blank" rel="noopener" title="Peter Adam"><img src="https://avatars.githubusercontent.com/u/132129459?u=4f3dbbb3b443990b56acb7d6a5d11ed2c555f6db&amp;v=4" width="139" alt="Peter Adam"/><br />Peter Adam</a></td>
109
116
  <td align="center"><a href="https://github.com/Ryanjso?ref=orpc" target="_blank" rel="noopener" title="Ryan Soderberg"><img src="https://avatars.githubusercontent.com/u/39172778?u=5ed913c31d57e7221b75784abcad48c7ebddde27&amp;v=4" width="139" alt="Ryan Soderberg"/><br />Ryan Soderberg</a></td>
110
117
  <td align="center"><a href="https://github.com/itigoore01?ref=orpc" target="_blank" rel="noopener" title="shota"><img src="https://avatars.githubusercontent.com/u/11831107?u=c976a6dc7e055eb026304c46c99100ed22b0c8e0&amp;v=4" width="139" alt="shota"/><br />shota</a></td>
111
118
  </tr>
@@ -116,25 +123,25 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
116
123
  <table>
117
124
  <tr>
118
125
  <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&amp;v=4" width="119" alt="David Walsh"/><br />David Walsh</a></td>
126
+ <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&amp;v=4" width="119" alt="Nicholas"/><br />Nicholas</a></td>
119
127
  <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&amp;v=4" width="119" alt="Robbe Vaes"/><br />Robbe Vaes</a></td>
120
128
  <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>
121
129
  <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&amp;v=4" width="119" alt="soonoo"/><br />soonoo</a></td>
122
130
  <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&amp;v=4" width="119" alt="Kevin Porten"/><br />Kevin Porten</a></td>
123
131
  <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&amp;v=4" width="119" alt="Denis"/><br />Denis</a></td>
124
- <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&amp;v=4" width="119" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
125
132
  </tr>
126
133
  <tr>
134
+ <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&amp;v=4" width="119" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
127
135
  <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&amp;v=4" width="119" alt="Tom Ballinger"/><br />Tom Ballinger</a></td>
128
136
  <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&amp;v=4" width="119" alt="Sam"/><br />Sam</a></td>
129
137
  <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&amp;v=4" width="119" alt="Titoine"/><br />Titoine</a></td>
130
138
  <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&amp;v=4" width="119" alt="Igor Makowski"/><br />Igor Makowski</a></td>
131
139
  <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&amp;v=4" width="119" alt="hanayashiki"/><br />hanayashiki</a></td>
132
140
  <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&amp;v=4" width="119" alt="Lev Dubinets"/><br />Lev Dubinets</a></td>
133
- <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&amp;v=4" width="119" alt="Kelly Peilin Chan"/><br />Kelly Peilin Chan</a></td>
134
141
  </tr>
135
142
  <tr>
143
+ <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&amp;v=4" width="119" alt="Kelly Peilin Chan"/><br />Kelly Peilin Chan</a></td>
136
144
  <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&amp;v=4" width="119" alt="Alex"/><br />Alex</a></td>
137
- <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&amp;v=4" width="119" alt="nattstack"/><br />nattstack</a></td>
138
145
  <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&amp;v=4" width="119" alt="Andrey Gubanov"/><br />Andrey Gubanov</a></td>
139
146
  </tr>
140
147
  </table>
@@ -151,7 +158,7 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
151
158
  <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&amp;v=4" width="32" height="32" alt="Théo LUDWIG" /></a>
152
159
  <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&amp;v=4" width="32" height="32" alt="Abhay Ramesh" /></a>
153
160
  <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>
154
- <a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=24e8dd943cfc862aa284d858a023532c75071ade&amp;v=4" width="32" height="32" alt="0x4e32" /></a>
161
+ <a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=505e54608466ab53754f702973687b04c6424c1f&amp;v=4" width="32" height="32" alt="0x4e32" /></a>
155
162
  <a href="https://github.com/yzuyr?ref=orpc" target="_blank" rel="noopener" title="Ryuz"><img src="https://avatars.githubusercontent.com/u/196539378?u=d38374588d219b6748b16406982f6559411466d4&amp;v=4" width="32" height="32" alt="Ryuz" /></a>
156
163
  <a href="https://github.com/happyboy2022?ref=orpc" target="_blank" rel="noopener" title="happyboy"><img src="https://avatars.githubusercontent.com/u/103669586?u=65b49c4b893ed3703909fbb3a7a22313f3f9c121&amp;v=4" width="32" height="32" alt="happyboy" /></a>
157
164
  <a href="https://github.com/YiCChi?ref=orpc" target="_blank" rel="noopener" title="yicchi"><img src="https://avatars.githubusercontent.com/u/86967274?u=6c2756f09fe15dd94d572f560e979cd157982852&amp;v=4" width="32" height="32" alt="yicchi" /></a>
@@ -165,7 +172,9 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
165
172
  <a href="https://github.com/nelsonlaidev?ref=orpc" target="_blank" rel="noopener" title="Nelson Lai"><img src="https://avatars.githubusercontent.com/u/75498339?u=2fc0e0b95dd184c5ffb744df977cb15a18b60672&amp;v=4" width="32" height="32" alt="Nelson Lai" /></a>
166
173
  <a href="https://github.com/nguyenlc1993?ref=orpc" target="_blank" rel="noopener" title="Lê Cao Nguyên"><img src="https://avatars.githubusercontent.com/u/13871971?u=83c8b69d9e35b589c4e1f066cc113b1d9461386f&amp;v=4" width="32" height="32" alt="Lê Cao Nguyên" /></a>
167
174
  <a href="https://github.com/wobsoriano?ref=orpc" target="_blank" rel="noopener" title="Robert Soriano"><img src="https://avatars.githubusercontent.com/u/13049130?u=6d72104182e7c9ed25934815313fb69107332111&amp;v=4" width="32" height="32" alt="Robert Soriano" /></a>
175
+ <a href="https://github.com/andrewpeters9?ref=orpc" target="_blank" rel="noopener" title="Andrew Peters"><img src="https://avatars.githubusercontent.com/u/36251325?v=4" width="32" height="32" alt="Andrew Peters" /></a>
168
176
  <a href="https://github.com/SKostyukovich?ref=orpc" target="_blank" rel="noopener" title="SKostyukovich"><img src="https://avatars.githubusercontent.com/u/10700067?v=4" width="32" height="32" alt="SKostyukovich" /></a>
177
+ <a href="https://github.com/peter-adam-dy?ref=orpc" target="_blank" rel="noopener" title="Peter Adam"><img src="https://avatars.githubusercontent.com/u/132129459?u=4f3dbbb3b443990b56acb7d6a5d11ed2c555f6db&amp;v=4" width="32" height="32" alt="Peter Adam" /></a>
169
178
  <a href="https://github.com/FabworksHQ?ref=orpc" target="_blank" rel="noopener" title="Fabworks"><img src="https://avatars.githubusercontent.com/u/160179500?v=4" width="32" height="32" alt="Fabworks" /></a>
170
179
  <a href="https://github.com/NovakAnton?ref=orpc" target="_blank" rel="noopener" title="Novak Antonijevic"><img src="https://avatars.githubusercontent.com/u/157126729?u=ae49fa22292d55c0434ff0ca008206155b18663b&amp;v=4" width="32" height="32" alt="Novak Antonijevic" /></a>
171
180
  <a href="https://github.com/laduniestu?ref=orpc" target="_blank" rel="noopener" title="Laduni Estu Syalwa"><img src="https://avatars.githubusercontent.com/u/44757637?u=a2fc1ea8f7d827a96721176f79d30592d1c48059&amp;v=4" width="32" height="32" alt="Laduni Estu Syalwa" /></a>
@@ -173,6 +182,7 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
173
182
  <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&amp;v=4" width="32" height="32" alt="Illarion Koperski" /></a>
174
183
  <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&amp;v=4" width="32" height="32" alt="Anees Iqbal" /></a>
175
184
  <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&amp;v=4" width="32" height="32" alt="Sefa Eyeoglu" /></a>
185
+ <a href="https://github.com/nattstack?ref=orpc" target="_blank" rel="noopener" title="natt"><img src="https://avatars.githubusercontent.com/u/31426677?u=fa9dbb8b3e66eb0ea3c88db5dc07f31c8c5418fe&amp;v=4" width="32" height="32" alt="natt" /></a>
176
186
  <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&amp;v=4" width="32" height="32" alt="Adam Tkaczyk" /></a>
177
187
  <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>
178
188
  </p>
@@ -186,4 +196,4 @@ oRPC is inspired by existing solutions that prioritize type safety and developer
186
196
 
187
197
  ## License
188
198
 
189
- Distributed under the MIT License. See [LICENSE](https://github.com/middleapi/orpc-nest/blob/main/LICENCE) for more information.
199
+ Distributed under the MIT License. See [LICENSE](https://github.com/middleapi/orpc/blob/main/LICENSE) for more information.
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { DynamicModule, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
1
+ import { ExecutionContext, DynamicModule, NestInterceptor, CallHandler } from '@nestjs/common';
2
2
  import { RouterContract } from '@orpc/contract';
3
3
  import { DefaultInitialContext, ContractedRouter } from '@orpc/server';
4
- import { Promisable } from '@orpc/shared';
4
+ import { Value, Promisable } from '@orpc/shared';
5
5
  import { Observable } from 'rxjs';
6
6
  import { OpenAPIHandlerCodecCoreOptions } from '@orpc/openapi/standard';
7
7
  import { StandardHandlerOptions } from '@orpc/server/standard';
@@ -10,18 +10,24 @@ import { ToEventStreamOptions } from '@standardserver/node';
10
10
  import { HttpAdapterHost } from '@nestjs/core';
11
11
 
12
12
  declare const ORPC_MODULE_CONFIG_SYMBOL: unique symbol;
13
+ interface NestStandardLazyRequest extends StandardLazyRequest {
14
+ /**
15
+ * Route parameters extracted from the request path.
16
+ */
17
+ params?: undefined | Record<string, string | string[]>;
18
+ }
13
19
  type ORPCModuleConfig = OpenAPIHandlerCodecCoreOptions<DefaultInitialContext> & StandardHandlerOptions<DefaultInitialContext> & (object extends DefaultInitialContext ? {
14
- context?: DefaultInitialContext;
20
+ context?: Value<Promisable<DefaultInitialContext>, [ctx: ExecutionContext]>;
15
21
  } : {
16
- context: DefaultInitialContext;
22
+ context: Value<Promisable<DefaultInitialContext>, [ctx: ExecutionContext]>;
17
23
  }) & {
18
24
  /**
19
- * Customize how convert next.js req and res to StandardLazyRequest,
20
- * You might need define this if you not using express or fastify adapters
25
+ * Customize how to convert NestJS `req` and `res` to {@link NestStandardLazyRequest}.
26
+ * You might need to define this if you are not using express or fastify adapters.
21
27
  */
22
- toStandardLazyRequest?: undefined | ((req: any, res: any) => StandardLazyRequest);
28
+ toNestStandardLazyRequest?: undefined | ((req: any, res: any) => NestStandardLazyRequest);
23
29
  /**
24
- * Options for how to convert the Standard Response to a Nest Response (returning value), like event iterator options, etc.
30
+ * Options for how to convert the Standard Response to a Nest Response (returning value), like event stream options, etc.
25
31
  */
26
32
  toNestResponse?: undefined | {
27
33
  /**
@@ -43,11 +49,11 @@ declare function Implement<T extends RouterContract>(contract: T): <U extends Pr
43
49
  declare class ImplementInterceptor implements NestInterceptor {
44
50
  private readonly config;
45
51
  private readonly codec;
46
- private readonly toStandardLazyRequest;
52
+ private readonly toNestStandardLazyRequest;
47
53
  private readonly httpAdapterHost;
48
54
  constructor(config: ORPCModuleConfig | undefined, httpAdapterHost: HttpAdapterHost);
49
55
  intercept(ctx: ExecutionContext, next: CallHandler<any>): Observable<any>;
50
56
  }
51
57
 
52
58
  export { Implement as Impl, Implement, ImplementInterceptor, ORPCModule, ORPC_MODULE_CONFIG_SYMBOL };
53
- export type { ORPCModuleConfig };
59
+ export type { NestStandardLazyRequest, ORPCModuleConfig };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { DynamicModule, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
1
+ import { ExecutionContext, DynamicModule, NestInterceptor, CallHandler } from '@nestjs/common';
2
2
  import { RouterContract } from '@orpc/contract';
3
3
  import { DefaultInitialContext, ContractedRouter } from '@orpc/server';
4
- import { Promisable } from '@orpc/shared';
4
+ import { Value, Promisable } from '@orpc/shared';
5
5
  import { Observable } from 'rxjs';
6
6
  import { OpenAPIHandlerCodecCoreOptions } from '@orpc/openapi/standard';
7
7
  import { StandardHandlerOptions } from '@orpc/server/standard';
@@ -10,18 +10,24 @@ import { ToEventStreamOptions } from '@standardserver/node';
10
10
  import { HttpAdapterHost } from '@nestjs/core';
11
11
 
12
12
  declare const ORPC_MODULE_CONFIG_SYMBOL: unique symbol;
13
+ interface NestStandardLazyRequest extends StandardLazyRequest {
14
+ /**
15
+ * Route parameters extracted from the request path.
16
+ */
17
+ params?: undefined | Record<string, string | string[]>;
18
+ }
13
19
  type ORPCModuleConfig = OpenAPIHandlerCodecCoreOptions<DefaultInitialContext> & StandardHandlerOptions<DefaultInitialContext> & (object extends DefaultInitialContext ? {
14
- context?: DefaultInitialContext;
20
+ context?: Value<Promisable<DefaultInitialContext>, [ctx: ExecutionContext]>;
15
21
  } : {
16
- context: DefaultInitialContext;
22
+ context: Value<Promisable<DefaultInitialContext>, [ctx: ExecutionContext]>;
17
23
  }) & {
18
24
  /**
19
- * Customize how convert next.js req and res to StandardLazyRequest,
20
- * You might need define this if you not using express or fastify adapters
25
+ * Customize how to convert NestJS `req` and `res` to {@link NestStandardLazyRequest}.
26
+ * You might need to define this if you are not using express or fastify adapters.
21
27
  */
22
- toStandardLazyRequest?: undefined | ((req: any, res: any) => StandardLazyRequest);
28
+ toNestStandardLazyRequest?: undefined | ((req: any, res: any) => NestStandardLazyRequest);
23
29
  /**
24
- * Options for how to convert the Standard Response to a Nest Response (returning value), like event iterator options, etc.
30
+ * Options for how to convert the Standard Response to a Nest Response (returning value), like event stream options, etc.
25
31
  */
26
32
  toNestResponse?: undefined | {
27
33
  /**
@@ -43,11 +49,11 @@ declare function Implement<T extends RouterContract>(contract: T): <U extends Pr
43
49
  declare class ImplementInterceptor implements NestInterceptor {
44
50
  private readonly config;
45
51
  private readonly codec;
46
- private readonly toStandardLazyRequest;
52
+ private readonly toNestStandardLazyRequest;
47
53
  private readonly httpAdapterHost;
48
54
  constructor(config: ORPCModuleConfig | undefined, httpAdapterHost: HttpAdapterHost);
49
55
  intercept(ctx: ExecutionContext, next: CallHandler<any>): Observable<any>;
50
56
  }
51
57
 
52
58
  export { Implement as Impl, Implement, ImplementInterceptor, ORPCModule, ORPC_MODULE_CONFIG_SYMBOL };
53
- export type { ORPCModuleConfig };
59
+ export type { NestStandardLazyRequest, ORPCModuleConfig };
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ import { getOpenAPIMeta, DEFAULT_OPENAPI_METHOD, getDynamicPathParams } from '@o
6
6
  import { OpenAPIHandlerCodecCore } from '@orpc/openapi/standard';
7
7
  import { DEFAULT_SUCCESS_STATUS, getRouter, unlazy, Procedure } from '@orpc/server';
8
8
  import { StandardHandler } from '@orpc/server/standard';
9
- import { get, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared';
9
+ import { mergeHttpPath, value, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared';
10
10
  import { flattenStandardHeader, generateContentDisposition } from '@standardserver/core';
11
11
  import { toStandardLazyRequest, toEventStream } from '@standardserver/node';
12
12
  import { mergeMap } from 'rxjs';
@@ -77,19 +77,19 @@ const MethodDecoratorMap = {
77
77
  function Implement(contract) {
78
78
  if (contract instanceof ProcedureContract) {
79
79
  const meta = getOpenAPIMeta(contract);
80
- const method = meta?.method ?? DEFAULT_OPENAPI_METHOD;
81
- const path = meta?.path;
82
- const successStatus = meta?.successStatus ?? DEFAULT_SUCCESS_STATUS;
83
- if (path === void 0) {
80
+ if (meta?.path === void 0) {
84
81
  throw new TypeError(`
85
82
  @Implement decorator requires contract to have a 'openapi.path' meta.
86
83
  Please define one using '.meta(openapi({ path: '/example' }))'.
87
- Or use "populateRouterContractPaths" from "@orpc/contract" utility to automatically fill in any missing paths.
84
+ Or use "populateRouterContractOpenAPIPaths" from "@orpc/openapi" utility to automatically fill in any missing paths.
88
85
  `);
89
86
  }
87
+ const method = meta.method ?? DEFAULT_OPENAPI_METHOD;
88
+ const path = toNestPattern(meta.prefix ? mergeHttpPath(meta.prefix, meta.path) : meta.path);
89
+ const successStatus = meta.successStatus ?? DEFAULT_SUCCESS_STATUS;
90
90
  return (target, propertyKey, descriptor) => {
91
91
  applyDecorators(
92
- MethodDecoratorMap[method](toNestPattern(path)),
92
+ MethodDecoratorMap[method](path),
93
93
  HttpCode(successStatus),
94
94
  UseInterceptors(ImplementInterceptor)
95
95
  )(target, propertyKey, descriptor);
@@ -112,20 +112,20 @@ function Implement(contract) {
112
112
  for (const p of Reflect.getOwnMetadataKeys(target.constructor, propertyKey)) {
113
113
  Reflect.defineMetadata(p, Reflect.getOwnMetadata(p, target.constructor, propertyKey), target.constructor, methodName);
114
114
  }
115
- Implement(get(contract, [key]))(target, methodName, Object.getOwnPropertyDescriptor(target, methodName));
115
+ Implement(contract[key])(target, methodName, Object.getOwnPropertyDescriptor(target, methodName));
116
116
  }
117
117
  };
118
118
  }
119
119
  let ImplementInterceptor = class {
120
120
  config;
121
121
  codec;
122
- toStandardLazyRequest;
122
+ toNestStandardLazyRequest;
123
123
  httpAdapterHost;
124
124
  constructor(config, httpAdapterHost) {
125
125
  this.config = config ?? {};
126
126
  this.httpAdapterHost = httpAdapterHost;
127
127
  this.codec = new OpenAPIHandlerCodecCore(this.config);
128
- this.toStandardLazyRequest = this.config.toStandardLazyRequest ?? ((req, res) => {
128
+ this.toNestStandardLazyRequest = this.config.toNestStandardLazyRequest ?? ((req, res) => {
129
129
  const standardRequest = toStandardLazyRequest(
130
130
  "raw" in req ? req.raw : req,
131
131
  "raw" in res ? res.raw : res
@@ -133,6 +133,7 @@ let ImplementInterceptor = class {
133
133
  if (req.body !== void 0) {
134
134
  standardRequest.resolveBody = () => Promise.resolve(req.body);
135
135
  }
136
+ standardRequest.params = req.params;
136
137
  return standardRequest;
137
138
  });
138
139
  }
@@ -147,21 +148,21 @@ let ImplementInterceptor = class {
147
148
  }
148
149
  const req = ctx.switchToHttp().getRequest();
149
150
  const res = ctx.switchToHttp().getResponse();
150
- const standardRequest = this.toStandardLazyRequest(req, res);
151
+ const standardRequest = this.toNestStandardLazyRequest(req, res);
151
152
  const handler = new StandardHandler({
152
153
  resolveProcedure: () => Promise.resolve({
153
154
  path: getPathMeta(procedure) ?? [],
154
155
  procedure,
155
156
  decodeInput: () => this.codec.decodeInput({
156
157
  procedure,
157
- params: toORPCOpenAPIParams(procedure, req.params)
158
+ params: toORPCOpenAPIParams(procedure, standardRequest.params)
158
159
  }, standardRequest)
159
160
  }),
160
161
  encodeError: this.codec.encodeError.bind(this.codec),
161
162
  encodeOutput: this.codec.encodeOutput.bind(this.codec)
162
163
  }, this.config);
163
164
  const result = await handler.handle(standardRequest, {
164
- context: this.config.context ?? {}
165
+ context: await value(this.config.context ?? {}, ctx)
165
166
  });
166
167
  if (!result.matched) {
167
168
  throw new TypeError(
@@ -171,15 +172,15 @@ let ImplementInterceptor = class {
171
172
  const httpAdapter = this.httpAdapterHost.httpAdapter;
172
173
  httpAdapter.status(res, result.response.status);
173
174
  for (const key in result.response.headers) {
174
- const value = result.response.headers[key];
175
- if (typeof value === "string") {
176
- httpAdapter.setHeader(res, key, value);
175
+ const value2 = result.response.headers[key];
176
+ if (typeof value2 === "string") {
177
+ httpAdapter.setHeader(res, key, value2);
177
178
  } else {
178
- value?.forEach((value2, index) => {
179
+ value2?.forEach((value3, index) => {
179
180
  if (index === 0) {
180
- httpAdapter.setHeader(res, key, value2);
181
+ httpAdapter.setHeader(res, key, value3);
181
182
  } else {
182
- httpAdapter.appendHeader(res, key, value2);
183
+ httpAdapter.appendHeader(res, key, value3);
183
184
  }
184
185
  });
185
186
  }
@@ -202,7 +203,7 @@ let ImplementInterceptor = class {
202
203
  type: body.type,
203
204
  disposition: flattenStandardHeader(result.response.headers["content-disposition"]) ?? generateContentDisposition(body instanceof File ? body.name : "blob"),
204
205
  // BunS3 can use NaN for the size
205
- length: Number.isNaN(body.size) ? void 0 : body.size
206
+ length: Number.isFinite(body.size) ? body.size : void 0
206
207
  });
207
208
  }
208
209
  if (body instanceof FormData) {
@@ -233,24 +234,24 @@ ImplementInterceptor = __decorateClass([
233
234
  __decorateParam(0, Optional()),
234
235
  __decorateParam(1, Inject(HttpAdapterHost))
235
236
  ], ImplementInterceptor);
236
- function flattenParamValue(value) {
237
- return Array.isArray(value) ? value.join("/") : value;
237
+ function flattenParamValue(value2) {
238
+ return Array.isArray(value2) ? value2.join("/") : value2;
238
239
  }
239
240
  function toORPCOpenAPIParams(contract, params) {
240
- const path = getOpenAPIMeta(contract)?.path;
241
- if (!params || !path) {
241
+ const meta = getOpenAPIMeta(contract);
242
+ if (!params || meta?.path === void 0) {
242
243
  return void 0;
243
244
  }
244
- const dynamicParams = getDynamicPathParams(path);
245
+ const dynamicParams = getDynamicPathParams(meta.prefix ? mergeHttpPath(meta.prefix, meta.path) : meta.path);
245
246
  if (!dynamicParams) {
246
247
  return void 0;
247
248
  }
248
249
  return dynamicParams.reduce((acc, config) => {
249
- const value = config.allowsSlash ? flattenParamValue(params?.["*"] ?? params?.path) : flattenParamValue(params?.[config.parameterName]);
250
- if (value === void 0) {
250
+ const value2 = config.allowsSlash ? flattenParamValue(params?.["*"] ?? params?.path) : flattenParamValue(params?.[config.parameterName]);
251
+ if (value2 === void 0) {
251
252
  return acc;
252
253
  }
253
- acc[config.parameterName] = value;
254
+ acc[config.parameterName] = value2;
254
255
  return acc;
255
256
  }, {});
256
257
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@orpc/nest",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.2",
4
+ "version": "2.0.0-beta.21",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.dev",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/middleapi/orpc-nest.git",
9
+ "url": "git+https://github.com/middleapi/orpc.git",
10
10
  "directory": "packages/nest"
11
11
  },
12
12
  "sideEffects": false,
@@ -37,23 +37,25 @@
37
37
  }
38
38
  },
39
39
  "dependencies": {
40
- "@orpc/client": "2.0.0-beta.3",
41
- "@orpc/contract": "2.0.0-beta.3",
42
- "@orpc/openapi": "2.0.0-beta.3",
43
- "@orpc/server": "2.0.0-beta.3",
44
- "@orpc/shared": "2.0.0-beta.3",
45
- "@standardserver/core": "^0.0.25",
46
- "@standardserver/node": "^0.0.25"
40
+ "@standardserver/core": "^0.5.0",
41
+ "@standardserver/node": "^0.5.0",
42
+ "@orpc/client": "2.0.0-beta.21",
43
+ "@orpc/contract": "2.0.0-beta.21",
44
+ "@orpc/server": "2.0.0-beta.21",
45
+ "@orpc/shared": "2.0.0-beta.21",
46
+ "@orpc/openapi": "2.0.0-beta.21"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@fastify/cookie": "^11.0.2",
50
50
  "@nestjs/common": "^11.1.27",
51
51
  "@nestjs/core": "^11.1.27",
52
+ "@nestjs/platform-express": "^11.1.27",
52
53
  "@nestjs/platform-fastify": "^11.1.27",
54
+ "@nestjs/testing": "^11.1.27",
55
+ "@types/express": "^5.0.6",
53
56
  "express": "^5.2.1",
54
57
  "fastify": "^5.8.5",
55
- "rxjs": "^7.8.2",
56
- "supertest": "^7.2.2"
58
+ "rxjs": "^7.8.2"
57
59
  },
58
60
  "scripts": {
59
61
  "build": "unbuild",