import { DeepPartial } from './utils';
import { NextFunction, Request, Response } from 'express';
import { InferSchemaType, TSchema } from './tsSchema';
export declare const __expressTypedHack_key__ = "__expressTypedHack_key__";
export declare const __expressOpenAPIHack__: unique symbol;
type Config = {
    headers?: TSchema;
    params?: Record<string, TSchema>;
    query?: Record<string, TSchema>;
    body?: TSchema;
    returns?: TSchema;
};
type UseEmptyObjectAsDefault<T> = T extends Record<any, any> ? T : {};
type WrapToTObject<T> = {
    type: 'object';
    required: true;
    properties: T;
};
export declare const getApiDocInstance: ({ errorFormatter, }?: {
    errorFormatter?: ((errors: {
        errors: {
            headers?: any;
            params?: any;
            query?: any;
            body?: any;
            returns?: any;
        };
    }) => any) | undefined;
}) => <C extends Config>(docs: C) => (handle: (req: Omit<Request<{ [K_1 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_1], "decoded">; } & { [K_2 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_2], "decoded"> | undefined; }, any, InferSchemaType<C["body"]>, { [K_4 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_2 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_2]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) extends infer T_3 ? T_3 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_4 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_4]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) ? T_3 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_4], "decoded">; } & { [K_5 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_5 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_5]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) extends infer T_6 ? T_6 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_7 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_7]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) ? T_6 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_5], "decoded"> | undefined; }, Record<string, any>>, "headers"> & {
    headers: { [K_7 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_8 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_8]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) extends infer T_9 ? T_9 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_10 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_10]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) ? T_9 extends Record<any, infer Values> ? Values : never : never : never) & {
        required: true;
    })["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_7], "decoded">; } & { [K_8 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_11 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_11]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) extends infer T_12 ? T_12 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_13 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_13]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) ? T_12 extends Record<any, infer Values> ? Values : never : never : never) & {
        required: false;
    })["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_8], "decoded"> | undefined; };
}, res: Omit<Response<any, Record<string, any>>, "send"> & {
    send: (data: InferSchemaType<C["returns"]>) => void;
    tSend: (data: InferSchemaType<C["returns"]>) => void;
}, next: NextFunction) => void) => any;
export declare const apiDoc: <C extends Config>(docs: C) => (handle: (req: Omit<Request<{ [K_1 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_1], "decoded">; } & { [K_2 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
    required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
    key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_2], "decoded"> | undefined; }, any, InferSchemaType<C["body"]>, { [K_4 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_2 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_2]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) extends infer T_3 ? T_3 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_4 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_4]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) ? T_3 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_4], "decoded">; } & { [K_5 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_5 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_5]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) extends infer T_6 ? T_6 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_7 extends Record<any, {
    required: boolean;
}> ? { [K_3 in keyof T_7]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
    key: K_3;
}; } : never) ? T_6 extends Record<any, infer Values> ? Values : never : never : never) & {
    required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_5], "decoded"> | undefined; }, Record<string, any>>, "headers"> & {
    headers: { [K_7 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_8 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_8]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) extends infer T_9 ? T_9 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_10 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_10]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) ? T_9 extends Record<any, infer Values> ? Values : never : never : never) & {
        required: true;
    })["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_7], "decoded">; } & { [K_8 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_11 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_11]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) extends infer T_12 ? T_12 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_13 extends Record<any, {
        required: boolean;
    }> ? { [K_6 in keyof T_13]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
        key: K_6;
    }; } : never) ? T_12 extends Record<any, infer Values> ? Values : never : never : never) & {
        required: false;
    })["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_8], "decoded"> | undefined; };
}, res: Omit<Response<any, Record<string, any>>, "send"> & {
    send: (data: InferSchemaType<C["returns"]>) => void;
    tSend: (data: InferSchemaType<C["returns"]>) => void;
}, next: NextFunction) => void) => any;
type ExpressRouterInternalStruct = {
    name: 'router';
    regexp: RegExp;
    keys: {
        name: string;
        optional: boolean;
        offset: number;
    }[];
    __handle: ExpressRouteInternalStruct;
    handle: ExpressRouteInternalStruct;
    route: {
        stack: {
            handle: (...any: any[]) => any;
            method: string;
        }[];
        path: string;
    };
};
type ExpressRouteHandlerInternalStruct = {
    name: 'bound dispatch';
    route: {
        stack: {
            handle: (a?: symbol) => {
                apiRouteSchema: {
                    paramsSchema: any;
                    querySchema: any;
                    bodySchema: any;
                    returnsSchema: any;
                };
                handle: (...args: any[]) => any;
            };
            method: string;
            _swaggerTypedExpressDocs__route_cache?: any;
        }[];
        path: string;
    };
};
type ExpressRouteInternalStruct = {
    stack: (ExpressRouteHandlerInternalStruct | ExpressRouterInternalStruct)[];
};
type OpenAPIShape = DeepPartial<{
    openapi: '3.0.0';
    info: {
        description: string;
        version: string;
        title: string;
        termsOfService: string;
        contact: {
            email: string;
        };
    };
    servers: {
        url: string;
    }[];
    paths: any;
}>;
export declare const initApiDocs: (expressApp: {
    _router: ExpressRouteInternalStruct;
}, customOpenAPIType?: OpenAPIShape) => any;
export declare const getMock_apiDocInstance: ({ errorFormatter }?: {
    errorFormatter?: ((err: any) => any) | undefined;
}) => <T extends (req: Request, res: Response, next: NextFunction) => any>(a: Parameters<typeof apiDoc>[0]) => (_handler: T) => any;
export declare const mock_apiDoc: <T extends (req: Request, res: Response, next: NextFunction) => any>(a: Parameters<typeof apiDoc>[0]) => (_handler: T) => any;
export {};
