interface PrefixTemplateOptions {
    level: string;
    logger: LogLevel;
}
type PrefixTemplateFn = (options: PrefixTemplateOptions) => string;
interface PrefixFactoryOptions {
    [key: string]: PrefixTemplateFn | string | undefined;
    level?: PrefixTemplateFn;
    name?: PrefixTemplateFn;
    template?: string;
    time?: PrefixTemplateFn;
}
declare class PrefixFactory extends MethodFactory {
    private options;
    constructor(logger?: LogLevel, options?: PrefixFactoryOptions);
    interpolate(level: string): string;
    make(methodName: string): (...args: any[]) => void;
}

type SomeLevel = number | string;
interface LogLevelIndex {
    [key: string]: any;
}
interface LogLevelOptions {
    factory?: Factory;
    id?: string;
    level?: number | string;
    name?: string;
    prefix?: PrefixFactoryOptions;
}
declare class LogLevel<TLevels extends FactoryLevels = typeof defaultLevels> implements LogLevelIndex {
    [key: string]: any;
    name: string;
    type: string;
    private currentLevel;
    private methodFactory;
    private options;
    constructor(options: LogLevelOptions);
    get level(): TLevels[keyof TLevels];
    get levels(): TLevels;
    get factory(): Factory<TLevels>;
    set factory(factory: Factory<TLevels>);
    set level(logLevel: SomeLevel);
    disable(): void;
    enable(): void;
}

interface BindTarget {
    [key: string]: Function;
}
type FactoryLevels = Record<Uppercase<string>, number> & {
    DEBUG: number;
    ERROR: number;
    INFO: number;
    SILENT: number;
    TRACE: number;
    WARN: number;
};
declare const defaultLevels: FactoryLevels;
declare const levels: unique symbol;
declare const instance: unique symbol;
interface Factory<TLevels extends FactoryLevels = typeof defaultLevels> {
    [key: string]: any;
    bindMethod: (obj: BindTarget, methodName: string) => any;
    distillLevel: (level: number | string) => any;
    [instance]: LogLevel | undefined;
    levelValid: (level: number) => boolean;
    [levels]: TLevels;
    levels: TLevels;
    logger: LogLevel;
    make: (methodName: string) => Function;
    methods?: string[];
    replaceMethods: (logLevel: number | string) => void;
}
type MethodFactoryLevels = Lowercase<keyof FactoryLevels>;
declare class MethodFactory<TLevels extends FactoryLevels = typeof defaultLevels> implements Factory<TLevels> {
    [instance]: LogLevel | undefined;
    [levels]: TLevels;
    constructor(logger?: LogLevel);
    get levels(): TLevels;
    get logger(): LogLevel;
    get methods(): string[];
    set logger(logger: LogLevel);
    bindMethod(obj: BindTarget, methodName: string): any;
    distillLevel(level: number | string): number | null;
    levelValid(level: number): boolean;
    make(methodName: string): Function;
    replaceMethods(logLevel: number | string): void;
}

declare class DefaultLogger extends LogLevel {
    private cache;
    constructor();
    get factories(): any;
    get loggers(): Record<string, LogLevel<FactoryLevels>>;
    create(opts: LogLevelOptions | string): LogLevel<FactoryLevels>;
}
declare const _default: DefaultLogger;

export { Factory, FactoryLevels, LogLevel, LogLevelIndex, LogLevelOptions, MethodFactory, MethodFactoryLevels, PrefixFactory, PrefixFactoryOptions, PrefixTemplateFn, PrefixTemplateOptions, _default as default, defaultLevels };
