@orpc/server 0.0.0-next.c6c659d → 0.0.0-next.cba521d

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@ import {
4
4
  getRouterChild,
5
5
  isProcedure,
6
6
  unlazy
7
- } from "./chunk-ZBJYYEII.js";
7
+ } from "./chunk-OUPZ7QGV.js";
8
8
 
9
9
  // src/adapters/fetch/super-json.ts
10
10
  var super_json_exports = {};
@@ -298,4 +298,4 @@ export {
298
298
  ORPCProcedureMatcher,
299
299
  RPCHandler
300
300
  };
301
- //# sourceMappingURL=chunk-MB74GD7C.js.map
301
+ //# sourceMappingURL=chunk-3EVCPLVI.js.map
@@ -86,6 +86,11 @@ function flatLazy(lazied) {
86
86
  return lazy(flattenLoader);
87
87
  }
88
88
 
89
+ // src/middleware.ts
90
+ function middlewareOutputFn(output) {
91
+ return { output, context: void 0 };
92
+ }
93
+
89
94
  // src/procedure-client.ts
90
95
  import { ORPCError as ORPCError2, validateORPCError, ValidationError } from "@orpc/contract";
91
96
  import { executeWithHooks, toError, value } from "@orpc/shared";
@@ -94,30 +99,22 @@ function createProcedureClient(lazyableProcedure, ...[options]) {
94
99
  const path = options?.path ?? [];
95
100
  const { default: procedure } = await unlazy(lazyableProcedure);
96
101
  const context = await value(options?.context, callerOptions?.context);
97
- const meta = {
102
+ const errors = createORPCErrorConstructorMap(procedure["~orpc"].contract["~orpc"].errorMap);
103
+ const executeOptions = {
104
+ input,
105
+ context,
106
+ errors,
98
107
  path,
99
108
  procedure,
100
109
  signal: callerOptions?.signal
101
110
  };
102
- const executeWithValidation = async () => {
103
- const validInput = await validateInput(procedure, input);
104
- const output = await executeMiddlewareChain({
105
- context,
106
- input: validInput,
107
- path,
108
- procedure,
109
- signal: callerOptions?.signal,
110
- errors: createORPCErrorConstructorMap(procedure["~orpc"].contract["~orpc"].errorMap)
111
- });
112
- return validateOutput(procedure, output);
113
- };
114
111
  try {
115
112
  const output = await executeWithHooks({
116
113
  hooks: options,
117
114
  input,
118
115
  context,
119
- meta,
120
- execute: executeWithValidation
116
+ meta: executeOptions,
117
+ execute: () => executeProcedureInternal(procedure, executeOptions)
121
118
  });
122
119
  return output;
123
120
  } catch (e) {
@@ -160,24 +157,44 @@ async function validateOutput(procedure, output) {
160
157
  }
161
158
  return result.value;
162
159
  }
163
- async function executeMiddlewareChain(opt) {
164
- const middlewares = opt.procedure["~orpc"].middlewares ?? [];
165
- let currentMidIndex = 0;
160
+ function executeMiddlewareChain(middlewares, opt, input) {
161
+ let currentIndex = 0;
166
162
  let currentContext = opt.context;
167
- const next = async (nextOptions) => {
168
- const mid = middlewares[currentMidIndex];
169
- currentMidIndex += 1;
163
+ const executeMiddlewareChain2 = async (nextOptions) => {
164
+ const mid = middlewares[currentIndex];
165
+ currentIndex += 1;
170
166
  currentContext = mergeContext(currentContext, nextOptions.context);
171
167
  if (mid) {
172
- return await mid({ ...opt, context: currentContext, next }, opt.input, (output) => ({ output, context: void 0 }));
168
+ return await mid({ ...opt, context: currentContext, next: executeMiddlewareChain2 }, input, middlewareOutputFn);
173
169
  }
174
- const result = {
175
- output: await opt.procedure["~orpc"].handler({ ...opt, context: currentContext }),
176
- context: currentContext
177
- };
178
- return result;
170
+ return opt.next({ context: currentContext });
171
+ };
172
+ return executeMiddlewareChain2({});
173
+ }
174
+ async function executeProcedureInternal(procedure, options) {
175
+ const executeHandler = async (context, input) => {
176
+ return await procedure["~orpc"].handler({ ...options, context, input });
177
+ };
178
+ const executePostMiddlewares = async (context, input) => {
179
+ const validatedInput = await validateInput(procedure, input);
180
+ const result2 = await executeMiddlewareChain(procedure["~orpc"].postMiddlewares, {
181
+ ...options,
182
+ context,
183
+ next: async ({ context: context2 }) => {
184
+ return middlewareOutputFn(
185
+ await executeHandler(context2, validatedInput)
186
+ );
187
+ }
188
+ }, validatedInput);
189
+ const validatedOutput = await validateOutput(procedure, result2.output);
190
+ return { ...result2, output: validatedOutput };
179
191
  };
180
- return (await next({})).output;
192
+ const result = await executeMiddlewareChain(procedure["~orpc"].preMiddlewares, {
193
+ ...options,
194
+ context: options.context,
195
+ next: ({ context }) => executePostMiddlewares(context, options.input)
196
+ }, options.input);
197
+ return result.output;
181
198
  }
182
199
 
183
200
  // src/router.ts
@@ -221,7 +238,8 @@ export {
221
238
  isLazy,
222
239
  unlazy,
223
240
  flatLazy,
241
+ middlewareOutputFn,
224
242
  createProcedureClient,
225
243
  getRouterChild
226
244
  };
227
- //# sourceMappingURL=chunk-ZBJYYEII.js.map
245
+ //# sourceMappingURL=chunk-OUPZ7QGV.js.map
package/dist/fetch.js CHANGED
@@ -4,8 +4,8 @@ import {
4
4
  ORPCProcedureMatcher,
5
5
  RPCHandler,
6
6
  super_json_exports
7
- } from "./chunk-MB74GD7C.js";
8
- import "./chunk-ZBJYYEII.js";
7
+ } from "./chunk-3EVCPLVI.js";
8
+ import "./chunk-OUPZ7QGV.js";
9
9
  export {
10
10
  ORPCPayloadCodec,
11
11
  ORPCProcedureMatcher,
package/dist/hono.js CHANGED
@@ -4,8 +4,8 @@ import {
4
4
  ORPCProcedureMatcher,
5
5
  RPCHandler,
6
6
  super_json_exports
7
- } from "./chunk-MB74GD7C.js";
8
- import "./chunk-ZBJYYEII.js";
7
+ } from "./chunk-3EVCPLVI.js";
8
+ import "./chunk-OUPZ7QGV.js";
9
9
 
10
10
  // src/adapters/hono/middleware.ts
11
11
  import { value } from "@orpc/shared";
package/dist/index.js CHANGED
@@ -9,8 +9,9 @@ import {
9
9
  isProcedure,
10
10
  lazy,
11
11
  mergeContext,
12
+ middlewareOutputFn,
12
13
  unlazy
13
- } from "./chunk-ZBJYYEII.js";
14
+ } from "./chunk-OUPZ7QGV.js";
14
15
 
15
16
  // src/builder.ts
16
17
  import { ContractProcedure } from "@orpc/contract";
@@ -68,7 +69,7 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
68
69
  const middleware_ = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
69
70
  return new _DecoratedProcedure({
70
71
  ...this["~orpc"],
71
- middlewares: [...this["~orpc"].middlewares ?? [], middleware_]
72
+ postMiddlewares: [...this["~orpc"].postMiddlewares, middleware_]
72
73
  });
73
74
  }
74
75
  unshiftTag(...tags) {
@@ -79,12 +80,12 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
79
80
  }
80
81
  unshiftMiddleware(...middlewares) {
81
82
  const castedMiddlewares = middlewares;
82
- if (this["~orpc"].middlewares?.length) {
83
+ if (this["~orpc"].preMiddlewares.length) {
83
84
  let min = 0;
84
- for (let i = 0; i < this["~orpc"].middlewares.length; i++) {
85
- const index = castedMiddlewares.indexOf(this["~orpc"].middlewares[i], min);
85
+ for (let i = 0; i < this["~orpc"].preMiddlewares.length; i++) {
86
+ const index = castedMiddlewares.indexOf(this["~orpc"].preMiddlewares[i], min);
86
87
  if (index === -1) {
87
- castedMiddlewares.push(...this["~orpc"].middlewares.slice(i));
88
+ castedMiddlewares.push(...this["~orpc"].preMiddlewares.slice(i));
88
89
  break;
89
90
  }
90
91
  min = index + 1;
@@ -92,7 +93,7 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
92
93
  }
93
94
  return new _DecoratedProcedure({
94
95
  ...this["~orpc"],
95
- middlewares: castedMiddlewares
96
+ preMiddlewares: castedMiddlewares
96
97
  });
97
98
  }
98
99
  /**
@@ -122,12 +123,13 @@ var ProcedureImplementer = class _ProcedureImplementer {
122
123
  const mappedMiddleware = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
123
124
  return new _ProcedureImplementer({
124
125
  ...this["~orpc"],
125
- middlewares: [...this["~orpc"].middlewares ?? [], mappedMiddleware]
126
+ postMiddlewares: [...this["~orpc"].postMiddlewares, mappedMiddleware]
126
127
  });
127
128
  }
128
129
  handler(handler) {
129
130
  return new DecoratedProcedure({
130
- middlewares: this["~orpc"].middlewares,
131
+ postMiddlewares: this["~orpc"].postMiddlewares,
132
+ preMiddlewares: this["~orpc"].preMiddlewares,
131
133
  contract: this["~orpc"].contract,
132
134
  handler
133
135
  });
@@ -211,7 +213,7 @@ var RouterBuilder = class _RouterBuilder {
211
213
  use(middleware) {
212
214
  return new _RouterBuilder({
213
215
  ...this["~orpc"],
214
- middlewares: [...this["~orpc"].middlewares ?? [], middleware]
216
+ middlewares: [...this["~orpc"].middlewares, middleware]
215
217
  });
216
218
  }
217
219
  router(router) {
@@ -283,11 +285,12 @@ var RouterImplementer = class _RouterImplementer {
283
285
  };
284
286
 
285
287
  // src/implementer-chainable.ts
286
- function createChainableImplementer(contract, middlewares) {
288
+ function createChainableImplementer(contract, middlewares = []) {
287
289
  if (isContractProcedure(contract)) {
288
290
  const implementer = new ProcedureImplementer({
289
291
  contract,
290
- middlewares
292
+ preMiddlewares: middlewares,
293
+ postMiddlewares: []
291
294
  });
292
295
  return implementer;
293
296
  }
@@ -350,17 +353,20 @@ var ProcedureBuilder = class _ProcedureBuilder {
350
353
  if (!mapInput) {
351
354
  return new ProcedureImplementer({
352
355
  contract: this["~orpc"].contract,
353
- middlewares: this["~orpc"].middlewares
356
+ preMiddlewares: this["~orpc"].middlewares,
357
+ postMiddlewares: []
354
358
  }).use(middleware);
355
359
  }
356
360
  return new ProcedureImplementer({
357
361
  contract: this["~orpc"].contract,
358
- middlewares: this["~orpc"].middlewares
362
+ preMiddlewares: this["~orpc"].middlewares,
363
+ postMiddlewares: []
359
364
  }).use(middleware, mapInput);
360
365
  }
361
366
  handler(handler) {
362
367
  return new DecoratedProcedure({
363
- middlewares: this["~orpc"].middlewares,
368
+ preMiddlewares: this["~orpc"].middlewares,
369
+ postMiddlewares: [],
364
370
  contract: this["~orpc"].contract,
365
371
  handler
366
372
  });
@@ -375,12 +381,14 @@ var Builder = class _Builder {
375
381
  this["~orpc"] = def;
376
382
  }
377
383
  context() {
378
- return new _Builder({});
384
+ return new _Builder({
385
+ middlewares: []
386
+ });
379
387
  }
380
388
  use(middleware) {
381
389
  return new _Builder({
382
390
  ...this["~orpc"],
383
- middlewares: [...this["~orpc"].middlewares ?? [], middleware]
391
+ middlewares: [...this["~orpc"].middlewares, middleware]
384
392
  });
385
393
  }
386
394
  middleware(middleware) {
@@ -431,7 +439,8 @@ var Builder = class _Builder {
431
439
  }
432
440
  handler(handler) {
433
441
  return new DecoratedProcedure({
434
- middlewares: this["~orpc"].middlewares,
442
+ preMiddlewares: this["~orpc"].middlewares,
443
+ postMiddlewares: [],
435
444
  contract: new ContractProcedure({
436
445
  InputSchema: void 0,
437
446
  OutputSchema: void 0,
@@ -512,7 +521,9 @@ function createRouterClient(router, ...rest) {
512
521
 
513
522
  // src/index.ts
514
523
  import { configGlobal, fallbackToGlobalConfig, isDefinedError, ORPCError, safe } from "@orpc/contract";
515
- var os = new Builder({});
524
+ var os = new Builder({
525
+ middlewares: []
526
+ });
516
527
  export {
517
528
  Builder,
518
529
  DecoratedProcedure,
@@ -542,6 +553,7 @@ export {
542
553
  isProcedure,
543
554
  lazy,
544
555
  mergeContext,
556
+ middlewareOutputFn,
545
557
  os,
546
558
  safe,
547
559
  setRouterContract,
package/dist/next.js CHANGED
@@ -4,8 +4,8 @@ import {
4
4
  ORPCProcedureMatcher,
5
5
  RPCHandler,
6
6
  super_json_exports
7
- } from "./chunk-MB74GD7C.js";
8
- import "./chunk-ZBJYYEII.js";
7
+ } from "./chunk-3EVCPLVI.js";
8
+ import "./chunk-OUPZ7QGV.js";
9
9
 
10
10
  // src/adapters/next/serve.ts
11
11
  import { value } from "@orpc/shared";
package/dist/node.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RPCHandler
3
- } from "./chunk-MB74GD7C.js";
4
- import "./chunk-ZBJYYEII.js";
3
+ } from "./chunk-3EVCPLVI.js";
4
+ import "./chunk-OUPZ7QGV.js";
5
5
 
6
6
  // src/adapters/node/request-listener.ts
7
7
  function createRequest(req, res) {
@@ -11,7 +11,7 @@ import { ProcedureBuilder } from './procedure-builder';
11
11
  import { DecoratedProcedure } from './procedure-decorated';
12
12
  import { RouterBuilder } from './router-builder';
13
13
  export interface BuilderDef<TContext extends Context, TExtraContext extends Context> {
14
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
14
+ middlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
15
15
  }
16
16
  export declare class Builder<TContext extends Context, TExtraContext extends Context> {
17
17
  '~type': "Builder";
@@ -32,4 +32,5 @@ export interface MapInputMiddleware<TInput, TMappedInput> {
32
32
  (input: TInput): TMappedInput;
33
33
  }
34
34
  export type ANY_MAP_INPUT_MIDDLEWARE = MapInputMiddleware<any, any>;
35
+ export declare function middlewareOutputFn<TOutput>(output: TOutput): MiddlewareResult<undefined, TOutput>;
35
36
  //# sourceMappingURL=middleware.d.ts.map
@@ -7,7 +7,7 @@ import { DecoratedProcedure } from './procedure-decorated';
7
7
  import { ProcedureImplementer } from './procedure-implementer';
8
8
  export interface ProcedureBuilderDef<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap> {
9
9
  contract: ContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
10
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
10
+ middlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
11
11
  }
12
12
  export declare class ProcedureBuilder<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap> {
13
13
  '~type': "ProcedureBuilder";
@@ -3,7 +3,7 @@ import type { Hooks, Value } from '@orpc/shared';
3
3
  import type { Lazyable } from './lazy';
4
4
  import type { Procedure } from './procedure';
5
5
  import type { Context, Meta } from './types';
6
- export type ProcedureClient<TClientContext, TInput, TOutput, TError extends Error> = Client<TClientContext, TInput, TOutput, TError>;
6
+ export type ProcedureClient<TClientContext, TInputSchema extends Schema, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TErrorMap extends ErrorMap> = Client<TClientContext, SchemaInput<TInputSchema>, SchemaOutput<TOutputSchema, THandlerOutput>, ErrorFromErrorMap<TErrorMap>>;
7
7
  /**
8
8
  * Options for creating a procedure caller with comprehensive type safety
9
9
  */
@@ -18,5 +18,5 @@ export type CreateProcedureClientOptions<TContext extends Context, TOutputSchema
18
18
  context?: Value<TContext, [clientContext: TClientContext]>;
19
19
  } : never)) & Hooks<unknown, SchemaOutput<TOutputSchema, THandlerOutput>, TContext, Meta>;
20
20
  export type CreateProcedureClientRest<TContext extends Context, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TClientContext> = [options: CreateProcedureClientOptions<TContext, TOutputSchema, THandlerOutput, TClientContext>] | (undefined extends TContext ? [] : never);
21
- export declare function createProcedureClient<TContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TErrorMap extends ErrorMap, TClientContext>(lazyableProcedure: Lazyable<Procedure<TContext, any, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>>, ...[options]: CreateProcedureClientRest<TContext, TOutputSchema, THandlerOutput, TClientContext>): ProcedureClient<TClientContext, SchemaInput<TInputSchema>, SchemaOutput<TOutputSchema, THandlerOutput>, ErrorFromErrorMap<TErrorMap>>;
21
+ export declare function createProcedureClient<TContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TErrorMap extends ErrorMap, TClientContext>(lazyableProcedure: Lazyable<Procedure<TContext, any, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>>, ...[options]: CreateProcedureClientRest<TContext, TOutputSchema, THandlerOutput, TClientContext>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
22
22
  //# sourceMappingURL=procedure-client.d.ts.map
@@ -1,22 +1,22 @@
1
- import type { Client, ClientRest, ErrorFromErrorMap, ErrorMap, HTTPPath, RouteOptions, Schema, SchemaInput, SchemaOutput } from '@orpc/contract';
1
+ import type { ClientRest, ErrorMap, HTTPPath, RouteOptions, Schema, SchemaInput, SchemaOutput } from '@orpc/contract';
2
2
  import type { ORPCErrorConstructorMap } from './error';
3
3
  import type { MapInputMiddleware, Middleware } from './middleware';
4
- import type { CreateProcedureClientRest } from './procedure-client';
4
+ import type { CreateProcedureClientRest, ProcedureClient } from './procedure-client';
5
5
  import type { Context, MergeContext } from './types';
6
6
  import { Procedure } from './procedure';
7
7
  export declare class DecoratedProcedure<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TErrorMap extends ErrorMap> extends Procedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap> {
8
8
  static decorate<UContext extends Context, UExtraContext extends Context, UInputSchema extends Schema, UOutputSchema extends Schema, UHandlerOutput extends SchemaInput<UOutputSchema>, UErrorMap extends ErrorMap>(procedure: Procedure<UContext, UExtraContext, UInputSchema, UOutputSchema, UHandlerOutput, UErrorMap>): DecoratedProcedure<any, any, any, any, any, any> | DecoratedProcedure<UContext, UExtraContext, UInputSchema, UOutputSchema, UHandlerOutput, UErrorMap>;
9
9
  prefix(prefix: HTTPPath): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
10
10
  route(route: RouteOptions): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
11
- use<U extends Context & Partial<MergeContext<TContext, TExtraContext>> | undefined = undefined>(middleware: Middleware<MergeContext<TContext, TExtraContext>, U, SchemaOutput<TInputSchema>, SchemaInput<TOutputSchema, THandlerOutput>, ORPCErrorConstructorMap<TErrorMap>>): DecoratedProcedure<TContext, MergeContext<TExtraContext, U>, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
12
- use<UExtra extends Context & Partial<MergeContext<TContext, TExtraContext>> | undefined = undefined, UInput = unknown>(middleware: Middleware<MergeContext<TContext, TExtraContext>, UExtra, UInput, SchemaInput<TOutputSchema, THandlerOutput>, ORPCErrorConstructorMap<TErrorMap>>, mapInput: MapInputMiddleware<SchemaOutput<TInputSchema, THandlerOutput>, UInput>): DecoratedProcedure<TContext, MergeContext<TExtraContext, UExtra>, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
11
+ use<U extends Context & Partial<MergeContext<TContext, TExtraContext>> | undefined = undefined>(middleware: Middleware<MergeContext<TContext, TExtraContext>, U, SchemaOutput<TInputSchema>, THandlerOutput, ORPCErrorConstructorMap<TErrorMap>>): DecoratedProcedure<TContext, MergeContext<TExtraContext, U>, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
12
+ use<UExtra extends Context & Partial<MergeContext<TContext, TExtraContext>> | undefined = undefined, UInput = unknown>(middleware: Middleware<MergeContext<TContext, TExtraContext>, UExtra, UInput, THandlerOutput, ORPCErrorConstructorMap<TErrorMap>>, mapInput: MapInputMiddleware<SchemaOutput<TInputSchema, THandlerOutput>, UInput>): DecoratedProcedure<TContext, MergeContext<TExtraContext, UExtra>, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
13
13
  unshiftTag(...tags: string[]): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
14
- unshiftMiddleware<U extends Context & Partial<MergeContext<TContext, TExtraContext>> | undefined = undefined>(...middlewares: Middleware<TContext, U, SchemaOutput<TInputSchema>, SchemaInput<TOutputSchema, THandlerOutput>, ORPCErrorConstructorMap<TErrorMap>>[]): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
14
+ unshiftMiddleware(...middlewares: Middleware<TContext, Context & Partial<MergeContext<TContext, TExtraContext>> | undefined, unknown, SchemaOutput<TOutputSchema, THandlerOutput>, ORPCErrorConstructorMap<TErrorMap>>[]): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
15
15
  /**
16
16
  * Make this procedure callable (works like a function while still being a procedure).
17
17
  * **Note**: this only takes effect when this method is called at the end of the chain.
18
18
  */
19
- callable<TClientContext>(...rest: CreateProcedureClientRest<TContext, TOutputSchema, THandlerOutput, TClientContext>): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap> & (Client<TClientContext, SchemaInput<TInputSchema>, SchemaOutput<TOutputSchema, THandlerOutput>, ErrorFromErrorMap<TErrorMap>>);
19
+ callable<TClientContext>(...rest: CreateProcedureClientRest<TContext, TOutputSchema, THandlerOutput, TClientContext>): DecoratedProcedure<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap> & ProcedureClient<TClientContext, TInputSchema, TOutputSchema, THandlerOutput, TErrorMap>;
20
20
  /**
21
21
  * Make this procedure compatible with server action (the same as .callable, but the type is compatible with server action).
22
22
  * **Note**: this only takes effect when this method is called at the end of the chain.
@@ -6,7 +6,8 @@ import type { Context, MergeContext } from './types';
6
6
  import { DecoratedProcedure } from './procedure-decorated';
7
7
  export type ProcedureImplementerDef<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap> = {
8
8
  contract: ContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
9
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, SchemaOutput<TInputSchema>, SchemaInput<TOutputSchema>, ORPCErrorConstructorMap<TErrorMap>>[];
9
+ preMiddlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
10
+ postMiddlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, SchemaOutput<TInputSchema>, SchemaInput<TOutputSchema>, Record<string, unknown>>[];
10
11
  };
11
12
  export declare class ProcedureImplementer<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, TErrorMap extends ErrorMap> {
12
13
  '~type': "ProcedureImplementer";
@@ -16,7 +16,7 @@ export interface ProcedureHandler<TContext extends Context, TExtraContext extend
16
16
  (opt: ProcedureHandlerOptions<TContext, TExtraContext, SchemaOutput<TInputSchema>, ORPCErrorConstructorMap<TErrorMap>>): Promisable<SchemaInput<TOutputSchema, THandlerOutput>>;
17
17
  }
18
18
  /**
19
- * Why is `ErrorConstructorMap` passed to `Middleware` as `any`?
19
+ * Why is `ErrorConstructorMap` passed to `postMiddlewares` as `Record<string, unknown>`?
20
20
  * Why is `ErrorMap` passed to `ProcedureHandler` as `any`?
21
21
  *
22
22
  * Passing `ErrorMap/ErrorConstructorMap` directly to `Middleware/ProcedureHandler`
@@ -27,7 +27,8 @@ export interface ProcedureHandler<TContext extends Context, TExtraContext extend
27
27
  * The only downside is that direct access to them requires careful type checking to ensure safety.
28
28
  */
29
29
  export interface ProcedureDef<TContext extends Context, TExtraContext extends Context, TInputSchema extends Schema, TOutputSchema extends Schema, THandlerOutput extends SchemaInput<TOutputSchema>, TErrorMap extends ErrorMap> {
30
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, SchemaOutput<TInputSchema>, any, any>[];
30
+ preMiddlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
31
+ postMiddlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, SchemaOutput<TInputSchema>, SchemaInput<TOutputSchema>, Record<string, unknown>>[];
31
32
  contract: ContractProcedure<TInputSchema, TOutputSchema, TErrorMap>;
32
33
  handler: ProcedureHandler<TContext, TExtraContext, TInputSchema, TOutputSchema, THandlerOutput, any>;
33
34
  }
@@ -12,7 +12,7 @@ export type AdaptedRouter<TContext extends Context, TRouter extends ANY_ROUTER>
12
12
  export type RouterBuilderDef<TContext extends Context, TExtraContext extends Context> = {
13
13
  prefix?: HTTPPath;
14
14
  tags?: readonly string[];
15
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
15
+ middlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
16
16
  };
17
17
  export declare class RouterBuilder<TContext extends Context, TExtraContext extends Context> {
18
18
  '~type': "RouterBuilder";
@@ -1,4 +1,3 @@
1
- import type { ContractProcedure, ContractRouter, ErrorFromErrorMap, SchemaInput, SchemaOutput } from '@orpc/contract';
2
1
  import type { Hooks, Value } from '@orpc/shared';
3
2
  import type { Lazy } from './lazy';
4
3
  import type { Procedure } from './procedure';
@@ -8,8 +7,8 @@ import { type ANY_ROUTER, type Router } from './router';
8
7
  /**
9
8
  * FIXME: separate RouterClient and ContractRouterClient, don't mix them
10
9
  */
11
- export type RouterClient<TRouter extends ANY_ROUTER | ContractRouter, TClientContext> = TRouter extends Lazy<infer U extends ANY_ROUTER | ContractRouter> ? RouterClient<U, TClientContext> : TRouter extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrorMap> | Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput, infer UErrorMap> ? ProcedureClient<TClientContext, SchemaInput<UInputSchema>, SchemaOutput<UOutputSchema, UFuncOutput>, ErrorFromErrorMap<UErrorMap>> : {
12
- [K in keyof TRouter]: TRouter[K] extends ANY_ROUTER | ContractRouter ? RouterClient<TRouter[K], TClientContext> : never;
10
+ export type RouterClient<TRouter extends ANY_ROUTER, TClientContext> = TRouter extends Lazy<infer U extends ANY_ROUTER> ? RouterClient<U, TClientContext> : TRouter extends Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput, infer UErrorMap> ? ProcedureClient<TClientContext, UInputSchema, UOutputSchema, UFuncOutput, UErrorMap> : {
11
+ [K in keyof TRouter]: TRouter[K] extends ANY_ROUTER ? RouterClient<TRouter[K], TClientContext> : never;
13
12
  };
14
13
  export type CreateRouterClientOptions<TRouter extends ANY_ROUTER> = {
15
14
  /**
@@ -5,7 +5,7 @@ import type { Router } from './router';
5
5
  import type { AdaptedRouter } from './router-builder';
6
6
  import type { Context, MergeContext } from './types';
7
7
  export interface RouterImplementerDef<TContext extends Context, TExtraContext extends Context, TContract extends ContractRouter> {
8
- middlewares?: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
8
+ middlewares: Middleware<MergeContext<TContext, TExtraContext>, Partial<TExtraContext> | undefined, unknown, any, Record<string, unknown>>[];
9
9
  contract: TContract;
10
10
  }
11
11
  export declare class RouterImplementer<TContext extends Context, TExtraContext extends Context, TContract extends ContractRouter> {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/server",
3
3
  "type": "module",
4
- "version": "0.0.0-next.c6c659d",
4
+ "version": "0.0.0-next.cba521d",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -53,8 +53,8 @@
53
53
  "next": ">=14.0.0"
54
54
  },
55
55
  "dependencies": {
56
- "@orpc/contract": "0.0.0-next.c6c659d",
57
- "@orpc/shared": "0.0.0-next.c6c659d"
56
+ "@orpc/contract": "0.0.0-next.cba521d",
57
+ "@orpc/shared": "0.0.0-next.cba521d"
58
58
  },
59
59
  "scripts": {
60
60
  "build": "tsup --onSuccess='tsc -b --noCheck'",