@orpc/contract 0.29.0 → 0.31.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.
package/dist/index.js CHANGED
@@ -27,6 +27,15 @@ var DecoratedContractProcedure = class _DecoratedContractProcedure extends Contr
27
27
  }
28
28
  return new _DecoratedContractProcedure(procedure["~orpc"]);
29
29
  }
30
+ errors(errors) {
31
+ return new _DecoratedContractProcedure({
32
+ ...this["~orpc"],
33
+ errorMap: {
34
+ ...this["~orpc"].errorMap,
35
+ ...errors
36
+ }
37
+ });
38
+ }
30
39
  route(route) {
31
40
  return new _DecoratedContractProcedure({
32
41
  ...this["~orpc"],
@@ -59,24 +68,92 @@ var DecoratedContractProcedure = class _DecoratedContractProcedure extends Contr
59
68
  }
60
69
  });
61
70
  }
71
+ };
72
+
73
+ // src/procedure-builder-with-input.ts
74
+ var ContractProcedureBuilderWithInput = class _ContractProcedureBuilderWithInput extends ContractProcedure {
75
+ errors(errors) {
76
+ const decorated = DecoratedContractProcedure.decorate(this).errors(errors);
77
+ return new _ContractProcedureBuilderWithInput(decorated["~orpc"]);
78
+ }
79
+ route(route) {
80
+ const decorated = DecoratedContractProcedure.decorate(this).route(route);
81
+ return new _ContractProcedureBuilderWithInput(decorated["~orpc"]);
82
+ }
83
+ prefix(prefix) {
84
+ const decorated = DecoratedContractProcedure.decorate(this).prefix(prefix);
85
+ return new _ContractProcedureBuilderWithInput(decorated["~orpc"]);
86
+ }
87
+ unshiftTag(...tags) {
88
+ const decorated = DecoratedContractProcedure.decorate(this).unshiftTag(...tags);
89
+ return new _ContractProcedureBuilderWithInput(decorated["~orpc"]);
90
+ }
91
+ output(schema, example) {
92
+ return new DecoratedContractProcedure({
93
+ ...this["~orpc"],
94
+ OutputSchema: schema,
95
+ outputExample: example
96
+ });
97
+ }
98
+ };
99
+
100
+ // src/procedure-builder-with-output.ts
101
+ var ContractProcedureBuilderWithOutput = class _ContractProcedureBuilderWithOutput extends ContractProcedure {
102
+ errors(errors) {
103
+ const decorated = DecoratedContractProcedure.decorate(this).errors(errors);
104
+ return new _ContractProcedureBuilderWithOutput(decorated["~orpc"]);
105
+ }
106
+ route(route) {
107
+ const decorated = DecoratedContractProcedure.decorate(this).route(route);
108
+ return new _ContractProcedureBuilderWithOutput(decorated["~orpc"]);
109
+ }
110
+ prefix(prefix) {
111
+ const decorated = DecoratedContractProcedure.decorate(this).prefix(prefix);
112
+ return new _ContractProcedureBuilderWithOutput(decorated["~orpc"]);
113
+ }
114
+ unshiftTag(...tags) {
115
+ const decorated = DecoratedContractProcedure.decorate(this).unshiftTag(...tags);
116
+ return new _ContractProcedureBuilderWithOutput(decorated["~orpc"]);
117
+ }
62
118
  input(schema, example) {
63
- return new _DecoratedContractProcedure({
119
+ return new DecoratedContractProcedure({
64
120
  ...this["~orpc"],
65
121
  InputSchema: schema,
66
122
  inputExample: example
67
123
  });
68
124
  }
69
- output(schema, example) {
70
- return new _DecoratedContractProcedure({
125
+ };
126
+
127
+ // src/procedure-builder.ts
128
+ var ContractProcedureBuilder = class _ContractProcedureBuilder extends ContractProcedure {
129
+ errors(errors) {
130
+ const decorated = DecoratedContractProcedure.decorate(this).errors(errors);
131
+ return new _ContractProcedureBuilder(decorated["~orpc"]);
132
+ }
133
+ route(route) {
134
+ const decorated = DecoratedContractProcedure.decorate(this).route(route);
135
+ return new _ContractProcedureBuilder(decorated["~orpc"]);
136
+ }
137
+ prefix(prefix) {
138
+ const decorated = DecoratedContractProcedure.decorate(this).prefix(prefix);
139
+ return new _ContractProcedureBuilder(decorated["~orpc"]);
140
+ }
141
+ unshiftTag(...tags) {
142
+ const decorated = DecoratedContractProcedure.decorate(this).unshiftTag(...tags);
143
+ return new _ContractProcedureBuilder(decorated["~orpc"]);
144
+ }
145
+ input(schema, example) {
146
+ return new ContractProcedureBuilderWithInput({
71
147
  ...this["~orpc"],
72
- OutputSchema: schema,
73
- outputExample: example
148
+ InputSchema: schema,
149
+ inputExample: example
74
150
  });
75
151
  }
76
- errors(errorMap) {
77
- return new _DecoratedContractProcedure({
152
+ output(schema, example) {
153
+ return new ContractProcedureBuilderWithOutput({
78
154
  ...this["~orpc"],
79
- errorMap
155
+ OutputSchema: schema,
156
+ outputExample: example
80
157
  });
81
158
  }
82
159
  };
@@ -100,6 +177,15 @@ var ContractRouterBuilder = class _ContractRouterBuilder {
100
177
  tags: [...this["~orpc"].tags ?? [], ...tags]
101
178
  });
102
179
  }
180
+ errors(errors) {
181
+ return new _ContractRouterBuilder({
182
+ ...this["~orpc"],
183
+ errorMap: {
184
+ ...this["~orpc"].errorMap,
185
+ ...errors
186
+ }
187
+ });
188
+ }
103
189
  router(router) {
104
190
  if (isContractProcedure(router)) {
105
191
  let decorated = DecoratedContractProcedure.decorate(router);
@@ -109,6 +195,7 @@ var ContractRouterBuilder = class _ContractRouterBuilder {
109
195
  if (this["~orpc"].prefix) {
110
196
  decorated = decorated.prefix(this["~orpc"].prefix);
111
197
  }
198
+ decorated = decorated.errors(this["~orpc"].errorMap);
112
199
  return decorated;
113
200
  }
114
201
  const adapted = {};
@@ -120,50 +207,56 @@ var ContractRouterBuilder = class _ContractRouterBuilder {
120
207
  };
121
208
 
122
209
  // src/builder.ts
123
- var ContractBuilder = class {
124
- prefix(prefix) {
125
- return new ContractRouterBuilder({
126
- prefix
127
- });
128
- }
129
- tag(...tags) {
130
- return new ContractRouterBuilder({
131
- tags
210
+ var ContractBuilder = class _ContractBuilder extends ContractProcedure {
211
+ errors(errors) {
212
+ return new _ContractBuilder({
213
+ ...this["~orpc"],
214
+ errorMap: {
215
+ ...this["~orpc"].errorMap,
216
+ ...errors
217
+ }
132
218
  });
133
219
  }
134
220
  route(route) {
135
- return new DecoratedContractProcedure({
221
+ return new ContractProcedureBuilder({
136
222
  route,
137
223
  InputSchema: void 0,
138
224
  OutputSchema: void 0,
139
- errorMap: void 0
225
+ errorMap: this["~orpc"].errorMap
140
226
  });
141
227
  }
142
228
  input(schema, example) {
143
- return new DecoratedContractProcedure({
229
+ return new ContractProcedureBuilderWithInput({
144
230
  InputSchema: schema,
145
231
  inputExample: example,
146
232
  OutputSchema: void 0,
147
- errorMap: void 0
233
+ errorMap: this["~orpc"].errorMap
148
234
  });
149
235
  }
150
236
  output(schema, example) {
151
- return new DecoratedContractProcedure({
237
+ return new ContractProcedureBuilderWithOutput({
152
238
  OutputSchema: schema,
153
239
  outputExample: example,
154
240
  InputSchema: void 0,
155
- errorMap: void 0
241
+ errorMap: this["~orpc"].errorMap
156
242
  });
157
243
  }
158
- errors(errorMap) {
159
- return new DecoratedContractProcedure({
160
- InputSchema: void 0,
161
- OutputSchema: void 0,
162
- errorMap
244
+ prefix(prefix) {
245
+ return new ContractRouterBuilder({
246
+ prefix,
247
+ errorMap: this["~orpc"].errorMap
248
+ });
249
+ }
250
+ tag(...tags) {
251
+ return new ContractRouterBuilder({
252
+ tags,
253
+ errorMap: this["~orpc"].errorMap
163
254
  });
164
255
  }
165
256
  router(router) {
166
- return router;
257
+ return new ContractRouterBuilder({
258
+ errorMap: this["~orpc"].errorMap
259
+ }).router(router);
167
260
  }
168
261
  };
169
262
 
@@ -357,12 +450,35 @@ var ValidationError = class extends Error {
357
450
  }
358
451
  };
359
452
 
453
+ // src/schema-utils.ts
454
+ function type(...[map]) {
455
+ return {
456
+ "~standard": {
457
+ vendor: "custom",
458
+ version: 1,
459
+ async validate(value) {
460
+ if (map) {
461
+ return { value: await map(value) };
462
+ }
463
+ return { value };
464
+ }
465
+ }
466
+ };
467
+ }
468
+
360
469
  // src/index.ts
361
- var oc = new ContractBuilder();
470
+ var oc = new ContractBuilder({
471
+ errorMap: {},
472
+ InputSchema: void 0,
473
+ OutputSchema: void 0
474
+ });
362
475
  export {
363
476
  COMMON_ORPC_ERROR_DEFS,
364
477
  ContractBuilder,
365
478
  ContractProcedure,
479
+ ContractProcedureBuilder,
480
+ ContractProcedureBuilderWithInput,
481
+ ContractProcedureBuilderWithOutput,
366
482
  ContractRouterBuilder,
367
483
  DecoratedContractProcedure,
368
484
  ORPCError,
@@ -375,6 +491,7 @@ export {
375
491
  isDefinedError,
376
492
  oc,
377
493
  safe,
494
+ type,
378
495
  validateORPCError
379
496
  };
380
497
  //# sourceMappingURL=index.js.map
@@ -1,16 +1,22 @@
1
- import type { ErrorMap } from './error-map';
2
- import type { RouteOptions } from './procedure';
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions, StrictErrorMap } from './error-map';
3
2
  import type { ContractRouter } from './router';
3
+ import type { AdaptedContractRouter } from './router-builder';
4
4
  import type { HTTPPath, Schema, SchemaInput, SchemaOutput } from './types';
5
- import { DecoratedContractProcedure } from './procedure-decorated';
5
+ import { ContractProcedure, type RouteOptions } from './procedure';
6
+ import { ContractProcedureBuilder } from './procedure-builder';
7
+ import { ContractProcedureBuilderWithInput } from './procedure-builder-with-input';
8
+ import { ContractProcedureBuilderWithOutput } from './procedure-builder-with-output';
6
9
  import { ContractRouterBuilder } from './router-builder';
7
- export declare class ContractBuilder {
8
- prefix(prefix: HTTPPath): ContractRouterBuilder;
9
- tag(...tags: string[]): ContractRouterBuilder;
10
- route(route: RouteOptions): DecoratedContractProcedure<undefined, undefined, undefined>;
11
- input<U extends Schema>(schema: U, example?: SchemaInput<U>): DecoratedContractProcedure<U, undefined, undefined>;
12
- output<U extends Schema>(schema: U, example?: SchemaOutput<U>): DecoratedContractProcedure<undefined, U, undefined>;
13
- errors<const U extends ErrorMap>(errorMap: U): DecoratedContractProcedure<undefined, undefined, U>;
14
- router<T extends ContractRouter>(router: T): T;
10
+ export type ContractBuilderDef<TErrorMap extends ErrorMap> = {
11
+ errorMap: TErrorMap;
12
+ };
13
+ export declare class ContractBuilder<TErrorMap extends ErrorMap> extends ContractProcedure<undefined, undefined, TErrorMap> {
14
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): ContractBuilder<U & TErrorMap>;
15
+ route(route: RouteOptions): ContractProcedureBuilder<TErrorMap>;
16
+ input<U extends Schema>(schema: U, example?: SchemaInput<U>): ContractProcedureBuilderWithInput<U, TErrorMap>;
17
+ output<U extends Schema>(schema: U, example?: SchemaOutput<U>): ContractProcedureBuilderWithOutput<U, TErrorMap>;
18
+ prefix(prefix: HTTPPath): ContractRouterBuilder<TErrorMap>;
19
+ tag(...tags: string[]): ContractRouterBuilder<TErrorMap>;
20
+ router<T extends ContractRouter<ErrorMap & Partial<StrictErrorMap<TErrorMap>>>>(router: T): AdaptedContractRouter<T, TErrorMap>;
15
21
  }
16
22
  //# sourceMappingURL=builder.d.ts.map
@@ -3,14 +3,56 @@ import type { Schema } from './types';
3
3
  export type ErrorMapItem<TDataSchema extends Schema> = {
4
4
  /**
5
5
  *
6
- * @default 200
6
+ * @default 500
7
7
  */
8
8
  status?: number;
9
9
  message?: string;
10
10
  description?: string;
11
11
  data?: TDataSchema;
12
12
  };
13
- export type ErrorMap = undefined | {
13
+ export interface ErrorMap {
14
+ [k: string]: ErrorMapItem<Schema>;
15
+ }
16
+ /**
17
+ * const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions
18
+ *
19
+ * Purpose:
20
+ * - Helps `U` suggest `CommonORPCErrorCode` to the user when typing.
21
+ *
22
+ * Why not replace `ErrorMap` with `ErrorMapSuggestions`?
23
+ * - `ErrorMapSuggestions` has a drawback: it allows `undefined` values for items.
24
+ * - `ErrorMapGuard<TErrorMap>` uses `Partial`, which can introduce `undefined` values.
25
+ *
26
+ * This could lead to unintended behavior where `undefined` values override `TErrorMap`,
27
+ * potentially resulting in a `never` type after merging.
28
+ *
29
+ * Recommendation:
30
+ * - Use `ErrorMapSuggestions` to assist users in typing correctly but do not replace `ErrorMap`.
31
+ * - Ensure `ErrorMapGuard<TErrorMap>` is adjusted to prevent `undefined` values.
32
+ */
33
+ export type ErrorMapSuggestions = {
14
34
  [key in CommonORPCErrorCode | (string & {})]?: ErrorMapItem<Schema>;
15
35
  };
36
+ /**
37
+ * `U` extends `ErrorMap` & `ErrorMapGuard<TErrorMap>`
38
+ *
39
+ * `ErrorMapGuard` is a utility type that ensures `U` cannot redefine the structure of `TErrorMap`.
40
+ * It achieves this by setting each key in `TErrorMap` to `never`, effectively preventing any redefinition.
41
+ *
42
+ * Why not just use `Partial<TErrorMap>`?
43
+ * - Allowing users to redefine existing error map items would require using `StrictErrorMap`.
44
+ * - However, I prefer not to use `StrictErrorMap` frequently, due to perceived performance concerns,
45
+ * though this has not been benchmarked and is based on personal preference.
46
+ *
47
+ */
48
+ export type ErrorMapGuard<TErrorMap extends ErrorMap> = {
49
+ [K in keyof TErrorMap]?: never;
50
+ };
51
+ /**
52
+ * Since `undefined` has a specific meaning (it use default value),
53
+ * we ensure all additional properties in each item of the ErrorMap are explicitly set to `undefined`.
54
+ */
55
+ export type StrictErrorMap<T extends ErrorMap> = {
56
+ [K in keyof T]: T[K] & Partial<Record<Exclude<keyof ErrorMapItem<any>, keyof T[K]>, undefined>>;
57
+ };
16
58
  //# sourceMappingURL=error-map.d.ts.map
@@ -8,11 +8,15 @@ export * from './error';
8
8
  export * from './error-map';
9
9
  export * from './error-orpc';
10
10
  export * from './procedure';
11
+ export * from './procedure-builder';
12
+ export * from './procedure-builder-with-input';
13
+ export * from './procedure-builder-with-output';
11
14
  export * from './procedure-client';
12
15
  export * from './procedure-decorated';
13
16
  export * from './router';
14
17
  export * from './router-builder';
15
18
  export * from './router-client';
19
+ export * from './schema-utils';
16
20
  export * from './types';
17
- export declare const oc: ContractBuilder;
21
+ export declare const oc: ContractBuilder<Record<never, never>>;
18
22
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,19 @@
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions } from './error-map';
2
+ import type { RouteOptions } from './procedure';
3
+ import type { HTTPPath, Schema, SchemaOutput } from './types';
4
+ import { ContractProcedure } from './procedure';
5
+ import { DecoratedContractProcedure } from './procedure-decorated';
6
+ /**
7
+ * `ContractProcedureBuilderWithInput` is a branch of `ContractProcedureBuilder` which it has input schema.
8
+ *
9
+ * Why?
10
+ * - prevents override input schema after .input
11
+ */
12
+ export declare class ContractProcedureBuilderWithInput<TInputSchema extends Schema, TErrorMap extends ErrorMap> extends ContractProcedure<TInputSchema, undefined, TErrorMap> {
13
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): ContractProcedureBuilderWithInput<TInputSchema, TErrorMap & U>;
14
+ route(route: RouteOptions): ContractProcedureBuilderWithInput<TInputSchema, TErrorMap>;
15
+ prefix(prefix: HTTPPath): ContractProcedureBuilderWithInput<TInputSchema, TErrorMap>;
16
+ unshiftTag(...tags: string[]): ContractProcedureBuilderWithInput<TInputSchema, TErrorMap>;
17
+ output<U extends Schema>(schema: U, example?: SchemaOutput<U>): DecoratedContractProcedure<TInputSchema, U, TErrorMap>;
18
+ }
19
+ //# sourceMappingURL=procedure-builder-with-input.d.ts.map
@@ -0,0 +1,19 @@
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions } from './error-map';
2
+ import type { RouteOptions } from './procedure';
3
+ import type { HTTPPath, Schema, SchemaInput } from './types';
4
+ import { ContractProcedure } from './procedure';
5
+ import { DecoratedContractProcedure } from './procedure-decorated';
6
+ /**
7
+ * `ContractProcedureBuilderWithOutput` is a branch of `ContractProcedureBuilder` which it has output schema.
8
+ *
9
+ * Why?
10
+ * - prevents override output schema after .output
11
+ */
12
+ export declare class ContractProcedureBuilderWithOutput<TOutputSchema extends Schema, TErrorMap extends ErrorMap> extends ContractProcedure<undefined, TOutputSchema, TErrorMap> {
13
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): ContractProcedureBuilderWithOutput<TOutputSchema, TErrorMap & U>;
14
+ route(route: RouteOptions): ContractProcedureBuilderWithOutput<TOutputSchema, TErrorMap>;
15
+ prefix(prefix: HTTPPath): ContractProcedureBuilderWithOutput<TOutputSchema, TErrorMap>;
16
+ unshiftTag(...tags: string[]): ContractProcedureBuilderWithOutput<TOutputSchema, TErrorMap>;
17
+ input<U extends Schema>(schema: U, example?: SchemaInput<U>): DecoratedContractProcedure<U, TOutputSchema, TErrorMap>;
18
+ }
19
+ //# sourceMappingURL=procedure-builder-with-output.d.ts.map
@@ -0,0 +1,15 @@
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions } from './error-map';
2
+ import type { RouteOptions } from './procedure';
3
+ import type { HTTPPath, Schema, SchemaInput, SchemaOutput } from './types';
4
+ import { ContractProcedure } from './procedure';
5
+ import { ContractProcedureBuilderWithInput } from './procedure-builder-with-input';
6
+ import { ContractProcedureBuilderWithOutput } from './procedure-builder-with-output';
7
+ export declare class ContractProcedureBuilder<TErrorMap extends ErrorMap> extends ContractProcedure<undefined, undefined, TErrorMap> {
8
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): ContractProcedureBuilder<TErrorMap & U>;
9
+ route(route: RouteOptions): ContractProcedureBuilder<TErrorMap>;
10
+ prefix(prefix: HTTPPath): ContractProcedureBuilder<TErrorMap>;
11
+ unshiftTag(...tags: string[]): ContractProcedureBuilder<TErrorMap>;
12
+ input<U extends Schema>(schema: U, example?: SchemaInput<U>): ContractProcedureBuilderWithInput<U, TErrorMap>;
13
+ output<U extends Schema>(schema: U, example?: SchemaOutput<U>): ContractProcedureBuilderWithOutput<U, TErrorMap>;
14
+ }
15
+ //# sourceMappingURL=procedure-builder.d.ts.map
@@ -1,14 +1,12 @@
1
- import type { ErrorMap } from './error-map';
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions } from './error-map';
2
2
  import type { RouteOptions } from './procedure';
3
- import type { HTTPPath, Schema, SchemaInput, SchemaOutput } from './types';
3
+ import type { HTTPPath, Schema } from './types';
4
4
  import { ContractProcedure } from './procedure';
5
5
  export declare class DecoratedContractProcedure<TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap> extends ContractProcedure<TInputSchema, TOutputSchema, TErrorMap> {
6
6
  static decorate<UInputSchema extends Schema, UOutputSchema extends Schema, TErrorMap extends ErrorMap>(procedure: ContractProcedure<UInputSchema, UOutputSchema, TErrorMap>): DecoratedContractProcedure<UInputSchema, UOutputSchema, TErrorMap>;
7
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): DecoratedContractProcedure<TInputSchema, TOutputSchema, TErrorMap & U>;
7
8
  route(route: RouteOptions): DecoratedContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
8
9
  prefix(prefix: HTTPPath): DecoratedContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
9
10
  unshiftTag(...tags: string[]): DecoratedContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
10
- input<U extends Schema>(schema: U, example?: SchemaInput<U>): DecoratedContractProcedure<U, TOutputSchema, TErrorMap>;
11
- output<U extends Schema>(schema: U, example?: SchemaOutput<U>): DecoratedContractProcedure<TInputSchema, U, TErrorMap>;
12
- errors<const U extends ErrorMap>(errorMap: U): DecoratedContractProcedure<TInputSchema, TOutputSchema, U>;
13
11
  }
14
12
  //# sourceMappingURL=procedure-decorated.d.ts.map
@@ -1,20 +1,23 @@
1
+ import type { ErrorMap, ErrorMapGuard, ErrorMapSuggestions, StrictErrorMap } from './error-map';
1
2
  import type { ContractProcedure } from './procedure';
2
3
  import type { ContractRouter } from './router';
3
4
  import type { HTTPPath } from './types';
4
5
  import { DecoratedContractProcedure } from './procedure-decorated';
5
- export type AdaptedContractRouter<TContract extends ContractRouter> = {
6
- [K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrors> ? DecoratedContractProcedure<UInputSchema, UOutputSchema, UErrors> : TContract[K] extends ContractRouter ? AdaptedContractRouter<TContract[K]> : never;
6
+ export type AdaptedContractRouter<TContract extends ContractRouter<any>, TErrorMapExtra extends ErrorMap> = {
7
+ [K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrors> ? DecoratedContractProcedure<UInputSchema, UOutputSchema, UErrors & TErrorMapExtra> : TContract[K] extends ContractRouter<any> ? AdaptedContractRouter<TContract[K], TErrorMapExtra> : never;
7
8
  };
8
- export interface ContractRouterBuilderDef {
9
+ export interface ContractRouterBuilderDef<TErrorMap extends ErrorMap> {
9
10
  prefix?: HTTPPath;
10
11
  tags?: string[];
12
+ errorMap: TErrorMap;
11
13
  }
12
- export declare class ContractRouterBuilder {
14
+ export declare class ContractRouterBuilder<TErrorMap extends ErrorMap> {
13
15
  '~type': "ContractProcedure";
14
- '~orpc': ContractRouterBuilderDef;
15
- constructor(def: ContractRouterBuilderDef);
16
- prefix(prefix: HTTPPath): ContractRouterBuilder;
17
- tag(...tags: string[]): ContractRouterBuilder;
18
- router<T extends ContractRouter>(router: T): AdaptedContractRouter<T>;
16
+ '~orpc': ContractRouterBuilderDef<TErrorMap>;
17
+ constructor(def: ContractRouterBuilderDef<TErrorMap>);
18
+ prefix(prefix: HTTPPath): ContractRouterBuilder<TErrorMap>;
19
+ tag(...tags: string[]): ContractRouterBuilder<TErrorMap>;
20
+ errors<const U extends ErrorMap & ErrorMapGuard<TErrorMap> & ErrorMapSuggestions>(errors: U): ContractRouterBuilder<U & TErrorMap>;
21
+ router<T extends ContractRouter<ErrorMap & Partial<StrictErrorMap<TErrorMap>>>>(router: T): AdaptedContractRouter<T, TErrorMap>;
19
22
  }
20
23
  //# sourceMappingURL=router-builder.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import type { ContractProcedure } from './procedure';
2
2
  import type { ContractProcedureClient } from './procedure-client';
3
3
  import type { ContractRouter } from './router';
4
- export type ContractRouterClient<TRouter extends ContractRouter, TClientContext> = TRouter extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrorMap> ? ContractProcedureClient<TClientContext, UInputSchema, UOutputSchema, UErrorMap> : {
5
- [K in keyof TRouter]: TRouter[K] extends ContractRouter ? ContractRouterClient<TRouter[K], TClientContext> : never;
4
+ export type ContractRouterClient<TRouter extends ContractRouter<any>, TClientContext> = TRouter extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrorMap> ? ContractProcedureClient<TClientContext, UInputSchema, UOutputSchema, UErrorMap> : {
5
+ [K in keyof TRouter]: TRouter[K] extends ContractRouter<any> ? ContractRouterClient<TRouter[K], TClientContext> : never;
6
6
  };
7
7
  //# sourceMappingURL=router-client.d.ts.map
@@ -1,12 +1,13 @@
1
- import type { ANY_CONTRACT_PROCEDURE, ContractProcedure } from './procedure';
1
+ import type { ErrorMap } from './error-map';
2
+ import type { ContractProcedure } from './procedure';
2
3
  import type { SchemaInput, SchemaOutput } from './types';
3
- export type ContractRouter = ANY_CONTRACT_PROCEDURE | {
4
- [k: string]: ContractRouter;
4
+ export type ContractRouter<T extends ErrorMap> = ContractProcedure<any, any, T> | {
5
+ [k: string]: ContractRouter<T>;
5
6
  };
6
- export type InferContractRouterInputs<T extends ContractRouter> = T extends ContractProcedure<infer UInputSchema, any, any> ? SchemaInput<UInputSchema> : {
7
- [K in keyof T]: T[K] extends ContractRouter ? InferContractRouterInputs<T[K]> : never;
7
+ export type InferContractRouterInputs<T extends ContractRouter<any>> = T extends ContractProcedure<infer UInputSchema, any, any> ? SchemaInput<UInputSchema> : {
8
+ [K in keyof T]: T[K] extends ContractRouter<any> ? InferContractRouterInputs<T[K]> : never;
8
9
  };
9
- export type InferContractRouterOutputs<T extends ContractRouter> = T extends ContractProcedure<any, infer UOutputSchema, any> ? SchemaOutput<UOutputSchema> : {
10
- [K in keyof T]: T[K] extends ContractRouter ? InferContractRouterOutputs<T[K]> : never;
10
+ export type InferContractRouterOutputs<T extends ContractRouter<any>> = T extends ContractProcedure<any, infer UOutputSchema, any> ? SchemaOutput<UOutputSchema> : {
11
+ [K in keyof T]: T[K] extends ContractRouter<any> ? InferContractRouterOutputs<T[K]> : never;
11
12
  };
12
13
  //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1,5 @@
1
+ import type { IsEqual, Promisable } from '@orpc/shared';
2
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
3
+ export type TypeRest<TInput, TOutput> = [map: (input: TInput) => Promisable<TOutput>] | (IsEqual<TInput, TOutput> extends true ? [] : never);
4
+ export declare function type<TInput, TOutput = TInput>(...[map]: TypeRest<TInput, TOutput>): StandardSchemaV1<TInput, TOutput>;
5
+ //# sourceMappingURL=schema-utils.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/contract",
3
3
  "type": "module",
4
- "version": "0.29.0",
4
+ "version": "0.31.0",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -30,7 +30,7 @@
30
30
  ],
31
31
  "dependencies": {
32
32
  "@standard-schema/spec": "1.0.0-beta.4",
33
- "@orpc/shared": "0.29.0"
33
+ "@orpc/shared": "0.31.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "arktype": "2.0.0-rc.26",