import { PropertyConverter, FlushPriority, FetchType } from "../mappingModel";
import { CollectionOptions } from "../collectionOptions";
import { IndexOptions } from "../indexOptions";
import { ChangeTrackingType } from "../mappingModel";
import { CascadeFlags } from "../mappingModel";
import { Constructor, ParameterlessConstructor } from "../../index";
import { MappingModel } from "../mappingModel";
import { MappingBuilderContext } from "./mappingBuilderContext";
import { MappingBuilder } from "./mappingBuilder";
import { Type, Property, Method } from "reflect-helper";
import { IdentityGenerator } from "../../config/configuration";
export declare enum AnnotationPriority {
    High = 100,
    Medium = 50,
    Low = 0,
}
export declare class Annotation {
}
export interface ClassAnnotation {
    inherited?: boolean;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, annotation: Annotation): void;
}
export interface PropertyAnnotation {
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: Annotation): void;
}
export interface MethodAnnotation {
    processMethodAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, method: Method, annotation: Annotation): void;
}
export interface MappingBuilderAnnotation {
    createBuilder(context: MappingBuilderContext, type: Type): MappingBuilder;
}
export interface TargetClassAnnotation {
    target: Constructor<any> | string;
}
export declare class EntityAnnotation extends Annotation implements MappingBuilderAnnotation {
    createBuilder(context: MappingBuilderContext, type: Type): MappingBuilder;
    toString(): string;
}
export declare class EmbeddableAnnotation extends Annotation implements MappingBuilderAnnotation {
    createBuilder(context: MappingBuilderContext, type: Type): MappingBuilder;
    toString(): string;
}
export declare class ConverterAnnotation extends Annotation implements MappingBuilderAnnotation {
    converter: PropertyConverter;
    converterCtr: ParameterlessConstructor<PropertyConverter>;
    converterName: string;
    constructor(converter: string | PropertyConverter | ParameterlessConstructor<PropertyConverter>);
    toString(): string;
    createBuilder(context: MappingBuilderContext, type: Type): MappingBuilder;
    createMapping(context: MappingBuilderContext): MappingModel.Mapping;
}
export declare class CollectionAnnotation extends Annotation implements ClassAnnotation {
    name: string;
    flushPriority: FlushPriority;
    db: string;
    options: CollectionOptions;
    constructor(name: string);
    constructor(description?: CollectionDescription);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: CollectionAnnotation): void;
}
export interface CollectionDescription {
    flushPriority?: FlushPriority;
    name?: string;
    db?: string;
    options?: CollectionOptions;
}
export declare class IndexAnnotation extends Annotation implements ClassAnnotation, PropertyAnnotation {
    keys: [string, number | string][];
    order: number;
    options: IndexOptions;
    inherited: boolean;
    constructor(args: ClassIndexDescription);
    constructor(args?: PropertyIndexDescription);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: IndexAnnotation): void;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, property: MappingModel.Property, symbol: Property, annotation: IndexAnnotation): void;
    private _addIndex(context, mapping, value);
}
export interface ClassIndexDescription {
    keys: [string, number | string][];
    options?: IndexOptions;
}
export interface PropertyIndexDescription {
    order?: number | string;
    options?: IndexOptions;
}
export declare class VersionFieldAnnotation extends Annotation implements ClassAnnotation {
    name: string;
    constructor(name: string);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: VersionFieldAnnotation): void;
}
export declare class VersionedAnnotation extends Annotation implements ClassAnnotation {
    enabled: boolean;
    constructor(enabled?: boolean);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: VersionedAnnotation): void;
}
export declare class ChangeTrackingAnnotation extends Annotation implements ClassAnnotation {
    type: ChangeTrackingType;
    constructor(type: ChangeTrackingType);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: ChangeTrackingAnnotation): void;
}
export declare class IdentityAnnotation extends Annotation implements ClassAnnotation {
    identity: IdentityGenerator;
    identityCtr: ParameterlessConstructor<IdentityGenerator>;
    constructor(identity: IdentityGenerator | ParameterlessConstructor<IdentityGenerator>);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.EntityMapping, annotation: ChangeTrackingAnnotation): void;
}
export declare class DiscriminatorFieldAnnotation extends Annotation implements ClassAnnotation {
    name: string;
    constructor(name: string);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.ClassMapping, annotation: DiscriminatorFieldAnnotation): void;
}
export declare class ImmutableAnnotation extends Annotation implements ClassAnnotation {
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.ClassMapping, annotation: ImmutableAnnotation): void;
}
export declare class DiscriminatorValueAnnotation extends Annotation implements ClassAnnotation {
    value: string;
    constructor(value: string);
    toString(): string;
    processClassAnnotation(context: MappingBuilderContext, mapping: MappingModel.ClassMapping, annotation: DiscriminatorValueAnnotation): void;
}
export declare class InverseOfAnnotation extends Annotation implements PropertyAnnotation {
    propertyName: string;
    constructor(propertyName: string);
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: InverseOfAnnotation): void;
}
export declare class CascadeAnnotation extends Annotation implements PropertyAnnotation {
    flags: CascadeFlags;
    constructor(flags: CascadeFlags);
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: CascadeAnnotation): void;
}
export declare class FetchAnnotation extends Annotation implements PropertyAnnotation {
    type: FetchType;
    constructor(type: FetchType);
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: FetchAnnotation): void;
}
export declare class TypeAnnotation extends Annotation implements TargetClassAnnotation {
    target: Constructor<any> | string;
    constructor(target: Constructor<any> | string);
    toString(): string;
}
export declare class ElementTypeAnnotation extends Annotation implements TargetClassAnnotation {
    target: Constructor<any> | string;
    constructor(target: Constructor<any> | string);
    toString(): string;
}
export declare class MapKeyAnnotation extends Annotation {
    propertyName: string;
    constructor(propertyName: string);
    toString(): string;
}
export declare class FieldAnnotation extends Annotation implements PropertyAnnotation {
    name: string;
    nullable: boolean;
    readable: boolean;
    constructor(name?: string);
    constructor(args: FieldDescription);
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: FieldAnnotation): void;
}
export declare class ParentAnnotation extends Annotation implements PropertyAnnotation {
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: FieldAnnotation): void;
}
export interface FieldDescription {
    name?: string;
    nullable?: boolean;
    readable?: boolean;
}
export declare class EnumeratedAnnotation {
    members: Object;
    constructor(members: Object);
    toString(): string;
}
export declare class TransientAnnotation implements PropertyAnnotation {
    toString(): string;
    processPropertyAnnotation(context: MappingBuilderContext, mapping: MappingModel.ObjectMapping, property: MappingModel.Property, symbol: Property, annotation: Annotation): void;
}
