import { Maybe, Type } from 'ts-gems';
import { AssociationFieldMetadata } from '../model/association-field-metadata.js';
import { ColumnFieldMetadata } from '../model/column-field-metadata.js';
import { EmbeddedFieldMetadata } from '../model/embedded-field-metadata.js';
import { AnyFieldMetadata, EntityMetadata, EntityOptions } from '../model/entity-metadata.js';
import { IndexMetadata } from '../model/index-metadata.js';
export declare function Entity(options?: EntityOptions | string): ClassDecorator;
export declare namespace Entity {
    const getMetadata: typeof EntityMetadata.get;
    const getOwnMetadata: typeof EntityMetadata.getOwn;
    function getField<T>(ctor: Type<T>, key: keyof T | string): Maybe<AnyFieldMetadata>;
    function getColumnField<T>(ctor: Type<T>, key: keyof T | string): Maybe<ColumnFieldMetadata>;
    function getEmbeddedField<T>(ctor: Type<T>, key: keyof T | string): Maybe<EmbeddedFieldMetadata>;
    function getAssociationField<T>(ctor: Type<T>, key: keyof T | string): Maybe<AssociationFieldMetadata>;
    function getColumnFieldByFieldName(ctor: Type, fieldName: string): Maybe<ColumnFieldMetadata>;
    function find(ctor: Type, predicate: (el: AnyFieldMetadata) => boolean): Maybe<AnyFieldMetadata>;
    function getFieldNames(ctor: Type, filter?: (el: AnyFieldMetadata) => boolean): string[];
    function getColumnFieldNames(ctor: Type): string[];
    function getEmbeddedFieldNames(ctor: Type): string[];
    function getAssociationFieldNames(ctor: Type): string[];
    function getNonAssociationFieldNames(ctor: Type): string[];
    function getInsertColumnNames(ctor: Type): string[];
    function getUpdateColumnNames(ctor: Type): string[];
    function getPrimaryIndex(ctor: Type): Maybe<IndexMetadata>;
    function getPrimaryIndexColumns(ctor: Type): ColumnFieldMetadata[];
    function mixin<A, B>(derivedCtor: Type<A>, baseB: Type<B>): Type<A & B>;
    function mixin<A, B, C>(derivedCtor: Type<A>, baseB: Type<B>, baseC: Type<C>): Type<A & B & C>;
    function mixin<A, B, C, D>(derivedCtor: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>): Type<A & B & C & D>;
    function mixin<A, B, C, D, E>(derivedCtor: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>, baseE: Type<E>): Type<A & B & C & D & E>;
    function mixin<A, B, C, D, E, F>(derivedCtor: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>, baseE: Type<E>, baseF: Type<F>): Type<A & B & C & D & E & F>;
    function Pick<T, K extends keyof T>(classRef: Type<T>, keys: readonly K[]): Type<Pick<T, (typeof keys)[number]>>;
    function Omit<T, K extends keyof T>(classRef: Type<T>, keys: readonly K[]): Type<Omit<T, (typeof keys)[number]>>;
    function Union<A, B>(baseA: Type<A>, baseB: Type<B>): Type<A & B>;
    function Union<A, B, C>(baseA: Type<A>, baseB: Type<B>, baseC: Type<C>): Type<A & B & C>;
    function Union<A, B, C, D>(baseA: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>): Type<A & B & C & D>;
    function Union<A, B, C, D, E>(baseA: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>, baseE: Type<E>): Type<A & B & C & D & E>;
    function Union<A, B, C, D, E, F>(baseA: Type<A>, baseB: Type<B>, baseC: Type<C>, baseD: Type<D>, baseE: Type<E>, baseF: Type<F>): Type<A & B & C & D & E & F>;
}
