import COMMANDS from "./commands";
import { ValkeyCommand, ValkeyCommandArguments, ValkeyCommandRawReply, ValkeyFunctions, ValkeyModules, ValkeyExtensions, ValkeyScript, ValkeyScripts, ExcludeMappedString, ValkeyFunction } from "../commands";
import { ValkeyMultiQueuedCommand } from "../multi-command";
type CommandSignature<C extends ValkeyCommand, M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = (...args: Parameters<C["transformArguments"]>) => ValkeyClientMultiCommandType<M, F, S>;
type WithCommands<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = {
    [P in keyof typeof COMMANDS]: CommandSignature<(typeof COMMANDS)[P], M, F, S>;
};
type WithModules<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = {
    [P in keyof M as ExcludeMappedString<P>]: {
        [C in keyof M[P] as ExcludeMappedString<C>]: CommandSignature<M[P][C], M, F, S>;
    };
};
type WithFunctions<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = {
    [P in keyof F as ExcludeMappedString<P>]: {
        [FF in keyof F[P] as ExcludeMappedString<FF>]: CommandSignature<F[P][FF], M, F, S>;
    };
};
type WithScripts<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = {
    [P in keyof S as ExcludeMappedString<P>]: CommandSignature<S[P], M, F, S>;
};
export type ValkeyClientMultiCommandType<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = ValkeyClientMultiCommand & WithCommands<M, F, S> & WithModules<M, F, S> & WithFunctions<M, F, S> & WithScripts<M, F, S>;
type InstantiableValkeyMultiCommand<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> = new (...args: ConstructorParameters<typeof ValkeyClientMultiCommand>) => ValkeyClientMultiCommandType<M, F, S>;
export type ValkeyClientMultiExecutor = (queue: Array<ValkeyMultiQueuedCommand>, selectedDB?: number, chainId?: symbol) => Promise<Array<ValkeyCommandRawReply>>;
export default class ValkeyClientMultiCommand {
    #private;
    static extend<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts>(extensions?: ValkeyExtensions<M, F, S>): InstantiableValkeyMultiCommand<M, F, S>;
    readonly v4: Record<string, any>;
    constructor(executor: ValkeyClientMultiExecutor, legacyMode?: boolean);
    commandsExecutor(command: ValkeyCommand, args: Array<unknown>): this;
    SELECT(db: number, transformReply?: ValkeyCommand["transformReply"]): this;
    select: (db: number, transformReply?: ValkeyCommand["transformReply"]) => this;
    addCommand(args: ValkeyCommandArguments, transformReply?: ValkeyCommand["transformReply"]): this;
    functionsExecutor(fn: ValkeyFunction, args: Array<unknown>, name: string): this;
    scriptsExecutor(script: ValkeyScript, args: Array<unknown>): this;
    exec(execAsPipeline?: boolean): Promise<Array<ValkeyCommandRawReply>>;
    EXEC: (execAsPipeline?: boolean) => Promise<Array<ValkeyCommandRawReply>>;
    execAsPipeline(): Promise<Array<ValkeyCommandRawReply>>;
}
export {};
