@trpc/server 10.43.0 → 11.0.0-next.91

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 (164) hide show
  1. package/dist/adapters/aws-lambda/index.d.ts.map +1 -1
  2. package/dist/adapters/aws-lambda/index.js +6 -4
  3. package/dist/adapters/aws-lambda/index.mjs +6 -4
  4. package/dist/adapters/aws-lambda/utils.d.ts +3 -1
  5. package/dist/adapters/aws-lambda/utils.d.ts.map +1 -1
  6. package/dist/adapters/express.js +4 -3
  7. package/dist/adapters/express.mjs +4 -3
  8. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  9. package/dist/adapters/fastify/index.js +8 -5
  10. package/dist/adapters/fastify/index.mjs +8 -5
  11. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  12. package/dist/adapters/fetch/index.js +6 -4
  13. package/dist/adapters/fetch/index.mjs +6 -4
  14. package/dist/adapters/fetch/types.d.ts +2 -1
  15. package/dist/adapters/fetch/types.d.ts.map +1 -1
  16. package/dist/adapters/next.js +4 -3
  17. package/dist/adapters/next.mjs +4 -3
  18. package/dist/adapters/node-http/index.js +4 -3
  19. package/dist/adapters/node-http/index.mjs +4 -3
  20. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  21. package/dist/adapters/node-http/types.d.ts +2 -1
  22. package/dist/adapters/node-http/types.d.ts.map +1 -1
  23. package/dist/adapters/standalone.d.ts +1 -6
  24. package/dist/adapters/standalone.d.ts.map +1 -1
  25. package/dist/adapters/standalone.js +8 -19
  26. package/dist/adapters/standalone.mjs +8 -19
  27. package/dist/adapters/ws.d.ts +25 -4
  28. package/dist/adapters/ws.d.ts.map +1 -1
  29. package/dist/adapters/ws.js +67 -14
  30. package/dist/adapters/ws.mjs +58 -6
  31. package/dist/bundle-analysis.json +910 -0
  32. package/dist/config-5de7eae5.js +10 -0
  33. package/dist/config-60fc2667.js +7 -0
  34. package/dist/config-ab4c1c6b.mjs +5 -0
  35. package/dist/core/index.d.ts +1 -1
  36. package/dist/core/index.d.ts.map +1 -1
  37. package/dist/core/initTRPC.d.ts +1 -1
  38. package/dist/core/internals/builderTypes.d.ts +11 -0
  39. package/dist/core/internals/builderTypes.d.ts.map +1 -0
  40. package/dist/core/internals/getParseFn.d.ts +0 -5
  41. package/dist/core/internals/getParseFn.d.ts.map +1 -1
  42. package/dist/core/internals/mergeRouters.d.ts +0 -3
  43. package/dist/core/internals/mergeRouters.d.ts.map +1 -1
  44. package/dist/core/internals/procedureBuilder.d.ts +24 -27
  45. package/dist/core/internals/procedureBuilder.d.ts.map +1 -1
  46. package/dist/core/internals/utils.d.ts +7 -8
  47. package/dist/core/internals/utils.d.ts.map +1 -1
  48. package/dist/core/middleware.d.ts +16 -15
  49. package/dist/core/middleware.d.ts.map +1 -1
  50. package/dist/core/procedure.d.ts +41 -42
  51. package/dist/core/procedure.d.ts.map +1 -1
  52. package/dist/core/router.d.ts +9 -56
  53. package/dist/core/router.d.ts.map +1 -1
  54. package/dist/core/types.d.ts +7 -12
  55. package/dist/core/types.d.ts.map +1 -1
  56. package/dist/http/index.js +3 -2
  57. package/dist/http/index.mjs +3 -2
  58. package/dist/http/resolveHTTPResponse.d.ts +3 -3
  59. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  60. package/dist/http/types.d.ts +22 -1
  61. package/dist/http/types.d.ts.map +1 -1
  62. package/dist/index.d.ts +10 -2
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +24 -811
  65. package/dist/index.mjs +15 -802
  66. package/dist/{nodeHTTPRequestHandler-cf01c646.mjs → nodeHTTPRequestHandler-0986c5a1.mjs} +8 -3
  67. package/dist/{nodeHTTPRequestHandler-b7d358fe.js → nodeHTTPRequestHandler-18f3370e.js} +8 -3
  68. package/dist/{nodeHTTPRequestHandler-9781faee.js → nodeHTTPRequestHandler-388f5fce.js} +8 -3
  69. package/dist/{resolveHTTPResponse-68c8befb.mjs → resolveHTTPResponse-55c648bd.mjs} +14 -12
  70. package/dist/{resolveHTTPResponse-79011e44.js → resolveHTTPResponse-5def1b0c.js} +15 -13
  71. package/dist/{resolveHTTPResponse-051b3a40.js → resolveHTTPResponse-8d474952.js} +12 -12
  72. package/dist/{config-3ab6b85e.js → router-3c22fe56.js} +9 -46
  73. package/dist/{config-4c0f8e88.mjs → router-5274e533.mjs} +10 -45
  74. package/dist/{config-f356f2fd.js → router-a1635eab.js} +9 -44
  75. package/dist/rpc/envelopes.d.ts +1 -5
  76. package/dist/rpc/envelopes.d.ts.map +1 -1
  77. package/dist/rpc/index.d.ts +0 -1
  78. package/dist/rpc/index.d.ts.map +1 -1
  79. package/dist/rpc/index.js +0 -2
  80. package/dist/rpc/index.mjs +0 -1
  81. package/dist/shared/getErrorShape.d.ts +1 -1
  82. package/dist/shared/getErrorShape.d.ts.map +1 -1
  83. package/dist/shared/index.d.ts +1 -0
  84. package/dist/shared/index.d.ts.map +1 -1
  85. package/dist/shared/jsonify.d.ts +3 -2
  86. package/dist/shared/jsonify.d.ts.map +1 -1
  87. package/dist/shared/transformTRPCResponse.d.ts +1 -1
  88. package/dist/shared/transformTRPCResponse.d.ts.map +1 -1
  89. package/dist/shared/types.d.ts +6 -0
  90. package/dist/shared/types.d.ts.map +1 -0
  91. package/dist/types.d.ts +5 -0
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/unstableInternalsExport-10cc2bae.mjs +353 -0
  94. package/dist/unstableInternalsExport-a064a7dd.js +349 -0
  95. package/dist/unstableInternalsExport-bf8496ea.js +363 -0
  96. package/dist/unstableInternalsExport.d.ts +11 -0
  97. package/dist/unstableInternalsExport.d.ts.map +1 -0
  98. package/dist/unstableInternalsExport.js +16 -0
  99. package/dist/unstableInternalsExport.mjs +5 -0
  100. package/package.json +9 -3
  101. package/src/adapters/aws-lambda/index.ts +11 -7
  102. package/src/adapters/aws-lambda/utils.ts +3 -0
  103. package/src/adapters/fastify/fastifyRequestHandler.ts +9 -5
  104. package/src/adapters/fetch/fetchRequestHandler.ts +9 -3
  105. package/src/adapters/fetch/types.ts +2 -1
  106. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +15 -4
  107. package/src/adapters/node-http/types.ts +2 -1
  108. package/src/adapters/standalone.ts +4 -22
  109. package/src/adapters/ws.ts +110 -14
  110. package/src/core/index.ts +1 -0
  111. package/src/core/internals/builderTypes.ts +11 -0
  112. package/src/core/internals/getParseFn.ts +0 -13
  113. package/src/core/internals/mergeRouters.ts +0 -4
  114. package/src/core/internals/procedureBuilder.ts +50 -70
  115. package/src/core/internals/utils.ts +11 -8
  116. package/src/core/middleware.ts +37 -31
  117. package/src/core/procedure.ts +46 -54
  118. package/src/core/router.ts +19 -117
  119. package/src/core/types.ts +11 -20
  120. package/src/http/resolveHTTPResponse.ts +17 -14
  121. package/src/http/types.ts +24 -1
  122. package/src/index.ts +16 -2
  123. package/src/rpc/envelopes.ts +1 -6
  124. package/src/rpc/index.ts +0 -1
  125. package/src/shared/getErrorShape.ts +2 -1
  126. package/src/shared/index.ts +2 -0
  127. package/src/shared/jsonify.ts +9 -5
  128. package/src/shared/transformTRPCResponse.ts +1 -1
  129. package/src/shared/types.ts +9 -0
  130. package/src/types.ts +8 -0
  131. package/src/unstableInternalsExport.ts +10 -0
  132. package/unstableInternalsExport/index.d.ts +1 -0
  133. package/unstableInternalsExport/index.js +1 -0
  134. package/adapters/zodFileSchema/index.d.ts +0 -1
  135. package/adapters/zodFileSchema/index.js +0 -1
  136. package/dist/adapters/lambda/index.d.ts +0 -12
  137. package/dist/adapters/lambda/index.d.ts.map +0 -1
  138. package/dist/deprecated/internals/middlewares.d.ts +0 -52
  139. package/dist/deprecated/internals/middlewares.d.ts.map +0 -1
  140. package/dist/deprecated/internals/procedure.d.ts +0 -96
  141. package/dist/deprecated/internals/procedure.d.ts.map +0 -1
  142. package/dist/deprecated/interop.d.ts +0 -44
  143. package/dist/deprecated/interop.d.ts.map +0 -1
  144. package/dist/deprecated/router.d.ts +0 -204
  145. package/dist/deprecated/router.d.ts.map +0 -1
  146. package/dist/internals.d.ts +0 -10
  147. package/dist/internals.d.ts.map +0 -1
  148. package/dist/parseTRPCMessage-1377f305.js +0 -56
  149. package/dist/parseTRPCMessage-95955211.js +0 -63
  150. package/dist/parseTRPCMessage-a0f17853.mjs +0 -54
  151. package/dist/rpc/parseTRPCMessage.d.ts +0 -5
  152. package/dist/rpc/parseTRPCMessage.d.ts.map +0 -1
  153. package/dist/subscription.d.ts +0 -13
  154. package/dist/subscription.d.ts.map +0 -1
  155. package/dist/subscription.js +0 -38
  156. package/dist/subscription.mjs +0 -34
  157. package/src/adapters/lambda/index.ts +0 -18
  158. package/src/deprecated/internals/middlewares.ts +0 -61
  159. package/src/deprecated/internals/procedure.ts +0 -411
  160. package/src/deprecated/interop.ts +0 -232
  161. package/src/deprecated/router.ts +0 -945
  162. package/src/internals.ts +0 -12
  163. package/src/rpc/parseTRPCMessage.ts +0 -84
  164. package/src/subscription.ts +0 -43
@@ -0,0 +1,349 @@
1
+ import { d as defaultFormatter, a as defaultTransformer, c as createRouterFactory } from './router-a1635eab.js';
2
+ import { T as TRPCError, g as getTRPCErrorFromUnknown } from './TRPCError-efecb077.js';
3
+
4
+ /**
5
+ * @internal
6
+ */
7
+ function createMiddlewareFactory() {
8
+ function createMiddlewareInner(middlewares) {
9
+ return {
10
+ _middlewares: middlewares,
11
+ unstable_pipe(middlewareBuilderOrFn) {
12
+ const pipedMiddleware = '_middlewares' in middlewareBuilderOrFn
13
+ ? middlewareBuilderOrFn._middlewares
14
+ : [middlewareBuilderOrFn];
15
+ return createMiddlewareInner([
16
+ ...middlewares,
17
+ ...pipedMiddleware,
18
+ ]);
19
+ },
20
+ };
21
+ }
22
+ function createMiddleware(fn) {
23
+ return createMiddlewareInner([fn]);
24
+ }
25
+ return createMiddleware;
26
+ }
27
+ const experimental_standaloneMiddleware = () => ({
28
+ create: createMiddlewareFactory(),
29
+ });
30
+ function isPlainObject(obj) {
31
+ return obj && typeof obj === 'object' && !Array.isArray(obj);
32
+ }
33
+ /**
34
+ * @internal
35
+ * Please note, `trpc-openapi` uses this function.
36
+ */
37
+ function createInputMiddleware(parse) {
38
+ const inputMiddleware = async (opts) => {
39
+ let parsedInput;
40
+ const rawInput = await opts.getRawInput();
41
+ try {
42
+ parsedInput = await parse(rawInput);
43
+ }
44
+ catch (cause) {
45
+ throw new TRPCError({
46
+ code: 'BAD_REQUEST',
47
+ cause,
48
+ });
49
+ }
50
+ // Multiple input parsers
51
+ const combinedInput = isPlainObject(opts.input) && isPlainObject(parsedInput)
52
+ ? {
53
+ ...opts.input,
54
+ ...parsedInput,
55
+ }
56
+ : parsedInput;
57
+ return opts.next({ input: combinedInput });
58
+ };
59
+ inputMiddleware._type = 'input';
60
+ return inputMiddleware;
61
+ }
62
+ /**
63
+ * @internal
64
+ */
65
+ function createOutputMiddleware(parse) {
66
+ const outputMiddleware = async ({ next }) => {
67
+ const result = await next();
68
+ if (!result.ok) {
69
+ // pass through failures without validating
70
+ return result;
71
+ }
72
+ try {
73
+ const data = await parse(result.data);
74
+ return {
75
+ ...result,
76
+ data,
77
+ };
78
+ }
79
+ catch (cause) {
80
+ throw new TRPCError({
81
+ message: 'Output validation failed',
82
+ code: 'INTERNAL_SERVER_ERROR',
83
+ cause,
84
+ });
85
+ }
86
+ };
87
+ outputMiddleware._type = 'output';
88
+ return outputMiddleware;
89
+ }
90
+
91
+ /**
92
+ * Ensures there are no duplicate keys when building a procedure.
93
+ */
94
+ function mergeWithoutOverrides(obj1, ...objs) {
95
+ const newObj = Object.assign(Object.create(null), obj1);
96
+ for (const overrides of objs) {
97
+ for (const key in overrides) {
98
+ if (key in newObj && newObj[key] !== overrides[key]) {
99
+ throw new Error(`Duplicate key ${key}`);
100
+ }
101
+ newObj[key] = overrides[key];
102
+ }
103
+ }
104
+ return newObj;
105
+ }
106
+
107
+ function mergeRouters(...routerList) {
108
+ const record = mergeWithoutOverrides({}, ...routerList.map((r) => r._def.record));
109
+ const errorFormatter = routerList.reduce((currentErrorFormatter, nextRouter) => {
110
+ if (nextRouter._def._config.errorFormatter &&
111
+ nextRouter._def._config.errorFormatter !== defaultFormatter) {
112
+ if (currentErrorFormatter !== defaultFormatter &&
113
+ currentErrorFormatter !== nextRouter._def._config.errorFormatter) {
114
+ throw new Error('You seem to have several error formatters');
115
+ }
116
+ return nextRouter._def._config.errorFormatter;
117
+ }
118
+ return currentErrorFormatter;
119
+ }, defaultFormatter);
120
+ const transformer = routerList.reduce((prev, current) => {
121
+ if (current._def._config.transformer &&
122
+ current._def._config.transformer !== defaultTransformer) {
123
+ if (prev !== defaultTransformer &&
124
+ prev !== current._def._config.transformer) {
125
+ throw new Error('You seem to have several transformers');
126
+ }
127
+ return current._def._config.transformer;
128
+ }
129
+ return prev;
130
+ }, defaultTransformer);
131
+ const router = createRouterFactory({
132
+ errorFormatter,
133
+ transformer,
134
+ isDev: routerList.some((r) => r._def._config.isDev),
135
+ allowOutsideOfServer: routerList.some((r) => r._def._config.allowOutsideOfServer),
136
+ isServer: routerList.some((r) => r._def._config.isServer),
137
+ $types: routerList[0]?._def._config.$types,
138
+ })(record);
139
+ return router;
140
+ }
141
+
142
+ function getParseFn(procedureParser) {
143
+ const parser = procedureParser;
144
+ if (typeof parser === 'function') {
145
+ // ParserCustomValidatorEsque
146
+ return parser;
147
+ }
148
+ if (typeof parser.parseAsync === 'function') {
149
+ // ParserZodEsque
150
+ return parser.parseAsync.bind(parser);
151
+ }
152
+ if (typeof parser.parse === 'function') {
153
+ // ParserZodEsque
154
+ // ParserValibotEsque (<= v0.12.X)
155
+ return parser.parse.bind(parser);
156
+ }
157
+ if (typeof parser.validateSync === 'function') {
158
+ // ParserYupEsque
159
+ return parser.validateSync.bind(parser);
160
+ }
161
+ if (typeof parser.create === 'function') {
162
+ // ParserSuperstructEsque
163
+ return parser.create.bind(parser);
164
+ }
165
+ if (typeof parser.assert === 'function') {
166
+ // ParserScaleEsque
167
+ return (value) => {
168
+ parser.assert(value);
169
+ return value;
170
+ };
171
+ }
172
+ throw new Error('Could not find a validator fn');
173
+ }
174
+
175
+ /**
176
+ * @internal
177
+ */
178
+ const middlewareMarker = 'middlewareMarker';
179
+ /**
180
+ * @internal
181
+ */
182
+ const unsetMarker = Symbol('unsetMarker');
183
+
184
+ function createNewBuilder(def1, def2) {
185
+ const { middlewares = [], inputs, meta, ...rest } = def2;
186
+ // TODO: maybe have a fn here to warn about calls
187
+ return createBuilder({
188
+ ...mergeWithoutOverrides(def1, rest),
189
+ inputs: [...def1.inputs, ...(inputs ?? [])],
190
+ middlewares: [...def1.middlewares, ...middlewares],
191
+ meta: def1.meta && meta ? { ...def1.meta, ...meta } : meta ?? def1.meta,
192
+ });
193
+ }
194
+ function createBuilder(initDef = {}) {
195
+ const _def = {
196
+ procedure: true,
197
+ inputs: [],
198
+ middlewares: [],
199
+ ...initDef,
200
+ };
201
+ return {
202
+ _def,
203
+ input(input) {
204
+ const parser = getParseFn(input);
205
+ return createNewBuilder(_def, {
206
+ inputs: [input],
207
+ middlewares: [createInputMiddleware(parser)],
208
+ });
209
+ },
210
+ output(output) {
211
+ const parseOutput = getParseFn(output);
212
+ return createNewBuilder(_def, {
213
+ output,
214
+ middlewares: [createOutputMiddleware(parseOutput)],
215
+ });
216
+ },
217
+ meta(meta) {
218
+ return createNewBuilder(_def, {
219
+ meta: meta,
220
+ });
221
+ },
222
+ use(middlewareBuilderOrFn) {
223
+ // Distinguish between a middleware builder and a middleware function
224
+ const middlewares = '_middlewares' in middlewareBuilderOrFn
225
+ ? middlewareBuilderOrFn._middlewares
226
+ : [middlewareBuilderOrFn];
227
+ return createNewBuilder(_def, {
228
+ middlewares: middlewares,
229
+ });
230
+ },
231
+ query(resolver) {
232
+ return createResolver({ ..._def, type: 'query' }, resolver);
233
+ },
234
+ mutation(resolver) {
235
+ return createResolver({ ..._def, type: 'mutation' }, resolver);
236
+ },
237
+ subscription(resolver) {
238
+ return createResolver({ ..._def, type: 'subscription' }, resolver);
239
+ },
240
+ };
241
+ }
242
+ function createResolver(_def, resolver) {
243
+ const finalBuilder = createNewBuilder(_def, {
244
+ resolver,
245
+ middlewares: [
246
+ async function resolveMiddleware(opts) {
247
+ const data = await resolver(opts);
248
+ return {
249
+ marker: middlewareMarker,
250
+ ok: true,
251
+ data,
252
+ ctx: opts.ctx,
253
+ };
254
+ },
255
+ ],
256
+ });
257
+ return createProcedureCaller(finalBuilder._def);
258
+ }
259
+ const codeblock = `
260
+ If you want to call this function on the server, you do the following:
261
+ This is a client-only function.
262
+
263
+ const caller = appRouter.createCaller({
264
+ /* ... your context */
265
+ });
266
+
267
+ const result = await caller.call('myProcedure', input);
268
+ `.trim();
269
+ function createProcedureCaller(_def) {
270
+ async function procedure(opts) {
271
+ // is direct server-side call
272
+ if (!opts || !('getRawInput' in opts)) {
273
+ throw new Error(codeblock);
274
+ }
275
+ // run the middlewares recursively with the resolver as the last one
276
+ const callRecursive = async (callOpts = {
277
+ index: 0,
278
+ ctx: opts.ctx,
279
+ }) => {
280
+ try {
281
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
282
+ const middleware = _def.middlewares[callOpts.index];
283
+ const result = await middleware({
284
+ ctx: callOpts.ctx,
285
+ type: opts.type,
286
+ path: opts.path,
287
+ getRawInput: callOpts.getRawInput ?? opts.getRawInput,
288
+ meta: _def.meta,
289
+ input: callOpts.input,
290
+ next(_nextOpts) {
291
+ const nextOpts = _nextOpts;
292
+ return callRecursive({
293
+ index: callOpts.index + 1,
294
+ ctx: nextOpts && 'ctx' in nextOpts
295
+ ? { ...callOpts.ctx, ...nextOpts.ctx }
296
+ : callOpts.ctx,
297
+ input: nextOpts && 'input' in nextOpts
298
+ ? nextOpts.input
299
+ : callOpts.input,
300
+ getRawInput: nextOpts && 'getRawInput' in nextOpts
301
+ ? nextOpts.getRawInput
302
+ : callOpts.getRawInput,
303
+ });
304
+ },
305
+ });
306
+ return result;
307
+ }
308
+ catch (cause) {
309
+ return {
310
+ ok: false,
311
+ error: getTRPCErrorFromUnknown(cause),
312
+ marker: middlewareMarker,
313
+ };
314
+ }
315
+ };
316
+ // there's always at least one "next" since we wrap this.resolver in a middleware
317
+ const result = await callRecursive();
318
+ if (!result) {
319
+ throw new TRPCError({
320
+ code: 'INTERNAL_SERVER_ERROR',
321
+ message: 'No result from middlewares - did you forget to `return next()`?',
322
+ });
323
+ }
324
+ if (!result.ok) {
325
+ // re-throw original error
326
+ throw result.error;
327
+ }
328
+ return result.data;
329
+ }
330
+ procedure._def = _def;
331
+ // FIXME typecast shouldn't be needed - fixittt
332
+ return procedure;
333
+ }
334
+
335
+ /**
336
+ * These types have to be exported so users can generate their own types definitions files
337
+ *
338
+ * @remark Do not `import` anything here as it will be unreliable between minor versions of tRPC
339
+ */
340
+
341
+ var unstableInternalsExport = /*#__PURE__*/Object.freeze({
342
+ __proto__: null,
343
+ mergeRouters: mergeRouters,
344
+ createBuilder: createBuilder,
345
+ middlewareMarker: middlewareMarker,
346
+ unsetMarker: unsetMarker
347
+ });
348
+
349
+ export { createMiddlewareFactory as a, createInputMiddleware as b, createBuilder as c, createOutputMiddleware as d, experimental_standaloneMiddleware as e, middlewareMarker as f, unsetMarker as g, mergeRouters as m, unstableInternalsExport as u };
@@ -0,0 +1,363 @@
1
+ 'use strict';
2
+
3
+ var router = require('./router-3c22fe56.js');
4
+ var TRPCError = require('./TRPCError-ae7b67e8.js');
5
+
6
+ /**
7
+ * @internal
8
+ */ function createMiddlewareFactory() {
9
+ function createMiddlewareInner(middlewares) {
10
+ return {
11
+ _middlewares: middlewares,
12
+ unstable_pipe (middlewareBuilderOrFn) {
13
+ const pipedMiddleware = '_middlewares' in middlewareBuilderOrFn ? middlewareBuilderOrFn._middlewares : [
14
+ middlewareBuilderOrFn
15
+ ];
16
+ return createMiddlewareInner([
17
+ ...middlewares,
18
+ ...pipedMiddleware
19
+ ]);
20
+ }
21
+ };
22
+ }
23
+ function createMiddleware(fn) {
24
+ return createMiddlewareInner([
25
+ fn
26
+ ]);
27
+ }
28
+ return createMiddleware;
29
+ }
30
+ const experimental_standaloneMiddleware = ()=>({
31
+ create: createMiddlewareFactory()
32
+ });
33
+ function isPlainObject(obj) {
34
+ return obj && typeof obj === 'object' && !Array.isArray(obj);
35
+ }
36
+ /**
37
+ * @internal
38
+ * Please note, `trpc-openapi` uses this function.
39
+ */ function createInputMiddleware(parse) {
40
+ const inputMiddleware = async (opts)=>{
41
+ let parsedInput;
42
+ const rawInput = await opts.getRawInput();
43
+ try {
44
+ parsedInput = await parse(rawInput);
45
+ } catch (cause) {
46
+ throw new TRPCError.TRPCError({
47
+ code: 'BAD_REQUEST',
48
+ cause
49
+ });
50
+ }
51
+ // Multiple input parsers
52
+ const combinedInput = isPlainObject(opts.input) && isPlainObject(parsedInput) ? {
53
+ ...opts.input,
54
+ ...parsedInput
55
+ } : parsedInput;
56
+ return opts.next({
57
+ input: combinedInput
58
+ });
59
+ };
60
+ inputMiddleware._type = 'input';
61
+ return inputMiddleware;
62
+ }
63
+ /**
64
+ * @internal
65
+ */ function createOutputMiddleware(parse) {
66
+ const outputMiddleware = async ({ next })=>{
67
+ const result = await next();
68
+ if (!result.ok) {
69
+ // pass through failures without validating
70
+ return result;
71
+ }
72
+ try {
73
+ const data = await parse(result.data);
74
+ return {
75
+ ...result,
76
+ data
77
+ };
78
+ } catch (cause) {
79
+ throw new TRPCError.TRPCError({
80
+ message: 'Output validation failed',
81
+ code: 'INTERNAL_SERVER_ERROR',
82
+ cause
83
+ });
84
+ }
85
+ };
86
+ outputMiddleware._type = 'output';
87
+ return outputMiddleware;
88
+ }
89
+
90
+ /**
91
+ * Ensures there are no duplicate keys when building a procedure.
92
+ */ function mergeWithoutOverrides(obj1, ...objs) {
93
+ const newObj = Object.assign(Object.create(null), obj1);
94
+ for (const overrides of objs){
95
+ for(const key in overrides){
96
+ if (key in newObj && newObj[key] !== overrides[key]) {
97
+ throw new Error(`Duplicate key ${key}`);
98
+ }
99
+ newObj[key] = overrides[key];
100
+ }
101
+ }
102
+ return newObj;
103
+ }
104
+
105
+ function mergeRouters(...routerList) {
106
+ const record = mergeWithoutOverrides({}, ...routerList.map((r)=>r._def.record));
107
+ const errorFormatter = routerList.reduce((currentErrorFormatter, nextRouter)=>{
108
+ if (nextRouter._def._config.errorFormatter && nextRouter._def._config.errorFormatter !== router.defaultFormatter) {
109
+ if (currentErrorFormatter !== router.defaultFormatter && currentErrorFormatter !== nextRouter._def._config.errorFormatter) {
110
+ throw new Error('You seem to have several error formatters');
111
+ }
112
+ return nextRouter._def._config.errorFormatter;
113
+ }
114
+ return currentErrorFormatter;
115
+ }, router.defaultFormatter);
116
+ const transformer = routerList.reduce((prev, current)=>{
117
+ if (current._def._config.transformer && current._def._config.transformer !== router.defaultTransformer) {
118
+ if (prev !== router.defaultTransformer && prev !== current._def._config.transformer) {
119
+ throw new Error('You seem to have several transformers');
120
+ }
121
+ return current._def._config.transformer;
122
+ }
123
+ return prev;
124
+ }, router.defaultTransformer);
125
+ const router$1 = router.createRouterFactory({
126
+ errorFormatter,
127
+ transformer,
128
+ isDev: routerList.some((r)=>r._def._config.isDev),
129
+ allowOutsideOfServer: routerList.some((r)=>r._def._config.allowOutsideOfServer),
130
+ isServer: routerList.some((r)=>r._def._config.isServer),
131
+ $types: routerList[0]?._def._config.$types
132
+ })(record);
133
+ return router$1;
134
+ }
135
+
136
+ function getParseFn(procedureParser) {
137
+ const parser = procedureParser;
138
+ if (typeof parser === 'function') {
139
+ // ParserCustomValidatorEsque
140
+ return parser;
141
+ }
142
+ if (typeof parser.parseAsync === 'function') {
143
+ // ParserZodEsque
144
+ return parser.parseAsync.bind(parser);
145
+ }
146
+ if (typeof parser.parse === 'function') {
147
+ // ParserZodEsque
148
+ // ParserValibotEsque (<= v0.12.X)
149
+ return parser.parse.bind(parser);
150
+ }
151
+ if (typeof parser.validateSync === 'function') {
152
+ // ParserYupEsque
153
+ return parser.validateSync.bind(parser);
154
+ }
155
+ if (typeof parser.create === 'function') {
156
+ // ParserSuperstructEsque
157
+ return parser.create.bind(parser);
158
+ }
159
+ if (typeof parser.assert === 'function') {
160
+ // ParserScaleEsque
161
+ return (value)=>{
162
+ parser.assert(value);
163
+ return value;
164
+ };
165
+ }
166
+ throw new Error('Could not find a validator fn');
167
+ }
168
+
169
+ /**
170
+ * @internal
171
+ */ const middlewareMarker = 'middlewareMarker';
172
+ /**
173
+ * @internal
174
+ */ const unsetMarker = Symbol('unsetMarker');
175
+
176
+ function createNewBuilder(def1, def2) {
177
+ const { middlewares =[] , inputs , meta , ...rest } = def2;
178
+ // TODO: maybe have a fn here to warn about calls
179
+ return createBuilder({
180
+ ...mergeWithoutOverrides(def1, rest),
181
+ inputs: [
182
+ ...def1.inputs,
183
+ ...inputs ?? []
184
+ ],
185
+ middlewares: [
186
+ ...def1.middlewares,
187
+ ...middlewares
188
+ ],
189
+ meta: def1.meta && meta ? {
190
+ ...def1.meta,
191
+ ...meta
192
+ } : meta ?? def1.meta
193
+ });
194
+ }
195
+ function createBuilder(initDef = {}) {
196
+ const _def = {
197
+ procedure: true,
198
+ inputs: [],
199
+ middlewares: [],
200
+ ...initDef
201
+ };
202
+ return {
203
+ _def,
204
+ input (input) {
205
+ const parser = getParseFn(input);
206
+ return createNewBuilder(_def, {
207
+ inputs: [
208
+ input
209
+ ],
210
+ middlewares: [
211
+ createInputMiddleware(parser)
212
+ ]
213
+ });
214
+ },
215
+ output (output) {
216
+ const parseOutput = getParseFn(output);
217
+ return createNewBuilder(_def, {
218
+ output,
219
+ middlewares: [
220
+ createOutputMiddleware(parseOutput)
221
+ ]
222
+ });
223
+ },
224
+ meta (meta) {
225
+ return createNewBuilder(_def, {
226
+ meta: meta
227
+ });
228
+ },
229
+ use (middlewareBuilderOrFn) {
230
+ // Distinguish between a middleware builder and a middleware function
231
+ const middlewares = '_middlewares' in middlewareBuilderOrFn ? middlewareBuilderOrFn._middlewares : [
232
+ middlewareBuilderOrFn
233
+ ];
234
+ return createNewBuilder(_def, {
235
+ middlewares: middlewares
236
+ });
237
+ },
238
+ query (resolver) {
239
+ return createResolver({
240
+ ..._def,
241
+ type: 'query'
242
+ }, resolver);
243
+ },
244
+ mutation (resolver) {
245
+ return createResolver({
246
+ ..._def,
247
+ type: 'mutation'
248
+ }, resolver);
249
+ },
250
+ subscription (resolver) {
251
+ return createResolver({
252
+ ..._def,
253
+ type: 'subscription'
254
+ }, resolver);
255
+ }
256
+ };
257
+ }
258
+ function createResolver(_def, resolver) {
259
+ const finalBuilder = createNewBuilder(_def, {
260
+ resolver,
261
+ middlewares: [
262
+ async function resolveMiddleware(opts) {
263
+ const data = await resolver(opts);
264
+ return {
265
+ marker: middlewareMarker,
266
+ ok: true,
267
+ data,
268
+ ctx: opts.ctx
269
+ };
270
+ }
271
+ ]
272
+ });
273
+ return createProcedureCaller(finalBuilder._def);
274
+ }
275
+ const codeblock = `
276
+ If you want to call this function on the server, you do the following:
277
+ This is a client-only function.
278
+
279
+ const caller = appRouter.createCaller({
280
+ /* ... your context */
281
+ });
282
+
283
+ const result = await caller.call('myProcedure', input);
284
+ `.trim();
285
+ function createProcedureCaller(_def) {
286
+ async function procedure(opts) {
287
+ // is direct server-side call
288
+ if (!opts || !('getRawInput' in opts)) {
289
+ throw new Error(codeblock);
290
+ }
291
+ // run the middlewares recursively with the resolver as the last one
292
+ const callRecursive = async (callOpts = {
293
+ index: 0,
294
+ ctx: opts.ctx
295
+ })=>{
296
+ try {
297
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
298
+ const middleware = _def.middlewares[callOpts.index];
299
+ const result = await middleware({
300
+ ctx: callOpts.ctx,
301
+ type: opts.type,
302
+ path: opts.path,
303
+ getRawInput: callOpts.getRawInput ?? opts.getRawInput,
304
+ meta: _def.meta,
305
+ input: callOpts.input,
306
+ next (_nextOpts) {
307
+ const nextOpts = _nextOpts;
308
+ return callRecursive({
309
+ index: callOpts.index + 1,
310
+ ctx: nextOpts && 'ctx' in nextOpts ? {
311
+ ...callOpts.ctx,
312
+ ...nextOpts.ctx
313
+ } : callOpts.ctx,
314
+ input: nextOpts && 'input' in nextOpts ? nextOpts.input : callOpts.input,
315
+ getRawInput: nextOpts && 'getRawInput' in nextOpts ? nextOpts.getRawInput : callOpts.getRawInput
316
+ });
317
+ }
318
+ });
319
+ return result;
320
+ } catch (cause) {
321
+ return {
322
+ ok: false,
323
+ error: TRPCError.getTRPCErrorFromUnknown(cause),
324
+ marker: middlewareMarker
325
+ };
326
+ }
327
+ };
328
+ // there's always at least one "next" since we wrap this.resolver in a middleware
329
+ const result = await callRecursive();
330
+ if (!result) {
331
+ throw new TRPCError.TRPCError({
332
+ code: 'INTERNAL_SERVER_ERROR',
333
+ message: 'No result from middlewares - did you forget to `return next()`?'
334
+ });
335
+ }
336
+ if (!result.ok) {
337
+ // re-throw original error
338
+ throw result.error;
339
+ }
340
+ return result.data;
341
+ }
342
+ procedure._def = _def;
343
+ // FIXME typecast shouldn't be needed - fixittt
344
+ return procedure;
345
+ }
346
+
347
+ var unstableInternalsExport = /*#__PURE__*/Object.freeze({
348
+ __proto__: null,
349
+ mergeRouters: mergeRouters,
350
+ createBuilder: createBuilder,
351
+ middlewareMarker: middlewareMarker,
352
+ unsetMarker: unsetMarker
353
+ });
354
+
355
+ exports.createBuilder = createBuilder;
356
+ exports.createInputMiddleware = createInputMiddleware;
357
+ exports.createMiddlewareFactory = createMiddlewareFactory;
358
+ exports.createOutputMiddleware = createOutputMiddleware;
359
+ exports.experimental_standaloneMiddleware = experimental_standaloneMiddleware;
360
+ exports.mergeRouters = mergeRouters;
361
+ exports.middlewareMarker = middlewareMarker;
362
+ exports.unsetMarker = unsetMarker;
363
+ exports.unstableInternalsExport = unstableInternalsExport;