From d8503d7bacc4fd369e55814c416c07c8de0ef125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Mon, 11 Mar 2019 23:07:40 +0100 Subject: [PATCH] fix: require generic type of ChangeSet (fixes older TS compatibility) --- lib/decorators/Entity.ts | 2 +- lib/unit-of-work/ChangeSet.ts | 3 +-- lib/unit-of-work/ChangeSetComputer.ts | 24 ++++++++++++------------ lib/unit-of-work/UnitOfWork.ts | 4 ++-- lib/utils/Utils.ts | 10 +++++----- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/lib/decorators/Entity.ts b/lib/decorators/Entity.ts index 3606d0354f69..87f8a3cd6354 100644 --- a/lib/decorators/Entity.ts +++ b/lib/decorators/Entity.ts @@ -52,7 +52,7 @@ export type EntityData> = { [P in keyof T]?: T[P] | IPr export interface EntityProperty { name: string; fk: string; - entity: () => string | Function; + entity: () => EntityName; type: string; primary: boolean; reference: ReferenceType; diff --git a/lib/unit-of-work/ChangeSet.ts b/lib/unit-of-work/ChangeSet.ts index 18ec2ca2630a..be83915cf3d7 100644 --- a/lib/unit-of-work/ChangeSet.ts +++ b/lib/unit-of-work/ChangeSet.ts @@ -1,7 +1,6 @@ import { EntityData, IEntityType } from '../decorators'; -export interface ChangeSet = IEntityType> { - index: number; +export interface ChangeSet> { name: string; collection: string; delete: boolean; diff --git a/lib/unit-of-work/ChangeSetComputer.ts b/lib/unit-of-work/ChangeSetComputer.ts index 535528991fe4..874b7d114ca7 100644 --- a/lib/unit-of-work/ChangeSetComputer.ts +++ b/lib/unit-of-work/ChangeSetComputer.ts @@ -1,6 +1,6 @@ import { Utils } from '../utils'; import { MetadataStorage } from '../metadata'; -import { EntityProperty, IEntity } from '../decorators'; +import { EntityData, EntityProperty, IEntity, IEntityType } from '../decorators'; import { ChangeSet } from './ChangeSet'; import { Collection, EntityIdentifier, EntityValidator, ReferenceType } from '../entity'; @@ -9,11 +9,11 @@ export class ChangeSetComputer { private readonly metadata = MetadataStorage.getMetadata(); constructor(private readonly validator: EntityValidator, - private readonly originalEntityData: Record, + private readonly originalEntityData: Record>, private readonly identifierMap: Record) { } - computeChangeSet(entity: IEntity): ChangeSet | null { - const changeSet = { entity } as ChangeSet; + computeChangeSet>(entity: T): ChangeSet | null { + const changeSet = { entity } as ChangeSet; const meta = this.metadata[entity.constructor.name]; changeSet.name = meta.name; @@ -33,32 +33,32 @@ export class ChangeSetComputer { return changeSet; } - private computePayload(entity: IEntity): Record { + private computePayload>(entity: T): EntityData { if (entity.id && this.originalEntityData[entity.uuid]) { - return Utils.diffEntities(this.originalEntityData[entity.uuid], entity); + return Utils.diffEntities(this.originalEntityData[entity.uuid] as T, entity); } else { return Utils.prepareEntity(entity); } } - private processReference(changeSet: ChangeSet, prop: EntityProperty): void { + private processReference>(changeSet: ChangeSet, prop: EntityProperty): void { if (prop.reference === ReferenceType.MANY_TO_MANY && prop.owner) { - this.processManyToMany(changeSet, prop, changeSet.entity[prop.name]); - } else if (prop.reference === ReferenceType.MANY_TO_ONE && changeSet.entity[prop.name]) { + this.processManyToMany(changeSet, prop, changeSet.entity[prop.name as keyof T]); + } else if (prop.reference === ReferenceType.MANY_TO_ONE && changeSet.entity[prop.name as keyof T]) { this.processManyToOne(prop, changeSet); } } - private processManyToOne(prop: EntityProperty, changeSet: ChangeSet): void { + private processManyToOne>(prop: EntityProperty, changeSet: ChangeSet): void { const pk = this.metadata[prop.type].primaryKey; - const entity = changeSet.entity[prop.name]; + const entity = changeSet.entity[prop.name as keyof T]; if (!entity[pk]) { changeSet.payload[prop.name] = this.identifierMap[entity.uuid]; } } - private processManyToMany(changeSet: ChangeSet, prop: EntityProperty, collection: Collection): void { + private processManyToMany>(changeSet: ChangeSet, prop: EntityProperty, collection: Collection): void { if (prop.owner && collection.isDirty()) { const pk = this.metadata[prop.type].primaryKey as keyof IEntity; changeSet.payload[prop.name] = collection.getItems().map(item => item[pk] || this.identifierMap[item.uuid]); diff --git a/lib/unit-of-work/UnitOfWork.ts b/lib/unit-of-work/UnitOfWork.ts index 9a0d943e77cc..b19be227190f 100644 --- a/lib/unit-of-work/UnitOfWork.ts +++ b/lib/unit-of-work/UnitOfWork.ts @@ -21,7 +21,7 @@ export class UnitOfWork { private readonly persistStack: IEntity[] = []; private readonly removeStack: IEntity[] = []; - private readonly changeSets: ChangeSet[] = []; + private readonly changeSets: ChangeSet[] = []; private readonly metadata = MetadataStorage.getMetadata(); private readonly changeSetComputer = new ChangeSetComputer(this.em.getValidator(), this.originalEntityData, this.identifierMap); private readonly changeSetPersister = new ChangeSetPersister(this.em.getDriver(), this.identifierMap); @@ -121,7 +121,7 @@ export class UnitOfWork { for (const entity of Object.values(this.removeStack)) { const meta = this.metadata[entity.constructor.name]; - this.changeSets.push({ entity, delete: true, name: meta.name, collection: meta.collection, payload: {} } as ChangeSet); + this.changeSets.push({ entity, delete: true, name: meta.name, collection: meta.collection, payload: {} } as ChangeSet); } } diff --git a/lib/utils/Utils.ts b/lib/utils/Utils.ts index 73a3cb07cf16..55a72abaff49 100644 --- a/lib/utils/Utils.ts +++ b/lib/utils/Utils.ts @@ -2,7 +2,7 @@ import * as fastEqual from 'fast-deep-equal'; import * as clone from 'clone'; import { MetadataStorage } from '../metadata'; -import { EntityMetadata, IEntity, IEntityType, IPrimaryKey } from '../decorators'; +import { EntityData, EntityMetadata, IEntity, IEntityType, IPrimaryKey } from '../decorators'; import { ArrayCollection } from '../entity'; export class Utils { @@ -47,7 +47,7 @@ export class Utils { return Utils.merge(target, ...sources); } - static diff(a: Record, b: Record): Record { + static diff(a: Record, b: Record): Record { const ret: Record = {}; Object.keys(b).forEach(k => { @@ -61,11 +61,11 @@ export class Utils { return ret; } - static diffEntities(a: IEntity, b: IEntity): Record { - return Utils.diff(Utils.prepareEntity(a), Utils.prepareEntity(b)); + static diffEntities>(a: T, b: T): EntityData { + return Utils.diff(Utils.prepareEntity(a), Utils.prepareEntity(b)) as EntityData; } - static prepareEntity(e: IEntityType): Record { + static prepareEntity>(e: T): EntityData { const metadata = MetadataStorage.getMetadata(); const meta = metadata[e.constructor.name]; const ret = Utils.copy(e);