import { MetadataStorage } from '../metadata'; import { EntityManager } from '../EntityManager'; import { IPrimaryKey } from './PrimaryKey'; import { AssignOptions, Cascade, Collection, EntityRepository, ReferenceType } from '../entity'; import { Utils } from '../utils'; import { QueryOrder } from '../query'; export function Entity(options: EntityOptions = {}): Function { return function (target: T) { const meta = MetadataStorage.getMetadata(target.name); Utils.merge(meta, options); meta.name = target.name; meta.constructorParams = Utils.getParamNames(target); meta.extends = Object.getPrototypeOf(target).name || undefined; Utils.lookupPathFromDecorator(meta); return target; }; } export type EntityOptions = { collection?: string; customRepository?: () => { new (em: EntityManager, entityName: EntityName): EntityRepository }; } export interface IEntity { id: K; isInitialized(): boolean; populated(populated?: boolean): void; init(populated?: boolean): Promise; toObject(parent?: IEntity, isCollection?: boolean): Record; toJSON(...args: any[]): Record; assign(data: any, options?: AssignOptions | boolean): void; __uuid: string; __em: EntityManager; __initialized?: boolean; __populated: boolean; __primaryKey: K; __primaryKeyField: string & keyof IEntity; __serializedPrimaryKey: string & keyof IEntity; __serializedPrimaryKeyField: string; } export type IEntityType = { [k in keyof T]: IEntity | Collection | any; } & IEntity; export type EntityClass> = Function & { prototype: T }; export type EntityClassGroup> = { entity: EntityClass schema: EntityMetadata, }; export type EntityName> = string | EntityClass; export type EntityData> = { [P in keyof T]?: T[P] | IPrimaryKey; } & Record; export interface EntityProperty = any> { name: string & keyof T; fk: string; entity: () => EntityName; type: string; primary: boolean; length?: any; reference: ReferenceType; fieldName: string; default?: string; unique?: boolean; nullable?: boolean; persist?: boolean; cascade: Cascade[]; onUpdate?: () => any; owner: boolean; inversedBy: string; mappedBy: string; orderBy?: { [field: string]: QueryOrder }, pivotTable: string; joinColumn: string; inverseJoinColumn: string; referenceColumnName: string; } export interface EntityMetadata = any> { name: string; constructorParams: (keyof T & string)[]; toJsonParams: string[]; extends: string; collection: string; path: string; primaryKey: keyof T & string; serializedPrimaryKey: keyof T & string; properties: { [K in keyof T & string]: EntityProperty }; customRepository: () => { new (em: EntityManager, entityName: EntityName): EntityRepository }; hooks: Record; prototype: EntityClass & IEntity; }