@orpc/swr 0.0.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 oRPC
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:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
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.
package/README.md ADDED
@@ -0,0 +1,199 @@
1
+ <h1 align="center">oRPC - Typesafe APIs Made Simple πŸͺ„</h1>
2
+
3
+ <div align="center">
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
+ </a>
7
+ <a href="https://www.npmjs.com/package/@orpc/swr">
8
+ <img alt="weekly downloads" src="https://img.shields.io/npm/dw/%40orpc%2Fswr?logo=npm" />
9
+ </a>
10
+ <a href="https://app.codspeed.io/middleapi/orpc?utm_source=badge">
11
+ <img alt="CodSpeed" src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" />
12
+ </a>
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" />
15
+ </a>
16
+ <a href="https://discord.gg/TXEbwRBvQn">
17
+ <img alt="Discord" src="https://img.shields.io/discord/1308966753044398161?color=7389D8&label&logo=discord&logoColor=ffffff" />
18
+ </a>
19
+ <a href="https://deepwiki.com/middleapi/orpc">
20
+ <img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki">
21
+ </a>
22
+ </div>
23
+
24
+ ## Documentation
25
+
26
+ You can read the documentation [here](https://orpc.dev).
27
+
28
+ ## Packages
29
+
30
+ **Core**
31
+
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.
36
+
37
+ **Schema validation**
38
+
39
+ - [@orpc/zod](https://www.npmjs.com/package/@orpc/zod): Integrate with [Zod](https://zod.dev/).
40
+ - [@orpc/valibot](https://www.npmjs.com/package/@orpc/valibot): Integrate with [Valibot](https://valibot.dev/).
41
+ - [@orpc/arktype](https://www.npmjs.com/package/@orpc/arktype): Integrate with [ArkType](https://arktype.io/).
42
+
43
+ **Built-in features**
44
+
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.
47
+ - [@orpc/json-schema](https://www.npmjs.com/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
48
+
49
+ **Framework & ecosystem integrations**
50
+
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.
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/).
56
+ - [@orpc/experimental-effect](https://www.npmjs.com/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
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.
61
+
62
+ **Observability**
63
+
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.
67
+
68
+ ## Sponsors
69
+
70
+ Like what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going here: [GitHub Sponsors](https://github.com/sponsors/dinwwwh). Every bit helps! πŸš€
71
+
72
+ ### πŸ† Platinum Sponsor
73
+
74
+ <table>
75
+ <tr>
76
+ <td align="center"><a href="https://screenshotone.com/?ref=orpc" target="_blank" rel="noopener" title="ScreenshotOne.com"><img src="https://avatars.githubusercontent.com/u/97035603?v=4" width="279" alt="ScreenshotOne.com"/><br />ScreenshotOne.com</a></td>
77
+ </tr>
78
+ </table>
79
+
80
+ ### πŸ₯ˆ Silver Sponsor
81
+
82
+ <table>
83
+ <tr>
84
+ <td align="center"><a href="https://misskey.io/?ref=orpc" target="_blank" rel="noopener" title="ζ‘δΈŠγ•γ‚“"><img src="https://avatars.githubusercontent.com/u/37681609?u=0dd4c7e4ba937cbb52b068c55914b1d8164dc0c7&amp;v=4" width="209" alt="ζ‘δΈŠγ•γ‚“"/><br />ζ‘δΈŠγ•γ‚“</a></td>
85
+ </tr>
86
+ </table>
87
+
88
+ ### Generous Sponsors
89
+
90
+ <table>
91
+ <tr>
92
+ <td align="center"><a href="https://github.com/ln-markets?ref=orpc" target="_blank" rel="noopener" title="LN Markets"><img src="https://avatars.githubusercontent.com/u/70597625?v=4" width="167" alt="LN Markets"/><br />LN Markets</a></td>
93
+ </tr>
94
+ </table>
95
+
96
+ ### Sponsors
97
+
98
+ <table>
99
+ <tr>
100
+ <td align="center"><a href="https://github.com/hrmcdonald?ref=orpc" target="_blank" rel="noopener" title="Reece McDonald"><img src="https://avatars.githubusercontent.com/u/39349270?v=4" width="139" alt="Reece McDonald"/><br />Reece McDonald</a></td>
101
+ <td align="center"><a href="https://github.com/nicognaW?ref=orpc" target="_blank" rel="noopener" title="nk"><img src="https://avatars.githubusercontent.com/u/66731869?u=4699bda3a9092d3ec34fbd959450767bcc8b8b6d&amp;v=4" width="139" alt="nk"/><br />nk</a></td>
102
+ <td align="center"><a href="https://github.com/supastarter?ref=orpc" target="_blank" rel="noopener" title="supastarter"><img src="https://avatars.githubusercontent.com/u/110960143?v=4" width="139" alt="supastarter"/><br />supastarter</a></td>
103
+ <td align="center"><a href="https://github.com/divmgl?ref=orpc" target="_blank" rel="noopener" title="Dexter Miguel"><img src="https://avatars.githubusercontent.com/u/5452298?u=645993204be8696c085ecf0d228c3062efe2ed65&amp;v=4" width="139" alt="Dexter Miguel"/><br />Dexter Miguel</a></td>
104
+ <td align="center"><a href="https://github.com/herrfugbaum?ref=orpc" target="_blank" rel="noopener" title="herrfugbaum"><img src="https://avatars.githubusercontent.com/u/12859776?u=644dc1666d0220bc0468eb0de3c56b919f635b16&amp;v=4" width="139" alt="herrfugbaum"/><br />herrfugbaum</a></td>
105
+ <td align="center"><a href="https://github.com/ryota-murakami?ref=orpc" target="_blank" rel="noopener" title="Ryota Murakami"><img src="https://avatars.githubusercontent.com/u/5501268?u=599389e03340734325726ca3f8f423c021d47d7f&amp;v=4" width="139" alt="Ryota Murakami"/><br />Ryota Murakami</a></td>
106
+ </tr>
107
+ <tr>
108
+ <td align="center"><a href="https://github.com/dcramer?ref=orpc" target="_blank" rel="noopener" title="David Cramer"><img src="https://avatars.githubusercontent.com/u/23610?v=4" width="139" alt="David Cramer"/><br />David Cramer</a></td>
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>
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>
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>
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>
114
+ </tr>
115
+ <tr>
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>
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>
118
+ </tr>
119
+ </table>
120
+
121
+ ### Backers
122
+
123
+ <table>
124
+ <tr>
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>
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>
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>
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>
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>
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>
132
+ </tr>
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>
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>
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>
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>
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>
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>
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>
141
+ </tr>
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>
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>
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>
146
+ </tr>
147
+ </table>
148
+
149
+ ### Past Sponsors
150
+
151
+ <p>
152
+ <a href="https://github.com/MrMaxie?ref=orpc" target="_blank" rel="noopener" title="Maxie"><img src="https://avatars.githubusercontent.com/u/3857836?u=5e6b57973d4385d655663ffdd836e487856f2984&amp;v=4" width="32" height="32" alt="Maxie" /></a>
153
+ <a href="https://github.com/Stijn-Timmer?ref=orpc" target="_blank" rel="noopener" title="Stijn Timmer"><img src="https://avatars.githubusercontent.com/u/100147665?u=106b2c18e9c98a61861b4ee7fc100f5b9906a6c9&amp;v=4" width="32" height="32" alt="Stijn Timmer" /></a>
154
+ <a href="https://github.com/u1-liquid?ref=orpc" target="_blank" rel="noopener" title="あわわわとーにゅ"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&amp;v=4" width="32" height="32" alt="あわわわとーにゅ" /></a>
155
+ <a href="https://github.com/zuplo?ref=orpc" target="_blank" rel="noopener" title="Zuplo"><img src="https://avatars.githubusercontent.com/u/85497839?v=4" width="32" height="32" alt="Zuplo" /></a>
156
+ <a href="https://github.com/motopods?ref=orpc" target="_blank" rel="noopener" title="motopods"><img src="https://avatars.githubusercontent.com/u/58200641?v=4" width="32" height="32" alt="motopods" /></a>
157
+ <a href="https://github.com/franciscohermida?ref=orpc" target="_blank" rel="noopener" title="Francisco Hermida"><img src="https://avatars.githubusercontent.com/u/483242?u=bbcbc80eb9d8781ff401f7dafc3b59cd7bea0561&amp;v=4" width="32" height="32" alt="Francisco Hermida" /></a>
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>
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>
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>
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>
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>
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>
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
+ <a href="https://github.com/cloudycotton?ref=orpc" target="_blank" rel="noopener" title="Saksham"><img src="https://avatars.githubusercontent.com/u/168998965?u=9b9634a5aed66a51c1b880663272725b00b92b14&amp;v=4" width="32" height="32" alt="Saksham" /></a>
166
+ <a href="https://github.com/hrynevychroman?ref=orpc" target="_blank" rel="noopener" title="Roman Hrynevych"><img src="https://avatars.githubusercontent.com/u/82209198?u=1a1d111ab3d589855b9cc8a7fefb1b5c6a4fbbaf&amp;v=4" width="32" height="32" alt="Roman Hrynevych" /></a>
167
+ <a href="https://github.com/rokitgg?ref=orpc" target="_blank" rel="noopener" title="rokitg"><img src="https://avatars.githubusercontent.com/u/125133357?u=06c74aefaa2236b06a2e5fba5a5c612339f45912&amp;v=4" width="32" height="32" alt="rokitg" /></a>
168
+ <a href="https://github.com/omarkhatibgg?ref=orpc" target="_blank" rel="noopener" title="Omar Khatib"><img src="https://avatars.githubusercontent.com/u/9054278?u=afbba7331b85c51b8eee4130f5fd31b1017dc919&amp;v=4" width="32" height="32" alt="Omar Khatib" /></a>
169
+ <a href="https://github.com/YuSabo90002?ref=orpc" target="_blank" rel="noopener" title="Yu-Sabo"><img src="https://avatars.githubusercontent.com/u/13120582?v=4" width="32" height="32" alt="Yu-Sabo" /></a>
170
+ <a href="https://github.com/bapspatil?ref=orpc" target="_blank" rel="noopener" title="Bapusaheb Patil"><img src="https://avatars.githubusercontent.com/u/16699418?u=6d9d8e0a64a6f91ca1c4d559c72d931172bdcbbd&amp;v=4" width="32" height="32" alt="Bapusaheb Patil" /></a>
171
+ <a href="https://github.com/ripgrim?ref=orpc" target="_blank" rel="noopener" title="grim"><img src="https://avatars.githubusercontent.com/u/75869731?u=b17c42ec2309552fdb822a86b25a2f99146a4d72&amp;v=4" width="32" height="32" alt="grim" /></a>
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>
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>
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>
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>
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>
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>
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>
181
+ <a href="https://github.com/yukimotochern?ref=orpc" target="_blank" rel="noopener" title="Chen, Zhi-Yuan"><img src="https://avatars.githubusercontent.com/u/20896173?u=945c33fc21725e4d566a0d02afc54b136ca1d67a&amp;v=4" width="32" height="32" alt="Chen, Zhi-Yuan" /></a>
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>
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>
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>
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>
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>
188
+ </p>
189
+
190
+ ## References
191
+
192
+ oRPC is inspired by existing solutions that prioritize type safety and developer experience. Special acknowledgments to:
193
+
194
+ - [tRPC](https://trpc.io): For pioneering the concept of end-to-end type-safe RPC and influencing the development of type-safe APIs.
195
+ - [ts-rest](https://ts-rest.com): For its emphasis on contract-first development and OpenAPI integration, which have greatly inspired oRPC's feature set.
196
+
197
+ ## License
198
+
199
+ Distributed under the MIT License. See [LICENSE](https://github.com/middleapi/orpc/blob/main/LICENSE) for more information.
@@ -0,0 +1,152 @@
1
+ import { PartialDeep, MaybeOptionalOptions, Public } from '@orpc/shared';
2
+ import { ClientContext, Client, AnyNestedClient } from '@orpc/client';
3
+ import { SWRSubscriptionOptions } from 'swr/subscription';
4
+
5
+ interface OperationKeyPrefixOptions {
6
+ /**
7
+ * Prepended as the first element of the key when present.
8
+ * Use this to avoid key conflicts when multiple router utils share the same client.
9
+ */
10
+ prefix?: string;
11
+ }
12
+ type OperationKeyOptions<TInput> = OperationKeyPrefixOptions & {
13
+ input?: PartialDeep<TInput>;
14
+ };
15
+ type OperationKey<TInput> = [path: string[], options: Omit<OperationKeyOptions<TInput>, 'prefix'>] | [prefix: string, path: string[], options: Omit<OperationKeyOptions<TInput>, 'prefix'>];
16
+ /**
17
+ * Generate a **full matching** key for SWR operations.
18
+ *
19
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Key Docs}
20
+ */
21
+ declare function generateOperationKey<TInput>(path: string[], options?: OperationKeyOptions<TInput>): OperationKey<TInput>;
22
+
23
+ type InferSubscriberOutput<TOutput> = TOutput extends AsyncIterable<infer U> ? U[] : never;
24
+ type InferLiveSubscriberOutput<TOutput> = TOutput extends AsyncIterable<infer U> ? U : never;
25
+ type OperationType = 'fetcher' | 'mutator' | 'subscriber' | 'liveSubscriber';
26
+ declare const OPERATION_CONTEXT_SYMBOL: unique symbol;
27
+ interface OperationContext {
28
+ [OPERATION_CONTEXT_SYMBOL]?: {
29
+ key: unknown;
30
+ type: OperationType;
31
+ };
32
+ }
33
+ type KeyOptions<TInput> = undefined extends TInput ? {
34
+ input?: TInput;
35
+ } : {
36
+ input: TInput;
37
+ };
38
+ type MatcherStrategy = 'exact' | 'partial';
39
+ type MatcherOptions<TStrategy extends MatcherStrategy, TInput> = ('partial' extends TStrategy ? {
40
+ input?: PartialDeep<TInput>;
41
+ } : undefined extends TInput ? {
42
+ input?: TInput;
43
+ } : {
44
+ input: TInput;
45
+ }) & {
46
+ strategy?: TStrategy;
47
+ };
48
+ type Matcher = (key?: unknown) => boolean;
49
+ type FetcherOptions<TClientContext extends ClientContext> = object extends TClientContext ? {
50
+ context?: TClientContext;
51
+ } : {
52
+ context: TClientContext;
53
+ };
54
+ type SubscriberOptions<TClientContext extends ClientContext> = FetcherOptions<TClientContext> & {
55
+ /**
56
+ * Determines how data is handled when the subscription refetches.
57
+ * - `reset`: Replace existing data with new data
58
+ * - `append`: Add new data to existing data
59
+ *
60
+ * @default 'reset'
61
+ */
62
+ refetchMode?: 'reset' | 'append';
63
+ /**
64
+ * Maximum number of chunks to store.
65
+ * When exceeded, the oldest chunks will be removed.
66
+ */
67
+ maxChunks?: number;
68
+ };
69
+ type MutatorOptions<TClientContext extends ClientContext> = FetcherOptions<TClientContext>;
70
+ type Fetcher<TInput, TOutput> = (key: OperationKey<TInput>) => Promise<TOutput>;
71
+ type Mutator<TInput, TOutput> = (key: unknown, options: Readonly<{
72
+ arg: TInput;
73
+ }>) => Promise<TOutput>;
74
+ type Subscriber<TInput, TData, TError> = (key: OperationKey<TInput>, options: SWRSubscriptionOptions<TData, TError>) => (() => void);
75
+
76
+ declare class SharedUtils<TInput> {
77
+ protected readonly path: string[];
78
+ protected readonly options: OperationKeyPrefixOptions;
79
+ constructor(path: string[], options: OperationKeyPrefixOptions);
80
+ /**
81
+ * Generate a matcher function that returns `true` if the key matches the specified conditions.
82
+ *
83
+ * @see {@link https://orpc.dev/docs/integrations/swr#manual-revalidation SWR Manual Revalidation Docs}
84
+ */
85
+ matcher<TStrategy extends MatcherStrategy>(...rest: MaybeOptionalOptions<MatcherOptions<TStrategy, TInput>>): Matcher;
86
+ }
87
+
88
+ interface ProcedureUtilsOptions extends OperationKeyPrefixOptions {
89
+ }
90
+ declare class ProcedureUtils<TClientContext extends ClientContext, TInput, TOutput, TError> extends SharedUtils<TInput> {
91
+ /**
92
+ * Calling corresponding procedure client
93
+ *
94
+ * @see {@link https://orpc.dev/docs/integrations/swr#calling-clients SWR Calling Procedure Client Docs}
95
+ */
96
+ call: Client<TClientContext, TInput, TOutput, TError>;
97
+ constructor(path: string[], client: Client<TClientContext, TInput, TOutput, TError>, options?: ProcedureUtilsOptions);
98
+ /**
99
+ * Generate a **full matching** key for SWR operations.
100
+ *
101
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Key Docs}
102
+ */
103
+ key(...rest: MaybeOptionalOptions<KeyOptions<TInput>>): OperationKey<TInput>;
104
+ /**
105
+ * Generate a fetcher function for use with useSWR, useSWRInfinite, and other SWR hooks.
106
+ *
107
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Data Fetching Docs}
108
+ */
109
+ fetcher(...rest: MaybeOptionalOptions<FetcherOptions<TClientContext>>): Fetcher<TInput, TOutput>;
110
+ /**
111
+ * Generate a subscriber function that subscribes to an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
112
+ *
113
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
114
+ */
115
+ subscriber(...rest: MaybeOptionalOptions<SubscriberOptions<TClientContext>>): Subscriber<TInput, InferSubscriberOutput<TOutput>, TError>;
116
+ /**
117
+ * Generate a live subscriber that subscribes to the latest events from an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
118
+ *
119
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
120
+ */
121
+ liveSubscriber(...rest: MaybeOptionalOptions<FetcherOptions<TClientContext>>): Subscriber<TInput, InferLiveSubscriberOutput<TOutput>, TError>;
122
+ /**
123
+ * Generate a mutator function for use with useSWRMutation, etc.
124
+ *
125
+ * @see {@link https://orpc.dev/docs/integrations/swr#mutations SWR Mutations Docs}
126
+ */
127
+ mutator(...rest: MaybeOptionalOptions<MutatorOptions<TClientContext>>): Mutator<TInput, TOutput>;
128
+ }
129
+
130
+ type RouterUtils<T extends AnyNestedClient> = T extends Client<infer UClientContext, infer UInput, infer UOutput, infer UError> ? Public<ProcedureUtils<UClientContext, UInput, UOutput, UError>> : {
131
+ [K in keyof T]: T[K] extends AnyNestedClient ? RouterUtils<T[K]> : never;
132
+ } & Public<SharedUtils<unknown>>;
133
+ interface RouterUtilsOptions extends OperationKeyPrefixOptions {
134
+ /**
135
+ * Base path for all keys.
136
+ *
137
+ * @internal
138
+ */
139
+ path?: string[] | undefined;
140
+ }
141
+ /**
142
+ * Create a swr router utils from a client.
143
+ *
144
+ * @info Both client-side and server-side clients are supported.
145
+ * @see {@link https://orpc.dev/docs/integrations/swr SWR Integration}
146
+ */
147
+ declare function createRouterUtils<T extends AnyNestedClient>(client: T, options?: RouterUtilsOptions): RouterUtils<T>;
148
+
149
+ declare function isSubsetOf(subsetKey: unknown, fullKey: unknown): boolean;
150
+
151
+ export { OPERATION_CONTEXT_SYMBOL, ProcedureUtils, OPERATION_CONTEXT_SYMBOL as SWR_OPERATION_CONTEXT_SYMBOL, SharedUtils, createRouterUtils, createRouterUtils as createSWRUtils, generateOperationKey, isSubsetOf };
152
+ export type { Fetcher, FetcherOptions, InferLiveSubscriberOutput, InferSubscriberOutput, KeyOptions, Matcher, MatcherOptions, MatcherStrategy, Mutator, MutatorOptions, OperationContext, OperationKey, OperationKeyOptions, OperationKeyPrefixOptions, OperationType, ProcedureUtilsOptions, RouterUtils, RouterUtilsOptions, OperationContext as SWROperationContext, Subscriber, SubscriberOptions };
@@ -0,0 +1,152 @@
1
+ import { PartialDeep, MaybeOptionalOptions, Public } from '@orpc/shared';
2
+ import { ClientContext, Client, AnyNestedClient } from '@orpc/client';
3
+ import { SWRSubscriptionOptions } from 'swr/subscription';
4
+
5
+ interface OperationKeyPrefixOptions {
6
+ /**
7
+ * Prepended as the first element of the key when present.
8
+ * Use this to avoid key conflicts when multiple router utils share the same client.
9
+ */
10
+ prefix?: string;
11
+ }
12
+ type OperationKeyOptions<TInput> = OperationKeyPrefixOptions & {
13
+ input?: PartialDeep<TInput>;
14
+ };
15
+ type OperationKey<TInput> = [path: string[], options: Omit<OperationKeyOptions<TInput>, 'prefix'>] | [prefix: string, path: string[], options: Omit<OperationKeyOptions<TInput>, 'prefix'>];
16
+ /**
17
+ * Generate a **full matching** key for SWR operations.
18
+ *
19
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Key Docs}
20
+ */
21
+ declare function generateOperationKey<TInput>(path: string[], options?: OperationKeyOptions<TInput>): OperationKey<TInput>;
22
+
23
+ type InferSubscriberOutput<TOutput> = TOutput extends AsyncIterable<infer U> ? U[] : never;
24
+ type InferLiveSubscriberOutput<TOutput> = TOutput extends AsyncIterable<infer U> ? U : never;
25
+ type OperationType = 'fetcher' | 'mutator' | 'subscriber' | 'liveSubscriber';
26
+ declare const OPERATION_CONTEXT_SYMBOL: unique symbol;
27
+ interface OperationContext {
28
+ [OPERATION_CONTEXT_SYMBOL]?: {
29
+ key: unknown;
30
+ type: OperationType;
31
+ };
32
+ }
33
+ type KeyOptions<TInput> = undefined extends TInput ? {
34
+ input?: TInput;
35
+ } : {
36
+ input: TInput;
37
+ };
38
+ type MatcherStrategy = 'exact' | 'partial';
39
+ type MatcherOptions<TStrategy extends MatcherStrategy, TInput> = ('partial' extends TStrategy ? {
40
+ input?: PartialDeep<TInput>;
41
+ } : undefined extends TInput ? {
42
+ input?: TInput;
43
+ } : {
44
+ input: TInput;
45
+ }) & {
46
+ strategy?: TStrategy;
47
+ };
48
+ type Matcher = (key?: unknown) => boolean;
49
+ type FetcherOptions<TClientContext extends ClientContext> = object extends TClientContext ? {
50
+ context?: TClientContext;
51
+ } : {
52
+ context: TClientContext;
53
+ };
54
+ type SubscriberOptions<TClientContext extends ClientContext> = FetcherOptions<TClientContext> & {
55
+ /**
56
+ * Determines how data is handled when the subscription refetches.
57
+ * - `reset`: Replace existing data with new data
58
+ * - `append`: Add new data to existing data
59
+ *
60
+ * @default 'reset'
61
+ */
62
+ refetchMode?: 'reset' | 'append';
63
+ /**
64
+ * Maximum number of chunks to store.
65
+ * When exceeded, the oldest chunks will be removed.
66
+ */
67
+ maxChunks?: number;
68
+ };
69
+ type MutatorOptions<TClientContext extends ClientContext> = FetcherOptions<TClientContext>;
70
+ type Fetcher<TInput, TOutput> = (key: OperationKey<TInput>) => Promise<TOutput>;
71
+ type Mutator<TInput, TOutput> = (key: unknown, options: Readonly<{
72
+ arg: TInput;
73
+ }>) => Promise<TOutput>;
74
+ type Subscriber<TInput, TData, TError> = (key: OperationKey<TInput>, options: SWRSubscriptionOptions<TData, TError>) => (() => void);
75
+
76
+ declare class SharedUtils<TInput> {
77
+ protected readonly path: string[];
78
+ protected readonly options: OperationKeyPrefixOptions;
79
+ constructor(path: string[], options: OperationKeyPrefixOptions);
80
+ /**
81
+ * Generate a matcher function that returns `true` if the key matches the specified conditions.
82
+ *
83
+ * @see {@link https://orpc.dev/docs/integrations/swr#manual-revalidation SWR Manual Revalidation Docs}
84
+ */
85
+ matcher<TStrategy extends MatcherStrategy>(...rest: MaybeOptionalOptions<MatcherOptions<TStrategy, TInput>>): Matcher;
86
+ }
87
+
88
+ interface ProcedureUtilsOptions extends OperationKeyPrefixOptions {
89
+ }
90
+ declare class ProcedureUtils<TClientContext extends ClientContext, TInput, TOutput, TError> extends SharedUtils<TInput> {
91
+ /**
92
+ * Calling corresponding procedure client
93
+ *
94
+ * @see {@link https://orpc.dev/docs/integrations/swr#calling-clients SWR Calling Procedure Client Docs}
95
+ */
96
+ call: Client<TClientContext, TInput, TOutput, TError>;
97
+ constructor(path: string[], client: Client<TClientContext, TInput, TOutput, TError>, options?: ProcedureUtilsOptions);
98
+ /**
99
+ * Generate a **full matching** key for SWR operations.
100
+ *
101
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Key Docs}
102
+ */
103
+ key(...rest: MaybeOptionalOptions<KeyOptions<TInput>>): OperationKey<TInput>;
104
+ /**
105
+ * Generate a fetcher function for use with useSWR, useSWRInfinite, and other SWR hooks.
106
+ *
107
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Data Fetching Docs}
108
+ */
109
+ fetcher(...rest: MaybeOptionalOptions<FetcherOptions<TClientContext>>): Fetcher<TInput, TOutput>;
110
+ /**
111
+ * Generate a subscriber function that subscribes to an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
112
+ *
113
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
114
+ */
115
+ subscriber(...rest: MaybeOptionalOptions<SubscriberOptions<TClientContext>>): Subscriber<TInput, InferSubscriberOutput<TOutput>, TError>;
116
+ /**
117
+ * Generate a live subscriber that subscribes to the latest events from an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
118
+ *
119
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
120
+ */
121
+ liveSubscriber(...rest: MaybeOptionalOptions<FetcherOptions<TClientContext>>): Subscriber<TInput, InferLiveSubscriberOutput<TOutput>, TError>;
122
+ /**
123
+ * Generate a mutator function for use with useSWRMutation, etc.
124
+ *
125
+ * @see {@link https://orpc.dev/docs/integrations/swr#mutations SWR Mutations Docs}
126
+ */
127
+ mutator(...rest: MaybeOptionalOptions<MutatorOptions<TClientContext>>): Mutator<TInput, TOutput>;
128
+ }
129
+
130
+ type RouterUtils<T extends AnyNestedClient> = T extends Client<infer UClientContext, infer UInput, infer UOutput, infer UError> ? Public<ProcedureUtils<UClientContext, UInput, UOutput, UError>> : {
131
+ [K in keyof T]: T[K] extends AnyNestedClient ? RouterUtils<T[K]> : never;
132
+ } & Public<SharedUtils<unknown>>;
133
+ interface RouterUtilsOptions extends OperationKeyPrefixOptions {
134
+ /**
135
+ * Base path for all keys.
136
+ *
137
+ * @internal
138
+ */
139
+ path?: string[] | undefined;
140
+ }
141
+ /**
142
+ * Create a swr router utils from a client.
143
+ *
144
+ * @info Both client-side and server-side clients are supported.
145
+ * @see {@link https://orpc.dev/docs/integrations/swr SWR Integration}
146
+ */
147
+ declare function createRouterUtils<T extends AnyNestedClient>(client: T, options?: RouterUtilsOptions): RouterUtils<T>;
148
+
149
+ declare function isSubsetOf(subsetKey: unknown, fullKey: unknown): boolean;
150
+
151
+ export { OPERATION_CONTEXT_SYMBOL, ProcedureUtils, OPERATION_CONTEXT_SYMBOL as SWR_OPERATION_CONTEXT_SYMBOL, SharedUtils, createRouterUtils, createRouterUtils as createSWRUtils, generateOperationKey, isSubsetOf };
152
+ export type { Fetcher, FetcherOptions, InferLiveSubscriberOutput, InferSubscriberOutput, KeyOptions, Matcher, MatcherOptions, MatcherStrategy, Mutator, MutatorOptions, OperationContext, OperationKey, OperationKeyOptions, OperationKeyPrefixOptions, OperationType, ProcedureUtilsOptions, RouterUtils, RouterUtilsOptions, OperationContext as SWROperationContext, Subscriber, SubscriberOptions };
package/dist/index.mjs ADDED
@@ -0,0 +1,206 @@
1
+ import { isPlainObject, resolveMaybeOptionalOptions, isAsyncIteratorObject, toArray, bindMethods, getOrBind, get, isTypescriptObject } from '@orpc/shared';
2
+ import { RECURSIVE_CLIENT_UNWRAP_KEYS } from '@orpc/client';
3
+
4
+ function generateOperationKey(path, options = {}) {
5
+ return [
6
+ ...options.prefix !== void 0 ? [options.prefix] : [],
7
+ path,
8
+ {
9
+ ...options.input !== void 0 ? { input: options.input } : {}
10
+ }
11
+ ];
12
+ }
13
+
14
+ function isSubsetOf(subsetKey, fullKey) {
15
+ return subsetKey === fullKey ? true : typeof subsetKey !== typeof fullKey ? false : isPlainObject(subsetKey) && isPlainObject(fullKey) ? Object.keys(subsetKey).every((key) => subsetKey[key] === void 0 || isSubsetOf(subsetKey[key], fullKey[key])) : Array.isArray(subsetKey) && Array.isArray(fullKey) ? subsetKey.every((value, index) => isSubsetOf(value, fullKey[index])) : false;
16
+ }
17
+
18
+ class SharedUtils {
19
+ constructor(path, options) {
20
+ this.path = path;
21
+ this.options = options;
22
+ }
23
+ /**
24
+ * Generate a matcher function that returns `true` if the key matches the specified conditions.
25
+ *
26
+ * @see {@link https://orpc.dev/docs/integrations/swr#manual-revalidation SWR Manual Revalidation Docs}
27
+ */
28
+ matcher(...rest) {
29
+ const { input, strategy = "partial" } = resolveMaybeOptionalOptions(rest);
30
+ const expectedKey = generateOperationKey(this.path, { prefix: this.options.prefix, input });
31
+ return (key) => {
32
+ if (!isSubsetOf(expectedKey, key)) {
33
+ return false;
34
+ }
35
+ if (strategy === "exact" && !isSubsetOf(key, expectedKey)) {
36
+ return false;
37
+ }
38
+ return true;
39
+ };
40
+ }
41
+ }
42
+
43
+ const OPERATION_CONTEXT_SYMBOL = Symbol.for("ORPC_SWR_OPERATION_CONTEXT");
44
+
45
+ class ProcedureUtils extends SharedUtils {
46
+ /**
47
+ * Calling corresponding procedure client
48
+ *
49
+ * @see {@link https://orpc.dev/docs/integrations/swr#calling-clients SWR Calling Procedure Client Docs}
50
+ */
51
+ call;
52
+ constructor(path, client, options = {}) {
53
+ super(path, options);
54
+ this.call = client;
55
+ }
56
+ /**
57
+ * Generate a **full matching** key for SWR operations.
58
+ *
59
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Key Docs}
60
+ */
61
+ key(...rest) {
62
+ const options = resolveMaybeOptionalOptions(rest);
63
+ return generateOperationKey(this.path, { ...options, prefix: this.options.prefix });
64
+ }
65
+ /**
66
+ * Generate a fetcher function for use with useSWR, useSWRInfinite, and other SWR hooks.
67
+ *
68
+ * @see {@link https://orpc.dev/docs/integrations/swr#data-fetching SWR Data Fetching Docs}
69
+ */
70
+ fetcher(...rest) {
71
+ const options = resolveMaybeOptionalOptions(rest);
72
+ return async (key) => {
73
+ const { input } = key[key.length - 1];
74
+ return this.call(input, {
75
+ context: {
76
+ [OPERATION_CONTEXT_SYMBOL]: { key, type: "fetcher" },
77
+ ...options.context
78
+ }
79
+ });
80
+ };
81
+ }
82
+ /**
83
+ * Generate a subscriber function that subscribes to an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
84
+ *
85
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
86
+ */
87
+ subscriber(...rest) {
88
+ const { maxChunks, refetchMode = "reset", ...options } = resolveMaybeOptionalOptions(rest);
89
+ return (key, { next }) => {
90
+ const controller = new AbortController();
91
+ void (async () => {
92
+ try {
93
+ const { input } = key[key.length - 1];
94
+ const iterator = await this.call(input, {
95
+ context: {
96
+ [OPERATION_CONTEXT_SYMBOL]: { key, type: "subscriber" },
97
+ ...options.context
98
+ },
99
+ signal: controller.signal
100
+ });
101
+ if (!isAsyncIteratorObject(iterator)) {
102
+ throw new TypeError(".subscriber requires an AsyncIteratorObject output");
103
+ }
104
+ if (refetchMode === "reset") {
105
+ next(void 0, void 0);
106
+ }
107
+ for await (const event of iterator) {
108
+ next(void 0, (old) => {
109
+ const newData = Array.isArray(old) ? [...old, event] : [event];
110
+ if (typeof maxChunks === "number" && newData.length > maxChunks) {
111
+ return newData.slice(newData.length - maxChunks);
112
+ }
113
+ return newData;
114
+ });
115
+ }
116
+ } catch (error) {
117
+ if (!controller.signal.aborted) {
118
+ next(error);
119
+ }
120
+ }
121
+ })();
122
+ return () => {
123
+ controller.abort();
124
+ };
125
+ };
126
+ }
127
+ /**
128
+ * Generate a live subscriber that subscribes to the latest events from an [AsyncIteratorObject](https://orpc.dev/docs/async-iterator-object) for use with useSWRSubscription, etc.
129
+ *
130
+ * @see {@link https://orpc.dev/docs/integrations/swr#subscriptions SWR Subscriptions Docs}
131
+ */
132
+ liveSubscriber(...rest) {
133
+ const options = resolveMaybeOptionalOptions(rest);
134
+ return (key, { next }) => {
135
+ const controller = new AbortController();
136
+ void (async () => {
137
+ try {
138
+ const { input } = key[key.length - 1];
139
+ const iterator = await this.call(input, {
140
+ context: {
141
+ [OPERATION_CONTEXT_SYMBOL]: { key, type: "liveSubscriber" },
142
+ ...options.context
143
+ },
144
+ signal: controller.signal
145
+ });
146
+ if (!isAsyncIteratorObject(iterator)) {
147
+ throw new TypeError(".liveSubscriber requires an AsyncIteratorObject output");
148
+ }
149
+ for await (const event of iterator) {
150
+ next(void 0, event);
151
+ }
152
+ } catch (error) {
153
+ if (!controller.signal.aborted) {
154
+ next(error);
155
+ }
156
+ }
157
+ })();
158
+ return () => {
159
+ controller.abort();
160
+ };
161
+ };
162
+ }
163
+ /**
164
+ * Generate a mutator function for use with useSWRMutation, etc.
165
+ *
166
+ * @see {@link https://orpc.dev/docs/integrations/swr#mutations SWR Mutations Docs}
167
+ */
168
+ mutator(...rest) {
169
+ const options = resolveMaybeOptionalOptions(rest);
170
+ return (key, { arg }) => this.call(arg, {
171
+ context: {
172
+ [OPERATION_CONTEXT_SYMBOL]: { key, type: "mutator" },
173
+ ...options.context
174
+ }
175
+ });
176
+ }
177
+ }
178
+
179
+ function createRouterUtils(client, options = {}) {
180
+ const path = toArray(options.path);
181
+ const utils = typeof client === "function" ? bindMethods(new ProcedureUtils(path, client, { prefix: options.prefix })) : bindMethods(new SharedUtils(path, { prefix: options.prefix }));
182
+ const recursive = new Proxy(utils, {
183
+ get(target, prop) {
184
+ const value = getOrBind(target, prop);
185
+ const nextClient = get(client, [prop]);
186
+ if (typeof prop !== "string" || RECURSIVE_CLIENT_UNWRAP_KEYS.has(prop) || !isTypescriptObject(nextClient)) {
187
+ return value;
188
+ }
189
+ const nextUtils = createRouterUtils(nextClient, { ...options, path: [...path, prop] });
190
+ if (typeof value !== "function") {
191
+ return nextUtils;
192
+ }
193
+ return new Proxy(value, {
194
+ get(target2, prop2) {
195
+ if (typeof prop2 !== "string" || RECURSIVE_CLIENT_UNWRAP_KEYS.has(prop2)) {
196
+ return getOrBind(target2, prop2);
197
+ }
198
+ return getOrBind(nextUtils, prop2);
199
+ }
200
+ });
201
+ }
202
+ });
203
+ return recursive;
204
+ }
205
+
206
+ export { OPERATION_CONTEXT_SYMBOL, ProcedureUtils, OPERATION_CONTEXT_SYMBOL as SWR_OPERATION_CONTEXT_SYMBOL, SharedUtils, createRouterUtils, createRouterUtils as createSWRUtils, generateOperationKey, isSubsetOf };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@orpc/swr",
3
+ "type": "module",
4
+ "version": "0.0.0",
5
+ "license": "MIT",
6
+ "homepage": "https://orpc.dev",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/middleapi/orpc.git",
10
+ "directory": "packages/swr"
11
+ },
12
+ "keywords": [
13
+ "orpc",
14
+ "react",
15
+ "swr"
16
+ ],
17
+ "sideEffects": false,
18
+ "exports": {
19
+ "./package.json": "./package.json",
20
+ ".": {
21
+ "types": "./dist/index.d.mts",
22
+ "import": "./dist/index.mjs",
23
+ "default": "./dist/index.mjs"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "peerDependencies": {
30
+ "swr": ">=2.4.2"
31
+ },
32
+ "dependencies": {
33
+ "@orpc/client": "*",
34
+ "@orpc/shared": "*"
35
+ },
36
+ "devDependencies": {
37
+ "swr": "^2.4.2",
38
+ "zod": "^4.4.3"
39
+ },
40
+ "scripts": {
41
+ "build": "unbuild",
42
+ "type:check": "tsc -b"
43
+ }
44
+ }