@orpc/server 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/{chunk-SXUFCJBY.js → chunk-ESTRJAOX.js} +5 -7
  2. package/dist/{chunk-GK2Z6B6W.js → chunk-KK4SDLC7.js} +158 -68
  3. package/dist/fetch.js +2 -2
  4. package/dist/hono.js +3 -3
  5. package/dist/index.js +191 -787
  6. package/dist/next.js +3 -3
  7. package/dist/node.js +6 -6
  8. package/dist/src/adapters/fetch/orpc-handler.d.ts +1 -1
  9. package/dist/src/adapters/fetch/orpc-procedure-matcher.d.ts +4 -4
  10. package/dist/src/adapters/fetch/types.d.ts +4 -4
  11. package/dist/src/adapters/hono/middleware.d.ts +3 -3
  12. package/dist/src/adapters/next/serve.d.ts +8 -8
  13. package/dist/src/adapters/node/orpc-handler.d.ts +2 -2
  14. package/dist/src/adapters/node/types.d.ts +5 -5
  15. package/dist/src/builder-variants.d.ts +74 -0
  16. package/dist/src/builder.d.ts +50 -36
  17. package/dist/src/config.d.ts +6 -0
  18. package/dist/src/context.d.ts +8 -10
  19. package/dist/src/hidden.d.ts +5 -3
  20. package/dist/src/implementer-procedure.d.ts +30 -0
  21. package/dist/src/implementer-variants.d.ts +16 -0
  22. package/dist/src/implementer.d.ts +27 -0
  23. package/dist/src/index.d.ts +9 -13
  24. package/dist/src/lazy-utils.d.ts +4 -2
  25. package/dist/src/lazy.d.ts +9 -5
  26. package/dist/src/middleware-decorated.d.ts +7 -7
  27. package/dist/src/middleware-utils.d.ts +5 -0
  28. package/dist/src/middleware.d.ts +22 -21
  29. package/dist/src/procedure-client.d.ts +6 -8
  30. package/dist/src/procedure-decorated.d.ts +10 -15
  31. package/dist/src/procedure-utils.d.ts +2 -2
  32. package/dist/src/procedure.d.ts +17 -33
  33. package/dist/src/router-accessible-lazy.d.ts +8 -0
  34. package/dist/src/router-client.d.ts +6 -10
  35. package/dist/src/router.d.ts +25 -12
  36. package/package.json +3 -3
  37. package/dist/src/builder-with-errors-middlewares.d.ts +0 -50
  38. package/dist/src/builder-with-errors.d.ts +0 -49
  39. package/dist/src/builder-with-middlewares.d.ts +0 -47
  40. package/dist/src/error.d.ts +0 -10
  41. package/dist/src/implementer-chainable.d.ts +0 -14
  42. package/dist/src/lazy-decorated.d.ts +0 -7
  43. package/dist/src/procedure-builder-with-input.d.ts +0 -34
  44. package/dist/src/procedure-builder-with-output.d.ts +0 -33
  45. package/dist/src/procedure-builder.d.ts +0 -27
  46. package/dist/src/procedure-implementer.d.ts +0 -22
  47. package/dist/src/router-builder.d.ts +0 -33
  48. package/dist/src/router-implementer.d.ts +0 -22
  49. package/dist/src/types.d.ts +0 -14
  50. package/dist/src/utils.d.ts +0 -3
package/dist/index.js CHANGED
@@ -1,32 +1,38 @@
1
1
  import {
2
2
  LAZY_LOADER_SYMBOL,
3
3
  Procedure,
4
- createORPCErrorConstructorMap,
4
+ adaptRouter,
5
+ addMiddleware,
6
+ createAccessibleLazyRouter,
7
+ createLazyProcedureFormAnyLazy,
5
8
  createProcedureClient,
9
+ deepSetLazyRouterPrefix,
6
10
  flatLazy,
11
+ getLazyRouterPrefix,
7
12
  getRouterChild,
13
+ getRouterContract,
8
14
  isLazy,
9
15
  isProcedure,
10
16
  lazy,
11
- mergeContext,
12
17
  middlewareOutputFn,
18
+ setRouterContract,
13
19
  unlazy
14
- } from "./chunk-GK2Z6B6W.js";
20
+ } from "./chunk-KK4SDLC7.js";
15
21
 
16
22
  // src/builder.ts
17
- import { ContractProcedure as ContractProcedure4 } from "@orpc/contract";
18
-
19
- // src/builder-with-errors.ts
20
- import { ContractProcedure as ContractProcedure2 } from "@orpc/contract";
23
+ import { mergeErrorMap as mergeErrorMap2, mergeMeta as mergeMeta2, mergePrefix, mergeRoute as mergeRoute2, mergeTags } from "@orpc/contract";
21
24
 
22
- // src/builder-with-errors-middlewares.ts
23
- import { ContractProcedure } from "@orpc/contract";
24
-
25
- // src/procedure-builder.ts
26
- import { ContractProcedureBuilder, DecoratedContractProcedure as DecoratedContractProcedure4 } from "@orpc/contract";
27
-
28
- // src/procedure-builder-with-input.ts
29
- import { ContractProcedureBuilderWithInput, DecoratedContractProcedure as DecoratedContractProcedure2 } from "@orpc/contract";
25
+ // src/config.ts
26
+ var DEFAULT_CONFIG = {
27
+ initialInputValidationIndex: 0,
28
+ initialOutputValidationIndex: 0
29
+ };
30
+ function fallbackConfig(key, value) {
31
+ if (value === void 0) {
32
+ return DEFAULT_CONFIG[key];
33
+ }
34
+ return value;
35
+ }
30
36
 
31
37
  // src/middleware-decorated.ts
32
38
  function decorateMiddleware(middleware) {
@@ -40,8 +46,8 @@ function decorateMiddleware(middleware) {
40
46
  decorated.concat = (concatMiddleware, mapInput) => {
41
47
  const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
42
48
  const concatted = decorateMiddleware((options, input, output, ...rest) => {
43
- const next = async (nextOptions) => {
44
- return mapped({ ...options, context: mergeContext(nextOptions.context, options.context) }, input, output, ...rest);
49
+ const next = async (...[nextOptions]) => {
50
+ return mapped({ ...options, context: { ...nextOptions?.context, ...options.context } }, input, output, ...rest);
45
51
  };
46
52
  const merged = middleware({ ...options, next }, input, output, ...rest);
47
53
  return merged;
@@ -52,64 +58,31 @@ function decorateMiddleware(middleware) {
52
58
  }
53
59
 
54
60
  // src/procedure-decorated.ts
55
- import { DecoratedContractProcedure } from "@orpc/contract";
61
+ import { mergeErrorMap, mergeMeta, mergeRoute } from "@orpc/contract";
56
62
  var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
57
- static decorate(procedure) {
58
- if (procedure instanceof _DecoratedProcedure) {
59
- return procedure;
60
- }
61
- return new _DecoratedProcedure(procedure["~orpc"]);
62
- }
63
- prefix(prefix) {
64
- return new _DecoratedProcedure({
65
- ...this["~orpc"],
66
- contract: DecoratedContractProcedure.decorate(this["~orpc"].contract).prefix(prefix)
67
- });
68
- }
69
- route(route) {
70
- return new _DecoratedProcedure({
71
- ...this["~orpc"],
72
- contract: DecoratedContractProcedure.decorate(this["~orpc"].contract).route(route)
73
- });
74
- }
75
63
  errors(errors) {
76
64
  return new _DecoratedProcedure({
77
65
  ...this["~orpc"],
78
- contract: DecoratedContractProcedure.decorate(this["~orpc"].contract).errors(errors)
66
+ errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
79
67
  });
80
68
  }
81
- use(middleware, mapInput) {
82
- const middleware_ = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
69
+ meta(meta) {
83
70
  return new _DecoratedProcedure({
84
71
  ...this["~orpc"],
85
- middlewares: [...this["~orpc"].middlewares, middleware_]
72
+ meta: mergeMeta(this["~orpc"].meta, meta)
86
73
  });
87
74
  }
88
- unshiftTag(...tags) {
75
+ route(route) {
89
76
  return new _DecoratedProcedure({
90
77
  ...this["~orpc"],
91
- contract: DecoratedContractProcedure.decorate(this["~orpc"].contract).unshiftTag(...tags)
78
+ route: mergeRoute(this["~orpc"].route, route)
92
79
  });
93
80
  }
94
- unshiftMiddleware(...middlewares) {
95
- const castedMiddlewares = middlewares;
96
- if (this["~orpc"].middlewares.length) {
97
- let min = 0;
98
- for (let i = 0; i < this["~orpc"].middlewares.length; i++) {
99
- const index = castedMiddlewares.indexOf(this["~orpc"].middlewares[i], min);
100
- if (index === -1) {
101
- castedMiddlewares.push(...this["~orpc"].middlewares.slice(i));
102
- break;
103
- }
104
- min = index + 1;
105
- }
106
- }
107
- const numNewMiddlewares = castedMiddlewares.length - this["~orpc"].middlewares.length;
81
+ use(middleware, mapInput) {
82
+ const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
108
83
  return new _DecoratedProcedure({
109
84
  ...this["~orpc"],
110
- inputValidationIndex: this["~orpc"].inputValidationIndex + numNewMiddlewares,
111
- outputValidationIndex: this["~orpc"].outputValidationIndex + numNewMiddlewares,
112
- middlewares: castedMiddlewares
85
+ middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
113
86
  });
114
87
  }
115
88
  /**
@@ -129,796 +102,230 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
129
102
  }
130
103
  };
131
104
 
132
- // src/procedure-implementer.ts
133
- var ProcedureImplementer = class _ProcedureImplementer {
134
- "~type" = "ProcedureImplementer";
135
- "~orpc";
136
- constructor(def) {
137
- this["~orpc"] = def;
138
- }
139
- use(middleware, mapInput) {
140
- const mappedMiddleware = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
141
- return new _ProcedureImplementer({
142
- ...this["~orpc"],
143
- middlewares: [...this["~orpc"].middlewares, mappedMiddleware]
144
- });
145
- }
146
- handler(handler) {
147
- return new DecoratedProcedure({
148
- ...this["~orpc"],
149
- handler
150
- });
151
- }
152
- };
153
-
154
- // src/procedure-builder-with-input.ts
155
- var ProcedureBuilderWithInput = class _ProcedureBuilderWithInput {
156
- "~type" = "ProcedureBuilderWithInput";
157
- "~orpc";
158
- constructor(def) {
159
- this["~orpc"] = def;
160
- }
161
- errors(errors) {
162
- return new _ProcedureBuilderWithInput({
163
- ...this["~orpc"],
164
- contract: DecoratedContractProcedure2.decorate(this["~orpc"].contract).errors(errors)
165
- });
166
- }
167
- route(route) {
168
- return new _ProcedureBuilderWithInput({
169
- ...this["~orpc"],
170
- contract: DecoratedContractProcedure2.decorate(this["~orpc"].contract).route(route)
171
- });
172
- }
173
- use(middleware, mapInput) {
174
- const maybeWithMapInput = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
175
- return new _ProcedureBuilderWithInput({
176
- ...this["~orpc"],
177
- outputValidationIndex: this["~orpc"].outputValidationIndex + 1,
178
- middlewares: [...this["~orpc"].middlewares, maybeWithMapInput]
179
- });
180
- }
181
- output(schema, example) {
182
- return new ProcedureImplementer({
183
- ...this["~orpc"],
184
- contract: new ContractProcedureBuilderWithInput(this["~orpc"].contract["~orpc"]).output(schema, example)
185
- });
186
- }
187
- handler(handler) {
188
- return new DecoratedProcedure({
189
- ...this["~orpc"],
190
- handler
191
- });
192
- }
193
- };
194
-
195
- // src/procedure-builder-with-output.ts
196
- import { ContractProcedureBuilderWithOutput, DecoratedContractProcedure as DecoratedContractProcedure3 } from "@orpc/contract";
197
- var ProcedureBuilderWithOutput = class _ProcedureBuilderWithOutput {
198
- "~type" = "ProcedureBuilderWithOutput";
199
- "~orpc";
200
- constructor(def) {
201
- this["~orpc"] = def;
202
- }
203
- errors(errors) {
204
- return new _ProcedureBuilderWithOutput({
205
- ...this["~orpc"],
206
- contract: DecoratedContractProcedure3.decorate(this["~orpc"].contract).errors(errors)
207
- });
208
- }
209
- route(route) {
210
- return new _ProcedureBuilderWithOutput({
211
- ...this["~orpc"],
212
- contract: DecoratedContractProcedure3.decorate(this["~orpc"].contract).route(route)
213
- });
214
- }
215
- use(middleware) {
216
- return new _ProcedureBuilderWithOutput({
217
- ...this["~orpc"],
218
- inputValidationIndex: this["~orpc"].inputValidationIndex + 1,
219
- middlewares: [...this["~orpc"].middlewares, middleware]
220
- });
221
- }
222
- input(schema, example) {
223
- return new ProcedureImplementer({
224
- ...this["~orpc"],
225
- contract: new ContractProcedureBuilderWithOutput(this["~orpc"].contract["~orpc"]).input(schema, example)
226
- });
227
- }
228
- handler(handler) {
229
- return new DecoratedProcedure({
230
- ...this["~orpc"],
231
- handler
232
- });
233
- }
234
- };
235
-
236
- // src/procedure-builder.ts
237
- var ProcedureBuilder = class _ProcedureBuilder {
238
- "~type" = "ProcedureBuilder";
105
+ // src/builder.ts
106
+ var Builder = class _Builder {
239
107
  "~orpc";
240
108
  constructor(def) {
241
109
  this["~orpc"] = def;
242
110
  }
243
- errors(errors) {
244
- return new _ProcedureBuilder({
245
- ...this["~orpc"],
246
- contract: DecoratedContractProcedure4.decorate(this["~orpc"].contract).errors(errors)
247
- });
248
- }
249
- route(route) {
250
- return new _ProcedureBuilder({
251
- ...this["~orpc"],
252
- contract: DecoratedContractProcedure4.decorate(this["~orpc"].contract).route(route)
253
- });
254
- }
255
- use(middleware) {
256
- return new _ProcedureBuilder({
257
- ...this["~orpc"],
258
- inputValidationIndex: this["~orpc"].inputValidationIndex + 1,
259
- outputValidationIndex: this["~orpc"].outputValidationIndex + 1,
260
- middlewares: [...this["~orpc"].middlewares, middleware]
261
- });
262
- }
263
- input(schema, example) {
264
- return new ProcedureBuilderWithInput({
111
+ /**
112
+ * Reset config
113
+ */
114
+ $config(config) {
115
+ const inputValidationCount = this["~orpc"].inputValidationIndex - fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex);
116
+ const outputValidationCount = this["~orpc"].outputValidationIndex - fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex);
117
+ return new _Builder({
265
118
  ...this["~orpc"],
266
- contract: new ContractProcedureBuilder(this["~orpc"].contract["~orpc"]).input(schema, example)
119
+ config,
120
+ inputValidationIndex: fallbackConfig("initialInputValidationIndex", config.initialInputValidationIndex) + inputValidationCount,
121
+ outputValidationIndex: fallbackConfig("initialOutputValidationIndex", config.initialOutputValidationIndex) + outputValidationCount
267
122
  });
268
123
  }
269
- output(schema, example) {
270
- return new ProcedureBuilderWithOutput({
124
+ /**
125
+ * Reset initial context
126
+ */
127
+ $context() {
128
+ return new _Builder({
271
129
  ...this["~orpc"],
272
- contract: new ContractProcedureBuilder(this["~orpc"].contract["~orpc"]).output(schema, example)
130
+ middlewares: [],
131
+ inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex),
132
+ outputValidationIndex: fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex)
273
133
  });
274
134
  }
275
- handler(handler) {
276
- return new DecoratedProcedure({
135
+ /**
136
+ * Reset initial meta
137
+ */
138
+ $meta(initialMeta) {
139
+ return new _Builder({
277
140
  ...this["~orpc"],
278
- handler
141
+ meta: initialMeta
279
142
  });
280
143
  }
281
- };
282
-
283
- // src/hidden.ts
284
- var ROUTER_CONTRACT_SYMBOL = Symbol("ORPC_ROUTER_CONTRACT");
285
- function setRouterContract(obj, contract) {
286
- return new Proxy(obj, {
287
- get(target, key) {
288
- if (key === ROUTER_CONTRACT_SYMBOL) {
289
- return contract;
290
- }
291
- return Reflect.get(target, key);
292
- }
293
- });
294
- }
295
- function getRouterContract(obj) {
296
- return obj[ROUTER_CONTRACT_SYMBOL];
297
- }
298
- var LAZY_ROUTER_PREFIX_SYMBOL = Symbol("ORPC_LAZY_ROUTER_PREFIX");
299
- function deepSetLazyRouterPrefix(router, prefix) {
300
- return new Proxy(router, {
301
- get(target, key) {
302
- if (key !== LAZY_ROUTER_PREFIX_SYMBOL) {
303
- const val = Reflect.get(target, key);
304
- if (val && (typeof val === "object" || typeof val === "function")) {
305
- return deepSetLazyRouterPrefix(val, prefix);
306
- }
307
- return val;
308
- }
309
- return prefix;
310
- }
311
- });
312
- }
313
- function getLazyRouterPrefix(obj) {
314
- return obj[LAZY_ROUTER_PREFIX_SYMBOL];
315
- }
316
-
317
- // src/lazy-decorated.ts
318
- function decorateLazy(lazied) {
319
- const flattenLazy = flatLazy(lazied);
320
- const recursive = new Proxy(flattenLazy, {
321
- get(target, key) {
322
- if (typeof key !== "string") {
323
- return Reflect.get(target, key);
324
- }
325
- const next = getRouterChild(flattenLazy, key);
326
- return decorateLazy(next);
327
- }
328
- });
329
- return recursive;
330
- }
331
-
332
- // src/router-builder.ts
333
- var RouterBuilder = class _RouterBuilder {
334
- "~type" = "RouterBuilder";
335
- "~orpc";
336
- constructor(def) {
337
- this["~orpc"] = def;
338
- if (def.prefix && def.prefix.includes("{")) {
339
- throw new Error(`
340
- Dynamic routing in prefix not supported yet.
341
- Please remove "{" from "${def.prefix}".
342
- `);
343
- }
344
- }
345
- prefix(prefix) {
346
- return new _RouterBuilder({
144
+ /**
145
+ * Reset initial route
146
+ */
147
+ $route(initialRoute) {
148
+ return new _Builder({
347
149
  ...this["~orpc"],
348
- prefix: `${this["~orpc"].prefix ?? ""}${prefix}`
150
+ route: initialRoute
349
151
  });
350
152
  }
351
- tag(...tags) {
352
- return new _RouterBuilder({
353
- ...this["~orpc"],
354
- tags: [...this["~orpc"].tags ?? [], ...tags]
355
- });
153
+ middleware(middleware) {
154
+ return decorateMiddleware(middleware);
356
155
  }
357
156
  errors(errors) {
358
- return new _RouterBuilder({
359
- ...this["~orpc"],
360
- errorMap: {
361
- ...this["~orpc"].errorMap,
362
- ...errors
363
- }
364
- });
365
- }
366
- use(middleware) {
367
- return new _RouterBuilder({
157
+ return new _Builder({
368
158
  ...this["~orpc"],
369
- middlewares: [...this["~orpc"].middlewares, middleware]
159
+ errorMap: mergeErrorMap2(this["~orpc"].errorMap, errors)
370
160
  });
371
161
  }
372
- router(router) {
373
- const adapted = adapt(router, this["~orpc"]);
374
- return adapted;
375
- }
376
- lazy(loader) {
377
- const adapted = adapt(flatLazy(lazy(loader)), this["~orpc"]);
378
- return adapted;
379
- }
380
- };
381
- function adapt(item, options) {
382
- if (isLazy(item)) {
383
- const adaptedLazy = decorateLazy(lazy(async () => {
384
- const routerOrProcedure = (await unlazy(item)).default;
385
- const adapted2 = adapt(routerOrProcedure, options);
386
- return { default: adapted2 };
387
- }));
388
- const lazyPrefix = getLazyRouterPrefix(item);
389
- if (options.prefix || lazyPrefix) {
390
- const prefixed = deepSetLazyRouterPrefix(adaptedLazy, `${options.prefix ?? ""}${lazyPrefix ?? ""}`);
391
- return prefixed;
392
- }
393
- return adaptedLazy;
394
- }
395
- if (isProcedure(item)) {
396
- let decorated = DecoratedProcedure.decorate(item);
397
- if (options.tags?.length) {
398
- decorated = decorated.unshiftTag(...options.tags);
399
- }
400
- if (options.prefix) {
401
- decorated = decorated.prefix(options.prefix);
402
- }
403
- if (options.middlewares?.length) {
404
- decorated = decorated.unshiftMiddleware(...options.middlewares);
405
- }
406
- if (Object.keys(options.errorMap).length) {
407
- decorated = decorated.errors(options.errorMap);
408
- }
409
- return decorated;
410
- }
411
- const adapted = {};
412
- for (const key in item) {
413
- adapted[key] = adapt(item[key], options);
414
- }
415
- return adapted;
416
- }
417
-
418
- // src/builder-with-errors-middlewares.ts
419
- var BuilderWithErrorsMiddlewares = class _BuilderWithErrorsMiddlewares {
420
- "~type" = "BuilderWithErrorsMiddlewares";
421
- "~orpc";
422
- constructor(def) {
423
- this["~orpc"] = def;
424
- }
425
- errors(errors) {
426
- return new _BuilderWithErrorsMiddlewares({
162
+ use(middleware, mapInput) {
163
+ const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
164
+ return new _Builder({
427
165
  ...this["~orpc"],
428
- errorMap: {
429
- ...this["~orpc"].errorMap,
430
- ...errors
431
- }
166
+ middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
432
167
  });
433
168
  }
434
- use(middleware) {
435
- return new _BuilderWithErrorsMiddlewares({
169
+ meta(meta) {
170
+ return new _Builder({
436
171
  ...this["~orpc"],
437
- inputValidationIndex: this["~orpc"].inputValidationIndex + 1,
438
- outputValidationIndex: this["~orpc"].outputValidationIndex + 1,
439
- middlewares: [...this["~orpc"].middlewares, middleware]
440
- // FIXME: I believe we can remove `as any` here
172
+ meta: mergeMeta2(this["~orpc"].meta, meta)
441
173
  });
442
174
  }
443
175
  route(route) {
444
- return new ProcedureBuilder({
176
+ return new _Builder({
445
177
  ...this["~orpc"],
446
- contract: new ContractProcedure({
447
- route,
448
- InputSchema: void 0,
449
- OutputSchema: void 0,
450
- errorMap: this["~orpc"].errorMap
451
- })
178
+ route: mergeRoute2(this["~orpc"].route, route)
452
179
  });
453
180
  }
454
- input(schema, example) {
455
- return new ProcedureBuilderWithInput({
181
+ input(schema) {
182
+ return new _Builder({
456
183
  ...this["~orpc"],
457
- contract: new ContractProcedure({
458
- OutputSchema: void 0,
459
- InputSchema: schema,
460
- inputExample: example,
461
- errorMap: this["~orpc"].errorMap
462
- })
184
+ inputSchema: schema,
185
+ inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex) + this["~orpc"].middlewares.length
463
186
  });
464
187
  }
465
- output(schema, example) {
466
- return new ProcedureBuilderWithOutput({
188
+ output(schema) {
189
+ return new _Builder({
467
190
  ...this["~orpc"],
468
- contract: new ContractProcedure({
469
- InputSchema: void 0,
470
- OutputSchema: schema,
471
- outputExample: example,
472
- errorMap: this["~orpc"].errorMap
473
- })
191
+ outputSchema: schema,
192
+ outputValidationIndex: fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex) + this["~orpc"].middlewares.length
474
193
  });
475
194
  }
476
195
  handler(handler) {
477
196
  return new DecoratedProcedure({
478
197
  ...this["~orpc"],
479
- contract: new ContractProcedure({
480
- InputSchema: void 0,
481
- OutputSchema: void 0,
482
- errorMap: this["~orpc"].errorMap
483
- }),
484
198
  handler
485
199
  });
486
200
  }
487
201
  prefix(prefix) {
488
- return new RouterBuilder({
202
+ return new _Builder({
489
203
  ...this["~orpc"],
490
- prefix
204
+ prefix: mergePrefix(this["~orpc"].prefix, prefix)
491
205
  });
492
206
  }
493
207
  tag(...tags) {
494
- return new RouterBuilder({
495
- ...this["~orpc"],
496
- tags
497
- });
498
- }
499
- router(router) {
500
- return new RouterBuilder(this["~orpc"]).router(router);
501
- }
502
- lazy(loader) {
503
- return new RouterBuilder(this["~orpc"]).lazy(loader);
504
- }
505
- };
506
-
507
- // src/builder-with-errors.ts
508
- var BuilderWithErrors = class _BuilderWithErrors {
509
- "~type" = "BuilderWithErrors";
510
- "~orpc";
511
- constructor(def) {
512
- this["~orpc"] = def;
513
- }
514
- context() {
515
- return this;
516
- }
517
- errors(errors) {
518
- return new _BuilderWithErrors({
519
- ...this["~orpc"],
520
- errorMap: {
521
- ...this["~orpc"].errorMap,
522
- ...errors
523
- }
524
- });
525
- }
526
- middleware(middleware) {
527
- return decorateMiddleware(middleware);
528
- }
529
- use(middleware) {
530
- return new BuilderWithErrorsMiddlewares({
208
+ return new _Builder({
531
209
  ...this["~orpc"],
532
- inputValidationIndex: 1,
533
- outputValidationIndex: 1,
534
- middlewares: [middleware]
535
- // FIXME: I believe we can remove `as any` here
536
- });
537
- }
538
- route(route) {
539
- return new ProcedureBuilder({
540
- middlewares: [],
541
- inputValidationIndex: 0,
542
- outputValidationIndex: 0,
543
- contract: new ContractProcedure2({
544
- route,
545
- InputSchema: void 0,
546
- OutputSchema: void 0,
547
- errorMap: this["~orpc"].errorMap
548
- })
549
- });
550
- }
551
- input(schema, example) {
552
- return new ProcedureBuilderWithInput({
553
- middlewares: [],
554
- inputValidationIndex: 0,
555
- outputValidationIndex: 0,
556
- contract: new ContractProcedure2({
557
- OutputSchema: void 0,
558
- InputSchema: schema,
559
- inputExample: example,
560
- errorMap: this["~orpc"].errorMap
561
- })
562
- });
563
- }
564
- output(schema, example) {
565
- return new ProcedureBuilderWithOutput({
566
- middlewares: [],
567
- inputValidationIndex: 0,
568
- outputValidationIndex: 0,
569
- contract: new ContractProcedure2({
570
- InputSchema: void 0,
571
- OutputSchema: schema,
572
- outputExample: example,
573
- errorMap: this["~orpc"].errorMap
574
- })
575
- });
576
- }
577
- handler(handler) {
578
- return new DecoratedProcedure({
579
- middlewares: [],
580
- inputValidationIndex: 0,
581
- outputValidationIndex: 0,
582
- contract: new ContractProcedure2({
583
- InputSchema: void 0,
584
- OutputSchema: void 0,
585
- errorMap: this["~orpc"].errorMap
586
- }),
587
- handler
588
- });
589
- }
590
- prefix(prefix) {
591
- return new RouterBuilder({
592
- middlewares: [],
593
- errorMap: this["~orpc"].errorMap,
594
- prefix
595
- });
596
- }
597
- tag(...tags) {
598
- return new RouterBuilder({
599
- middlewares: [],
600
- errorMap: this["~orpc"].errorMap,
601
- tags
210
+ tags: mergeTags(this["~orpc"].tags, tags)
602
211
  });
603
212
  }
604
213
  router(router) {
605
- return new RouterBuilder({
606
- middlewares: [],
607
- ...this["~orpc"]
608
- }).router(router);
214
+ return adaptRouter(router, this["~orpc"]);
609
215
  }
610
216
  lazy(loader) {
611
- return new RouterBuilder({
612
- middlewares: [],
613
- ...this["~orpc"]
614
- }).lazy(loader);
217
+ return adaptRouter(flatLazy(lazy(loader)), this["~orpc"]);
615
218
  }
616
219
  };
220
+ var os = new Builder({
221
+ config: {},
222
+ route: {},
223
+ meta: {},
224
+ errorMap: {},
225
+ inputSchema: void 0,
226
+ outputSchema: void 0,
227
+ inputValidationIndex: fallbackConfig("initialInputValidationIndex"),
228
+ outputValidationIndex: fallbackConfig("initialOutputValidationIndex"),
229
+ middlewares: []
230
+ });
617
231
 
618
- // src/builder-with-middlewares.ts
619
- import { ContractProcedure as ContractProcedure3 } from "@orpc/contract";
232
+ // src/context.ts
233
+ function mergeContext(context, other) {
234
+ return { ...context, ...other };
235
+ }
620
236
 
621
- // src/implementer-chainable.ts
237
+ // src/implementer.ts
622
238
  import { isContractProcedure } from "@orpc/contract";
623
- import { createCallableObject } from "@orpc/shared";
624
-
625
- // src/router-implementer.ts
626
- var RouterImplementer = class _RouterImplementer {
627
- "~type" = "RouterImplementer";
628
- "~orpc";
629
- constructor(def) {
630
- this["~orpc"] = def;
631
- }
632
- use(middleware) {
633
- return new _RouterImplementer({
634
- ...this["~orpc"],
635
- middlewares: [...this["~orpc"].middlewares ?? [], middleware]
636
- });
637
- }
638
- router(router) {
639
- const adapted = new RouterBuilder({
640
- ...this["~orpc"],
641
- errorMap: {}
642
- }).router(router);
643
- const contracted = setRouterContract(adapted, this["~orpc"].contract);
644
- return contracted;
645
- }
646
- lazy(loader) {
647
- const adapted = new RouterBuilder({
648
- ...this["~orpc"],
649
- errorMap: {}
650
- }).lazy(loader);
651
- const contracted = setRouterContract(adapted, this["~orpc"].contract);
652
- return contracted;
653
- }
654
- };
655
-
656
- // src/implementer-chainable.ts
657
- function createChainableImplementer(contract, options) {
239
+ function implementerInternal(contract, config, middlewares) {
658
240
  if (isContractProcedure(contract)) {
659
- const implementer = new ProcedureImplementer({
660
- contract,
661
- middlewares: options.middlewares,
662
- inputValidationIndex: options.inputValidationIndex,
663
- outputValidationIndex: options.outputValidationIndex
664
- });
665
- return implementer;
666
- }
667
- const chainable = {};
668
- for (const key in contract) {
669
- chainable[key] = createChainableImplementer(contract[key], options);
670
- }
671
- const routerImplementer = new RouterImplementer({
672
- contract,
673
- middlewares: options.middlewares
241
+ const impl2 = new Builder({
242
+ ...contract["~orpc"],
243
+ config,
244
+ middlewares,
245
+ inputValidationIndex: fallbackConfig("initialInputValidationIndex", config?.initialInputValidationIndex) + middlewares.length,
246
+ outputValidationIndex: fallbackConfig("initialOutputValidationIndex", config?.initialOutputValidationIndex) + middlewares.length
247
+ });
248
+ return impl2;
249
+ }
250
+ const impl = new Proxy(contract, {
251
+ get: (target, key) => {
252
+ let method;
253
+ if (key === "middleware") {
254
+ method = (mid) => decorateMiddleware(mid);
255
+ } else if (key === "use") {
256
+ method = (mid) => {
257
+ return implementerInternal(
258
+ contract,
259
+ config,
260
+ addMiddleware(middlewares, mid)
261
+ );
262
+ };
263
+ } else if (key === "router") {
264
+ method = (router) => {
265
+ const adapted = adaptRouter(router, {
266
+ middlewares,
267
+ errorMap: {}
268
+ });
269
+ return setRouterContract(adapted, contract);
270
+ };
271
+ } else if (key === "lazy") {
272
+ method = (loader) => {
273
+ const adapted = adaptRouter(flatLazy(lazy(loader)), {
274
+ middlewares,
275
+ errorMap: {}
276
+ });
277
+ return setRouterContract(adapted, contract);
278
+ };
279
+ }
280
+ const next = Reflect.get(target, key);
281
+ if (!next || typeof next !== "function" && typeof next !== "object") {
282
+ return method ?? next;
283
+ }
284
+ const nextImpl = implementerInternal(next, config, middlewares);
285
+ if (method) {
286
+ return new Proxy(method, {
287
+ get(_, key2) {
288
+ return Reflect.get(nextImpl, key2);
289
+ }
290
+ });
291
+ }
292
+ return nextImpl;
293
+ }
674
294
  });
675
- const merged = new Proxy(chainable, {
676
- get(target, key) {
295
+ return impl;
296
+ }
297
+ function implement(contract, config = {}) {
298
+ const implInternal = implementerInternal(contract, config, []);
299
+ const impl = new Proxy(implInternal, {
300
+ get: (target, key) => {
301
+ let method;
302
+ if (key === "$context") {
303
+ method = () => impl;
304
+ } else if (key === "$config") {
305
+ method = (config2) => implement(contract, config2);
306
+ }
677
307
  const next = Reflect.get(target, key);
678
- const method = Reflect.get(routerImplementer, key);
679
- if (typeof key !== "string" || typeof method !== "function") {
680
- return next;
308
+ if (!next || typeof next !== "function" && typeof next !== "object") {
309
+ return method ?? next;
681
310
  }
682
- if (!next) {
683
- return method.bind(routerImplementer);
311
+ if (method) {
312
+ return new Proxy(method, {
313
+ get(_, key2) {
314
+ return Reflect.get(next, key2);
315
+ }
316
+ });
684
317
  }
685
- return createCallableObject(next, method.bind(routerImplementer));
318
+ return next;
686
319
  }
687
320
  });
688
- return merged;
321
+ return impl;
689
322
  }
690
323
 
691
- // src/builder-with-middlewares.ts
692
- var BuilderWithMiddlewares = class _BuilderWithMiddlewares {
693
- "~type" = "BuilderHasMiddlewares";
694
- "~orpc";
695
- constructor(def) {
696
- this["~orpc"] = def;
697
- }
698
- use(middleware) {
699
- return new _BuilderWithMiddlewares({
700
- ...this["~orpc"],
701
- inputValidationIndex: this["~orpc"].inputValidationIndex + 1,
702
- outputValidationIndex: this["~orpc"].outputValidationIndex + 1,
703
- middlewares: [...this["~orpc"].middlewares, middleware]
704
- });
705
- }
706
- errors(errors) {
707
- return new BuilderWithErrorsMiddlewares({
708
- ...this["~orpc"],
709
- errorMap: errors
710
- });
711
- }
712
- route(route) {
713
- return new ProcedureBuilder({
714
- ...this["~orpc"],
715
- contract: new ContractProcedure3({
716
- route,
717
- InputSchema: void 0,
718
- OutputSchema: void 0,
719
- errorMap: {}
720
- })
721
- });
722
- }
723
- input(schema, example) {
724
- return new ProcedureBuilderWithInput({
725
- ...this["~orpc"],
726
- contract: new ContractProcedure3({
727
- OutputSchema: void 0,
728
- InputSchema: schema,
729
- inputExample: example,
730
- errorMap: {}
731
- })
732
- });
733
- }
734
- output(schema, example) {
735
- return new ProcedureBuilderWithOutput({
736
- ...this["~orpc"],
737
- contract: new ContractProcedure3({
738
- InputSchema: void 0,
739
- OutputSchema: schema,
740
- outputExample: example,
741
- errorMap: {}
742
- })
743
- });
744
- }
745
- handler(handler) {
746
- return new DecoratedProcedure({
747
- ...this["~orpc"],
748
- contract: new ContractProcedure3({
749
- InputSchema: void 0,
750
- OutputSchema: void 0,
751
- errorMap: {}
752
- }),
753
- handler
754
- });
755
- }
756
- prefix(prefix) {
757
- return new RouterBuilder({
758
- middlewares: this["~orpc"].middlewares,
759
- errorMap: {},
760
- prefix
761
- });
762
- }
763
- tag(...tags) {
764
- return new RouterBuilder({
765
- middlewares: this["~orpc"].middlewares,
766
- errorMap: {},
767
- tags
768
- });
769
- }
770
- router(router) {
771
- return new RouterBuilder({
772
- errorMap: {},
773
- ...this["~orpc"]
774
- }).router(router);
775
- }
776
- lazy(loader) {
777
- return new RouterBuilder({
778
- errorMap: {},
779
- ...this["~orpc"]
780
- }).lazy(loader);
781
- }
782
- contract(contract) {
783
- return createChainableImplementer(contract, this["~orpc"]);
784
- }
785
- };
786
-
787
- // src/builder.ts
788
- var Builder = class {
789
- "~type" = "Builder";
790
- "~orpc";
791
- constructor(def) {
792
- this["~orpc"] = def;
793
- }
794
- context() {
795
- return this;
796
- }
797
- middleware(middleware) {
798
- return decorateMiddleware(middleware);
799
- }
800
- errors(errors) {
801
- return new BuilderWithErrors({
802
- errorMap: errors
803
- });
804
- }
805
- use(middleware) {
806
- return new BuilderWithMiddlewares({
807
- ...this["~orpc"],
808
- inputValidationIndex: 1,
809
- outputValidationIndex: 1,
810
- middlewares: [middleware]
811
- // FIXME: I believe we can remove `as any` here
812
- });
813
- }
814
- route(route) {
815
- return new ProcedureBuilder({
816
- middlewares: [],
817
- inputValidationIndex: 0,
818
- outputValidationIndex: 0,
819
- contract: new ContractProcedure4({
820
- route,
821
- InputSchema: void 0,
822
- OutputSchema: void 0,
823
- errorMap: {}
824
- })
825
- });
826
- }
827
- input(schema, example) {
828
- return new ProcedureBuilderWithInput({
829
- middlewares: [],
830
- inputValidationIndex: 0,
831
- outputValidationIndex: 0,
832
- contract: new ContractProcedure4({
833
- OutputSchema: void 0,
834
- InputSchema: schema,
835
- inputExample: example,
836
- errorMap: {}
837
- })
838
- });
839
- }
840
- output(schema, example) {
841
- return new ProcedureBuilderWithOutput({
842
- middlewares: [],
843
- inputValidationIndex: 0,
844
- outputValidationIndex: 0,
845
- contract: new ContractProcedure4({
846
- InputSchema: void 0,
847
- OutputSchema: schema,
848
- outputExample: example,
849
- errorMap: {}
850
- })
851
- });
852
- }
853
- handler(handler) {
854
- return new DecoratedProcedure({
855
- middlewares: [],
856
- inputValidationIndex: 0,
857
- outputValidationIndex: 0,
858
- contract: new ContractProcedure4({
859
- InputSchema: void 0,
860
- OutputSchema: void 0,
861
- errorMap: {}
862
- }),
863
- handler
864
- });
865
- }
866
- prefix(prefix) {
867
- return new RouterBuilder({
868
- middlewares: [],
869
- errorMap: {},
870
- prefix
871
- });
872
- }
873
- tag(...tags) {
874
- return new RouterBuilder({
875
- middlewares: [],
876
- errorMap: {},
877
- tags
878
- });
879
- }
880
- router(router) {
881
- return new RouterBuilder({
882
- middlewares: [],
883
- errorMap: []
884
- }).router(router);
885
- }
886
- lazy(loader) {
887
- return new RouterBuilder({
888
- middlewares: [],
889
- errorMap: {}
890
- }).lazy(loader);
891
- }
892
- contract(contract) {
893
- return createChainableImplementer(contract, {
894
- middlewares: [],
895
- inputValidationIndex: 0,
896
- outputValidationIndex: 0
897
- });
898
- }
899
- };
900
-
901
324
  // src/procedure-utils.ts
902
325
  function call(procedure, input, ...rest) {
903
326
  return createProcedureClient(procedure, ...rest)(input);
904
327
  }
905
328
 
906
- // src/lazy-utils.ts
907
- function createLazyProcedureFormAnyLazy(lazied) {
908
- const lazyProcedure = lazy(async () => {
909
- const { default: maybeProcedure } = await unlazy(flatLazy(lazied));
910
- if (!isProcedure(maybeProcedure)) {
911
- throw new Error(`
912
- Expected a lazy<procedure> but got lazy<unknown>.
913
- This should be caught by TypeScript compilation.
914
- Please report this issue if this makes you feel uncomfortable.
915
- `);
916
- }
917
- return { default: maybeProcedure };
918
- });
919
- return lazyProcedure;
920
- }
921
-
922
329
  // src/router-client.ts
923
330
  function createRouterClient(router, ...rest) {
924
331
  if (isProcedure(router)) {
@@ -946,32 +353,29 @@ function createRouterClient(router, ...rest) {
946
353
  }
947
354
 
948
355
  // src/index.ts
949
- import { configGlobal, fallbackToGlobalConfig, isDefinedError, ORPCError, safe, type } from "@orpc/contract";
950
- var os = new Builder({});
356
+ import { isDefinedError, ORPCError, safe, type, ValidationError } from "@orpc/contract";
951
357
  export {
952
358
  Builder,
953
359
  DecoratedProcedure,
954
360
  LAZY_LOADER_SYMBOL,
955
361
  ORPCError,
956
362
  Procedure,
957
- ProcedureBuilder,
958
- ProcedureImplementer,
959
- RouterBuilder,
960
- RouterImplementer,
363
+ ValidationError,
364
+ adaptRouter,
961
365
  call,
962
- configGlobal,
963
- createChainableImplementer,
964
- createORPCErrorConstructorMap,
366
+ createAccessibleLazyRouter,
367
+ createLazyProcedureFormAnyLazy,
965
368
  createProcedureClient,
966
369
  createRouterClient,
967
- decorateLazy,
968
370
  decorateMiddleware,
969
371
  deepSetLazyRouterPrefix,
970
- fallbackToGlobalConfig,
372
+ fallbackConfig,
971
373
  flatLazy,
972
374
  getLazyRouterPrefix,
973
375
  getRouterChild,
974
376
  getRouterContract,
377
+ implement,
378
+ implementerInternal,
975
379
  isDefinedError,
976
380
  isLazy,
977
381
  isProcedure,