@orpc/server 0.0.0-next.db1f26d → 0.0.0-next.ee0aeaf

Sign up to get free protection for your applications and to get access to all the features.
@@ -45,9 +45,8 @@ function decorateMiddleware(middleware) {
45
45
  }
46
46
 
47
47
  // src/procedure-caller.ts
48
- import { trim, value } from "@orpc/shared";
48
+ import { executeWithHooks, trim, value } from "@orpc/shared";
49
49
  import { ORPCError } from "@orpc/shared/error";
50
- import { OpenAPIDeserializer } from "@orpc/transformer";
51
50
 
52
51
  // src/procedure.ts
53
52
  import {
@@ -109,96 +108,102 @@ function isProcedure(item) {
109
108
 
110
109
  // src/procedure-caller.ts
111
110
  function createProcedureCaller(options) {
112
- const loadProcedure = async () => {
113
- let procedure;
114
- if (isLazy(options.procedure)) {
115
- procedure = (await loadLazy(options.procedure)).default;
116
- } else {
117
- procedure = options.procedure;
118
- }
119
- if (!isProcedure(procedure)) {
120
- throw new ORPCError({
121
- code: "NOT_FOUND",
122
- message: "Not found",
123
- cause: new Error(trim(`
124
- This error should be caught by the typescript compiler.
125
- But if you still see this error, it means that you trying to call a lazy router (expected to be a lazy procedure).
126
- `))
127
- });
128
- }
129
- return procedure;
130
- };
131
- const caller = async (input) => {
111
+ const caller = async (...args) => {
112
+ const [input, callerOptions] = args;
132
113
  const path = options.path ?? [];
133
- const procedure = await loadProcedure();
134
- const input_ = (() => {
135
- if (!(input instanceof FormData)) {
136
- return input;
137
- }
138
- const transformer = new OpenAPIDeserializer({
139
- schema: procedure.zz$p.contract.zz$cp.InputSchema
140
- });
141
- return transformer.deserializeAsFormData(input);
142
- })();
143
- const validInput = (() => {
144
- const schema = procedure.zz$p.contract.zz$cp.InputSchema;
145
- if (!schema) {
146
- return input_;
147
- }
148
- try {
149
- return schema.parse(input_);
150
- } catch (e) {
151
- throw new ORPCError({
152
- message: "Validation input failed",
153
- code: "BAD_REQUEST",
154
- cause: e
155
- });
156
- }
157
- })();
158
- const middlewares = procedure.zz$p.middlewares ?? [];
159
- let currentMidIndex = 0;
160
- let currentContext = await value(options.context);
161
- const next = async (nextOptions) => {
162
- const mid = middlewares[currentMidIndex];
163
- currentMidIndex += 1;
164
- currentContext = mergeContext(currentContext, nextOptions.context);
165
- if (mid) {
166
- return await mid(validInput, currentContext, {
167
- path,
168
- procedure,
169
- next,
170
- output: (output2) => ({ output: output2, context: void 0 })
171
- });
172
- } else {
173
- return {
174
- output: await await procedure.zz$p.func(validInput, currentContext, {
175
- path,
176
- procedure
177
- }),
178
- context: currentContext
179
- };
180
- }
114
+ const procedure = await loadProcedure(options.procedure);
115
+ const context = await value(options.context);
116
+ const execute = async () => {
117
+ const validInput = await (async () => {
118
+ const schema = procedure.zz$p.contract["~orpc"].InputSchema;
119
+ if (!schema) {
120
+ return input;
121
+ }
122
+ const result = await schema["~standard"].validate(input);
123
+ if (result.issues) {
124
+ throw new ORPCError({
125
+ message: "Validation input failed",
126
+ code: "BAD_REQUEST",
127
+ issues: result.issues
128
+ });
129
+ }
130
+ return result.value;
131
+ })();
132
+ const meta = {
133
+ path,
134
+ procedure,
135
+ signal: callerOptions?.signal
136
+ };
137
+ const middlewares = procedure.zz$p.middlewares ?? [];
138
+ let currentMidIndex = 0;
139
+ let currentContext = context;
140
+ const next = async (nextOptions) => {
141
+ const mid = middlewares[currentMidIndex];
142
+ currentMidIndex += 1;
143
+ currentContext = mergeContext(currentContext, nextOptions.context);
144
+ if (mid) {
145
+ return await mid(validInput, currentContext, {
146
+ ...meta,
147
+ next,
148
+ output: (output3) => ({ output: output3, context: void 0 })
149
+ });
150
+ } else {
151
+ return {
152
+ output: await await procedure.zz$p.func(validInput, currentContext, meta),
153
+ context: currentContext
154
+ };
155
+ }
156
+ };
157
+ const output2 = (await next({})).output;
158
+ const validOutput = await (async () => {
159
+ const schema = procedure.zz$p.contract["~orpc"].OutputSchema;
160
+ if (!schema) {
161
+ return output2;
162
+ }
163
+ const result = await schema["~standard"].validate(output2);
164
+ if (result.issues) {
165
+ throw new ORPCError({
166
+ message: "Validation output failed",
167
+ code: "INTERNAL_SERVER_ERROR"
168
+ });
169
+ }
170
+ return result.value;
171
+ })();
172
+ return validOutput;
181
173
  };
182
- const output = (await next({})).output;
183
- const validOutput = await (async () => {
184
- const schema = procedure.zz$p.contract.zz$cp.OutputSchema;
185
- if (!schema) {
186
- return output;
187
- }
188
- const result = await schema.safeParseAsync(output);
189
- if (result.error) {
190
- throw new ORPCError({
191
- message: "Validation output failed",
192
- code: "INTERNAL_SERVER_ERROR",
193
- cause: result.error
194
- });
195
- }
196
- return result.data;
197
- })();
198
- return validOutput;
174
+ const output = await executeWithHooks({
175
+ hooks: options,
176
+ input,
177
+ context,
178
+ meta: {
179
+ path,
180
+ procedure
181
+ },
182
+ execute
183
+ });
184
+ return output;
199
185
  };
200
186
  return caller;
201
187
  }
188
+ async function loadProcedure(procedure) {
189
+ let loadedProcedure;
190
+ if (isLazy(procedure)) {
191
+ loadedProcedure = (await loadLazy(procedure)).default;
192
+ } else {
193
+ loadedProcedure = procedure;
194
+ }
195
+ if (!isProcedure(loadedProcedure)) {
196
+ throw new ORPCError({
197
+ code: "NOT_FOUND",
198
+ message: "Not found",
199
+ cause: new Error(trim(`
200
+ This error should be caught by the typescript compiler.
201
+ But if you still see this error, it means that you trying to call a lazy router (expected to be a lazy procedure).
202
+ `))
203
+ });
204
+ }
205
+ return loadedProcedure;
206
+ }
202
207
 
203
208
  // src/lazy.ts
204
209
  var LAZY_LOADER_SYMBOL = Symbol("ORPC_LAZY_LOADER");
@@ -260,8 +265,9 @@ export {
260
265
  createFlattenLazy,
261
266
  decorateLazy,
262
267
  createProcedureCaller,
268
+ loadProcedure,
263
269
  Procedure,
264
270
  decorateProcedure,
265
271
  isProcedure
266
272
  };
267
- //# sourceMappingURL=chunk-FL4ZAGNE.js.map
273
+ //# sourceMappingURL=chunk-VARUID7X.js.map
package/dist/fetch.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  createProcedureCaller,
3
3
  isLazy,
4
4
  isProcedure
5
- } from "./chunk-FL4ZAGNE.js";
5
+ } from "./chunk-VARUID7X.js";
6
6
 
7
7
  // src/fetch/handle.ts
8
8
  import { ORPCError } from "@orpc/shared/error";
@@ -23,15 +23,14 @@ async function handleFetchRequest(options) {
23
23
  }
24
24
 
25
25
  // src/fetch/handler.ts
26
- import { ORPC_HEADER, ORPC_HEADER_VALUE } from "@orpc/contract";
27
- import { trim, value } from "@orpc/shared";
26
+ import { executeWithHooks, ORPC_PROTOCOL_HEADER, ORPC_PROTOCOL_VALUE, trim, value } from "@orpc/shared";
28
27
  import { ORPCError as ORPCError2 } from "@orpc/shared/error";
29
28
  import { ORPCDeserializer, ORPCSerializer } from "@orpc/transformer";
30
29
  var serializer = new ORPCSerializer();
31
30
  var deserializer = new ORPCDeserializer();
32
31
  function createORPCHandler() {
33
32
  return async (options) => {
34
- if (options.request.headers.get(ORPC_HEADER) !== ORPC_HEADER_VALUE) {
33
+ if (!options.request.headers.get(ORPC_PROTOCOL_HEADER)?.includes(ORPC_PROTOCOL_VALUE)) {
35
34
  return void 0;
36
35
  }
37
36
  const context = await value(options.context);
@@ -48,7 +47,7 @@ function createORPCHandler() {
48
47
  procedure: match.procedure,
49
48
  path: match.path
50
49
  });
51
- const output = await caller(input);
50
+ const output = await caller(input, { signal: options.signal });
52
51
  const { body, headers } = serializer.serialize(output);
53
52
  return new Response(body, {
54
53
  status: 200,
@@ -56,10 +55,15 @@ function createORPCHandler() {
56
55
  });
57
56
  };
58
57
  try {
59
- return await options.hooks?.(
58
+ return await executeWithHooks({
59
+ hooks: options,
60
60
  context,
61
- { next: handler, response: (response) => response }
62
- ) ?? await handler();
61
+ execute: handler,
62
+ input: options.request,
63
+ meta: {
64
+ signal: options.signal
65
+ }
66
+ });
63
67
  } catch (e) {
64
68
  const error = e instanceof ORPCError2 ? e : new ORPCError2({
65
69
  code: "INTERNAL_SERVER_ERROR",
package/dist/index.js CHANGED
@@ -10,8 +10,9 @@ import {
10
10
  isLazy,
11
11
  isProcedure,
12
12
  loadLazy,
13
+ loadProcedure,
13
14
  mergeContext
14
- } from "./chunk-FL4ZAGNE.js";
15
+ } from "./chunk-VARUID7X.js";
15
16
 
16
17
  // src/builder.ts
17
18
  import {
@@ -25,7 +26,7 @@ import {
25
26
  } from "@orpc/contract";
26
27
 
27
28
  // src/router-builder.ts
28
- import { DecoratedContractProcedure, prefixHTTPPath } from "@orpc/contract";
29
+ import { DecoratedContractProcedure } from "@orpc/contract";
29
30
  var LAZY_ROUTER_PREFIX_SYMBOL = Symbol("ORPC_LAZY_ROUTER_PREFIX");
30
31
  var RouterBuilder = class _RouterBuilder {
31
32
  constructor(zz$rb) {
@@ -108,7 +109,7 @@ function adaptLazyRouter(options) {
108
109
  };
109
110
  let lazyRouterPrefix = options.prefix;
110
111
  if (LAZY_ROUTER_PREFIX_SYMBOL in options.current && typeof options.current[LAZY_ROUTER_PREFIX_SYMBOL] === "string") {
111
- lazyRouterPrefix = lazyRouterPrefix ? prefixHTTPPath(options.current[LAZY_ROUTER_PREFIX_SYMBOL], lazyRouterPrefix) : options.current[LAZY_ROUTER_PREFIX_SYMBOL];
112
+ lazyRouterPrefix = `${options.current[LAZY_ROUTER_PREFIX_SYMBOL]}${lazyRouterPrefix ?? ""}`;
112
113
  }
113
114
  const decoratedLazy = Object.assign(decorateLazy(createLazy(loader)), {
114
115
  [LAZY_ROUTER_PREFIX_SYMBOL]: lazyRouterPrefix
@@ -140,7 +141,7 @@ function adaptProcedure(options) {
140
141
  ];
141
142
  let contract = DecoratedContractProcedure.decorate(
142
143
  options.procedure.zz$p.contract
143
- ).addTags(...options.tags ?? []);
144
+ ).pushTag(...options.tags ?? []);
144
145
  if (options.prefix) {
145
146
  contract = contract.prefix(options.prefix);
146
147
  }
@@ -297,11 +298,11 @@ var Builder = class _Builder {
297
298
  /**
298
299
  * Convert to ContractProcedureBuilder
299
300
  */
300
- route(opts) {
301
+ route(route) {
301
302
  return new ProcedureBuilder({
302
303
  middlewares: this.zz$b.middlewares,
303
304
  contract: new ContractProcedure({
304
- ...opts,
305
+ route,
305
306
  InputSchema: void 0,
306
307
  OutputSchema: void 0
307
308
  })
@@ -388,49 +389,27 @@ var Builder = class _Builder {
388
389
  }
389
390
  };
390
391
 
391
- // src/router.ts
392
- import {
393
- isContractProcedure as isContractProcedure3
394
- } from "@orpc/contract";
395
- function toContractRouter(router) {
396
- const contract = {};
397
- for (const key in router) {
398
- const item = router[key];
399
- if (isContractProcedure3(item)) {
400
- contract[key] = item;
401
- } else if (isProcedure(item)) {
402
- contract[key] = item.zz$p.contract;
403
- } else {
404
- contract[key] = toContractRouter(item);
405
- }
406
- }
407
- return contract;
408
- }
409
-
410
392
  // src/router-caller.ts
411
393
  function createRouterCaller(options) {
412
- return createRouterCallerInternal({
413
- current: options.router,
414
- context: options.context,
415
- path: options.basePath ?? []
416
- });
394
+ return createRouterCallerInternal(options);
417
395
  }
418
396
  function createRouterCallerInternal(options) {
419
- const procedureCaller = isLazy(options.current) || isProcedure(options.current) ? createProcedureCaller({
420
- procedure: options.current,
397
+ const procedureCaller = isLazy(options.router) || isProcedure(options.router) ? createProcedureCaller({
398
+ ...options,
399
+ procedure: options.router,
421
400
  context: options.context,
422
- path: options.path
401
+ path: options.basePath
423
402
  }) : {};
424
403
  const recursive = new Proxy(procedureCaller, {
425
404
  get(target, key) {
426
405
  if (typeof key !== "string") {
427
406
  return Reflect.get(target, key);
428
407
  }
429
- const next = options.current[key];
408
+ const next = options.router[key];
430
409
  return createRouterCallerInternal({
431
- current: next,
432
- context: options.context,
433
- path: [...options.path, key]
410
+ ...options,
411
+ router: next,
412
+ basePath: [...options.basePath ?? [], key]
434
413
  });
435
414
  }
436
415
  });
@@ -461,8 +440,8 @@ export {
461
440
  isLazy,
462
441
  isProcedure,
463
442
  loadLazy,
443
+ loadProcedure,
464
444
  mergeContext,
465
- os,
466
- toContractRouter
445
+ os
467
446
  };
468
447
  //# sourceMappingURL=index.js.map
@@ -1,9 +1,10 @@
1
+ import type { ANY_CONTRACT_PROCEDURE, ContractRouter, HTTPPath, RouteOptions, Schema, SchemaInput, SchemaOutput } from '@orpc/contract';
1
2
  import type { IsEqual } from '@orpc/shared';
2
3
  import type { DecoratedLazy } from './lazy';
3
4
  import type { DecoratedProcedure, Procedure, ProcedureFunc } from './procedure';
4
5
  import type { HandledRouter, Router } from './router';
5
6
  import type { Context, MergeContext } from './types';
6
- import { ContractProcedure, type ContractRouter, type HTTPPath, type RouteOptions, type Schema, type SchemaInput, type SchemaOutput } from '@orpc/contract';
7
+ import { ContractProcedure } from '@orpc/contract';
7
8
  import { type DecoratedMiddleware, type MapInputMiddleware, type Middleware } from './middleware';
8
9
  import { ProcedureBuilder } from './procedure-builder';
9
10
  import { ProcedureImplementer } from './procedure-implementer';
@@ -25,7 +26,7 @@ export declare class Builder<TContext extends Context, TExtraContext extends Con
25
26
  /**
26
27
  * Convert to ContractProcedureBuilder
27
28
  */
28
- route(opts: RouteOptions): ProcedureBuilder<TContext, TExtraContext, undefined, undefined>;
29
+ route(route: RouteOptions): ProcedureBuilder<TContext, TExtraContext, undefined, undefined>;
29
30
  input<USchema extends Schema = undefined>(schema: USchema, example?: SchemaInput<USchema>): ProcedureBuilder<TContext, TExtraContext, USchema, undefined>;
30
31
  output<USchema extends Schema = undefined>(schema: USchema, example?: SchemaOutput<USchema>): ProcedureBuilder<TContext, TExtraContext, undefined, USchema>;
31
32
  /**
@@ -35,7 +36,7 @@ export declare class Builder<TContext extends Context, TExtraContext extends Con
35
36
  /**
36
37
  * Convert to ProcedureImplementer | RouterBuilder
37
38
  */
38
- contract<UContract extends ContractProcedure<any, any> | ContractRouter>(contract: UContract): UContract extends ContractProcedure<infer UInputSchema, infer UOutputSchema> ? ProcedureImplementer<TContext, TExtraContext, UInputSchema, UOutputSchema> : UContract extends ContractRouter ? ChainedRouterImplementer<TContext, UContract, TExtraContext> : never;
39
+ contract<UContract extends ANY_CONTRACT_PROCEDURE | ContractRouter>(contract: UContract): UContract extends ContractProcedure<infer UInputSchema, infer UOutputSchema> ? ProcedureImplementer<TContext, TExtraContext, UInputSchema, UOutputSchema> : UContract extends ContractRouter ? ChainedRouterImplementer<TContext, UContract, TExtraContext> : never;
39
40
  /**
40
41
  * Create ExtendedMiddleware
41
42
  */
@@ -1,9 +1,6 @@
1
- import type { PartialOnUndefinedDeep, Promisable, Value } from '@orpc/shared';
1
+ import type { Hooks, PartialOnUndefinedDeep, Value } from '@orpc/shared';
2
2
  import type { Router } from '../router';
3
- export interface FetchHandlerHooks {
4
- next: () => Promise<Response>;
5
- response: (response: Response) => Response;
6
- }
3
+ import type { CallerOptions } from '../types';
7
4
  export type FetchHandlerOptions<TRouter extends Router<any>> = {
8
5
  /**
9
6
  * The `router` used for handling the request and routing,
@@ -21,15 +18,11 @@ export type FetchHandlerOptions<TRouter extends Router<any>> = {
21
18
  * @example /api
22
19
  */
23
20
  prefix?: string;
24
- /**
25
- * Hooks for executing logics on lifecycle events.
26
- */
27
- hooks?: (context: TRouter extends Router<infer UContext> ? UContext : never, hooks: FetchHandlerHooks) => Promisable<Response>;
28
21
  } & PartialOnUndefinedDeep<{
29
22
  /**
30
23
  * The context used to handle the request.
31
24
  */
32
25
  context: Value<TRouter extends Router<infer UContext> ? UContext : never>;
33
- }>;
26
+ }> & CallerOptions & Hooks<Request, Response, TRouter extends Router<infer UContext> ? UContext : never, CallerOptions>;
34
27
  export type FetchHandler = <TRouter extends Router<any>>(options: FetchHandlerOptions<TRouter>) => Promise<Response | undefined>;
35
28
  //# sourceMappingURL=types.d.ts.map
@@ -1,20 +1,26 @@
1
1
  import type { SchemaInput, SchemaOutput } from '@orpc/contract';
2
+ import type { Hooks, PartialOnUndefinedDeep, Value } from '@orpc/shared';
2
3
  import type { Lazy } from './lazy';
3
- import { type Value } from '@orpc/shared';
4
- import { type ANY_LAZY_PROCEDURE, type ANY_PROCEDURE, type Procedure } from './procedure';
5
- export interface CreateProcedureCallerOptions<TProcedure extends ANY_PROCEDURE | ANY_LAZY_PROCEDURE> {
6
- procedure: TProcedure;
7
- /**
8
- * The context used when calling the procedure.
9
- */
10
- context: Value<TProcedure extends Procedure<infer UContext, any, any, any, any> | Lazy<Procedure<infer UContext, any, any, any, any>> ? UContext : never>;
4
+ import type { ANY_LAZY_PROCEDURE, ANY_PROCEDURE, Procedure } from './procedure';
5
+ import type { Caller } from './types';
6
+ export type CreateProcedureCallerOptions<T extends ANY_PROCEDURE | ANY_LAZY_PROCEDURE> = T extends Procedure<infer UContext, any, any, infer UOutputSchema, infer UFuncOutput> | Lazy<Procedure<infer UContext, any, any, infer UOutputSchema, infer UFuncOutput>> ? {
7
+ procedure: T;
11
8
  /**
12
9
  * This is helpful for logging and analytics.
13
10
  *
14
11
  * @internal
15
12
  */
16
13
  path?: string[];
17
- }
18
- export type ProcedureCaller<TProcedure extends ANY_PROCEDURE | ANY_LAZY_PROCEDURE> = TProcedure extends Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput> | Lazy<Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput>> ? (...input: [input: SchemaInput<UInputSchema> | FormData] | (undefined extends SchemaInput<UInputSchema> ? [] : never)) => Promise<SchemaOutput<UOutputSchema, UFuncOutput>> : never;
14
+ } & PartialOnUndefinedDeep<{
15
+ /**
16
+ * The context used when calling the procedure.
17
+ */
18
+ context: Value<UContext>;
19
+ }> & Hooks<unknown, SchemaOutput<UOutputSchema, UFuncOutput>, UContext, {
20
+ path: string[];
21
+ procedure: ANY_PROCEDURE;
22
+ }> : never;
23
+ export type ProcedureCaller<TProcedure extends ANY_PROCEDURE | ANY_LAZY_PROCEDURE> = TProcedure extends Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput> | Lazy<Procedure<any, any, infer UInputSchema, infer UOutputSchema, infer UFuncOutput>> ? Caller<SchemaInput<UInputSchema>, SchemaOutput<UOutputSchema, UFuncOutput>> : never;
19
24
  export declare function createProcedureCaller<TProcedure extends ANY_PROCEDURE | ANY_LAZY_PROCEDURE>(options: CreateProcedureCallerOptions<TProcedure>): ProcedureCaller<TProcedure>;
25
+ export declare function loadProcedure(procedure: ANY_PROCEDURE | ANY_LAZY_PROCEDURE): Promise<ANY_PROCEDURE>;
20
26
  //# sourceMappingURL=procedure-caller.d.ts.map
@@ -1,8 +1,11 @@
1
- import type { Value } from '@orpc/shared';
1
+ import type { Hooks, Value } from '@orpc/shared';
2
2
  import type { ANY_LAZY_PROCEDURE, ANY_PROCEDURE } from './procedure';
3
3
  import type { Router } from './router';
4
4
  import { type ProcedureCaller } from './procedure-caller';
5
- export interface CreateRouterCallerOptions<TRouter extends Router<any>> {
5
+ export interface CreateRouterCallerOptions<TRouter extends Router<any>> extends Hooks<unknown, unknown, TRouter extends Router<infer UContext> ? UContext : never, {
6
+ path: string[];
7
+ procedure: ANY_PROCEDURE;
8
+ }> {
6
9
  router: TRouter;
7
10
  /**
8
11
  * The context used when calling the procedure.
@@ -12,10 +12,10 @@ export declare class RouterImplementer<TContext extends Context, TContract exten
12
12
  constructor(zz$ri: {
13
13
  contract: TContract;
14
14
  });
15
- router(router: RouterWithContract<TContext, TContract>): HandledRouter<RouterWithContract<TContext, TContract>>;
16
- lazy(loader: () => Promise<{
17
- default: RouterWithContract<TContext, TContract>;
18
- }>): DecoratedLazy<RouterWithContract<TContext, TContract>>;
15
+ router<U extends RouterWithContract<TContext, TContract>>(router: U): HandledRouter<U>;
16
+ lazy<U extends RouterWithContract<TContext, TContract>>(loader: () => Promise<{
17
+ default: U;
18
+ }>): DecoratedLazy<U>;
19
19
  }
20
20
  export type ChainedRouterImplementer<TContext extends Context, TContract extends ContractRouter, TExtraContext extends Context> = {
21
21
  [K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema> ? ProcedureImplementer<TContext, TExtraContext, UInputSchema, UOutputSchema> : TContract[K] extends ContractRouter ? ChainedRouterImplementer<TContext, TContract[K], TExtraContext> : never;
@@ -1,7 +1,7 @@
1
1
  import type { ContractProcedure, ContractRouter, SchemaInput, SchemaOutput } from '@orpc/contract';
2
2
  import type { ANY_LAZY, DecoratedLazy, Lazy } from './lazy';
3
+ import type { DecoratedProcedure, Procedure } from './procedure';
3
4
  import type { Context } from './types';
4
- import { type DecoratedProcedure, type Procedure } from './procedure';
5
5
  export interface Router<TContext extends Context> {
6
6
  [k: string]: Procedure<TContext, any, any, any, any> | Lazy<Procedure<TContext, any, any, any, any>> | Router<TContext> | Lazy<Router<TContext>>;
7
7
  }
@@ -9,13 +9,12 @@ export type HandledRouter<TRouter extends Router<any>> = {
9
9
  [K in keyof TRouter]: TRouter[K] extends Procedure<infer UContext, infer UExtraContext, infer UInputSchema, infer UOutputSchema, infer UFuncOutput> ? DecoratedProcedure<UContext, UExtraContext, UInputSchema, UOutputSchema, UFuncOutput> : TRouter[K] extends ANY_LAZY ? DecoratedLazy<TRouter[K]> : TRouter[K] extends Router<any> ? HandledRouter<TRouter[K]> : never;
10
10
  };
11
11
  export type RouterWithContract<TContext extends Context, TContract extends ContractRouter> = {
12
- [K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema> ? Procedure<TContext, any, UInputSchema, UOutputSchema, any> | Lazy<Procedure<TContext, any, UInputSchema, UOutputSchema, any>> : TContract[K] extends ContractRouter ? RouterWithContract<TContext, TContract[K]> | Lazy<RouterWithContract<TContext, TContract[K]>> : never;
12
+ [K in keyof TContract]: TContract[K] extends ContractProcedure<infer UInputSchema, infer UOutputSchema> ? Procedure<TContext, any, UInputSchema, UOutputSchema, any> | Lazy<Procedure<TContext, any, UInputSchema, UOutputSchema, any>> : TContract[K] extends ContractRouter ? RouterWithContract<TContext, TContract[K]> : never;
13
13
  };
14
- export declare function toContractRouter(router: ContractRouter | Router<any>): ContractRouter;
15
14
  export type InferRouterInputs<T extends Router<any>> = {
16
- [K in keyof T]: T[K] extends Procedure<any, any, infer UInputSchema, any, any> ? SchemaInput<UInputSchema> : T[K] extends Router<any> ? InferRouterInputs<T[K]> : never;
15
+ [K in keyof T]: T[K] extends Procedure<any, any, infer UInputSchema, any, any> | Lazy<Procedure<any, any, infer UInputSchema, any, any>> ? SchemaInput<UInputSchema> : T[K] extends Router<any> ? InferRouterInputs<T[K]> : never;
17
16
  };
18
17
  export type InferRouterOutputs<T extends Router<any>> = {
19
- [K in keyof T]: T[K] extends Procedure<any, any, any, infer UOutputSchema, infer UFuncOutput> ? SchemaOutput<UOutputSchema, UFuncOutput> : T[K] extends Router<any> ? InferRouterOutputs<T[K]> : never;
18
+ [K in keyof T]: T[K] extends Procedure<any, any, any, infer UOutputSchema, infer UFuncOutput> | Lazy<Procedure<any, any, any, infer UOutputSchema, infer UFuncOutput>> ? SchemaOutput<UOutputSchema, UFuncOutput> : T[K] extends Router<any> ? InferRouterOutputs<T[K]> : never;
20
19
  };
21
20
  //# sourceMappingURL=router.d.ts.map
@@ -1,7 +1,13 @@
1
1
  import type { WELL_DEFINED_PROCEDURE } from './procedure';
2
2
  export type Context = Record<string, unknown> | undefined;
3
3
  export type MergeContext<TA extends Context, TB extends Context> = TA extends undefined ? TB : TB extends undefined ? TA : TA & TB;
4
- export interface Meta {
4
+ export interface CallerOptions {
5
+ signal?: AbortSignal;
6
+ }
7
+ export interface Caller<TInput, TOutput> {
8
+ (...opts: [input: TInput, options?: CallerOptions] | (undefined extends TInput ? [] : never)): Promise<TOutput>;
9
+ }
10
+ export interface Meta extends CallerOptions {
5
11
  path: string[];
6
12
  procedure: WELL_DEFINED_PROCEDURE;
7
13
  }
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.db1f26d",
4
+ "version": "0.0.0-next.ee0aeaf",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -34,16 +34,15 @@
34
34
  "dist"
35
35
  ],
36
36
  "peerDependencies": {
37
- "zod": ">=3.23.0",
38
- "@orpc/zod": "0.0.0-next.db1f26d"
37
+ "@orpc/zod": "0.0.0-next.ee0aeaf"
39
38
  },
40
39
  "dependencies": {
41
- "@orpc/contract": "0.0.0-next.db1f26d",
42
- "@orpc/shared": "0.0.0-next.db1f26d",
43
- "@orpc/transformer": "0.0.0-next.db1f26d"
40
+ "@orpc/shared": "0.0.0-next.ee0aeaf",
41
+ "@orpc/transformer": "0.0.0-next.ee0aeaf",
42
+ "@orpc/contract": "0.0.0-next.ee0aeaf"
44
43
  },
45
44
  "devDependencies": {
46
- "@orpc/openapi": "0.0.0-next.db1f26d"
45
+ "@orpc/openapi": "0.0.0-next.ee0aeaf"
47
46
  },
48
47
  "scripts": {
49
48
  "build": "tsup --clean --sourcemap --entry.index=src/index.ts --entry.fetch=src/fetch/index.ts --format=esm --onSuccess='tsc -b --noCheck'",