-
-
Notifications
You must be signed in to change notification settings - Fork 526
/
OneToMany.ts
50 lines (46 loc) · 2.12 KB
/
OneToMany.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { ReferenceOptions } from './Property';
import { MetadataStorage, MetadataValidator } from '../metadata';
import { Utils } from '../utils';
import { ReferenceType, QueryOrder } from '../enums';
import { EntityName, EntityProperty, AnyEntity } from '../typings';
export function createOneToDecorator<T, O>(
entity: OneToManyOptions<T, O> | string | ((e?: any) => EntityName<T>),
mappedBy: (string & keyof T) | ((e: T) => any) | undefined,
options: Partial<OneToManyOptions<T, O>>,
reference: ReferenceType,
) {
return function (target: AnyEntity, propertyName: string) {
options = Utils.isObject<OneToManyOptions<T, O>>(entity) ? entity : { ...options, entity, mappedBy };
const meta = MetadataStorage.getMetadataFromDecorator(target.constructor);
MetadataValidator.validateSingleDecorator(meta, propertyName, reference);
const property = { name: propertyName, reference } as EntityProperty<T>;
meta.properties[propertyName] = Object.assign(meta.properties[propertyName] ?? {}, property, options);
return Utils.propertyDecoratorReturnValue();
};
}
export function OneToMany<T, O>(
entity: string | ((e?: any) => EntityName<T>),
mappedBy: (string & keyof T) | ((e: T) => any),
options?: Partial<OneToManyOptions<T, O>>,
): (target: AnyEntity, propertyName: string) => void;
export function OneToMany<T, O>(
options: OneToManyOptions<T, O>,
): (target: AnyEntity, propertyName: string) => void;
export function OneToMany<T, O>(
entity: OneToManyOptions<T, O> | string | ((e?: any) => EntityName<T>),
mappedBy?: (string & keyof T) | ((e: T) => any),
options: Partial<OneToManyOptions<T, O>> = {},
): (target: AnyEntity, propertyName: string) => void {
return createOneToDecorator(entity, mappedBy, options, ReferenceType.ONE_TO_MANY);
}
export type OneToManyOptions<T, O> = ReferenceOptions<T, O> & {
entity?: string | (() => EntityName<T>);
orphanRemoval?: boolean;
orderBy?: { [field: string]: QueryOrder };
joinColumn?: string;
joinColumns?: string[];
inverseJoinColumn?: string;
inverseJoinColumns?: string[];
referenceColumnName?: string;
mappedBy: (string & keyof T) | ((e: T) => any);
};