diff --git a/packages/server/src/implementer-variants.ts b/packages/server/src/implementer-variants.ts index 27f4e8ad2..0cdff6e9f 100644 --- a/packages/server/src/implementer-variants.ts +++ b/packages/server/src/implementer-variants.ts @@ -1,10 +1,34 @@ -import type { AnyContractRouter, ContractProcedure, ContractRouter, ContractRouterToErrorMap, ORPCErrorConstructorMap } from '@orpc/contract' +import type { AnyContractRouter, ContractProcedure, ContractRouterToErrorMap, ContractRouterToMeta, ORPCErrorConstructorMap } from '@orpc/contract' import type { ConflictContextGuard, Context, MergedContext } from './context' import type { ProcedureImplementer } from './implementer-procedure' import type { FlattenLazy } from './lazy-utils' import type { Middleware } from './middleware' import type { AdaptedRouter, Router } from './router' +export interface RouterImplementerWithMiddlewares< + TContract extends AnyContractRouter, + TInitialContext extends Context, + TCurrentContext extends Context, +> { + use( + middleware: Middleware< + TCurrentContext, + U, + unknown, + unknown, + ORPCErrorConstructorMap>, + ContractRouterToMeta + >, + ): ConflictContextGuard> + & ImplementerInternalWithMiddlewares> + + router>(router: U): AdaptedRouter> + + lazy>( + loader: () => Promise<{ default: U }> + ): AdaptedRouter, TInitialContext, Record> +} + export type ImplementerInternalWithMiddlewares< TContract extends AnyContractRouter, TInitialContext extends Context, @@ -13,27 +37,9 @@ export type ImplementerInternalWithMiddlewares< &( TContract extends ContractProcedure ? ProcedureImplementer - : TContract extends ContractRouter ? { - use( - middleware: Middleware< - TCurrentContext, - U, - unknown, - unknown, - ORPCErrorConstructorMap>, - UMeta - >, - ): ConflictContextGuard> - & ImplementerInternalWithMiddlewares> - - router>(router: U): AdaptedRouter> - - lazy>( - loader: () => Promise<{ default: U }> - ): AdaptedRouter, TInitialContext, Record> - } & { + : RouterImplementerWithMiddlewares & { [K in keyof TContract]: TContract[K] extends AnyContractRouter ? ImplementerInternalWithMiddlewares : never - } : never + } ) diff --git a/packages/server/src/implementer.ts b/packages/server/src/implementer.ts index ef6ab99fe..8326165a7 100644 --- a/packages/server/src/implementer.ts +++ b/packages/server/src/implementer.ts @@ -1,4 +1,4 @@ -import type { AnyContractRouter, ContractProcedure, ContractRouter, ContractRouterToErrorMap, ContractRouterToMeta, ORPCErrorConstructorMap } from '@orpc/contract' +import type { AnyContractRouter, ContractProcedure, ContractRouterToErrorMap, ContractRouterToMeta, ORPCErrorConstructorMap } from '@orpc/contract' import type { ConflictContextGuard, Context, MergedContext } from './context' import type { ProcedureImplementer } from './implementer-procedure' import type { ImplementerInternalWithMiddlewares } from './implementer-variants' @@ -13,6 +13,41 @@ import { type DecoratedMiddleware, decorateMiddleware } from './middleware-decor import { addMiddleware } from './middleware-utils' import { type AdaptedRouter, adaptRouter, type Router } from './router' +export interface RouterImplementer< + TContract extends AnyContractRouter, + TInitialContext extends Context, + TCurrentContext extends Context, +> { + middleware( // = any here is important to make middleware can be used in any output by default + middleware: Middleware< + TCurrentContext, + UOutContext, + TInput, + TOutput, + ORPCErrorConstructorMap>, + ContractRouterToMeta + >, + ): DecoratedMiddleware, ContractRouterToMeta> // ORPCErrorConstructorMap ensures middleware can used in any procedure + + use( + middleware: Middleware< + TCurrentContext, + U, + unknown, + unknown, + ORPCErrorConstructorMap>, + ContractRouterToMeta + >, + ): ConflictContextGuard> + & ImplementerInternalWithMiddlewares> + + router>(router: U): AdaptedRouter> + + lazy>( + loader: () => Promise<{ default: U }> + ): AdaptedRouter, TInitialContext, Record> +} + export type ImplementerInternal< TContract extends AnyContractRouter, TInitialContext extends Context, @@ -21,40 +56,11 @@ export type ImplementerInternal< &( TContract extends ContractProcedure ? ProcedureImplementer - : TContract extends ContractRouter ? { - middleware( // = any here is important to make middleware can be used in any output by default - middleware: Middleware< - TCurrentContext, - UOutContext, - TInput, - TOutput, - ORPCErrorConstructorMap>, - ContractRouterToMeta - >, - ): DecoratedMiddleware, UMeta> // ORPCErrorConstructorMap ensures middleware can used in any procedure - - use( - middleware: Middleware< - TCurrentContext, - U, - unknown, - unknown, - ORPCErrorConstructorMap>, - UMeta - >, - ): ConflictContextGuard> - & ImplementerInternalWithMiddlewares> - - router>(router: U): AdaptedRouter> - - lazy>( - loader: () => Promise<{ default: U }> - ): AdaptedRouter, TInitialContext, Record> - } & { + : RouterImplementer & { [K in keyof TContract]: TContract[K] extends AnyContractRouter ? ImplementerInternal : never - } : never + } ) export function implementerInternal<