import { MongoClient } from "mongodb";
import { NamingStrategy } from "./namingStrategies";
import { ResultCallback } from "../core/callback";
import { ChangeTrackingType } from "../mapping/mappingModel";
import { MappingModel, PropertyConverter } from "../mapping/mappingModel";
import { SessionFactory } from "../sessionFactory";
export declare class Configuration {
    databaseName: string;
    identityGenerator: IdentityGenerator;
    versioned: boolean;
    nullable: boolean;
    versionField: string;
    discriminatorField: string;
    changeTracking: ChangeTrackingType;
    collectionPrefix: string;
    collectionNamingStrategy: NamingStrategy;
    fieldNamingStrategy: NamingStrategy;
    discriminatorNamingStrategy: NamingStrategy;
    propertyConverters: {
        [name: string]: PropertyConverter;
    };
    logger: Logger;
    createIndexes: boolean;
    private _mappings;
    addMapping(mapping: MappingProvider): void;
    createSessionFactory(connection: MongoClient, callback: ResultCallback<SessionFactory>): void;
    createSessionFactory(connection: MongoClient, databaseName: string, callback: ResultCallback<SessionFactory>): void;
    private _buildCollections(connection, databaseName, registry, callback);
}
export interface IdentityGenerator {
    generate(): any;
    fromString(text: string): any;
    validate(value: any): boolean;
    areEqual(first: any, second: any): boolean;
}
export interface PropertyConverter {
    convertToDocumentField(property: any): any;
    convertToObjectProperty(field: any): any;
    areEqual(field1: any, field2: any): boolean;
}
export interface MappingProvider {
    getMapping(config: Configuration, callback: ResultCallback<MappingModel.ClassMapping[]>): void;
}
export interface Logger {
    child(options: LoggerOptions): Logger;
    trace(error: Error, msg?: string, ...args: any[]): void;
    trace(fields: Object, msg?: string, ...args: any[]): void;
    trace(msg: string, ...params: any[]): void;
    debug(error: Error, msg?: string, ...args: any[]): void;
    debug(fields: Object, msg?: string, ...args: any[]): void;
    debug(msg: string, ...args: any[]): void;
    info(error: Error, msg?: string, ...args: any[]): void;
    info(fields: Object, msg?: string, ...args: any[]): void;
    info(msg: string, ...args: any[]): void;
    warn(error: Error, msg?: string, ...args: any[]): void;
    warn(fields: Object, msg?: string, ...args: any[]): void;
    warn(msg: string, ...args: any[]): void;
    error(error: Error, msg?: string, ...args: any[]): void;
    error(fields: Object, msg?: string, ...args: any[]): void;
    error(msg: string, ...args: any[]): void;
    fatal(error: Error, msg?: string, ...args: any[]): void;
    fatal(fields: Object, msg?: string, ...args: any[]): void;
    fatal(msg: string, ...args: any[]): void;
}
export interface LoggerOptions {
    serializers?: {
        [key: string]: (input: any) => any;
    };
}
