@trpc/server 10.0.0-alpha.2 → 10.0.0-alpha.22

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 (301) hide show
  1. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +7 -6
  2. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +7 -6
  3. package/adapters/express/dist/trpc-server-adapters-express.esm.js +7 -6
  4. package/adapters/express/index.d.ts +1 -0
  5. package/adapters/express/index.js +1 -0
  6. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.d.ts +1 -0
  7. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +109 -0
  8. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.js +7 -0
  9. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +109 -0
  10. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +104 -0
  11. package/adapters/fastify/index.d.ts +1 -0
  12. package/adapters/fastify/index.js +1 -0
  13. package/adapters/fetch/index.d.ts +1 -0
  14. package/adapters/fetch/index.js +1 -0
  15. package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +4 -3
  16. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +4 -3
  17. package/adapters/next/dist/trpc-server-adapters-next.esm.js +4 -3
  18. package/adapters/next/index.d.ts +1 -0
  19. package/adapters/next/index.js +1 -0
  20. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +4 -3
  21. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +4 -3
  22. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +4 -3
  23. package/adapters/node-http/index.d.ts +1 -0
  24. package/adapters/node-http/index.js +1 -0
  25. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +5 -4
  26. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +5 -4
  27. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +5 -4
  28. package/adapters/standalone/index.d.ts +1 -0
  29. package/adapters/standalone/index.js +1 -0
  30. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.dev.js +6 -5
  31. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.prod.js +6 -5
  32. package/adapters/ws/dist/trpc-server-adapters-ws.esm.js +6 -5
  33. package/adapters/ws/index.d.ts +1 -0
  34. package/adapters/ws/index.js +1 -0
  35. package/dist/TRPCError-7971540a.mjs +65 -0
  36. package/dist/TRPCError-ddec3395.js +69 -0
  37. package/dist/TRPCError.d.ts +11 -0
  38. package/dist/TRPCError.d.ts.map +1 -0
  39. package/dist/{declarations/src/adapters → adapters}/express.d.ts +5 -5
  40. package/dist/adapters/express.d.ts.map +1 -0
  41. package/dist/adapters/express.js +23 -0
  42. package/dist/adapters/express.mjs +19 -0
  43. package/dist/adapters/express.ts.js +1 -0
  44. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +13 -0
  45. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -0
  46. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +12 -0
  47. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -0
  48. package/dist/adapters/fastify/index.d.ts +3 -0
  49. package/dist/adapters/fastify/index.d.ts.map +1 -0
  50. package/dist/adapters/fastify/index.js +108 -0
  51. package/dist/adapters/fastify/index.mjs +103 -0
  52. package/dist/adapters/fastify/index.ts.js +1 -0
  53. package/dist/adapters/fetch/fetchRequestHandler.d.ts +8 -0
  54. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -0
  55. package/dist/adapters/fetch/index.d.ts +3 -0
  56. package/dist/adapters/fetch/index.d.ts.map +1 -0
  57. package/dist/adapters/fetch/index.js +69 -0
  58. package/dist/adapters/fetch/index.mjs +65 -0
  59. package/dist/adapters/fetch/index.ts.js +1 -0
  60. package/dist/adapters/fetch/types.d.ts +21 -0
  61. package/dist/adapters/fetch/types.d.ts.map +1 -0
  62. package/dist/{declarations/src/adapters → adapters}/next.d.ts +5 -5
  63. package/dist/adapters/next.d.ts.map +1 -0
  64. package/dist/adapters/next.js +55 -0
  65. package/dist/adapters/next.mjs +51 -0
  66. package/dist/adapters/next.ts.js +1 -0
  67. package/dist/{declarations/src/adapters → adapters}/node-http/index.d.ts +2 -2
  68. package/dist/adapters/node-http/index.d.ts.map +1 -0
  69. package/dist/adapters/node-http/index.js +13 -0
  70. package/dist/adapters/node-http/index.mjs +5 -0
  71. package/dist/adapters/node-http/index.ts.js +1 -0
  72. package/dist/{declarations/src/adapters → adapters}/node-http/internals/getPostBody.d.ts +12 -12
  73. package/dist/adapters/node-http/internals/getPostBody.d.ts.map +1 -0
  74. package/dist/{declarations/src/adapters → adapters}/node-http/nodeHTTPRequestHandler.d.ts +9 -9
  75. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -0
  76. package/dist/{declarations/src/adapters → adapters}/node-http/types.d.ts +31 -32
  77. package/dist/adapters/node-http/types.d.ts.map +1 -0
  78. package/dist/{declarations/src/adapters → adapters}/standalone.d.ts +13 -13
  79. package/dist/adapters/standalone.d.ts.map +1 -0
  80. package/dist/adapters/standalone.js +49 -0
  81. package/dist/adapters/standalone.mjs +40 -0
  82. package/dist/adapters/standalone.ts.js +1 -0
  83. package/dist/{declarations/src/adapters → adapters}/ws.d.ts +16 -16
  84. package/dist/adapters/ws.d.ts.map +1 -0
  85. package/dist/adapters/ws.js +384 -0
  86. package/dist/adapters/ws.mjs +380 -0
  87. package/dist/adapters/ws.ts.js +1 -0
  88. package/dist/{declarations/src/assertNotBrowser.d.ts → assertNotBrowser.d.ts} +1 -1
  89. package/dist/assertNotBrowser.d.ts.map +1 -0
  90. package/dist/{codes-e0df67c4.cjs.prod.js → envelopes-1deb2fa7.mjs} +19 -5
  91. package/dist/{codes-33cef953.cjs.dev.js → envelopes-a953b930.js} +18 -0
  92. package/dist/{declarations/src/http → http}/ResponseMeta.d.ts +4 -4
  93. package/dist/http/ResponseMeta.d.ts.map +1 -0
  94. package/dist/{declarations/src/http → http}/index.d.ts +2 -2
  95. package/dist/http/index.d.ts.map +1 -0
  96. package/dist/{declarations/src/http → http}/internals/getHTTPStatusCode.d.ts +21 -20
  97. package/dist/http/internals/getHTTPStatusCode.d.ts.map +1 -0
  98. package/dist/{declarations/src/http → http}/internals/types.d.ts +40 -39
  99. package/dist/http/internals/types.d.ts.map +1 -0
  100. package/dist/{declarations/src/http → http}/resolveHTTPResponse.d.ts +12 -12
  101. package/dist/http/resolveHTTPResponse.d.ts.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/{trpc-server.cjs.dev.js → index.js} +81 -107
  105. package/dist/{trpc-server.esm.js → index.mjs} +71 -91
  106. package/dist/index.ts.js +1 -0
  107. package/dist/{declarations/src/internals → internals}/BaseHandlerOptions.d.ts +12 -12
  108. package/dist/internals/BaseHandlerOptions.d.ts.map +1 -0
  109. package/dist/{declarations/src/internals → internals}/OnErrorFunction.d.ts +10 -10
  110. package/dist/internals/OnErrorFunction.d.ts.map +1 -0
  111. package/dist/{declarations/src/internals → internals}/callProcedure.d.ts +9 -9
  112. package/dist/internals/callProcedure.d.ts.map +1 -0
  113. package/dist/{declarations/src/internals → internals}/errors.d.ts +4 -3
  114. package/dist/internals/errors.d.ts.map +1 -0
  115. package/dist/{declarations/src/internals → internals}/invert.d.ts +8 -8
  116. package/dist/internals/invert.d.ts.map +1 -0
  117. package/dist/{declarations/src/internals → internals}/middlewares.d.ts +34 -33
  118. package/dist/internals/middlewares.d.ts.map +1 -0
  119. package/dist/internals/procedure.d.ts +87 -0
  120. package/dist/internals/procedure.d.ts.map +1 -0
  121. package/dist/internals/transformTRPCResponse.d.ts +9 -0
  122. package/dist/internals/transformTRPCResponse.d.ts.map +1 -0
  123. package/dist/nodeHTTPRequestHandler-1cdb6383.mjs +105 -0
  124. package/dist/nodeHTTPRequestHandler-848f07b5.js +107 -0
  125. package/dist/observable/index.d.ts +5 -0
  126. package/dist/observable/index.d.ts.map +1 -0
  127. package/dist/observable/index.js +204 -0
  128. package/dist/observable/index.mjs +195 -0
  129. package/dist/observable/index.ts.js +1 -0
  130. package/dist/observable/internals/identity.d.ts +2 -0
  131. package/dist/observable/internals/identity.d.ts.map +1 -0
  132. package/dist/observable/internals/observableToPromise.d.ts +10 -0
  133. package/dist/observable/internals/observableToPromise.d.ts.map +1 -0
  134. package/dist/observable/internals/pipe.d.ts +4 -0
  135. package/dist/observable/internals/pipe.d.ts.map +1 -0
  136. package/dist/observable/observable.d.ts +5 -0
  137. package/dist/observable/observable.d.ts.map +1 -0
  138. package/dist/observable/operators/index.d.ts +4 -0
  139. package/dist/observable/operators/index.d.ts.map +1 -0
  140. package/dist/observable/operators/map.d.ts +3 -0
  141. package/dist/observable/operators/map.d.ts.map +1 -0
  142. package/dist/observable/operators/share.d.ts +6 -0
  143. package/dist/observable/operators/share.d.ts.map +1 -0
  144. package/dist/observable/operators/tap.d.ts +3 -0
  145. package/dist/observable/operators/tap.d.ts.map +1 -0
  146. package/dist/observable/types.d.ts +29 -0
  147. package/dist/observable/types.d.ts.map +1 -0
  148. package/dist/observable-137ea1bd.mjs +105 -0
  149. package/dist/observable-3aa4d911.js +108 -0
  150. package/dist/{nodeHTTPRequestHandler-2e6cc2d7.esm.js → resolveHTTPResponse-54a79e6c.mjs} +19 -126
  151. package/dist/{nodeHTTPRequestHandler-b7ff366e.cjs.dev.js → resolveHTTPResponse-ec3dccaa.js} +24 -132
  152. package/dist/router.d.ts +173 -0
  153. package/dist/router.d.ts.map +1 -0
  154. package/dist/{declarations/src/rpc → rpc}/codes.d.ts +48 -46
  155. package/dist/rpc/codes.d.ts.map +1 -0
  156. package/dist/rpc/envelopes.d.ts +94 -0
  157. package/dist/rpc/envelopes.d.ts.map +1 -0
  158. package/dist/{declarations/src/rpc → rpc}/index.d.ts +2 -2
  159. package/dist/rpc/index.d.ts.map +1 -0
  160. package/dist/rpc/index.js +14 -0
  161. package/dist/rpc/index.mjs +1 -0
  162. package/dist/rpc/index.ts.js +1 -0
  163. package/dist/subscription.d.ts +9 -0
  164. package/dist/subscription.d.ts.map +1 -0
  165. package/dist/subscription.js +44 -0
  166. package/dist/subscription.mjs +40 -0
  167. package/dist/subscription.ts.js +1 -0
  168. package/dist/transformTRPCResponse-333bed6c.js +56 -0
  169. package/dist/transformTRPCResponse-e0cba527.mjs +53 -0
  170. package/dist/{declarations/src/transformer.d.ts → transformer.d.ts} +29 -29
  171. package/dist/transformer.d.ts.map +1 -0
  172. package/dist/{declarations/src/types.d.ts → types.d.ts} +40 -40
  173. package/dist/types.d.ts.map +1 -0
  174. package/observable/index.d.ts +1 -0
  175. package/observable/index.js +1 -0
  176. package/package.json +82 -26
  177. package/rpc/dist/trpc-server-rpc.cjs.dev.js +1 -1
  178. package/rpc/dist/trpc-server-rpc.cjs.prod.js +1 -1
  179. package/rpc/dist/trpc-server-rpc.esm.js +1 -1
  180. package/rpc/index.d.ts +1 -0
  181. package/rpc/index.js +1 -0
  182. package/src/TRPCError.ts +5 -13
  183. package/src/adapters/express.ts +3 -3
  184. package/src/adapters/fastify/fastifyRequestHandler.ts +77 -0
  185. package/src/adapters/fastify/fastifyTRPCPlugin.ts +56 -0
  186. package/src/adapters/fastify/index.ts +2 -0
  187. package/src/adapters/fetch/fetchRequestHandler.ts +61 -0
  188. package/src/adapters/fetch/index.ts +2 -0
  189. package/src/adapters/fetch/types.ts +28 -0
  190. package/src/adapters/next.ts +9 -7
  191. package/src/adapters/node-http/internals/getPostBody.test.ts +2 -1
  192. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +5 -6
  193. package/src/adapters/node-http/types.ts +4 -5
  194. package/src/adapters/standalone.ts +11 -3
  195. package/src/adapters/ws.ts +122 -81
  196. package/src/assertNotBrowser.ts +1 -0
  197. package/src/http/internals/getHTTPStatusCode.ts +2 -1
  198. package/src/http/internals/types.ts +6 -7
  199. package/src/http/resolveHTTPResponse.ts +23 -27
  200. package/src/index.ts +1 -6
  201. package/src/internals/BaseHandlerOptions.ts +1 -1
  202. package/src/internals/OnErrorFunction.ts +1 -1
  203. package/src/internals/callProcedure.ts +6 -3
  204. package/src/internals/errors.ts +20 -4
  205. package/src/internals/middlewares.ts +3 -2
  206. package/src/internals/procedure.ts +213 -93
  207. package/src/internals/transformTRPCResponse.ts +20 -15
  208. package/src/observable/index.ts +4 -0
  209. package/src/observable/internals/identity.ts +3 -0
  210. package/src/observable/internals/observableToPromise.ts +49 -0
  211. package/src/observable/internals/pipe.ts +22 -0
  212. package/src/observable/observable.test.ts +101 -0
  213. package/src/observable/observable.ts +75 -0
  214. package/src/observable/operators/index.ts +3 -0
  215. package/src/observable/operators/map.test.ts +92 -0
  216. package/src/observable/operators/map.ts +25 -0
  217. package/src/observable/operators/share.test.ts +60 -0
  218. package/src/observable/operators/share.ts +67 -0
  219. package/src/observable/operators/tap.ts +26 -0
  220. package/src/observable/types.ts +69 -0
  221. package/src/router.ts +171 -82
  222. package/src/rpc/codes.ts +1 -0
  223. package/src/rpc/envelopes.ts +87 -68
  224. package/src/subscription.ts +6 -124
  225. package/src/types.ts +7 -9
  226. package/adapters/express/package.json +0 -4
  227. package/adapters/next/package.json +0 -4
  228. package/adapters/node-http/package.json +0 -4
  229. package/adapters/standalone/package.json +0 -4
  230. package/adapters/ws/package.json +0 -4
  231. package/dist/codes-fe07bf82.esm.js +0 -56
  232. package/dist/declarations/src/TRPCError.d.ts +0 -19
  233. package/dist/declarations/src/TRPCError.d.ts.map +0 -1
  234. package/dist/declarations/src/adapters/express.d.ts.map +0 -1
  235. package/dist/declarations/src/adapters/next.d.ts.map +0 -1
  236. package/dist/declarations/src/adapters/node-http/index.d.ts.map +0 -1
  237. package/dist/declarations/src/adapters/node-http/internals/getPostBody.d.ts.map +0 -1
  238. package/dist/declarations/src/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +0 -1
  239. package/dist/declarations/src/adapters/node-http/types.d.ts.map +0 -1
  240. package/dist/declarations/src/adapters/standalone.d.ts.map +0 -1
  241. package/dist/declarations/src/adapters/ws.d.ts.map +0 -1
  242. package/dist/declarations/src/assertNotBrowser.d.ts.map +0 -1
  243. package/dist/declarations/src/deprecated/LegacyRouter.d.ts +0 -3
  244. package/dist/declarations/src/deprecated/LegacyRouter.d.ts.map +0 -1
  245. package/dist/declarations/src/deprecated/createHttpServer.d.ts +0 -19
  246. package/dist/declarations/src/deprecated/createHttpServer.d.ts.map +0 -1
  247. package/dist/declarations/src/deprecated/requestHandler.d.ts +0 -15
  248. package/dist/declarations/src/deprecated/requestHandler.d.ts.map +0 -1
  249. package/dist/declarations/src/http/ResponseMeta.d.ts.map +0 -1
  250. package/dist/declarations/src/http/index.d.ts.map +0 -1
  251. package/dist/declarations/src/http/internals/getHTTPStatusCode.d.ts.map +0 -1
  252. package/dist/declarations/src/http/internals/types.d.ts.map +0 -1
  253. package/dist/declarations/src/http/resolveHTTPResponse.d.ts.map +0 -1
  254. package/dist/declarations/src/index.d.ts +0 -10
  255. package/dist/declarations/src/index.d.ts.map +0 -1
  256. package/dist/declarations/src/internals/BaseHandlerOptions.d.ts.map +0 -1
  257. package/dist/declarations/src/internals/OnErrorFunction.d.ts.map +0 -1
  258. package/dist/declarations/src/internals/callProcedure.d.ts.map +0 -1
  259. package/dist/declarations/src/internals/errors.d.ts.map +0 -1
  260. package/dist/declarations/src/internals/invert.d.ts.map +0 -1
  261. package/dist/declarations/src/internals/middlewares.d.ts.map +0 -1
  262. package/dist/declarations/src/internals/procedure.d.ts +0 -74
  263. package/dist/declarations/src/internals/procedure.d.ts.map +0 -1
  264. package/dist/declarations/src/internals/transformTRPCResponse.d.ts +0 -7
  265. package/dist/declarations/src/internals/transformTRPCResponse.d.ts.map +0 -1
  266. package/dist/declarations/src/internals/wrapCallSafe.d.ts +0 -16
  267. package/dist/declarations/src/internals/wrapCallSafe.d.ts.map +0 -1
  268. package/dist/declarations/src/router.d.ts +0 -176
  269. package/dist/declarations/src/router.d.ts.map +0 -1
  270. package/dist/declarations/src/rpc/codes.d.ts.map +0 -1
  271. package/dist/declarations/src/rpc/envelopes.d.ts +0 -72
  272. package/dist/declarations/src/rpc/envelopes.d.ts.map +0 -1
  273. package/dist/declarations/src/rpc/index.d.ts.map +0 -1
  274. package/dist/declarations/src/subscription.d.ts +0 -58
  275. package/dist/declarations/src/subscription.d.ts.map +0 -1
  276. package/dist/declarations/src/transformer.d.ts.map +0 -1
  277. package/dist/declarations/src/types.d.ts.map +0 -1
  278. package/dist/declarations/src/ws/index.d.ts +0 -7
  279. package/dist/declarations/src/ws/index.d.ts.map +0 -1
  280. package/dist/nodeHTTPRequestHandler-7325b53f.cjs.prod.js +0 -399
  281. package/dist/subscription-b8831081.cjs.dev.js +0 -136
  282. package/dist/subscription-c2e0bfbc.cjs.prod.js +0 -136
  283. package/dist/subscription-fbda2888.esm.js +0 -133
  284. package/dist/transformTRPCResponse-8248515e.cjs.dev.js +0 -114
  285. package/dist/transformTRPCResponse-dcbf66c5.cjs.prod.js +0 -114
  286. package/dist/transformTRPCResponse-f73dc4a2.esm.js +0 -109
  287. package/dist/trpc-server.cjs.d.ts +0 -1
  288. package/dist/trpc-server.cjs.js +0 -7
  289. package/dist/trpc-server.cjs.prod.js +0 -528
  290. package/rpc/package.json +0 -4
  291. package/src/deprecated/LegacyRouter.ts +0 -3
  292. package/src/deprecated/createHttpServer.ts +0 -29
  293. package/src/deprecated/requestHandler.ts +0 -26
  294. package/src/internals/wrapCallSafe.ts +0 -19
  295. package/src/ws/index.ts +0 -8
  296. package/ws/dist/trpc-server-ws.cjs.d.ts +0 -1
  297. package/ws/dist/trpc-server-ws.cjs.dev.js +0 -15
  298. package/ws/dist/trpc-server-ws.cjs.js +0 -7
  299. package/ws/dist/trpc-server-ws.cjs.prod.js +0 -15
  300. package/ws/dist/trpc-server-ws.esm.js +0 -11
  301. package/ws/package.json +0 -4
@@ -1,51 +1,59 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { TRPCError } from '../TRPCError';
2
3
  import { assertNotBrowser } from '../assertNotBrowser';
3
4
  import { ProcedureType } from '../router';
4
- import { TRPCError } from '../TRPCError';
5
- import { getErrorFromUnknown } from './errors';
6
- import { MiddlewareFunction, middlewareMarker } from './middlewares';
7
- import { wrapCallSafe } from './wrapCallSafe';
5
+ import { InferLast } from '../types';
6
+ import { getCauseFromUnknown, getErrorFromUnknown } from './errors';
7
+ import {
8
+ MiddlewareFunction,
9
+ MiddlewareResult,
10
+ middlewareMarker,
11
+ } from './middlewares';
12
+
8
13
  assertNotBrowser();
9
14
 
10
- export type ProcedureInputParserZodEsque<TInput, TParsedInput> = {
15
+ export type ProcedureParserZodEsque<TInput, TOutput> = {
11
16
  _input: TInput;
12
- _output: TParsedInput;
17
+ _output: TOutput;
13
18
  };
14
19
 
15
- export type ProcedureInputParserMyZodEsque<TInput> = {
16
- parse: (input: any) => TInput;
20
+ export type ProcedureParserMyZodEsque<T> = {
21
+ parse: (input: any) => T;
17
22
  };
18
23
 
19
- export type ProcedureInputParserSuperstructEsque<TInput> = {
20
- create: (input: unknown) => TInput;
24
+ export type ProcedureParserSuperstructEsque<T> = {
25
+ create: (input: unknown) => T;
21
26
  };
22
27
 
23
- export type ProcedureInputParserCustomValidatorEsque<TInput> = (
28
+ export type ProcedureParserCustomValidatorEsque<T> = (
24
29
  input: unknown,
25
- ) => TInput | Promise<TInput>;
30
+ ) => T | Promise<T>;
26
31
 
27
- export type ProcedureInputParserYupEsque<TInput> = {
28
- validateSync: (input: unknown) => TInput;
32
+ export type ProcedureParserYupEsque<T> = {
33
+ validateSync: (input: unknown) => T;
29
34
  };
30
- export type ProcedureInputParser<TInput> =
31
- | ProcedureInputParserYupEsque<TInput>
32
- | ProcedureInputParserSuperstructEsque<TInput>
33
- | ProcedureInputParserCustomValidatorEsque<TInput>
34
- | ProcedureInputParserMyZodEsque<TInput>;
35
35
 
36
- export type ProcedureInputParserWithInputOutput<TInput, TParsedInput> =
37
- ProcedureInputParserZodEsque<TInput, TParsedInput>;
36
+ export type ProcedureParserWithInputOutput<TInput, TOutput> =
37
+ ProcedureParserZodEsque<TInput, TOutput>;
38
38
 
39
- export type ProcedureResolver<TContext, TParsedInput, TOutput> = (opts: {
39
+ export type ProcedureParser<T> =
40
+ | ProcedureParserYupEsque<T>
41
+ | ProcedureParserSuperstructEsque<T>
42
+ | ProcedureParserCustomValidatorEsque<T>
43
+ | ProcedureParserMyZodEsque<T>;
44
+
45
+ export type ProcedureResolver<TContext, TInput, TOutput> = (opts: {
40
46
  ctx: TContext;
41
- input: TParsedInput;
47
+ input: TInput;
42
48
  type: ProcedureType;
43
49
  }) => Promise<TOutput> | TOutput;
44
50
 
45
- interface ProcedureOptions<TContext, TParsedInput, TOutput> {
46
- middlewares: Array<MiddlewareFunction<any, any>>;
47
- resolver: ProcedureResolver<TContext, TParsedInput, TOutput>;
48
- inputParser: ProcedureInputParser<TParsedInput>;
51
+ interface ProcedureOptions<TContext, TMeta, TInput, TOutput, TParsedOutput> {
52
+ middlewares: Array<MiddlewareFunction<any, any, any>>;
53
+ resolver: ProcedureResolver<TContext, TInput, TOutput>;
54
+ inputParser: ProcedureParser<TInput>;
55
+ outputParser: ProcedureParser<TParsedOutput>;
56
+ meta: TMeta;
49
57
  }
50
58
 
51
59
  /**
@@ -58,36 +66,33 @@ export interface ProcedureCallOptions<TContext> {
58
66
  type: ProcedureType;
59
67
  }
60
68
 
61
- type ParseFn<TParsedInput> = (
62
- value: unknown,
63
- ) => TParsedInput | Promise<TParsedInput>;
64
- function getParseFn<TParsedInput>(
65
- inputParser: ProcedureInputParser<TParsedInput>,
66
- ): ParseFn<TParsedInput> {
67
- const parser = inputParser as any;
69
+ type ParseFn<T> = (value: unknown) => T | Promise<T>;
70
+
71
+ function getParseFn<T>(procedureParser: ProcedureParser<T>): ParseFn<T> {
72
+ const parser = procedureParser as any;
68
73
 
69
74
  if (typeof parser === 'function') {
70
- // ProcedureInputParserCustomValidatorEsque
75
+ // ProcedureParserCustomValidatorEsque
71
76
  return parser;
72
77
  }
73
78
 
74
79
  if (typeof parser.parseAsync === 'function') {
75
- // ProcedureInputParserZodEsque
80
+ // ProcedureParserZodEsque
76
81
  return parser.parseAsync.bind(parser);
77
82
  }
78
83
 
79
84
  if (typeof parser.parse === 'function') {
80
- // ProcedureInputParserZodEsque
85
+ // ProcedureParserZodEsque
81
86
  return parser.parse.bind(parser);
82
87
  }
83
88
 
84
89
  if (typeof parser.validateSync === 'function') {
85
- // ProcedureInputParserYupEsque
90
+ // ProcedureParserYupEsque
86
91
  return parser.validateSync.bind(parser);
87
92
  }
88
93
 
89
94
  if (typeof parser.create === 'function') {
90
- // ProcedureInputParserSuperstructEsque
95
+ // ProcedureParserSuperstructEsque
91
96
  return parser.create.bind(parser);
92
97
  }
93
98
 
@@ -97,42 +102,82 @@ function getParseFn<TParsedInput>(
97
102
  /**
98
103
  * @internal
99
104
  */
100
- export class Procedure<TInputContext, TContext, TInput, TParsedInput, TOutput> {
101
- private middlewares: Readonly<Array<MiddlewareFunction<any, any>>>;
105
+ export class Procedure<
106
+ TInputContext,
107
+ TContext,
108
+ TMeta,
109
+ TInput,
110
+ TParsedInput,
111
+ TOutput,
112
+ TParsedOutput,
113
+ TFinalOutput = unknown extends TParsedOutput ? TOutput : TParsedOutput,
114
+ > {
115
+ private middlewares: Readonly<Array<MiddlewareFunction<any, any, any>>>;
102
116
  private resolver: ProcedureResolver<TContext, TParsedInput, TOutput>;
103
- private readonly inputParser: ProcedureInputParser<TParsedInput>;
104
- private parse: ParseFn<TParsedInput>;
117
+ private readonly inputParser: ProcedureParser<TParsedInput>;
118
+ private parseInputFn: ParseFn<TParsedInput>;
119
+ private readonly outputParser: ProcedureParser<TFinalOutput>;
120
+ private parseOutputFn: ParseFn<TFinalOutput>;
121
+ public readonly meta: TMeta;
105
122
 
106
- constructor(opts: ProcedureOptions<TContext, TParsedInput, TOutput>) {
123
+ constructor(
124
+ opts: ProcedureOptions<
125
+ TContext,
126
+ TMeta,
127
+ TParsedInput,
128
+ TOutput,
129
+ TFinalOutput
130
+ >,
131
+ ) {
107
132
  this.middlewares = opts.middlewares;
108
133
  this.resolver = opts.resolver;
109
134
  this.inputParser = opts.inputParser;
110
- this.parse = getParseFn(this.inputParser);
135
+ this.parseInputFn = getParseFn(this.inputParser);
136
+ this.outputParser = opts.outputParser;
137
+ this.parseOutputFn = getParseFn(this.outputParser);
138
+ this.meta = opts.meta;
111
139
  }
112
140
 
113
141
  private async parseInput(rawInput: unknown): Promise<TParsedInput> {
114
142
  try {
115
- return await this.parse(rawInput);
143
+ return await this.parseInputFn(rawInput);
116
144
  } catch (cause) {
117
145
  throw new TRPCError({
118
146
  code: 'BAD_REQUEST',
119
- cause,
147
+ cause: getCauseFromUnknown(cause),
148
+ });
149
+ }
150
+ }
151
+
152
+ private async parseOutput(rawOutput: TOutput): Promise<TFinalOutput> {
153
+ try {
154
+ return await this.parseOutputFn(rawOutput);
155
+ } catch (cause) {
156
+ throw new TRPCError({
157
+ code: 'INTERNAL_SERVER_ERROR',
158
+ cause: getCauseFromUnknown(cause),
159
+ message: 'Output validation failed',
120
160
  });
121
161
  }
122
162
  }
123
163
 
124
164
  /**
125
- * Trigger middlewares in order, parse raw input & call resolver
165
+ * Trigger middlewares in order, parse raw input, call resolver & parse raw output
126
166
  * @internal
127
167
  */
128
168
  public async call(
129
169
  opts: ProcedureCallOptions<TInputContext>,
130
- ): Promise<TOutput> {
170
+ ): Promise<TFinalOutput> {
131
171
  // wrap the actual resolver and treat as the last "middleware"
132
172
  const middlewaresWithResolver = this.middlewares.concat([
133
- async ({ ctx }: { ctx: TContext }) => {
173
+ async ({ ctx }: { ctx: any }) => {
134
174
  const input = await this.parseInput(opts.rawInput);
135
- const data = await this.resolver({ ...opts, ctx, input });
175
+ const rawOutput = await this.resolver({
176
+ ...opts,
177
+ ctx,
178
+ input,
179
+ });
180
+ const data = await this.parseOutput(rawOutput);
136
181
  return {
137
182
  marker: middlewareMarker,
138
183
  ok: true,
@@ -142,30 +187,40 @@ export class Procedure<TInputContext, TContext, TInput, TParsedInput, TOutput> {
142
187
  },
143
188
  ]);
144
189
 
145
- // create `next()` calls in resolvers
146
- const nextFns = middlewaresWithResolver.map((fn, index) => {
147
- return async (nextOpts?: { ctx: TContext }) => {
148
- const res = await wrapCallSafe(() =>
149
- fn({
150
- ctx: nextOpts ? nextOpts.ctx : opts.ctx,
151
- type: opts.type,
152
- path: opts.path,
153
- rawInput: opts.rawInput,
154
- next: nextFns[index + 1],
155
- }),
156
- );
157
- if (res.ok) {
158
- return res.data;
159
- }
190
+ // run the middlewares recursively with the resolver as the last one
191
+ const callRecursive = async (
192
+ callOpts: { ctx: any; index: number } = {
193
+ index: 0,
194
+ ctx: opts.ctx,
195
+ },
196
+ ): Promise<MiddlewareResult<any>> => {
197
+ try {
198
+ const result = await middlewaresWithResolver[callOpts.index]({
199
+ ctx: callOpts.ctx,
200
+ type: opts.type,
201
+ path: opts.path,
202
+ rawInput: opts.rawInput,
203
+ meta: this.meta,
204
+ next: async (nextOpts?: { ctx: any }) => {
205
+ return await callRecursive({
206
+ index: callOpts.index + 1,
207
+ ctx: nextOpts ? nextOpts.ctx : callOpts.ctx,
208
+ });
209
+ },
210
+ });
211
+ return result;
212
+ } catch (cause) {
160
213
  return {
161
- ok: false as const,
162
- error: getErrorFromUnknown(res.error),
214
+ ctx: callOpts.ctx,
215
+ ok: false,
216
+ error: getErrorFromUnknown(cause),
217
+ marker: middlewareMarker,
163
218
  };
164
- };
165
- });
219
+ }
220
+ };
166
221
 
167
222
  // there's always at least one "next" since we wrap this.resolver in a middleware
168
- const result = await nextFns[0]();
223
+ const result = await callRecursive();
169
224
  if (!result) {
170
225
  throw new TRPCError({
171
226
  code: 'INTERNAL_SERVER_ERROR',
@@ -178,7 +233,7 @@ export class Procedure<TInputContext, TContext, TInput, TParsedInput, TOutput> {
178
233
  throw result.error;
179
234
  }
180
235
 
181
- return result.data as TOutput;
236
+ return result.data as TFinalOutput;
182
237
  }
183
238
 
184
239
  /**
@@ -186,15 +241,25 @@ export class Procedure<TInputContext, TContext, TInput, TParsedInput, TOutput> {
186
241
  * @param middlewares
187
242
  */
188
243
  public inheritMiddlewares(
189
- middlewares: MiddlewareFunction<TInputContext, TContext>[],
244
+ middlewares: MiddlewareFunction<TInputContext, TContext, TMeta>[],
190
245
  ): this {
191
246
  const Constructor: {
192
- new (opts: ProcedureOptions<TContext, TParsedInput, TOutput>): Procedure<
247
+ new (
248
+ opts: ProcedureOptions<
249
+ TContext,
250
+ TMeta,
251
+ TParsedInput,
252
+ TOutput,
253
+ TFinalOutput
254
+ >,
255
+ ): Procedure<
193
256
  TInputContext,
194
257
  TContext,
258
+ TMeta,
195
259
  TInput,
196
260
  TParsedInput,
197
- TOutput
261
+ TOutput,
262
+ TParsedOutput
198
263
  >;
199
264
  } = (this as any).constructor;
200
265
 
@@ -202,48 +267,92 @@ export class Procedure<TInputContext, TContext, TInput, TParsedInput, TOutput> {
202
267
  middlewares: [...middlewares, ...this.middlewares],
203
268
  resolver: this.resolver,
204
269
  inputParser: this.inputParser,
270
+ outputParser: this.outputParser,
271
+ meta: this.meta,
205
272
  });
206
273
 
207
274
  return instance as any;
208
275
  }
209
276
  }
210
277
 
211
- export type CreateProcedureWithInput<TContext, TInput, TParsedInput, TOutput> =
212
- {
213
- input: ProcedureInputParser<TInput>;
214
- resolve: ProcedureResolver<TContext, TParsedInput, TOutput>;
215
- };
278
+ export type CreateProcedureWithInput<TContext, TMeta, TInput, TOutput> = {
279
+ input: ProcedureParser<TInput>;
280
+ output?: ProcedureParser<TOutput>;
281
+ meta?: TMeta;
282
+ resolve: ProcedureResolver<TContext, TInput, InferLast<TOutput>>;
283
+ };
284
+
216
285
  export type CreateProcedureWithInputOutputParser<
217
286
  TContext,
287
+ TMeta,
218
288
  TInput,
219
289
  TParsedInput,
220
290
  TOutput,
291
+ TParsedOutput,
221
292
  > = {
222
- input: ProcedureInputParserWithInputOutput<TInput, TParsedInput>;
223
- resolve: ProcedureResolver<TContext, TParsedInput, TOutput>;
293
+ input: ProcedureParserWithInputOutput<TInput, TParsedInput>;
294
+ output?: ProcedureParserWithInputOutput<TOutput, TParsedOutput>;
295
+ meta?: TMeta;
296
+ resolve: ProcedureResolver<TContext, TParsedInput, InferLast<TOutput>>;
224
297
  };
225
- export type CreateProcedureWithoutInput<TContext, TOutput> = {
226
- resolve: ProcedureResolver<TContext, undefined, TOutput>;
298
+
299
+ export type CreateProcedureWithoutInput<
300
+ TContext,
301
+ TMeta,
302
+ TOutput,
303
+ TParsedOutput,
304
+ > = {
305
+ output?:
306
+ | ProcedureParserWithInputOutput<TOutput, TParsedOutput>
307
+ | ProcedureParser<TOutput>;
308
+ meta?: TMeta;
309
+ resolve: ProcedureResolver<TContext, undefined, InferLast<TOutput>>;
227
310
  };
228
311
 
229
312
  export type CreateProcedureOptions<
230
313
  TContext,
314
+ TMeta = undefined,
231
315
  TInput = undefined,
232
316
  TParsedInput = undefined,
233
317
  TOutput = undefined,
318
+ TParsedOutput = undefined,
234
319
  > =
235
- | CreateProcedureWithInput<TContext, TInput, TParsedInput, TOutput>
236
320
  | CreateProcedureWithInputOutputParser<
237
321
  TContext,
322
+ TMeta,
238
323
  TInput,
239
324
  TParsedInput,
240
- TOutput
325
+ TOutput,
326
+ TParsedOutput
241
327
  >
242
- | CreateProcedureWithoutInput<TContext, TOutput>;
328
+ | CreateProcedureWithInput<TContext, TMeta, TInput, TOutput>
329
+ | CreateProcedureWithoutInput<TContext, TMeta, TOutput, TParsedOutput>;
243
330
 
244
- export function createProcedure<TContext, TInput, TParsedInput, TOutput>(
245
- opts: CreateProcedureOptions<TContext, TInput, TParsedInput, TOutput>,
246
- ): Procedure<unknown, TContext, TInput, TParsedInput, TOutput> {
331
+ export function createProcedure<
332
+ TContext,
333
+ TMeta,
334
+ TInput,
335
+ TParsedInput,
336
+ TOutput,
337
+ TParsedOutput,
338
+ >(
339
+ opts: CreateProcedureOptions<
340
+ TContext,
341
+ TMeta,
342
+ TInput,
343
+ TParsedInput,
344
+ TOutput,
345
+ TParsedOutput
346
+ >,
347
+ ): Procedure<
348
+ unknown,
349
+ TContext,
350
+ TMeta,
351
+ TInput,
352
+ TParsedInput,
353
+ TOutput,
354
+ TParsedOutput
355
+ > {
247
356
  const inputParser =
248
357
  'input' in opts
249
358
  ? opts.input
@@ -257,27 +366,38 @@ export function createProcedure<TContext, TInput, TParsedInput, TOutput>(
257
366
  return undefined;
258
367
  };
259
368
 
369
+ const outputParser =
370
+ 'output' in opts && opts.output
371
+ ? opts.output
372
+ : (output: unknown) => output as TOutput;
373
+
260
374
  return new Procedure({
261
375
  inputParser: inputParser as any,
262
376
  resolver: opts.resolve as any,
263
377
  middlewares: [],
378
+ outputParser: outputParser as any,
379
+ meta: opts.meta as any,
264
380
  });
265
381
  }
266
382
 
267
383
  export type inferProcedureFromOptions<
268
384
  TInputContext,
269
- TOptions extends CreateProcedureOptions<any, any, any, any>,
385
+ TOptions extends CreateProcedureOptions<any, any, any, any, any, any>,
270
386
  > = TOptions extends CreateProcedureOptions<
271
387
  infer TContext,
388
+ infer TMeta,
272
389
  infer TInput,
273
390
  infer TParsedInput,
274
- infer TOutput
391
+ infer TOutput,
392
+ infer TParsedOutput
275
393
  >
276
394
  ? Procedure<
277
395
  TInputContext,
278
396
  TContext,
397
+ TMeta,
279
398
  unknown extends TInput ? undefined : TInput,
280
399
  unknown extends TParsedInput ? undefined : TParsedInput,
281
- TOutput
400
+ TOutput,
401
+ TParsedOutput
282
402
  >
283
403
  : never;
@@ -1,33 +1,38 @@
1
1
  import { AnyRouter } from '../router';
2
- import { TRPCResponse } from '../rpc';
2
+ import { TRPCResponse, TRPCResponseMessage } from '../rpc';
3
3
 
4
- function transformTRPCResponseItem(
5
- router: AnyRouter,
6
- item: TRPCResponse,
7
- ): TRPCResponse {
4
+ function transformTRPCResponseItem<
5
+ TResponseItem extends TRPCResponse | TRPCResponseMessage,
6
+ >(router: AnyRouter, item: TResponseItem): TResponseItem {
8
7
  if ('error' in item) {
9
8
  return {
10
9
  ...item,
11
10
  error: router._def.transformer.output.serialize(item.error),
12
11
  };
13
12
  }
14
- if (item.result.type !== 'data') {
15
- return item;
13
+
14
+ if ('data' in item.result) {
15
+ return {
16
+ ...item,
17
+ result: {
18
+ ...item.result,
19
+ data: router._def.transformer.output.serialize(item.result.data),
20
+ },
21
+ };
16
22
  }
17
- return {
18
- ...item,
19
- result: {
20
- ...item.result,
21
- data: router._def.transformer.output.serialize(item.result.data),
22
- },
23
- };
23
+
24
+ return item;
24
25
  }
25
26
 
26
27
  /**
27
28
  * Takes a unserialized `TRPCResponse` and serializes it with the router's transformers
28
29
  **/
29
30
  export function transformTRPCResponse<
30
- TResponse extends TRPCResponse | TRPCResponse[],
31
+ TResponse extends
32
+ | TRPCResponse
33
+ | TRPCResponse[]
34
+ | TRPCResponseMessage
35
+ | TRPCResponseMessage[],
31
36
  >(router: AnyRouter, itemOrItems: TResponse) {
32
37
  return Array.isArray(itemOrItems)
33
38
  ? itemOrItems.map((item) => transformTRPCResponseItem(router, item))
@@ -0,0 +1,4 @@
1
+ export * from './observable';
2
+ export * from './types';
3
+ export * from './operators';
4
+ export { observableToPromise } from './internals/observableToPromise';
@@ -0,0 +1,3 @@
1
+ export function identity<T>(x: T): T {
2
+ return x;
3
+ }
@@ -0,0 +1,49 @@
1
+ import { Observable } from '../types';
2
+
3
+ export class ObservableAbortError extends Error {
4
+ constructor(message: string) {
5
+ super(message);
6
+ this.name = 'ObservableAbortError';
7
+ Object.setPrototypeOf(this, ObservableAbortError.prototype);
8
+ }
9
+ }
10
+
11
+ /** @internal */
12
+ export function observableToPromise<TValue>(
13
+ observable: Observable<TValue, unknown>,
14
+ ) {
15
+ let abort: () => void;
16
+ const promise = new Promise<TValue>((resolve, reject) => {
17
+ let isDone = false;
18
+ function onDone() {
19
+ if (isDone) {
20
+ return;
21
+ }
22
+ isDone = true;
23
+ reject(new ObservableAbortError('This operation was cancelled.'));
24
+ obs$.unsubscribe();
25
+ }
26
+ const obs$ = observable.subscribe({
27
+ next(data) {
28
+ isDone = true;
29
+ resolve(data);
30
+ onDone();
31
+ },
32
+ error(data) {
33
+ isDone = true;
34
+ reject(data);
35
+ onDone();
36
+ },
37
+ complete() {
38
+ isDone = true;
39
+ onDone();
40
+ },
41
+ });
42
+ abort = onDone;
43
+ });
44
+ return {
45
+ promise,
46
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
47
+ abort: abort!,
48
+ };
49
+ }
@@ -0,0 +1,22 @@
1
+ import { UnaryFunction } from '../types';
2
+ import { identity } from './identity';
3
+
4
+ /** @internal */
5
+ export function pipeFromArray<T, R>(
6
+ fns: Array<UnaryFunction<T, R>>,
7
+ ): UnaryFunction<T, R> {
8
+ if (fns.length === 0) {
9
+ return identity as UnaryFunction<any, any>;
10
+ }
11
+
12
+ if (fns.length === 1) {
13
+ return fns[0];
14
+ }
15
+
16
+ return function piped(input: T): R {
17
+ return fns.reduce(
18
+ (prev: any, fn: UnaryFunction<T, R>) => fn(prev),
19
+ input as any,
20
+ );
21
+ };
22
+ }