import { InjectionToken } from '@nestjs/common';
import { CreateIndexesOptions } from 'mongodb';
import { MongoClientOptions, MongoDatabaseOptions } from './mongo';
import { BSONType } from './enums';
export type Class<T = any> = new (...args: Array<any>) => T;
export type MixedList<T> = Array<T> | {
    [key: string]: T;
};
export type MongoHost = {
    host: string;
    port: string;
};
export type DataSourceOptions = {
    database?: string;
    host?: string;
    port?: number;
    hosts?: Array<MongoHost>;
    replicaSet?: string;
    username?: string;
    password?: string;
    synchronize?: boolean;
    entities?: MixedList<Class>;
    migrations?: MixedList<Class>;
    clientOptions?: MongoClientOptions;
    dbOptions?: MongoDatabaseOptions;
};
export type ForRootOptions = {
    global?: boolean;
    connectionName?: string;
    options?: DataSourceOptions;
};
export type ForRootAsyncOptions = {
    global?: boolean;
    connectionName?: string;
    inject?: Array<InjectionToken>;
    useFactory: (...args: Array<any>) => Promise<DataSourceOptions> | DataSourceOptions;
};
export type EntityColumnTypes = StringConstructor | NumberConstructor | BooleanConstructor | ObjectConstructor | Class | Record<string, any>;
export type EntityColumn = {
    type: EntityColumnTypes;
    parent: Class;
    propertyKey: string;
    options: EntityColumnOptions;
};
export type EntityColumnOptions = {
    type?: EntityColumnTypes;
    array?: boolean;
    enum?: object;
    required?: boolean;
    index?: string | Array<string> | CreateIndexesOptions;
};
export type EntityOptions = {
    index?: Record<string, CreateIndexesOptions>;
    validationLevel?: 'off' | 'strict' | 'moderate';
    validationAction?: 'error' | 'warn';
};
export type EntityMetadata = {
    collectionName: string | null;
    entityOptions: EntityOptions;
    entityColumns: Array<EntityColumn>;
};
export type EntityIndex = {
    keys: Array<string>;
    options: CreateIndexesOptions;
};
export type EntityColumnValidator = {
    bsonType?: BSONType;
    description?: string;
    minItems?: number;
    maxItems?: number;
    required?: Array<string>;
    enum?: Array<string>;
    additionalProperties?: boolean;
    items?: EntityColumnValidator;
    properties?: Record<string, EntityColumnValidator>;
};
export type MongoJsonSchema = {
    $jsonSchema?: EntityColumnValidator;
};
