import * as changeCase from "change-case";
export type EnumCase = 
/** `"twoWords"` */
'camelCase' | 
/** `"Two Words"` */
'capitalCase' | 
/** `"TWO_WORDS"` */
'constantCase' | 
/** `"two.words"` */
'dotCase' | 
/** `"two-words"` */
'kebabCase' | 
/** `"two words"` */
'noCase' | 
/** `"TwoWords"` */
'pascalCase' | 
/** `"Two_Words"` */
'pascalSnakeCase' | 
/** `"two/words"` */
'pathCase' | 
/** `"Two words"` */
'sentenceCase' | 
/** `"two_words"` */
'snakeCase' | 
/** `"Two-Words"` */
'trainCase';
/**
 * (Optional: defaults to "service")  Differentiator for various asset behaviors (eg: "job" or "helm").
 */
export declare const EnumCase: {
    /** `"twoWords"` */
    readonly camelCase: "camelCase";
    /** `"Two Words"` */
    readonly capitalCase: "capitalCase";
    /** `"TWO_WORDS"` */
    readonly constantCase: "constantCase";
    /** `"two.words"` */
    readonly dotCase: "dotCase";
    /** `"two-words"` */
    readonly kebabCase: "kebabCase";
    /** `"two words"` */
    readonly noCase: "noCase";
    /** `"TwoWords"` */
    readonly pascalCase: "pascalCase";
    /** `"Two_Words"` */
    readonly pascalSnakeCase: "pascalSnakeCase";
    /** `"two/words"` */
    readonly pathCase: "pathCase";
    /** `"Two words"` */
    readonly sentenceCase: "sentenceCase";
    /** `"two_words"` */
    readonly snakeCase: "snakeCase";
    /** `"Two-Words"` */
    readonly trainCase: "trainCase";
};
export declare class ConvertTo {
    /** `"twoWords"` */
    static [EnumCase.camelCase]: typeof changeCase.camelCase;
    /** `"Two Words"` */
    static [EnumCase.capitalCase]: typeof changeCase.capitalCase;
    /** `"TWO_WORDS"` */
    static [EnumCase.constantCase]: typeof changeCase.constantCase;
    /** `"two.words"` */
    static [EnumCase.dotCase]: typeof changeCase.dotCase;
    /** `"two-words"` */
    static [EnumCase.kebabCase]: typeof changeCase.kebabCase;
    /** `"two words"` */
    static [EnumCase.noCase]: typeof changeCase.noCase;
    /** `"TwoWords"` */
    static [EnumCase.pascalCase]: typeof changeCase.pascalCase;
    /** `"Two_Words"` */
    static [EnumCase.pascalSnakeCase]: typeof changeCase.pascalSnakeCase;
    /** `"two/words"` */
    static [EnumCase.pathCase]: typeof changeCase.pathCase;
    /** `"Two words"` */
    static [EnumCase.sentenceCase]: typeof changeCase.sentenceCase;
    /** `"two_words"` */
    static [EnumCase.snakeCase]: typeof changeCase.snakeCase;
    /** `"Two-Words"` */
    static [EnumCase.trainCase]: typeof changeCase.trainCase;
}
/** Infers flat source object keys from flattened target property names (dot notation on target for hierarchy),
 * via a lettercase convention, an optional prefix, and a hierarchy delimiter.
 *
 * NOTE: Target object uses dot notation for hierarchy.
 */
export type MergeMapFromTarget = {
    /**  (optional: defaults to all) The list of property names on the given object
     *  that are to be sought for in the process env (and overwritten if found).
     *  If none are provided, all env variables (matching the given `options.envPrefix`) will be applied to target object
     */
    targetPropertyNames: string[];
    sourceCase?: EnumCase;
    sourcePrefix?: string;
    sourceHierarchyDelim?: string;
};
/** Property Map that infers flattened target property names from keys on the flat source object,
 * via a lettercase convention, an optional prefix, and a hierarchy delimiter.
 *
 * NOTE: Target object uses dot notation for hierarchy.
 */
export type MergeMapFromSource = {
    /**  (optional: defaults to all) The list of keys on the flat source object
     *  that are to be sought for in the process env (and overwritten if found).
     *  If none are provided, all env variables (matching the given `options.envPrefix`) will be applied to target object
     */
    sourceKeys?: string[];
    targetObjectCase?: EnumCase;
    sourcePrefix?: string;
    sourceHierarchyDelim?: string;
};
/** Property Map with direct mappings from flattened target property to its associated key on the flat source object.
 *
 * NOTE: Target object uses dot notation for hierarchy. */
export type MergeMapExplicit = {
    /** Map of object property names to the env keys they'll be matched with. */
    propertyMap: {
        [objKey: string]: string;
    };
};
export type MergeOptions = {
    fromTarget?: MergeMapFromTarget;
    fromSource?: MergeMapFromSource;
    explicit?: MergeMapExplicit;
};
export declare class Overlayer {
    /** Delimiter to use in env value key names to denote object hierarchy,
     * for use when applying env values (as overrides) to the ultimate app config object.
     *
     * eg:
     * (eg: when `ENV_HIERARCHY_DELIM="__"`, the env variable `"DB__NAME=Jake"` would resolve to `{ "db": { "name": "Jake" } }` on the target object).
     */
    static readonly ENV_HIERARCHY_DELIM = "__";
    /** Returns a new version of the given object
     * by applying/overwriting property values
     * with values from env variables.
     * (DOES NOT mutate the original)
     *
     * @param target The target object to be overlaid with available env values.  (NOTE: The original object is NOT mutated).
     * @param targetPropertyNames (optional: defaults to all) The list of property names on the given object
     *  that are to be sought for in the process env (and overwritten if found).
     *  If none are provided, all env variables (matching the given `options.envPrefix`) will be applied to target object
     * @param options Behaviors to apply in the conversion
     * */
    static overlay<T extends {
        [key: string]: any;
    }>(target: T, flatSource: {
        [key: string]: string | number | boolean | undefined;
    }, options?: MergeOptions): T;
}
