@trpc/server 10.0.0-alpha.41 → 10.0.0-alpha.44

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 (87) hide show
  1. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.dev.js +4 -4
  2. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.cjs.prod.js +4 -4
  3. package/adapters/aws-lambda/dist/trpc-server-adapters-aws-lambda.esm.js +4 -4
  4. package/adapters/aws-lambda/index.js +1 -1
  5. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +3 -3
  6. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +3 -3
  7. package/adapters/express/dist/trpc-server-adapters-express.esm.js +3 -3
  8. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +3 -3
  9. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +3 -3
  10. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +3 -3
  11. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.dev.js +4 -4
  12. package/adapters/lambda/dist/trpc-server-adapters-lambda.cjs.prod.js +4 -4
  13. package/adapters/lambda/dist/trpc-server-adapters-lambda.esm.js +4 -4
  14. package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +3 -3
  15. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +3 -3
  16. package/adapters/next/dist/trpc-server-adapters-next.esm.js +3 -3
  17. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +3 -3
  18. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +3 -3
  19. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +3 -3
  20. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +3 -3
  21. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +3 -3
  22. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +3 -3
  23. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.dev.js +2 -2
  24. package/adapters/ws/dist/trpc-server-adapters-ws.cjs.prod.js +2 -2
  25. package/adapters/ws/dist/trpc-server-adapters-ws.esm.js +2 -2
  26. package/dist/{TRPCError-b7fa0c31.mjs → TRPCError-97212592.mjs} +1 -1
  27. package/dist/adapters/aws-lambda/index.js +190 -0
  28. package/dist/adapters/aws-lambda/index.mjs +186 -0
  29. package/dist/adapters/aws-lambda/index.ts.js +1 -0
  30. package/dist/adapters/express.js +3 -3
  31. package/dist/adapters/express.mjs +4 -4
  32. package/dist/adapters/fastify/index.js +2 -2
  33. package/dist/adapters/fastify/index.mjs +3 -3
  34. package/dist/adapters/fetch/index.js +2 -2
  35. package/dist/adapters/fetch/index.mjs +3 -3
  36. package/dist/adapters/next.js +3 -3
  37. package/dist/adapters/next.mjs +4 -4
  38. package/dist/adapters/node-http/index.js +3 -3
  39. package/dist/adapters/node-http/index.mjs +4 -4
  40. package/dist/adapters/standalone.js +3 -3
  41. package/dist/adapters/standalone.mjs +4 -4
  42. package/dist/adapters/ws.mjs +1 -1
  43. package/dist/core/index.d.ts +1 -1
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/initTRPC.d.ts +8 -0
  46. package/dist/core/initTRPC.d.ts.map +1 -1
  47. package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts +20 -0
  48. package/dist/core/internals/__generated__/mergeRoutersGeneric.d.ts.map +1 -1
  49. package/dist/core/internals/procedureBuilder.d.ts +1 -6
  50. package/dist/core/internals/procedureBuilder.d.ts.map +1 -1
  51. package/dist/core/procedure.d.ts +1 -0
  52. package/dist/core/procedure.d.ts.map +1 -1
  53. package/dist/core/router.d.ts +31 -23
  54. package/dist/core/router.d.ts.map +1 -1
  55. package/dist/deprecated/interop.d.ts +29 -2
  56. package/dist/deprecated/interop.d.ts.map +1 -1
  57. package/dist/deprecated/router.d.ts.map +1 -1
  58. package/dist/{envelopes-b6dd0367.js → envelopes-2ae27c9f.js} +1 -4
  59. package/dist/{envelopes-af8c2959.mjs → envelopes-b9f49d4d.mjs} +1 -4
  60. package/dist/error/TRPCError.d.ts +1 -1
  61. package/dist/index.js +22 -1114
  62. package/dist/index.mjs +8 -1101
  63. package/dist/internals/transformTRPCResponse.d.ts +2 -2
  64. package/dist/internals/transformTRPCResponse.d.ts.map +1 -1
  65. package/dist/{nodeHTTPRequestHandler-6b7c8622.js → nodeHTTPRequestHandler-bee7aacc.js} +1 -1
  66. package/dist/{nodeHTTPRequestHandler-174459c5.mjs → nodeHTTPRequestHandler-f1656eba.mjs} +2 -2
  67. package/dist/{resolveHTTPResponse-8657b8de.mjs → resolveHTTPResponse-455f1e51.mjs} +2 -2
  68. package/dist/{resolveHTTPResponse-fcc8f644.js → resolveHTTPResponse-5d90abc5.js} +1 -1
  69. package/dist/router-4e50a6ac.js +1104 -0
  70. package/dist/router-a3db8f3a.mjs +1094 -0
  71. package/dist/rpc/envelopes.d.ts +22 -21
  72. package/dist/rpc/envelopes.d.ts.map +1 -1
  73. package/dist/rpc/index.js +1 -1
  74. package/dist/rpc/index.mjs +1 -1
  75. package/dist/subscription.mjs +1 -1
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +6 -5
  78. package/src/core/index.ts +5 -1
  79. package/src/core/initTRPC.ts +0 -1
  80. package/src/core/internals/__generated__/mergeRoutersGeneric.ts +20 -0
  81. package/src/core/internals/procedureBuilder.ts +0 -22
  82. package/src/core/procedure.ts +1 -0
  83. package/src/core/router.ts +29 -44
  84. package/src/deprecated/interop.ts +47 -4
  85. package/src/deprecated/router.ts +0 -2
  86. package/src/rpc/envelopes.ts +32 -25
  87. package/src/types.ts +0 -1
@@ -0,0 +1,1094 @@
1
+ import { a as assertNotBrowser, g as getHTTPStatusCodeFromError } from './resolveHTTPResponse-455f1e51.mjs';
2
+ import { T as TRPC_ERROR_CODES_BY_KEY } from './envelopes-b9f49d4d.mjs';
3
+ import { T as TRPCError, a as getCauseFromUnknown, g as getErrorFromUnknown } from './TRPCError-97212592.mjs';
4
+ import { c as createProxy } from './index-a3bd54c7.mjs';
5
+
6
+ assertNotBrowser();
7
+
8
+ /* eslint-disable @typescript-eslint/no-explicit-any */
9
+
10
+ /**
11
+ * @public
12
+ */
13
+
14
+ /**
15
+ * @public
16
+ */
17
+
18
+ /**
19
+ * @public
20
+ */
21
+
22
+ /**
23
+ * @public
24
+ */
25
+
26
+ /**
27
+ * @public
28
+ */
29
+
30
+ /**
31
+ * @internal
32
+ */
33
+ function getDataTransformer$1(transformer) {
34
+ if ('input' in transformer) {
35
+ return transformer;
36
+ }
37
+
38
+ return {
39
+ input: transformer,
40
+ output: transformer
41
+ };
42
+ }
43
+ /**
44
+ * @internal
45
+ */
46
+
47
+ /**
48
+ * @internal
49
+ */
50
+ const defaultTransformer = {
51
+ _default: true,
52
+ input: {
53
+ serialize: obj => obj,
54
+ deserialize: obj => obj
55
+ },
56
+ output: {
57
+ serialize: obj => obj,
58
+ deserialize: obj => obj
59
+ }
60
+ };
61
+
62
+ /**
63
+ * @internal
64
+ */
65
+
66
+ /**
67
+ * @internal
68
+ */
69
+
70
+ /**
71
+ * @internal
72
+ */
73
+ const defaultFormatter = ({
74
+ shape
75
+ }) => {
76
+ return shape;
77
+ };
78
+
79
+ /**
80
+ * @deprecated
81
+ */
82
+ const middlewareMarker$1 = 'middlewareMarker';
83
+
84
+ /* eslint-disable @typescript-eslint/no-explicit-any */
85
+ assertNotBrowser();
86
+
87
+ function getParseFn$1(procedureParser) {
88
+ const parser = procedureParser;
89
+
90
+ if (typeof parser === 'function') {
91
+ // ProcedureParserCustomValidatorEsque
92
+ return parser;
93
+ }
94
+
95
+ if (typeof parser.parseAsync === 'function') {
96
+ // ProcedureParserZodEsque
97
+ return parser.parseAsync.bind(parser);
98
+ }
99
+
100
+ if (typeof parser.parse === 'function') {
101
+ // ProcedureParserZodEsque
102
+ return parser.parse.bind(parser);
103
+ }
104
+
105
+ if (typeof parser.validateSync === 'function') {
106
+ // ProcedureParserYupEsque
107
+ return parser.validateSync.bind(parser);
108
+ }
109
+
110
+ if (typeof parser.create === 'function') {
111
+ // ProcedureParserSuperstructEsque
112
+ return parser.create.bind(parser);
113
+ }
114
+
115
+ throw new Error('Could not find a validator fn');
116
+ }
117
+ /**
118
+ * @internal
119
+ * @deprecated
120
+ */
121
+
122
+
123
+ class Procedure {
124
+ constructor(opts) {
125
+ this.middlewares = void 0;
126
+ this.resolver = void 0;
127
+ this.inputParser = void 0;
128
+ this.parseInputFn = void 0;
129
+ this.outputParser = void 0;
130
+ this.parseOutputFn = void 0;
131
+ this.meta = void 0;
132
+ this.middlewares = opts.middlewares;
133
+ this.resolver = opts.resolver;
134
+ this.inputParser = opts.inputParser;
135
+ this.parseInputFn = getParseFn$1(this.inputParser);
136
+ this.outputParser = opts.outputParser;
137
+ this.parseOutputFn = getParseFn$1(this.outputParser);
138
+ this.meta = opts.meta;
139
+ }
140
+
141
+ _def() {
142
+ return {
143
+ middlewares: this.middlewares,
144
+ resolver: this.resolver,
145
+ inputParser: this.inputParser,
146
+ outputParser: this.outputParser,
147
+ meta: this.meta
148
+ };
149
+ }
150
+
151
+ async parseInput(rawInput) {
152
+ try {
153
+ return await this.parseInputFn(rawInput);
154
+ } catch (cause) {
155
+ throw new TRPCError({
156
+ code: 'BAD_REQUEST',
157
+ cause: getCauseFromUnknown(cause)
158
+ });
159
+ }
160
+ }
161
+
162
+ async parseOutput(rawOutput) {
163
+ try {
164
+ return await this.parseOutputFn(rawOutput);
165
+ } catch (cause) {
166
+ throw new TRPCError({
167
+ code: 'INTERNAL_SERVER_ERROR',
168
+ cause: getCauseFromUnknown(cause),
169
+ message: 'Output validation failed'
170
+ });
171
+ }
172
+ }
173
+ /**
174
+ * Trigger middlewares in order, parse raw input, call resolver & parse raw output
175
+ * @internal
176
+ */
177
+
178
+
179
+ async call(opts) {
180
+ // wrap the actual resolver and treat as the last "middleware"
181
+ const middlewaresWithResolver = this.middlewares.concat([async ({
182
+ ctx
183
+ }) => {
184
+ const input = await this.parseInput(opts.rawInput);
185
+ const rawOutput = await this.resolver({ ...opts,
186
+ ctx,
187
+ input
188
+ });
189
+ const data = await this.parseOutput(rawOutput);
190
+ return {
191
+ marker: middlewareMarker$1,
192
+ ok: true,
193
+ data,
194
+ ctx
195
+ };
196
+ }]); // run the middlewares recursively with the resolver as the last one
197
+
198
+ const callRecursive = async (callOpts = {
199
+ index: 0,
200
+ ctx: opts.ctx
201
+ }) => {
202
+ try {
203
+ const result = await middlewaresWithResolver[callOpts.index]({
204
+ ctx: callOpts.ctx,
205
+ type: opts.type,
206
+ path: opts.path,
207
+ rawInput: opts.rawInput,
208
+ meta: this.meta,
209
+ next: async nextOpts => {
210
+ return await callRecursive({
211
+ index: callOpts.index + 1,
212
+ ctx: nextOpts ? nextOpts.ctx : callOpts.ctx
213
+ });
214
+ }
215
+ });
216
+ return result;
217
+ } catch (cause) {
218
+ return {
219
+ ctx: callOpts.ctx,
220
+ ok: false,
221
+ error: getErrorFromUnknown(cause),
222
+ marker: middlewareMarker$1
223
+ };
224
+ }
225
+ }; // there's always at least one "next" since we wrap this.resolver in a middleware
226
+
227
+
228
+ const result = await callRecursive();
229
+
230
+ if (!result) {
231
+ throw new TRPCError({
232
+ code: 'INTERNAL_SERVER_ERROR',
233
+ message: 'No result from middlewares - did you forget to `return next()`?'
234
+ });
235
+ }
236
+
237
+ if (!result.ok) {
238
+ // re-throw original error
239
+ throw result.error;
240
+ }
241
+
242
+ return result.data;
243
+ }
244
+ /**
245
+ * Create new procedure with passed middlewares
246
+ * @param middlewares
247
+ */
248
+
249
+
250
+ inheritMiddlewares(middlewares) {
251
+ const Constructor = this.constructor;
252
+ const instance = new Constructor({
253
+ middlewares: [...middlewares, ...this.middlewares],
254
+ resolver: this.resolver,
255
+ inputParser: this.inputParser,
256
+ outputParser: this.outputParser,
257
+ meta: this.meta
258
+ });
259
+ return instance;
260
+ }
261
+
262
+ }
263
+ function createProcedure(opts) {
264
+ const inputParser = 'input' in opts ? opts.input : input => {
265
+ if (input != null) {
266
+ throw new TRPCError({
267
+ code: 'BAD_REQUEST',
268
+ message: 'No input expected'
269
+ });
270
+ }
271
+
272
+ return undefined;
273
+ };
274
+ const outputParser = 'output' in opts && opts.output ? opts.output : output => output;
275
+ return new Procedure({
276
+ inputParser: inputParser,
277
+ resolver: opts.resolve,
278
+ middlewares: [],
279
+ outputParser: outputParser,
280
+ meta: opts.meta
281
+ });
282
+ }
283
+
284
+ function getParseFn(procedureParser) {
285
+ const parser = procedureParser;
286
+
287
+ if (typeof parser === 'function') {
288
+ // ProcedureParserCustomValidatorEsque
289
+ return parser;
290
+ }
291
+
292
+ if (typeof parser.parseAsync === 'function') {
293
+ // ProcedureParserZodEsque
294
+ return parser.parseAsync.bind(parser);
295
+ }
296
+
297
+ if (typeof parser.parse === 'function') {
298
+ // ProcedureParserZodEsque
299
+ return parser.parse.bind(parser);
300
+ }
301
+
302
+ if (typeof parser.validateSync === 'function') {
303
+ // ProcedureParserYupEsque
304
+ return parser.validateSync.bind(parser);
305
+ }
306
+
307
+ if (typeof parser.create === 'function') {
308
+ // ProcedureParserSuperstructEsque
309
+ return parser.create.bind(parser);
310
+ }
311
+
312
+ throw new Error('Could not find a validator fn');
313
+ }
314
+ /**
315
+ * @deprecated only for backwards compat
316
+ * @internal
317
+ */
318
+
319
+ function getParseFnOrPassThrough(procedureParser) {
320
+ if (!procedureParser) {
321
+ return v => v;
322
+ }
323
+
324
+ return getParseFn(procedureParser);
325
+ }
326
+
327
+ /**
328
+ * Ensures there are no duplicate keys when building a procedure.
329
+ */
330
+ function mergeWithoutOverrides(obj1, ...objs) {
331
+ const newObj = Object.assign(Object.create(null), obj1);
332
+
333
+ for (const overrides of objs) {
334
+ for (const key in overrides) {
335
+ if (key in newObj && newObj[key] !== overrides[key]) {
336
+ throw new Error(`Duplicate key ${key}`);
337
+ }
338
+
339
+ newObj[key] = overrides[key];
340
+ }
341
+ }
342
+
343
+ return newObj;
344
+ }
345
+
346
+ /**
347
+ * @internal
348
+ */
349
+
350
+ /**
351
+ * @internal
352
+ */
353
+
354
+ /**
355
+ * @internal
356
+ */
357
+ const middlewareMarker = 'middlewareMarker';
358
+ /**
359
+ * @internal
360
+ */
361
+
362
+ function createNewBuilder(def1, def2) {
363
+ const {
364
+ middlewares = [],
365
+ ...rest
366
+ } = def2; // TODO: maybe have a fn here to warn about calls
367
+
368
+ return createBuilder({ ...mergeWithoutOverrides(def1, rest),
369
+ middlewares: [...def1.middlewares, ...middlewares]
370
+ });
371
+ }
372
+
373
+ function createBuilder(initDef) {
374
+ const _def = initDef || {
375
+ middlewares: []
376
+ };
377
+
378
+ return {
379
+ _def,
380
+
381
+ input(input) {
382
+ const parser = getParseFn(input);
383
+ return createNewBuilder(_def, {
384
+ input,
385
+ middlewares: [createInputMiddleware(parser)]
386
+ });
387
+ },
388
+
389
+ output(output) {
390
+ const parseOutput = getParseFn(output);
391
+ return createNewBuilder(_def, {
392
+ output,
393
+ middlewares: [createOutputMiddleware(parseOutput)]
394
+ });
395
+ },
396
+
397
+ meta(meta) {
398
+ return createNewBuilder(_def, {
399
+ meta: meta
400
+ });
401
+ },
402
+
403
+ unstable_concat(builder) {
404
+ return createNewBuilder(_def, builder._def);
405
+ },
406
+
407
+ use(middleware) {
408
+ return createNewBuilder(_def, {
409
+ middlewares: [middleware]
410
+ });
411
+ },
412
+
413
+ query(resolver) {
414
+ return createResolver({ ..._def,
415
+ query: true
416
+ }, resolver);
417
+ },
418
+
419
+ mutation(resolver) {
420
+ return createResolver({ ..._def,
421
+ mutation: true
422
+ }, resolver);
423
+ },
424
+
425
+ subscription(resolver) {
426
+ return createResolver({ ..._def,
427
+ subscription: true
428
+ }, resolver);
429
+ }
430
+
431
+ };
432
+ }
433
+ function createInputMiddleware(parse) {
434
+ return async function inputMiddleware({
435
+ next,
436
+ rawInput
437
+ }) {
438
+ let input;
439
+
440
+ try {
441
+ input = await parse(rawInput);
442
+ } catch (cause) {
443
+ throw new TRPCError({
444
+ code: 'BAD_REQUEST',
445
+ cause: getCauseFromUnknown(cause)
446
+ });
447
+ } // TODO fix this typing?
448
+
449
+
450
+ return next({
451
+ input
452
+ });
453
+ };
454
+ }
455
+ function createOutputMiddleware(parse) {
456
+ return async function outputMiddleware({
457
+ next
458
+ }) {
459
+ const result = await next();
460
+
461
+ if (!result.ok) {
462
+ // pass through failures without validating
463
+ return result;
464
+ }
465
+
466
+ try {
467
+ const data = await parse(result.data);
468
+ return { ...result,
469
+ data
470
+ };
471
+ } catch (cause) {
472
+ throw new TRPCError({
473
+ message: 'Output validation failed',
474
+ code: 'INTERNAL_SERVER_ERROR',
475
+ cause: getCauseFromUnknown(cause)
476
+ });
477
+ }
478
+ };
479
+ }
480
+
481
+ function createResolver(_def, resolver) {
482
+ const finalBuilder = createNewBuilder(_def, {
483
+ resolver,
484
+ middlewares: [async function resolveMiddleware(opts) {
485
+ const data = await resolver(opts);
486
+ return {
487
+ marker: middlewareMarker,
488
+ ok: true,
489
+ data,
490
+ ctx: opts.ctx
491
+ };
492
+ }]
493
+ });
494
+ return createProcedureCaller(finalBuilder._def);
495
+ }
496
+ /**
497
+ * @internal
498
+ */
499
+
500
+
501
+ const codeblock = /*#__PURE__*/`
502
+ If you want to call this function on the server, you do the following:
503
+ This is a client-only function.
504
+
505
+ const caller = appRouter.createCaller({
506
+ /* ... your context */
507
+ });
508
+
509
+ const result = await caller.call('myProcedure', input);
510
+ `.trim();
511
+
512
+ function createProcedureCaller(_def) {
513
+ const procedure = async function resolve(opts) {
514
+ // is direct server-side call
515
+ if (!opts || !('rawInput' in opts)) {
516
+ throw new Error(codeblock);
517
+ } // run the middlewares recursively with the resolver as the last one
518
+
519
+
520
+ const callRecursive = async (callOpts = {
521
+ index: 0,
522
+ ctx: opts.ctx
523
+ }) => {
524
+ try {
525
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
526
+ const middleware = _def.middlewares[callOpts.index];
527
+ const result = await middleware({
528
+ ctx: callOpts.ctx,
529
+ type: opts.type,
530
+ path: opts.path,
531
+ rawInput: opts.rawInput,
532
+ meta: _def.meta,
533
+ input: callOpts.input,
534
+ next: async nextOpts => {
535
+ return await callRecursive({
536
+ index: callOpts.index + 1,
537
+ ctx: nextOpts && 'ctx' in nextOpts ? { ...callOpts.ctx,
538
+ ...nextOpts.ctx
539
+ } : callOpts.ctx,
540
+ input: nextOpts && 'input' in nextOpts ? nextOpts.input : callOpts.input
541
+ });
542
+ }
543
+ });
544
+ return result;
545
+ } catch (cause) {
546
+ return {
547
+ ok: false,
548
+ error: getErrorFromUnknown(cause),
549
+ marker: middlewareMarker
550
+ };
551
+ }
552
+ }; // there's always at least one "next" since we wrap this.resolver in a middleware
553
+
554
+
555
+ const result = await callRecursive();
556
+
557
+ if (!result) {
558
+ throw new TRPCError({
559
+ code: 'INTERNAL_SERVER_ERROR',
560
+ message: 'No result from middlewares - did you forget to `return next()`?'
561
+ });
562
+ }
563
+
564
+ if (!result.ok) {
565
+ // re-throw original error
566
+ throw result.error;
567
+ }
568
+
569
+ return result.data;
570
+ };
571
+
572
+ procedure._def = _def;
573
+ procedure.meta = _def.meta;
574
+ return procedure;
575
+ }
576
+
577
+ /**
578
+ * Create an object without inheriting anything from `Object.prototype`
579
+ * @internal
580
+ */
581
+ function omitPrototype(obj1) {
582
+ return Object.assign(Object.create(null), obj1);
583
+ }
584
+
585
+ const procedureTypes = ['query', 'mutation', 'subscription'];
586
+ /**
587
+ * @public
588
+ */
589
+
590
+ /** @internal **/
591
+
592
+ function isRouter(procedureOrRouter) {
593
+ return 'router' in procedureOrRouter._def;
594
+ }
595
+
596
+ const emptyRouter = {
597
+ _ctx: null,
598
+ _errorShape: null,
599
+ _meta: null,
600
+ queries: {},
601
+ mutations: {},
602
+ subscriptions: {},
603
+ errorFormatter: defaultFormatter,
604
+ transformer: defaultTransformer
605
+ };
606
+ /**
607
+ *
608
+ * @internal
609
+ */
610
+
611
+ function createRouterFactory(defaults) {
612
+ return function createRouterInner(opts) {
613
+ var _defaults$transformer, _defaults$errorFormat;
614
+
615
+ const routerProcedures = omitPrototype({});
616
+
617
+ function recursiveGetPaths(procedures, path = '') {
618
+ for (const [key, procedureOrRouter] of Object.entries(procedures !== null && procedures !== void 0 ? procedures : {})) {
619
+ const newPath = `${path}${key}`;
620
+
621
+ if (isRouter(procedureOrRouter)) {
622
+ recursiveGetPaths(procedureOrRouter._def.procedures, `${newPath}.`);
623
+ continue;
624
+ }
625
+
626
+ routerProcedures[newPath] = procedureOrRouter;
627
+ }
628
+ }
629
+
630
+ recursiveGetPaths(opts);
631
+ const result = mergeWithoutOverrides({
632
+ transformer: (_defaults$transformer = defaults === null || defaults === void 0 ? void 0 : defaults.transformer) !== null && _defaults$transformer !== void 0 ? _defaults$transformer : defaultTransformer,
633
+ errorFormatter: (_defaults$errorFormat = defaults === null || defaults === void 0 ? void 0 : defaults.errorFormatter) !== null && _defaults$errorFormat !== void 0 ? _defaults$errorFormat : defaultFormatter
634
+ }, {
635
+ procedures: routerProcedures
636
+ });
637
+ const _def = {
638
+ router: true,
639
+ legacy: {},
640
+ procedures: {},
641
+ ...emptyRouter,
642
+ ...result,
643
+ record: opts,
644
+ queries: Object.entries(result.procedures || {}).filter(pair => pair[1]._def.query).reduce((acc, [key, val]) => ({ ...acc,
645
+ [key]: val
646
+ }), {}),
647
+ mutations: Object.entries(result.procedures || {}).filter(pair => pair[1]._def.mutation).reduce((acc, [key, val]) => ({ ...acc,
648
+ [key]: val
649
+ }), {}),
650
+ subscriptions: Object.entries(result.procedures || {}).filter(pair => pair[1]._def.subscription).reduce((acc, [key, val]) => ({ ...acc,
651
+ [key]: val
652
+ }), {}),
653
+ routers: Object.entries(result.procedures || {}).filter(pair => pair[1]._def._router).reduce((acc, [key, val]) => ({ ...acc,
654
+ [key]: val
655
+ }), {})
656
+ };
657
+ const router = { ...opts,
658
+ _def,
659
+ transformer: _def.transformer,
660
+ errorFormatter: _def.errorFormatter,
661
+
662
+ createCaller(ctx) {
663
+ const proxy = createProxy(({
664
+ path,
665
+ args
666
+ }) => {
667
+ // interop mode
668
+ if (path.length === 1 && procedureTypes.includes(path[0])) {
669
+ return callProcedure({
670
+ procedures: _def.procedures,
671
+ path: args[0],
672
+ rawInput: args[1],
673
+ ctx,
674
+ type: path[0]
675
+ });
676
+ }
677
+
678
+ const fullPath = path.join('.');
679
+ const procedure = _def.procedures[fullPath];
680
+ let type = 'query';
681
+
682
+ if (procedure._def.mutation) {
683
+ type = 'mutation';
684
+ } else if (procedure._def.subscription) {
685
+ type = 'subscription';
686
+ }
687
+
688
+ return procedure({
689
+ path: fullPath,
690
+ rawInput: args[0],
691
+ ctx,
692
+ type
693
+ });
694
+ });
695
+ return proxy;
696
+ },
697
+
698
+ getErrorShape(opts) {
699
+ const {
700
+ path,
701
+ error
702
+ } = opts;
703
+ const {
704
+ code
705
+ } = opts.error;
706
+ const shape = {
707
+ message: error.message,
708
+ code: TRPC_ERROR_CODES_BY_KEY[code],
709
+ data: {
710
+ code,
711
+ httpStatus: getHTTPStatusCodeFromError(error)
712
+ }
713
+ };
714
+
715
+ if (process.env.NODE_ENV !== 'production' && typeof opts.error.stack === 'string') {
716
+ shape.data.stack = opts.error.stack;
717
+ }
718
+
719
+ if (typeof path === 'string') {
720
+ shape.data.path = path;
721
+ }
722
+
723
+ return this._def.errorFormatter({ ...opts,
724
+ shape
725
+ });
726
+ }
727
+
728
+ };
729
+ return router;
730
+ };
731
+ }
732
+ /**
733
+ * @internal
734
+ */
735
+
736
+ function callProcedure(opts) {
737
+ var _opts$procedures$path;
738
+
739
+ const {
740
+ type,
741
+ path
742
+ } = opts;
743
+
744
+ if (!(path in opts.procedures) || !((_opts$procedures$path = opts.procedures[path]) !== null && _opts$procedures$path !== void 0 && _opts$procedures$path._def[type])) {
745
+ throw new TRPCError({
746
+ code: 'NOT_FOUND',
747
+ message: `No "${type}"-procedure on path "${path}"`
748
+ });
749
+ }
750
+
751
+ const procedure = opts.procedures[path];
752
+ return procedure(opts);
753
+ }
754
+
755
+ function migrateProcedure(oldProc, type) {
756
+ const def = oldProc._def();
757
+
758
+ const inputParser = getParseFnOrPassThrough(def.inputParser);
759
+ const outputParser = getParseFnOrPassThrough(def.outputParser);
760
+ const inputMiddleware = createInputMiddleware(inputParser);
761
+ const builder = createBuilder({
762
+ input: def.inputParser,
763
+ middlewares: [...def.middlewares, inputMiddleware, createOutputMiddleware(outputParser)],
764
+ meta: def.meta,
765
+ output: def.outputParser,
766
+ mutation: type === 'mutation',
767
+ query: type === 'query',
768
+ subscription: type === 'subscription'
769
+ });
770
+ const proc = builder[type](opts => def.resolver(opts));
771
+ return proc;
772
+ }
773
+
774
+ function migrateRouter(oldRouter) {
775
+ const errorFormatter = oldRouter._def.errorFormatter;
776
+ const transformer = oldRouter._def.transformer;
777
+ const queries = {};
778
+ const mutations = {};
779
+ const subscriptions = {};
780
+
781
+ for (const [name, procedure] of Object.entries(oldRouter._def.queries)) {
782
+ queries[name] = migrateProcedure(procedure, 'query');
783
+ }
784
+
785
+ for (const [name, procedure] of Object.entries(oldRouter._def.mutations)) {
786
+ mutations[name] = migrateProcedure(procedure, 'mutation');
787
+ }
788
+
789
+ for (const [name, procedure] of Object.entries(oldRouter._def.subscriptions)) {
790
+ subscriptions[name] = migrateProcedure(procedure, 'subscription');
791
+ }
792
+
793
+ const procedures = mergeWithoutOverrides(queries, mutations, subscriptions);
794
+ const newRouter = createRouterFactory({
795
+ transformer,
796
+ errorFormatter
797
+ })(procedures);
798
+ return newRouter;
799
+ }
800
+
801
+ /* eslint-disable @typescript-eslint/no-explicit-any */
802
+ assertNotBrowser();
803
+
804
+ function getDataTransformer(transformer) {
805
+ if ('input' in transformer) {
806
+ return transformer;
807
+ }
808
+
809
+ return {
810
+ input: transformer,
811
+ output: transformer
812
+ };
813
+ }
814
+ /**
815
+ * @internal
816
+ * @deprecated
817
+ */
818
+
819
+
820
+ const PROCEDURE_DEFINITION_MAP = {
821
+ query: 'queries',
822
+ mutation: 'mutations',
823
+ subscription: 'subscriptions'
824
+ };
825
+ /**
826
+ * @internal
827
+ * @deprecated
828
+ */
829
+
830
+ function safeObject(...args) {
831
+ return Object.assign(Object.create(null), ...args);
832
+ }
833
+
834
+ /**
835
+ * @internal The type signature of this class may change without warning.
836
+ * @deprecated
837
+ */
838
+ class Router {
839
+ constructor(def) {
840
+ var _def$queries, _def$mutations, _def$subscriptions, _def$middlewares, _def$errorFormatter, _def$transformer;
841
+
842
+ this._def = void 0;
843
+ this._def = {
844
+ queries: (_def$queries = def === null || def === void 0 ? void 0 : def.queries) !== null && _def$queries !== void 0 ? _def$queries : safeObject(),
845
+ mutations: (_def$mutations = def === null || def === void 0 ? void 0 : def.mutations) !== null && _def$mutations !== void 0 ? _def$mutations : safeObject(),
846
+ subscriptions: (_def$subscriptions = def === null || def === void 0 ? void 0 : def.subscriptions) !== null && _def$subscriptions !== void 0 ? _def$subscriptions : safeObject(),
847
+ middlewares: (_def$middlewares = def === null || def === void 0 ? void 0 : def.middlewares) !== null && _def$middlewares !== void 0 ? _def$middlewares : [],
848
+ errorFormatter: (_def$errorFormatter = def === null || def === void 0 ? void 0 : def.errorFormatter) !== null && _def$errorFormatter !== void 0 ? _def$errorFormatter : defaultFormatter,
849
+ transformer: (_def$transformer = def === null || def === void 0 ? void 0 : def.transformer) !== null && _def$transformer !== void 0 ? _def$transformer : defaultTransformer
850
+ };
851
+ }
852
+
853
+ static prefixProcedures(procedures, prefix) {
854
+ const eps = safeObject();
855
+
856
+ for (const [key, procedure] of Object.entries(procedures)) {
857
+ eps[prefix + key] = procedure;
858
+ }
859
+
860
+ return eps;
861
+ }
862
+
863
+ query(path, procedure) {
864
+ const router = new Router({
865
+ queries: safeObject({
866
+ [path]: createProcedure(procedure)
867
+ })
868
+ });
869
+ return this.merge(router);
870
+ }
871
+
872
+ mutation(path, procedure) {
873
+ const router = new Router({
874
+ mutations: safeObject({
875
+ [path]: createProcedure(procedure)
876
+ })
877
+ });
878
+ return this.merge(router);
879
+ }
880
+ /**
881
+ * @beta Might change without a major version bump
882
+ */
883
+
884
+
885
+ subscription(path, procedure) {
886
+ const router = new Router({
887
+ subscriptions: safeObject({
888
+ [path]: createProcedure(procedure)
889
+ })
890
+ });
891
+ return this.merge(router);
892
+ }
893
+ /**
894
+ * Merge router with other router
895
+ * @param router
896
+ */
897
+
898
+
899
+ merge(prefixOrRouter, maybeRouter) {
900
+ let prefix = '';
901
+ let childRouter;
902
+
903
+ if (typeof prefixOrRouter === 'string' && maybeRouter instanceof Router) {
904
+ prefix = prefixOrRouter;
905
+ childRouter = maybeRouter;
906
+ } else if (prefixOrRouter instanceof Router) {
907
+ childRouter = prefixOrRouter;
908
+ }
909
+ /* istanbul ignore next */
910
+ else {
911
+ throw new Error('Invalid args');
912
+ }
913
+
914
+ const duplicateQueries = Object.keys(childRouter._def.queries).filter(key => !!this._def['queries'][prefix + key]);
915
+ const duplicateMutations = Object.keys(childRouter._def.mutations).filter(key => !!this._def['mutations'][prefix + key]);
916
+ const duplicateSubscriptions = Object.keys(childRouter._def.subscriptions).filter(key => !!this._def['subscriptions'][prefix + key]);
917
+ const duplicates = [...duplicateQueries, ...duplicateMutations, ...duplicateSubscriptions];
918
+
919
+ if (duplicates.length) {
920
+ throw new Error(`Duplicate endpoint(s): ${duplicates.join(', ')}`);
921
+ }
922
+
923
+ const mergeProcedures = defs => {
924
+ const newDefs = safeObject();
925
+
926
+ for (const [key, procedure] of Object.entries(defs)) {
927
+ const newProcedure = procedure.inheritMiddlewares(this._def.middlewares);
928
+ newDefs[key] = newProcedure;
929
+ }
930
+
931
+ return Router.prefixProcedures(newDefs, prefix);
932
+ };
933
+
934
+ return new Router({ ...this._def,
935
+ queries: safeObject(this._def.queries, mergeProcedures(childRouter._def.queries)),
936
+ mutations: safeObject(this._def.mutations, mergeProcedures(childRouter._def.mutations)),
937
+ subscriptions: safeObject(this._def.subscriptions, mergeProcedures(childRouter._def.subscriptions))
938
+ });
939
+ }
940
+ /**
941
+ * Invoke procedure. Only for internal use within library.
942
+ */
943
+
944
+
945
+ async call(opts) {
946
+ const {
947
+ type,
948
+ path
949
+ } = opts;
950
+ const defTarget = PROCEDURE_DEFINITION_MAP[type];
951
+ const defs = this._def[defTarget];
952
+ const procedure = defs[path];
953
+
954
+ if (!procedure) {
955
+ throw new TRPCError({
956
+ code: 'NOT_FOUND',
957
+ message: `No "${type}"-procedure on path "${path}"`
958
+ });
959
+ }
960
+
961
+ return procedure.call(opts);
962
+ }
963
+
964
+ createCaller(ctx) {
965
+ return {
966
+ query: (path, ...args) => {
967
+ return this.call({
968
+ type: 'query',
969
+ ctx,
970
+ path,
971
+ rawInput: args[0]
972
+ });
973
+ },
974
+ mutation: (path, ...args) => {
975
+ return this.call({
976
+ type: 'mutation',
977
+ ctx,
978
+ path,
979
+ rawInput: args[0]
980
+ });
981
+ },
982
+ subscription: (path, ...args) => {
983
+ return this.call({
984
+ type: 'subscription',
985
+ ctx,
986
+ path,
987
+ rawInput: args[0]
988
+ });
989
+ }
990
+ };
991
+ }
992
+ /**
993
+ * Function to be called before any procedure is invoked
994
+ * @link https://trpc.io/docs/middlewares
995
+ */
996
+
997
+
998
+ middleware(middleware) {
999
+ return new Router({ ...this._def,
1000
+ middlewares: [...this._def.middlewares, middleware]
1001
+ });
1002
+ }
1003
+ /**
1004
+ * Format errors
1005
+ * @link https://trpc.io/docs/error-formatting
1006
+ */
1007
+
1008
+
1009
+ formatError(errorFormatter) {
1010
+ if (this._def.errorFormatter !== defaultFormatter) {
1011
+ throw new Error('You seem to have double `formatError()`-calls in your router tree');
1012
+ }
1013
+
1014
+ return new Router({ ...this._def,
1015
+ errorFormatter: errorFormatter
1016
+ });
1017
+ }
1018
+
1019
+ getErrorShape(opts) {
1020
+ const {
1021
+ path,
1022
+ error
1023
+ } = opts;
1024
+ const {
1025
+ code
1026
+ } = opts.error;
1027
+ const shape = {
1028
+ message: error.message,
1029
+ code: TRPC_ERROR_CODES_BY_KEY[code],
1030
+ data: {
1031
+ code,
1032
+ httpStatus: getHTTPStatusCodeFromError(error)
1033
+ }
1034
+ };
1035
+
1036
+ if (process.env.NODE_ENV !== 'production' && typeof opts.error.stack === 'string') {
1037
+ shape.data.stack = opts.error.stack;
1038
+ }
1039
+
1040
+ if (typeof path === 'string') {
1041
+ shape.data.path = path;
1042
+ }
1043
+
1044
+ return this._def.errorFormatter({ ...opts,
1045
+ shape
1046
+ });
1047
+ }
1048
+ /**
1049
+ * Add data transformer to serialize/deserialize input args + output
1050
+ * @link https://trpc.io/docs/data-transformers
1051
+ */
1052
+
1053
+
1054
+ transformer(_transformer) {
1055
+ const transformer = getDataTransformer(_transformer);
1056
+
1057
+ if (this._def.transformer !== defaultTransformer) {
1058
+ throw new Error('You seem to have double `transformer()`-calls in your router tree');
1059
+ }
1060
+
1061
+ return new Router({ ...this._def,
1062
+ transformer
1063
+ });
1064
+ }
1065
+ /**
1066
+ * Flattens the generics of TQueries/TMutations/TSubscriptions.
1067
+ * ⚠️ Experimental - might disappear. ⚠️
1068
+ *
1069
+ * @alpha
1070
+ */
1071
+
1072
+
1073
+ flat() {
1074
+ return this;
1075
+ }
1076
+ /**
1077
+ * Interop mode for v9.x -> v10.x
1078
+ */
1079
+
1080
+
1081
+ interop() {
1082
+ return migrateRouter(this);
1083
+ }
1084
+
1085
+ }
1086
+ /**
1087
+ * @deprecated
1088
+ */
1089
+
1090
+ function router() {
1091
+ return new Router();
1092
+ }
1093
+
1094
+ export { defaultTransformer as a, createBuilder as b, createRouterFactory as c, defaultFormatter as d, callProcedure as e, getDataTransformer$1 as g, mergeWithoutOverrides as m, procedureTypes as p, router as r };