import { type DefaultErrorShape, type ErrorFormatter, type ErrorFormatterShape } from './error/formatter';
import { type CreateRootConfigTypes, type RootConfig, type RootConfigTypes, type RuntimeConfig } from './rootConfig';
import { mergeRouters } from './router';
import { type DataTransformerOptions, type DefaultDataTransformer } from './transformer';
import type { PickFirstDefined, Unwrap, ValidateShape } from './types';
type PartialRootConfigTypes = Partial<RootConfigTypes>;
type CreateRootConfigTypesFromPartial<TTypes extends PartialRootConfigTypes> = CreateRootConfigTypes<{
    ctx: TTypes['ctx'] extends RootConfigTypes['ctx'] ? TTypes['ctx'] : object;
    meta: TTypes['meta'] extends RootConfigTypes['meta'] ? TTypes['meta'] : object;
    errorShape: TTypes['errorShape'];
    transformer: DataTransformerOptions;
}>;
/**
 * TODO: This can be improved:
 * - We should be able to chain `.meta()`/`.context()` only once
 * - Simplify typings
 * - Doesn't need to be a class but it doesn't really hurt either
 */
declare class TRPCBuilder<TParams extends PartialRootConfigTypes = object> {
    /**
     * Add a context shape as a generic to the root object
     * @link https://trpc.io/docs/v11/server/context
     */
    context<TNewContext extends RootConfigTypes['ctx'] | ((...args: unknown[]) => RootConfigTypes['ctx'])>(): TRPCBuilder<TParams extends object ? { [K in "ctx" | keyof import("./types").WithoutIndexSignature<TParams>]: K extends "ctx" ? {
        ctx: Unwrap<TNewContext>;
    }[K] : K extends keyof TParams ? TParams[K] : never; } : {
        ctx: Unwrap<TNewContext>;
    }>;
    /**
     * Add a meta shape as a generic to the root object
     * @link https://trpc.io/docs/v11/quickstart
     */
    meta<TNewMeta extends RootConfigTypes['meta']>(): TRPCBuilder<TParams extends object ? { [K in "meta" | keyof import("./types").WithoutIndexSignature<TParams>]: K extends "meta" ? {
        meta: TNewMeta;
    }[K] : K extends keyof TParams ? TParams[K] : never; } : {
        meta: TNewMeta;
    }>;
    /**
     * Create the root object
     * @link https://trpc.io/docs/v11/server/routers#initialize-trpc
     */
    create<TOptions extends Partial<RuntimeConfig<CreateRootConfigTypesFromPartial<TParams>>>>(options?: ValidateShape<TOptions, Partial<RuntimeConfig<CreateRootConfigTypesFromPartial<TParams>>>> | undefined): {
        /**
         * These are just types, they can't be used
         * @internal
         */
        _config: RootConfig<{
            ctx: TParams["ctx"] extends object ? TParams["ctx"] : object;
            meta: TParams["meta"] extends object ? TParams["meta"] : object;
            errorShape: ErrorFormatterShape<PickFirstDefined<TOptions["errorFormatter"], ErrorFormatter<TParams["ctx"] extends object ? TParams["ctx"] : object, DefaultErrorShape>>>;
            transformer: TOptions["transformer"] extends DataTransformerOptions ? TOptions["transformer"] : DefaultDataTransformer;
        }>;
        /**
         * Builder object for creating procedures
         * @link https://trpc.io/docs/v11/server/procedures
         */
        procedure: import("./procedureBuilder").ProcedureBuilder<TParams["ctx"] extends object ? TParams["ctx"] : object, TParams["meta"] extends object ? TParams["meta"] : object, object, typeof import("./procedureBuilder").unsetMarker, typeof import("./procedureBuilder").unsetMarker, typeof import("./procedureBuilder").unsetMarker, typeof import("./procedureBuilder").unsetMarker>;
        /**
         * Create reusable middlewares
         * @link https://trpc.io/docs/v11/server/middlewares
         */
        middleware: <$ContextOverrides>(fn: import("./middleware").MiddlewareFunction<TParams["ctx"] extends object ? TParams["ctx"] : object, TParams["meta"] extends object ? TParams["meta"] : object, object, $ContextOverrides, unknown>) => import("./middleware").MiddlewareBuilder<TParams["ctx"] extends object ? TParams["ctx"] : object, TParams["meta"] extends object ? TParams["meta"] : object, $ContextOverrides, unknown>;
        /**
         * Create a router
         * @link https://trpc.io/docs/v11/server/routers
         */
        router: <TProcRouterRecord extends import("./router").ProcedureRouterRecord>(procedures: TProcRouterRecord) => import("./router").CreateRouterInner<RootConfig<{
            ctx: TParams["ctx"] extends object ? TParams["ctx"] : object;
            meta: TParams["meta"] extends object ? TParams["meta"] : object;
            errorShape: ErrorFormatterShape<PickFirstDefined<TOptions["errorFormatter"], ErrorFormatter<TParams["ctx"] extends object ? TParams["ctx"] : object, DefaultErrorShape>>>;
            transformer: TOptions["transformer"] extends DataTransformerOptions ? TOptions["transformer"] : DefaultDataTransformer;
        }>, TProcRouterRecord>;
        /**
         * Merge Routers
         * @link https://trpc.io/docs/v11/server/merging-routers
         */
        mergeRouters: typeof mergeRouters;
        /**
         * Create a server-side caller for a router
         * @link https://trpc.io/docs/v11/server/server-side-calls
         */
        createCallerFactory: <TRouter extends import("./router").Router<import("./router").AnyRouterDef<RootConfig<{
            ctx: TParams["ctx"] extends object ? TParams["ctx"] : object;
            meta: TParams["meta"] extends object ? TParams["meta"] : object;
            errorShape: ErrorFormatterShape<PickFirstDefined<TOptions["errorFormatter"], ErrorFormatter<TParams["ctx"] extends object ? TParams["ctx"] : object, DefaultErrorShape>>>;
            transformer: TOptions["transformer"] extends DataTransformerOptions ? TOptions["transformer"] : DefaultDataTransformer;
        }>>>>(router: TRouter) => import("./router").RouterCaller<TRouter["_def"]>;
    };
}
/**
 * Builder to initialize the tRPC root object - use this exactly once per backend
 * @link https://trpc.io/docs/v11/quickstart
 */
export declare const initTRPC: TRPCBuilder<object>;
export {};
//# sourceMappingURL=initTRPC.d.ts.map