import { ZodType, z } from 'zod';

type ConfigDefinitionElement<T = unknown> = {
    schema: ZodType<T>;
    env?: string;
    doc?: string;
    default?: T;
};
type ConfigDefinition = {
    [P in keyof any]: ConfigDefinitionElement | ConfigDefinitionObject;
};
type ConfigDefinitionObject = {
    [K in keyof any]: ConfigDefinitionElement | ConfigDefinition;
};
type InferSchemaType<T extends ConfigDefinition> = {
    [P in keyof T]: T[P] extends ConfigDefinitionElement ? T[P]['schema']['_output'] : T[P] extends ConfigDefinition ? InferSchemaType<T[P]> : never;
};
type EnvRecord = Record<string, unknown>;

type DeepPartial<T> = T extends object ? {
    [P in keyof T]?: DeepPartial<T[P]>;
} : T;
type Falsy = false | 0 | '' | null | undefined;

declare function buildConfigSchema({ configDefinition }: {
    configDefinition: ConfigDefinition;
}): z.ZodObject<any, "strip", z.ZodTypeAny, {
    [x: string]: any;
}, {
    [x: string]: any;
}>;
declare function defineConfig<T extends ConfigDefinition, Config extends Record<string, unknown> = InferSchemaType<T>>(configDefinition: T, { envSources, envSource, defaults: rawDefaults, priority, getDefaults, }?: {
    envSources?: EnvRecord[];
    envSource?: EnvRecord;
    defaults?: (Record<string, unknown> | Falsy)[] | Record<string, unknown>;
    getDefaults?: ((args: {
        configDefaults: Record<string, unknown>;
        envConfig: Record<string, unknown>;
        config: Record<string, unknown>;
    }) => (Record<string, unknown> | Falsy)[] | Record<string, unknown>);
    priority?: 'env' | 'defaults';
}): {
    config: Config;
    env: EnvRecord;
    envConfig: DeepPartial<Config>;
    schema: z.ZodObject<any, "strip", z.ZodTypeAny, {
        [x: string]: any;
    }, {
        [x: string]: any;
    }>;
};

export { type ConfigDefinition, type ConfigDefinitionElement, type ConfigDefinitionObject, type EnvRecord, buildConfigSchema, defineConfig };
