@trpc/server 10.0.0-proxy-beta.13 → 10.0.0-proxy-beta.14

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 (63) hide show
  1. package/dist/{TRPCError-281ac25a.mjs → TRPCError-e99e7cbe.mjs} +1 -1
  2. package/dist/adapters/aws-lambda/index.js +2 -3
  3. package/dist/adapters/aws-lambda/index.mjs +3 -4
  4. package/dist/adapters/express.js +3 -3
  5. package/dist/adapters/express.mjs +4 -4
  6. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  7. package/dist/adapters/fastify/index.js +2 -3
  8. package/dist/adapters/fastify/index.mjs +3 -4
  9. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  10. package/dist/adapters/fetch/index.js +2 -3
  11. package/dist/adapters/fetch/index.mjs +3 -4
  12. package/dist/adapters/next.js +3 -3
  13. package/dist/adapters/next.mjs +4 -4
  14. package/dist/adapters/node-http/index.js +3 -3
  15. package/dist/adapters/node-http/index.mjs +4 -4
  16. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  17. package/dist/adapters/standalone.js +3 -3
  18. package/dist/adapters/standalone.mjs +4 -4
  19. package/dist/adapters/ws.d.ts.map +1 -1
  20. package/dist/adapters/ws.js +10 -3
  21. package/dist/adapters/ws.mjs +11 -4
  22. package/dist/core/initTRPC.d.ts +16 -4
  23. package/dist/core/initTRPC.d.ts.map +1 -1
  24. package/dist/core/internals/config.d.ts +13 -0
  25. package/dist/core/internals/config.d.ts.map +1 -1
  26. package/dist/core/middleware.d.ts +1 -1
  27. package/dist/core/middleware.d.ts.map +1 -1
  28. package/dist/deprecated/internals/procedure.d.ts.map +1 -1
  29. package/dist/deprecated/router.d.ts.map +1 -1
  30. package/dist/http/index.d.ts.map +1 -1
  31. package/dist/index.d.ts +0 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +739 -25
  34. package/dist/index.mjs +724 -9
  35. package/dist/{nodeHTTPRequestHandler-1bf460cc.mjs → nodeHTTPRequestHandler-205f7545.mjs} +2 -3
  36. package/dist/{nodeHTTPRequestHandler-71717219.js → nodeHTTPRequestHandler-efc38711.js} +1 -2
  37. package/dist/resolveHTTPResponse-4ceb1785.mjs +205 -0
  38. package/dist/resolveHTTPResponse-bf4c6ceb.js +207 -0
  39. package/dist/subscription.mjs +1 -1
  40. package/dist/{resolveHTTPResponse-c6e31b55.js → transformTRPCResponse-05aa84c1.js} +22 -201
  41. package/dist/{resolveHTTPResponse-f2b378b6.mjs → transformTRPCResponse-959de787.mjs} +21 -201
  42. package/dist/types.d.ts +9 -2
  43. package/dist/types.d.ts.map +1 -1
  44. package/package.json +6 -6
  45. package/src/adapters/fastify/fastifyRequestHandler.ts +0 -3
  46. package/src/adapters/fetch/fetchRequestHandler.ts +0 -3
  47. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +0 -3
  48. package/src/adapters/ws.ts +13 -3
  49. package/src/core/initTRPC.ts +12 -0
  50. package/src/core/internals/config.ts +19 -0
  51. package/src/core/middleware.ts +1 -1
  52. package/src/deprecated/internals/procedure.ts +0 -3
  53. package/src/deprecated/router.ts +0 -3
  54. package/src/http/index.ts +0 -4
  55. package/src/index.ts +0 -1
  56. package/src/types.ts +28 -7
  57. package/dist/assertNotBrowser.d.ts +0 -2
  58. package/dist/assertNotBrowser.d.ts.map +0 -1
  59. package/dist/router-15f9618e.js +0 -724
  60. package/dist/router-28a2c129.mjs +0 -718
  61. package/dist/transformTRPCResponse-11ac69cc.js +0 -27
  62. package/dist/transformTRPCResponse-c8138d5f.mjs +0 -25
  63. package/src/assertNotBrowser.ts +0 -12
package/dist/index.mjs CHANGED
@@ -1,11 +1,75 @@
1
- import { m as mergeWithoutOverrides, d as defaultFormatter, a as defaultTransformer, c as createRouterFactory, g as getDataTransformer } from './resolveHTTPResponse-f2b378b6.mjs';
2
- export { b as assertNotBrowser, e as callProcedure, a as defaultTransformer, g as getDataTransformer, p as procedureTypes, r as resolveHTTPResponse } from './resolveHTTPResponse-f2b378b6.mjs';
3
- import { c as createBuilder, a as createMiddlewareFactory } from './router-28a2c129.mjs';
4
- export { b as createInputMiddleware, d as createOutputMiddleware, r as router } from './router-28a2c129.mjs';
5
- export { T as TRPCError } from './TRPCError-281ac25a.mjs';
6
- import './codes-7d21f749.mjs';
1
+ export { r as resolveHTTPResponse } from './resolveHTTPResponse-4ceb1785.mjs';
2
+ import { m as mergeWithoutOverrides, d as defaultFormatter, a as defaultTransformer, c as createRouterFactory, i as isServerDefault, g as getDataTransformer$1, b as getHTTPStatusCodeFromError } from './transformTRPCResponse-959de787.mjs';
3
+ export { e as callProcedure, a as defaultTransformer, g as getDataTransformer, p as procedureTypes } from './transformTRPCResponse-959de787.mjs';
4
+ import { T as TRPCError, g as getCauseFromUnknown, a as getTRPCErrorFromUnknown } from './TRPCError-e99e7cbe.mjs';
5
+ export { T as TRPCError } from './TRPCError-e99e7cbe.mjs';
6
+ import { T as TRPC_ERROR_CODES_BY_KEY } from './codes-7d21f749.mjs';
7
7
  import './index-5a6a2e91.mjs';
8
- import './transformTRPCResponse-c8138d5f.mjs';
8
+
9
+ /**
10
+ * @internal
11
+ */ // FIXME this should use RootConfig
12
+ function createMiddlewareFactory() {
13
+ return function createMiddleware(fn) {
14
+ return fn;
15
+ };
16
+ }
17
+ function isPlainObject(obj) {
18
+ return obj && typeof obj === 'object' && !Array.isArray(obj);
19
+ }
20
+ /**
21
+ * @internal
22
+ * Please note, `trpc-openapi` uses this function.
23
+ */ function createInputMiddleware(parse) {
24
+ const inputMiddleware = async ({ next , rawInput , input , })=>{
25
+ let parsedInput;
26
+ try {
27
+ parsedInput = await parse(rawInput);
28
+ } catch (cause) {
29
+ throw new TRPCError({
30
+ code: 'BAD_REQUEST',
31
+ cause: getCauseFromUnknown(cause)
32
+ });
33
+ }
34
+ // Multiple input parsers
35
+ const combinedInput = isPlainObject(input) && isPlainObject(parsedInput) ? {
36
+ ...input,
37
+ ...parsedInput
38
+ } : parsedInput;
39
+ // TODO fix this typing?
40
+ return next({
41
+ input: combinedInput
42
+ });
43
+ };
44
+ inputMiddleware._type = 'input';
45
+ return inputMiddleware;
46
+ }
47
+ /**
48
+ * @internal
49
+ */ function createOutputMiddleware(parse) {
50
+ const outputMiddleware = async ({ next })=>{
51
+ const result = await next();
52
+ if (!result.ok) {
53
+ // pass through failures without validating
54
+ return result;
55
+ }
56
+ try {
57
+ const data = await parse(result.data);
58
+ return {
59
+ ...result,
60
+ data
61
+ };
62
+ } catch (cause) {
63
+ throw new TRPCError({
64
+ message: 'Output validation failed',
65
+ code: 'INTERNAL_SERVER_ERROR',
66
+ cause: getCauseFromUnknown(cause)
67
+ });
68
+ }
69
+ };
70
+ outputMiddleware._type = 'output';
71
+ return outputMiddleware;
72
+ }
9
73
 
10
74
  function mergeRouters(...routerList) {
11
75
  const record = mergeWithoutOverrides({}, ...routerList.map((r)=>r._def.record));
@@ -38,6 +102,208 @@ function mergeRoutersGeneric(...args) {
38
102
  return mergeRouters(...args);
39
103
  }
40
104
 
105
+ function getParseFn$1(procedureParser) {
106
+ const parser = procedureParser;
107
+ if (typeof parser === 'function') {
108
+ // ProcedureParserCustomValidatorEsque
109
+ return parser;
110
+ }
111
+ if (typeof parser.parseAsync === 'function') {
112
+ // ProcedureParserZodEsque
113
+ return parser.parseAsync.bind(parser);
114
+ }
115
+ if (typeof parser.parse === 'function') {
116
+ // ProcedureParserZodEsque
117
+ return parser.parse.bind(parser);
118
+ }
119
+ if (typeof parser.validateSync === 'function') {
120
+ // ProcedureParserYupEsque
121
+ return parser.validateSync.bind(parser);
122
+ }
123
+ if (typeof parser.create === 'function') {
124
+ // ProcedureParserSuperstructEsque
125
+ return parser.create.bind(parser);
126
+ }
127
+ throw new Error('Could not find a validator fn');
128
+ }
129
+ /**
130
+ * @deprecated only for backwards compat
131
+ * @internal
132
+ */ function getParseFnOrPassThrough(procedureParser) {
133
+ if (!procedureParser) {
134
+ return (v)=>v;
135
+ }
136
+ return getParseFn$1(procedureParser);
137
+ }
138
+
139
+ /**
140
+ * @internal
141
+ */ const middlewareMarker$1 = 'middlewareMarker';
142
+
143
+ function createNewBuilder(def1, def2) {
144
+ const { middlewares =[] , inputs , ...rest } = def2;
145
+ // TODO: maybe have a fn here to warn about calls
146
+ return createBuilder({
147
+ ...mergeWithoutOverrides(def1, rest),
148
+ inputs: [
149
+ ...def1.inputs,
150
+ ...inputs ?? []
151
+ ],
152
+ middlewares: [
153
+ ...def1.middlewares,
154
+ ...middlewares
155
+ ]
156
+ });
157
+ }
158
+ function createBuilder(initDef) {
159
+ const _def = initDef || {
160
+ inputs: [],
161
+ middlewares: []
162
+ };
163
+ return {
164
+ _def,
165
+ input (input) {
166
+ const parser = getParseFn$1(input);
167
+ return createNewBuilder(_def, {
168
+ inputs: [
169
+ input
170
+ ],
171
+ middlewares: [
172
+ createInputMiddleware(parser)
173
+ ]
174
+ });
175
+ },
176
+ output (output) {
177
+ const parseOutput = getParseFn$1(output);
178
+ return createNewBuilder(_def, {
179
+ output,
180
+ middlewares: [
181
+ createOutputMiddleware(parseOutput)
182
+ ]
183
+ });
184
+ },
185
+ meta (meta) {
186
+ return createNewBuilder(_def, {
187
+ meta: meta
188
+ });
189
+ },
190
+ unstable_concat (builder) {
191
+ return createNewBuilder(_def, builder._def);
192
+ },
193
+ use (middleware) {
194
+ return createNewBuilder(_def, {
195
+ middlewares: [
196
+ middleware
197
+ ]
198
+ });
199
+ },
200
+ query (resolver) {
201
+ return createResolver({
202
+ ..._def,
203
+ query: true
204
+ }, resolver);
205
+ },
206
+ mutation (resolver) {
207
+ return createResolver({
208
+ ..._def,
209
+ mutation: true
210
+ }, resolver);
211
+ },
212
+ subscription (resolver) {
213
+ return createResolver({
214
+ ..._def,
215
+ subscription: true
216
+ }, resolver);
217
+ }
218
+ };
219
+ }
220
+ function createResolver(_def, resolver) {
221
+ const finalBuilder = createNewBuilder(_def, {
222
+ resolver,
223
+ middlewares: [
224
+ async function resolveMiddleware(opts) {
225
+ const data = await resolver(opts);
226
+ return {
227
+ marker: middlewareMarker$1,
228
+ ok: true,
229
+ data,
230
+ ctx: opts.ctx
231
+ };
232
+ }
233
+ ]
234
+ });
235
+ return createProcedureCaller(finalBuilder._def);
236
+ }
237
+ const codeblock = `
238
+ If you want to call this function on the server, you do the following:
239
+ This is a client-only function.
240
+
241
+ const caller = appRouter.createCaller({
242
+ /* ... your context */
243
+ });
244
+
245
+ const result = await caller.call('myProcedure', input);
246
+ `.trim();
247
+ function createProcedureCaller(_def) {
248
+ const procedure = async function resolve(opts) {
249
+ // is direct server-side call
250
+ if (!opts || !('rawInput' in opts)) {
251
+ throw new Error(codeblock);
252
+ }
253
+ // run the middlewares recursively with the resolver as the last one
254
+ const callRecursive = async (callOpts = {
255
+ index: 0,
256
+ ctx: opts.ctx
257
+ })=>{
258
+ try {
259
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
260
+ const middleware = _def.middlewares[callOpts.index];
261
+ const result = await middleware({
262
+ ctx: callOpts.ctx,
263
+ type: opts.type,
264
+ path: opts.path,
265
+ rawInput: opts.rawInput,
266
+ meta: _def.meta,
267
+ input: callOpts.input,
268
+ next: async (nextOpts)=>{
269
+ return await callRecursive({
270
+ index: callOpts.index + 1,
271
+ ctx: nextOpts && 'ctx' in nextOpts ? {
272
+ ...callOpts.ctx,
273
+ ...nextOpts.ctx
274
+ } : callOpts.ctx,
275
+ input: nextOpts && 'input' in nextOpts ? nextOpts.input : callOpts.input
276
+ });
277
+ }
278
+ });
279
+ return result;
280
+ } catch (cause) {
281
+ return {
282
+ ok: false,
283
+ error: getTRPCErrorFromUnknown(cause),
284
+ marker: middlewareMarker$1
285
+ };
286
+ }
287
+ };
288
+ // there's always at least one "next" since we wrap this.resolver in a middleware
289
+ const result = await callRecursive();
290
+ if (!result) {
291
+ throw new TRPCError({
292
+ code: 'INTERNAL_SERVER_ERROR',
293
+ message: 'No result from middlewares - did you forget to `return next()`?'
294
+ });
295
+ }
296
+ if (!result.ok) {
297
+ // re-throw original error
298
+ throw result.error;
299
+ }
300
+ return result.data;
301
+ };
302
+ procedure._def = _def;
303
+ procedure.meta = _def.meta;
304
+ return procedure;
305
+ }
306
+
41
307
  /**
42
308
  * TODO: This can be improved:
43
309
  * - We should be able to chain `.meta()`/`.context()` only once
@@ -59,8 +325,15 @@ function mergeRoutersGeneric(...args) {
59
325
  */ const initTRPC = new TRPCBuilder();
60
326
  function createTRPCInner() {
61
327
  return function initTRPCInner(options) {
328
+ {
329
+ // Server check
330
+ const isServer = options?.isServer ?? isServerDefault;
331
+ if (!isServer && options?.allowOutsideOfServer !== true) {
332
+ throw new Error(`You're trying to use @trpc/server in a non-server environment. This is not supported by default.`);
333
+ }
334
+ }
62
335
  const errorFormatter = options?.errorFormatter ?? defaultFormatter;
63
- const transformer = getDataTransformer(options?.transformer ?? defaultTransformer);
336
+ const transformer = getDataTransformer$1(options?.transformer ?? defaultTransformer);
64
337
  const _config = {
65
338
  transformer,
66
339
  errorShape: null,
@@ -91,4 +364,446 @@ function createTRPCInner() {
91
364
  };
92
365
  }
93
366
 
94
- export { initTRPC };
367
+ /**
368
+ * @deprecated
369
+ */ const middlewareMarker = 'middlewareMarker';
370
+
371
+ function getParseFn(procedureParser) {
372
+ const parser = procedureParser;
373
+ if (typeof parser === 'function') {
374
+ // ProcedureParserCustomValidatorEsque
375
+ return parser;
376
+ }
377
+ if (typeof parser.parseAsync === 'function') {
378
+ // ProcedureParserZodEsque
379
+ return parser.parseAsync.bind(parser);
380
+ }
381
+ if (typeof parser.parse === 'function') {
382
+ // ProcedureParserZodEsque
383
+ return parser.parse.bind(parser);
384
+ }
385
+ if (typeof parser.validateSync === 'function') {
386
+ // ProcedureParserYupEsque
387
+ return parser.validateSync.bind(parser);
388
+ }
389
+ if (typeof parser.create === 'function') {
390
+ // ProcedureParserSuperstructEsque
391
+ return parser.create.bind(parser);
392
+ }
393
+ throw new Error('Could not find a validator fn');
394
+ }
395
+ /**
396
+ * @internal
397
+ * @deprecated
398
+ */ class Procedure {
399
+ _def() {
400
+ return {
401
+ middlewares: this.middlewares,
402
+ resolver: this.resolver,
403
+ inputParser: this.inputParser,
404
+ outputParser: this.outputParser,
405
+ meta: this.meta
406
+ };
407
+ }
408
+ async parseInput(rawInput) {
409
+ try {
410
+ return await this.parseInputFn(rawInput);
411
+ } catch (cause) {
412
+ throw new TRPCError({
413
+ code: 'BAD_REQUEST',
414
+ cause: getCauseFromUnknown(cause)
415
+ });
416
+ }
417
+ }
418
+ async parseOutput(rawOutput) {
419
+ try {
420
+ return await this.parseOutputFn(rawOutput);
421
+ } catch (cause) {
422
+ throw new TRPCError({
423
+ code: 'INTERNAL_SERVER_ERROR',
424
+ cause: getCauseFromUnknown(cause),
425
+ message: 'Output validation failed'
426
+ });
427
+ }
428
+ }
429
+ /**
430
+ * Trigger middlewares in order, parse raw input, call resolver & parse raw output
431
+ * @internal
432
+ */ async call(opts) {
433
+ // wrap the actual resolver and treat as the last "middleware"
434
+ const middlewaresWithResolver = this.middlewares.concat([
435
+ async ({ ctx })=>{
436
+ const input = await this.parseInput(opts.rawInput);
437
+ const rawOutput = await this.resolver({
438
+ ...opts,
439
+ ctx,
440
+ input
441
+ });
442
+ const data = await this.parseOutput(rawOutput);
443
+ return {
444
+ marker: middlewareMarker,
445
+ ok: true,
446
+ data,
447
+ ctx
448
+ };
449
+ }
450
+ ]);
451
+ // run the middlewares recursively with the resolver as the last one
452
+ const callRecursive = async (callOpts = {
453
+ index: 0,
454
+ ctx: opts.ctx
455
+ })=>{
456
+ try {
457
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
458
+ const result = await middlewaresWithResolver[callOpts.index]({
459
+ ctx: callOpts.ctx,
460
+ type: opts.type,
461
+ path: opts.path,
462
+ rawInput: opts.rawInput,
463
+ meta: this.meta,
464
+ next: async (nextOpts)=>{
465
+ return await callRecursive({
466
+ index: callOpts.index + 1,
467
+ ctx: nextOpts ? nextOpts.ctx : callOpts.ctx
468
+ });
469
+ }
470
+ });
471
+ return result;
472
+ } catch (cause) {
473
+ return {
474
+ ctx: callOpts.ctx,
475
+ ok: false,
476
+ error: getTRPCErrorFromUnknown(cause),
477
+ marker: middlewareMarker
478
+ };
479
+ }
480
+ };
481
+ // there's always at least one "next" since we wrap this.resolver in a middleware
482
+ const result = await callRecursive();
483
+ if (!result) {
484
+ throw new TRPCError({
485
+ code: 'INTERNAL_SERVER_ERROR',
486
+ message: 'No result from middlewares - did you forget to `return next()`?'
487
+ });
488
+ }
489
+ if (!result.ok) {
490
+ // re-throw original error
491
+ throw result.error;
492
+ }
493
+ return result.data;
494
+ }
495
+ /**
496
+ * Create new procedure with passed middlewares
497
+ * @param middlewares
498
+ */ inheritMiddlewares(middlewares) {
499
+ const Constructor = this.constructor;
500
+ const instance = new Constructor({
501
+ middlewares: [
502
+ ...middlewares,
503
+ ...this.middlewares
504
+ ],
505
+ resolver: this.resolver,
506
+ inputParser: this.inputParser,
507
+ outputParser: this.outputParser,
508
+ meta: this.meta
509
+ });
510
+ return instance;
511
+ }
512
+ constructor(opts){
513
+ this.middlewares = opts.middlewares;
514
+ this.resolver = opts.resolver;
515
+ this.inputParser = opts.inputParser;
516
+ this.parseInputFn = getParseFn(this.inputParser);
517
+ this.outputParser = opts.outputParser;
518
+ this.parseOutputFn = getParseFn(this.outputParser);
519
+ this.meta = opts.meta;
520
+ }
521
+ }
522
+ function createProcedure(opts) {
523
+ const inputParser = 'input' in opts ? opts.input : (input)=>{
524
+ if (input != null) {
525
+ throw new TRPCError({
526
+ code: 'BAD_REQUEST',
527
+ message: 'No input expected'
528
+ });
529
+ }
530
+ return undefined;
531
+ };
532
+ const outputParser = 'output' in opts && opts.output ? opts.output : (output)=>output;
533
+ return new Procedure({
534
+ inputParser: inputParser,
535
+ resolver: opts.resolve,
536
+ middlewares: [],
537
+ outputParser: outputParser,
538
+ meta: opts.meta
539
+ });
540
+ }
541
+
542
+ function migrateProcedure(oldProc, type) {
543
+ const def = oldProc._def();
544
+ const inputParser = getParseFnOrPassThrough(def.inputParser);
545
+ const outputParser = getParseFnOrPassThrough(def.outputParser);
546
+ const inputMiddleware = createInputMiddleware(inputParser);
547
+ const builder = createBuilder({
548
+ inputs: [
549
+ def.inputParser
550
+ ],
551
+ middlewares: [
552
+ ...def.middlewares,
553
+ inputMiddleware,
554
+ createOutputMiddleware(outputParser)
555
+ ],
556
+ meta: def.meta,
557
+ output: def.outputParser,
558
+ mutation: type === 'mutation',
559
+ query: type === 'query',
560
+ subscription: type === 'subscription'
561
+ });
562
+ const proc = builder[type]((opts)=>def.resolver(opts));
563
+ return proc;
564
+ }
565
+ function migrateRouter(oldRouter) {
566
+ const errorFormatter = oldRouter._def.errorFormatter;
567
+ const transformer = oldRouter._def.transformer;
568
+ const queries = {};
569
+ const mutations = {};
570
+ const subscriptions = {};
571
+ for (const [name, procedure] of Object.entries(oldRouter._def.queries)){
572
+ queries[name] = migrateProcedure(procedure, 'query');
573
+ }
574
+ for (const [name1, procedure1] of Object.entries(oldRouter._def.mutations)){
575
+ mutations[name1] = migrateProcedure(procedure1, 'mutation');
576
+ }
577
+ for (const [name2, procedure2] of Object.entries(oldRouter._def.subscriptions)){
578
+ subscriptions[name2] = migrateProcedure(procedure2, 'subscription');
579
+ }
580
+ const procedures = mergeWithoutOverrides(queries, mutations, subscriptions);
581
+ const newRouter = createRouterFactory({
582
+ transformer,
583
+ errorFormatter
584
+ })(procedures);
585
+ return newRouter;
586
+ }
587
+
588
+ function getDataTransformer(transformer) {
589
+ if ('input' in transformer) {
590
+ return transformer;
591
+ }
592
+ return {
593
+ input: transformer,
594
+ output: transformer
595
+ };
596
+ }
597
+ const PROCEDURE_DEFINITION_MAP = {
598
+ query: 'queries',
599
+ mutation: 'mutations',
600
+ subscription: 'subscriptions'
601
+ };
602
+ function safeObject(...args) {
603
+ return Object.assign(Object.create(null), ...args);
604
+ }
605
+ /**
606
+ * @internal The type signature of this class may change without warning.
607
+ * @deprecated
608
+ */ class Router {
609
+ static prefixProcedures(procedures, prefix) {
610
+ const eps = safeObject();
611
+ for (const [key, procedure] of Object.entries(procedures)){
612
+ eps[prefix + key] = procedure;
613
+ }
614
+ return eps;
615
+ }
616
+ query(path, procedure) {
617
+ const router = new Router({
618
+ queries: safeObject({
619
+ [path]: createProcedure(procedure)
620
+ })
621
+ });
622
+ return this.merge(router);
623
+ }
624
+ mutation(path, procedure) {
625
+ const router = new Router({
626
+ mutations: safeObject({
627
+ [path]: createProcedure(procedure)
628
+ })
629
+ });
630
+ return this.merge(router);
631
+ }
632
+ subscription(path, procedure) {
633
+ const router = new Router({
634
+ subscriptions: safeObject({
635
+ [path]: createProcedure(procedure)
636
+ })
637
+ });
638
+ return this.merge(router);
639
+ }
640
+ merge(prefixOrRouter, maybeRouter) {
641
+ let prefix = '';
642
+ let childRouter;
643
+ if (typeof prefixOrRouter === 'string' && maybeRouter instanceof Router) {
644
+ prefix = prefixOrRouter;
645
+ childRouter = maybeRouter;
646
+ } else if (prefixOrRouter instanceof Router) {
647
+ childRouter = prefixOrRouter;
648
+ } else {
649
+ throw new Error('Invalid args');
650
+ }
651
+ const duplicateQueries = Object.keys(childRouter._def.queries).filter((key)=>!!this._def['queries'][prefix + key]);
652
+ const duplicateMutations = Object.keys(childRouter._def.mutations).filter((key)=>!!this._def['mutations'][prefix + key]);
653
+ const duplicateSubscriptions = Object.keys(childRouter._def.subscriptions).filter((key)=>!!this._def['subscriptions'][prefix + key]);
654
+ const duplicates = [
655
+ ...duplicateQueries,
656
+ ...duplicateMutations,
657
+ ...duplicateSubscriptions
658
+ ];
659
+ if (duplicates.length) {
660
+ throw new Error(`Duplicate endpoint(s): ${duplicates.join(', ')}`);
661
+ }
662
+ const mergeProcedures = (defs)=>{
663
+ const newDefs = safeObject();
664
+ for (const [key, procedure] of Object.entries(defs)){
665
+ const newProcedure = procedure.inheritMiddlewares(this._def.middlewares);
666
+ newDefs[key] = newProcedure;
667
+ }
668
+ return Router.prefixProcedures(newDefs, prefix);
669
+ };
670
+ return new Router({
671
+ ...this._def,
672
+ queries: safeObject(this._def.queries, mergeProcedures(childRouter._def.queries)),
673
+ mutations: safeObject(this._def.mutations, mergeProcedures(childRouter._def.mutations)),
674
+ subscriptions: safeObject(this._def.subscriptions, mergeProcedures(childRouter._def.subscriptions))
675
+ });
676
+ }
677
+ /**
678
+ * Invoke procedure. Only for internal use within library.
679
+ */ async call(opts) {
680
+ const { type , path } = opts;
681
+ const defTarget = PROCEDURE_DEFINITION_MAP[type];
682
+ const defs = this._def[defTarget];
683
+ const procedure = defs[path];
684
+ if (!procedure) {
685
+ throw new TRPCError({
686
+ code: 'NOT_FOUND',
687
+ message: `No "${type}"-procedure on path "${path}"`
688
+ });
689
+ }
690
+ return procedure.call(opts);
691
+ }
692
+ createCaller(ctx) {
693
+ return {
694
+ query: (path, ...args)=>{
695
+ return this.call({
696
+ type: 'query',
697
+ ctx,
698
+ path,
699
+ rawInput: args[0]
700
+ });
701
+ },
702
+ mutation: (path, ...args)=>{
703
+ return this.call({
704
+ type: 'mutation',
705
+ ctx,
706
+ path,
707
+ rawInput: args[0]
708
+ });
709
+ },
710
+ subscription: (path, ...args)=>{
711
+ return this.call({
712
+ type: 'subscription',
713
+ ctx,
714
+ path,
715
+ rawInput: args[0]
716
+ });
717
+ }
718
+ };
719
+ }
720
+ /**
721
+ * Function to be called before any procedure is invoked
722
+ * @link https://trpc.io/docs/middlewares
723
+ */ middleware(middleware) {
724
+ return new Router({
725
+ ...this._def,
726
+ middlewares: [
727
+ ...this._def.middlewares,
728
+ middleware
729
+ ]
730
+ });
731
+ }
732
+ /**
733
+ * Format errors
734
+ * @link https://trpc.io/docs/error-formatting
735
+ */ formatError(errorFormatter) {
736
+ if (this._def.errorFormatter !== defaultFormatter) {
737
+ throw new Error('You seem to have double `formatError()`-calls in your router tree');
738
+ }
739
+ return new Router({
740
+ ...this._def,
741
+ errorFormatter: errorFormatter
742
+ });
743
+ }
744
+ getErrorShape(opts) {
745
+ const { path , error } = opts;
746
+ const { code } = opts.error;
747
+ const shape = {
748
+ message: error.message,
749
+ code: TRPC_ERROR_CODES_BY_KEY[code],
750
+ data: {
751
+ code,
752
+ httpStatus: getHTTPStatusCodeFromError(error)
753
+ }
754
+ };
755
+ if (process.env.NODE_ENV !== 'production' && typeof opts.error.stack === 'string') {
756
+ shape.data.stack = opts.error.stack;
757
+ }
758
+ if (typeof path === 'string') {
759
+ shape.data.path = path;
760
+ }
761
+ return this._def.errorFormatter({
762
+ ...opts,
763
+ shape
764
+ });
765
+ }
766
+ /**
767
+ * Add data transformer to serialize/deserialize input args + output
768
+ * @link https://trpc.io/docs/data-transformers
769
+ */ transformer(_transformer) {
770
+ const transformer = getDataTransformer(_transformer);
771
+ if (this._def.transformer !== defaultTransformer) {
772
+ throw new Error('You seem to have double `transformer()`-calls in your router tree');
773
+ }
774
+ return new Router({
775
+ ...this._def,
776
+ transformer
777
+ });
778
+ }
779
+ /**
780
+ * Flattens the generics of TQueries/TMutations/TSubscriptions.
781
+ * ⚠️ Experimental - might disappear. ⚠️
782
+ *
783
+ * @alpha
784
+ */ flat() {
785
+ return this;
786
+ }
787
+ /**
788
+ * Interop mode for v9.x -> v10.x
789
+ */ interop() {
790
+ return migrateRouter(this);
791
+ }
792
+ constructor(def){
793
+ this._def = {
794
+ queries: def?.queries ?? safeObject(),
795
+ mutations: def?.mutations ?? safeObject(),
796
+ subscriptions: def?.subscriptions ?? safeObject(),
797
+ middlewares: def?.middlewares ?? [],
798
+ errorFormatter: def?.errorFormatter ?? defaultFormatter,
799
+ transformer: def?.transformer ?? defaultTransformer
800
+ };
801
+ }
802
+ }
803
+ /**
804
+ * @deprecated
805
+ */ function router() {
806
+ return new Router();
807
+ }
808
+
809
+ export { createInputMiddleware, createOutputMiddleware, initTRPC, router };