import type { Unsubscribable } from '@trpc/server/observable';
import type { AnyMutationProcedure, AnyProcedure, AnyQueryProcedure, AnyRootConfig, AnyRouter, AnySubscriptionProcedure, inferProcedureInput, inferTransformedProcedureOutput, inferTransformedSubscriptionOutput, IntersectionError, ProcedureOptions, ProcedureRouterRecord, ProcedureType } from '@trpc/server/unstable-core-do-not-import';
import type { CreateTRPCClientOptions } from './createTRPCUntypedClient';
import type { TRPCSubscriptionObserver, UntypedClientProperties } from './internals/TRPCUntypedClient';
import { TRPCUntypedClient } from './internals/TRPCUntypedClient';
import type { TRPCClientError } from './TRPCClientError';
/**
 * @public
 **/
export type inferRouterClient<TRouter extends AnyRouter> = DecoratedProcedureRecord<TRouter, TRouter['_def']['record']>;
/** @internal */
export type Resolver<TConfig extends AnyRootConfig, TProcedure extends AnyProcedure> = (input: inferProcedureInput<TProcedure>, opts?: ProcedureOptions) => Promise<inferTransformedProcedureOutput<TConfig, TProcedure>>;
type SubscriptionResolver<TConfig extends AnyRootConfig, TProcedure extends AnyProcedure> = (input: inferProcedureInput<TProcedure>, opts?: Partial<TRPCSubscriptionObserver<inferTransformedSubscriptionOutput<TConfig, TProcedure>, TRPCClientError<TConfig>>> & ProcedureOptions) => Unsubscribable;
type DecorateProcedure<TConfig extends AnyRootConfig, TProcedure extends AnyProcedure> = TProcedure extends AnyQueryProcedure ? {
    query: Resolver<TConfig, TProcedure>;
} : TProcedure extends AnyMutationProcedure ? {
    mutate: Resolver<TConfig, TProcedure>;
} : TProcedure extends AnySubscriptionProcedure ? {
    subscribe: SubscriptionResolver<TConfig, TProcedure>;
} : never;
/**
 * @internal
 */
type DecoratedProcedureRecord<TRouter extends AnyRouter, TProcedures extends ProcedureRouterRecord> = {
    [TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter ? DecoratedProcedureRecord<TRouter, TProcedures[TKey]['_def']['record']> : TProcedures[TKey] extends AnyProcedure ? DecorateProcedure<TRouter['_def']['_config'], TProcedures[TKey]> : never;
};
/** @internal */
export declare const clientCallTypeToProcedureType: (clientCallType: string) => ProcedureType;
/**
 * Creates a proxy client and shows type errors if you have query names that collide with built-in properties
 */
export type CreateTRPCClient<TRouter extends AnyRouter> = inferRouterClient<TRouter> extends infer $ProcedureRecord ? UntypedClientProperties & keyof $ProcedureRecord extends never ? inferRouterClient<TRouter> : IntersectionError<UntypedClientProperties & keyof $ProcedureRecord> : never;
/**
 * @internal
 */
export declare function createTRPCClientProxy<TRouter extends AnyRouter>(client: TRPCUntypedClient<TRouter>): CreateTRPCClient<TRouter>;
export declare function createTRPCClient<TRouter extends AnyRouter>(opts: CreateTRPCClientOptions<TRouter>): CreateTRPCClient<TRouter>;
/**
 * Get an untyped client from a proxy client
 * @internal
 */
export declare function getUntypedClient<TRouter extends AnyRouter>(client: inferRouterClient<TRouter>): TRPCUntypedClient<TRouter>;
export {};
//# sourceMappingURL=createTRPCClient.d.ts.map