quaerateum
Version:
Simple typescript ORM for node.js based on data-mapper, unit-of-work and identity-map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JS.
96 lines (84 loc) • 3.13 kB
text/typescript
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 <T extends { new(...args: any[]): IEntity }>(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<IEntity>): EntityRepository<IEntity> };
}
export interface IEntity<K = number | string> {
id: K;
isInitialized(): boolean;
populated(populated?: boolean): void;
init(populated?: boolean): Promise<this>;
toObject(parent?: IEntity, isCollection?: boolean): Record<string, any>;
toJSON(...args: any[]): Record<string, any>;
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<T> = { [k in keyof T]: IEntity | Collection<IEntity> | any; } & IEntity;
export type EntityClass<T extends IEntityType<T>> = Function & { prototype: T };
export type EntityClassGroup<T extends IEntityType<T>> = {
entity: EntityClass<T>
schema: EntityMetadata<T>,
};
export type EntityName<T extends IEntityType<T>> = string | EntityClass<T>;
export type EntityData<T extends IEntityType<T>> = { [P in keyof T]?: T[P] | IPrimaryKey; } & Record<string, any>;
export interface EntityProperty<T extends IEntityType<T> = any> {
name: string & keyof T;
fk: string;
entity: () => EntityName<T>;
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<T extends IEntityType<T> = 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<T> };
customRepository: () => { new (em: EntityManager, entityName: EntityName<T>): EntityRepository<T> };
hooks: Record<string, string[]>;
prototype: EntityClass<T> & IEntity;
}