joist-orm 0.1.536 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/{BaseEntity.d.ts → src/BaseEntity.d.ts} +2 -1
- package/build/{BaseEntity.js → src/BaseEntity.js} +13 -9
- package/build/src/BaseEntity.js.map +1 -0
- package/build/{EntityManager.d.ts → src/EntityManager.d.ts} +139 -110
- package/build/{EntityManager.js → src/EntityManager.js} +281 -262
- package/build/src/EntityManager.js.map +1 -0
- package/build/{QueryBuilder.d.ts → src/QueryBuilder.d.ts} +53 -3
- package/build/src/QueryBuilder.js +341 -0
- package/build/src/QueryBuilder.js.map +1 -0
- package/build/src/Todo.d.ts +25 -0
- package/build/src/Todo.js +52 -0
- package/build/src/Todo.js.map +1 -0
- package/build/src/changes.d.ts +34 -0
- package/build/src/changes.js +37 -0
- package/build/src/changes.js.map +1 -0
- package/build/src/config.d.ts +43 -0
- package/build/src/config.js +114 -0
- package/build/src/config.js.map +1 -0
- package/build/{createOrUpdatePartial.d.ts → src/createOrUpdatePartial.d.ts} +2 -1
- package/build/{createOrUpdatePartial.js → src/createOrUpdatePartial.js} +42 -10
- package/build/src/createOrUpdatePartial.js.map +1 -0
- package/build/src/dataloaders/findDataLoader.d.ts +5 -0
- package/build/src/dataloaders/findDataLoader.js +28 -0
- package/build/src/dataloaders/findDataLoader.js.map +1 -0
- package/build/src/dataloaders/loadDataLoader.d.ts +3 -0
- package/build/src/dataloaders/loadDataLoader.js +37 -0
- package/build/src/dataloaders/loadDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyDataLoader.js +78 -0
- package/build/src/dataloaders/manyToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js +33 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToManyDataLoader.js +40 -0
- package/build/src/dataloaders/oneToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js +32 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToOneDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToOneDataLoader.js +40 -0
- package/build/src/dataloaders/oneToOneDataLoader.js.map +1 -0
- package/build/src/drivers/IdAssigner.d.ts +33 -0
- package/build/src/drivers/IdAssigner.js +106 -0
- package/build/src/drivers/IdAssigner.js.map +1 -0
- package/build/src/drivers/InMemoryDriver.d.ts +29 -0
- package/build/src/drivers/InMemoryDriver.js +306 -0
- package/build/src/drivers/InMemoryDriver.js.map +1 -0
- package/build/src/drivers/PostgresDriver.d.ts +40 -0
- package/build/src/drivers/PostgresDriver.js +376 -0
- package/build/src/drivers/PostgresDriver.js.map +1 -0
- package/build/src/drivers/driver.d.ts +23 -0
- package/build/src/drivers/driver.js +3 -0
- package/build/src/drivers/driver.js.map +1 -0
- package/build/src/drivers/index.d.ts +4 -0
- package/build/src/drivers/index.js +17 -0
- package/build/src/drivers/index.js.map +1 -0
- package/build/{getProperties.d.ts → src/getProperties.d.ts} +0 -0
- package/build/{getProperties.js → src/getProperties.js} +1 -1
- package/build/src/getProperties.js.map +1 -0
- package/build/src/index.d.ts +62 -0
- package/build/src/index.js +263 -0
- package/build/src/index.js.map +1 -0
- package/build/src/keys.d.ts +30 -0
- package/build/{keys.js → src/keys.js} +48 -16
- package/build/src/keys.js.map +1 -0
- package/build/{loadLens.d.ts → src/loadLens.d.ts} +2 -2
- package/build/{loadLens.js → src/loadLens.js} +1 -1
- package/build/src/loadLens.js.map +1 -0
- package/build/src/loaded.d.ts +49 -0
- package/build/src/loaded.js +9 -0
- package/build/src/loaded.js.map +1 -0
- package/build/{newTestInstance.d.ts → src/newTestInstance.d.ts} +37 -3
- package/build/src/newTestInstance.js +342 -0
- package/build/src/newTestInstance.js.map +1 -0
- package/build/{collections → src/relations}/AbstractRelationImpl.d.ts +6 -5
- package/build/{collections → src/relations}/AbstractRelationImpl.js +0 -0
- package/build/src/relations/AbstractRelationImpl.js.map +1 -0
- package/build/src/relations/Collection.d.ts +26 -0
- package/build/src/relations/Collection.js +19 -0
- package/build/src/relations/Collection.js.map +1 -0
- package/build/{collections → src/relations}/CustomCollection.d.ts +6 -2
- package/build/{collections → src/relations}/CustomCollection.js +17 -9
- package/build/src/relations/CustomCollection.js.map +1 -0
- package/build/{collections → src/relations}/CustomReference.d.ts +7 -2
- package/build/{collections → src/relations}/CustomReference.js +16 -9
- package/build/src/relations/CustomReference.js.map +1 -0
- package/build/src/relations/LargeCollection.d.ts +17 -0
- package/build/src/relations/LargeCollection.js +3 -0
- package/build/src/relations/LargeCollection.js.map +1 -0
- package/build/{collections → src/relations}/ManyToManyCollection.d.ts +9 -2
- package/build/src/relations/ManyToManyCollection.js +249 -0
- package/build/src/relations/ManyToManyCollection.js.map +1 -0
- package/build/src/relations/ManyToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/ManyToManyLargeCollection.js +97 -0
- package/build/src/relations/ManyToManyLargeCollection.js.map +1 -0
- package/build/src/relations/ManyToOneReference.d.ts +77 -0
- package/build/{collections → src/relations}/ManyToOneReference.js +101 -48
- package/build/src/relations/ManyToOneReference.js.map +1 -0
- package/build/{collections → src/relations}/OneToManyCollection.d.ts +10 -2
- package/build/{collections → src/relations}/OneToManyCollection.js +54 -59
- package/build/src/relations/OneToManyCollection.js.map +1 -0
- package/build/src/relations/OneToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/OneToManyLargeCollection.js +83 -0
- package/build/src/relations/OneToManyLargeCollection.js.map +1 -0
- package/build/src/relations/OneToOneReference.d.ts +82 -0
- package/build/src/relations/OneToOneReference.js +168 -0
- package/build/src/relations/OneToOneReference.js.map +1 -0
- package/build/src/relations/PolymorphicReference.d.ts +69 -0
- package/build/src/relations/PolymorphicReference.js +210 -0
- package/build/src/relations/PolymorphicReference.js.map +1 -0
- package/build/src/relations/Reference.d.ts +29 -0
- package/build/src/relations/Reference.js +23 -0
- package/build/src/relations/Reference.js.map +1 -0
- package/build/src/relations/Relation.d.ts +10 -0
- package/build/src/relations/Relation.js +13 -0
- package/build/src/relations/Relation.js.map +1 -0
- package/build/src/relations/hasAsyncProperty.d.ts +36 -0
- package/build/src/relations/hasAsyncProperty.js +55 -0
- package/build/src/relations/hasAsyncProperty.js.map +1 -0
- package/build/{collections → src/relations}/hasManyDerived.d.ts +2 -1
- package/build/{collections → src/relations}/hasManyDerived.js +1 -1
- package/build/src/relations/hasManyDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasManyThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasManyThrough.js +2 -2
- package/build/src/relations/hasManyThrough.js.map +1 -0
- package/build/{collections → src/relations}/hasOneDerived.d.ts +3 -2
- package/build/{collections → src/relations}/hasOneDerived.js +1 -1
- package/build/src/relations/hasOneDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasOneThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasOneThrough.js +2 -2
- package/build/src/relations/hasOneThrough.js.map +1 -0
- package/build/src/relations/index.d.ts +18 -0
- package/build/src/relations/index.js +53 -0
- package/build/src/relations/index.js.map +1 -0
- package/build/{reverseHint.d.ts → src/reverseHint.d.ts} +2 -1
- package/build/{reverseHint.js → src/reverseHint.js} +13 -9
- package/build/src/reverseHint.js.map +1 -0
- package/build/src/rules.d.ts +23 -0
- package/build/src/rules.js +23 -0
- package/build/src/rules.js.map +1 -0
- package/build/src/serde.d.ts +121 -0
- package/build/src/serde.js +190 -0
- package/build/src/serde.js.map +1 -0
- package/build/{utils.d.ts → src/utils.d.ts} +2 -0
- package/build/{utils.js → src/utils.js} +10 -1
- package/build/src/utils.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +30 -15
- package/build/BaseEntity.js.map +0 -1
- package/build/EntityManager.js.map +0 -1
- package/build/EntityPersister.d.ts +0 -30
- package/build/EntityPersister.js +0 -197
- package/build/EntityPersister.js.map +0 -1
- package/build/QueryBuilder.js +0 -195
- package/build/QueryBuilder.js.map +0 -1
- package/build/changes.d.ts +0 -23
- package/build/changes.js +0 -14
- package/build/changes.js.map +0 -1
- package/build/collections/AbstractRelationImpl.js.map +0 -1
- package/build/collections/CustomCollection.js.map +0 -1
- package/build/collections/CustomReference.js.map +0 -1
- package/build/collections/ManyToManyCollection.js +0 -288
- package/build/collections/ManyToManyCollection.js.map +0 -1
- package/build/collections/ManyToOneReference.d.ts +0 -50
- package/build/collections/ManyToOneReference.js.map +0 -1
- package/build/collections/OneToManyCollection.js.map +0 -1
- package/build/collections/OneToOneReference.d.ts +0 -51
- package/build/collections/OneToOneReference.js +0 -132
- package/build/collections/OneToOneReference.js.map +0 -1
- package/build/collections/hasManyDerived.js.map +0 -1
- package/build/collections/hasManyThrough.js.map +0 -1
- package/build/collections/hasOneDerived.js.map +0 -1
- package/build/collections/hasOneThrough.js.map +0 -1
- package/build/collections/index.d.ts +0 -19
- package/build/collections/index.js +0 -49
- package/build/collections/index.js.map +0 -1
- package/build/createOrUpdatePartial.js.map +0 -1
- package/build/getProperties.js.map +0 -1
- package/build/index.d.ts +0 -140
- package/build/index.js +0 -278
- package/build/index.js.map +0 -1
- package/build/keys.d.ts +0 -21
- package/build/keys.js.map +0 -1
- package/build/loadLens.js.map +0 -1
- package/build/newTestInstance.js +0 -153
- package/build/newTestInstance.js.map +0 -1
- package/build/reverseHint.js.map +0 -1
- package/build/serde.d.ts +0 -47
- package/build/serde.js +0 -93
- package/build/serde.js.map +0 -1
- package/build/utils.js.map +0 -1
- package/package.json.bak +0 -27
- package/src/BaseEntity.ts +0 -104
- package/src/EntityManager.ts +0 -1263
- package/src/EntityPersister.ts +0 -240
- package/src/QueryBuilder.ts +0 -289
- package/src/changes.ts +0 -40
- package/src/collections/AbstractRelationImpl.ts +0 -28
- package/src/collections/CustomCollection.ts +0 -152
- package/src/collections/CustomReference.ts +0 -138
- package/src/collections/ManyToManyCollection.ts +0 -346
- package/src/collections/ManyToOneReference.ts +0 -215
- package/src/collections/OneToManyCollection.ts +0 -254
- package/src/collections/OneToOneReference.ts +0 -153
- package/src/collections/hasManyDerived.ts +0 -29
- package/src/collections/hasManyThrough.ts +0 -20
- package/src/collections/hasOneDerived.ts +0 -26
- package/src/collections/hasOneThrough.ts +0 -20
- package/src/collections/index.ts +0 -74
- package/src/createOrUpdatePartial.ts +0 -144
- package/src/getProperties.ts +0 -27
- package/src/index.ts +0 -400
- package/src/keys.ts +0 -75
- package/src/loadLens.ts +0 -126
- package/src/newTestInstance.ts +0 -205
- package/src/reverseHint.ts +0 -43
- package/src/serde.ts +0 -97
- package/src/utils.ts +0 -63
- package/tsconfig.json +0 -21
- package/tsconfig.tsbuildinfo +0 -2646
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.CustomReference = void 0;
|
|
4
5
|
const index_1 = require("../index");
|
|
5
6
|
const AbstractRelationImpl_1 = require("./AbstractRelationImpl");
|
|
7
|
+
const Reference_1 = require("./Reference");
|
|
8
|
+
const Relation_1 = require("./Relation");
|
|
6
9
|
/**
|
|
7
10
|
* Allows user-defined references that will work in `populate` / preload hints.
|
|
8
11
|
*
|
|
@@ -20,6 +23,9 @@ class CustomReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
20
23
|
this.entity = entity;
|
|
21
24
|
this.opts = opts;
|
|
22
25
|
this._isLoaded = false;
|
|
26
|
+
this[_a] = null;
|
|
27
|
+
this[_b] = null;
|
|
28
|
+
this[_c] = null;
|
|
23
29
|
}
|
|
24
30
|
get get() {
|
|
25
31
|
return this.doGet({ withDeleted: false });
|
|
@@ -31,7 +37,7 @@ class CustomReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
31
37
|
return this._isLoaded;
|
|
32
38
|
}
|
|
33
39
|
async load(opts) {
|
|
34
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
40
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
35
41
|
if (!this.isLoaded) {
|
|
36
42
|
if (this.loadPromise === undefined) {
|
|
37
43
|
this.loadPromise = this.opts.load(this.entity);
|
|
@@ -53,17 +59,17 @@ class CustomReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
53
59
|
// this._isLoaded = true;
|
|
54
60
|
}
|
|
55
61
|
get id() {
|
|
56
|
-
return index_1.fail(`CustomReference cannot resolve 'id'`);
|
|
62
|
+
return (0, index_1.fail)(`CustomReference cannot resolve 'id'`);
|
|
57
63
|
}
|
|
58
64
|
get idOrFail() {
|
|
59
|
-
return index_1.fail(`CustomReference cannot resolve 'idOrFail'`);
|
|
65
|
+
return (0, index_1.fail)(`CustomReference cannot resolve 'idOrFail'`);
|
|
60
66
|
}
|
|
61
67
|
get idUntagged() {
|
|
62
68
|
// We don't know the meta here but that is probably a feature in case this is polymorphic
|
|
63
|
-
return this.id && index_1.unsafeDeTagIds([this.id])[0];
|
|
69
|
+
return this.id && (0, index_1.unsafeDeTagIds)([this.id])[0];
|
|
64
70
|
}
|
|
65
71
|
get idUntaggedOrFail() {
|
|
66
|
-
return this.idUntagged || index_1.fail("Reference is unset or assigned to a new entity");
|
|
72
|
+
return this.idUntagged || (0, index_1.fail)("Reference is unset or assigned to a new entity");
|
|
67
73
|
}
|
|
68
74
|
get isSet() {
|
|
69
75
|
ensureNewOrLoaded(this);
|
|
@@ -82,8 +88,8 @@ class CustomReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
82
88
|
this.set(value);
|
|
83
89
|
}
|
|
84
90
|
// these callbacks should be no-ops as they ought to be handled by the underlying relations
|
|
85
|
-
async
|
|
86
|
-
|
|
91
|
+
async cleanupOnEntityDeleted() { }
|
|
92
|
+
maybeCascadeDelete() { }
|
|
87
93
|
async refreshIfLoaded() { }
|
|
88
94
|
/** Finds this CustomReferences field name by looking in the entity for the key that we're assigned to. */
|
|
89
95
|
get fieldName() {
|
|
@@ -93,15 +99,16 @@ class CustomReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
93
99
|
return `CustomReference(entity: ${this.entity}, fieldName: ${this.fieldName})`;
|
|
94
100
|
}
|
|
95
101
|
doGet(opts) {
|
|
96
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
102
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
97
103
|
ensureNewOrLoaded(this);
|
|
98
104
|
return this.filterDeleted(this.opts.get(this.entity), opts);
|
|
99
105
|
}
|
|
100
106
|
filterDeleted(entity, opts) {
|
|
101
|
-
return
|
|
107
|
+
return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;
|
|
102
108
|
}
|
|
103
109
|
}
|
|
104
110
|
exports.CustomReference = CustomReference;
|
|
111
|
+
_a = Relation_1.RelationT, _b = Relation_1.RelationU, _c = Reference_1.ReferenceN;
|
|
105
112
|
function ensureNewOrLoaded(reference) {
|
|
106
113
|
if (!(reference.isLoaded || reference.entity.isNewEntity)) {
|
|
107
114
|
// This should only be callable in the type system if we've already resolved this to an instance
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomReference.js","sourceRoot":"","sources":["../../../src/relations/CustomReference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Entity, IdOf } from "../EntityManager";
|
|
2
|
+
import { Relation } from "./Relation";
|
|
3
|
+
/**
|
|
4
|
+
* A large collection of `U` within `T`, where the parent has so many children
|
|
5
|
+
* that we cannot load them all at a single time.
|
|
6
|
+
*
|
|
7
|
+
* We consider this a `Relation`, but not a true `Collection` b/c it cannot be
|
|
8
|
+
* loaded.
|
|
9
|
+
*/
|
|
10
|
+
export interface LargeCollection<T extends Entity, U extends Entity> extends Relation<T, U> {
|
|
11
|
+
/** Looks up the specific `id` without fully loading the collection. */
|
|
12
|
+
find(id: IdOf<U>): Promise<U | undefined>;
|
|
13
|
+
/** Looks up the specific `other` without fully loading the collection. */
|
|
14
|
+
includes(other: U): Promise<boolean>;
|
|
15
|
+
add(other: U): void;
|
|
16
|
+
remove(other: U): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LargeCollection.js","sourceRoot":"","sources":["../../../src/relations/LargeCollection.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Collection, Entity, EntityMetadata, IdOf } from "../";
|
|
2
2
|
import { AbstractRelationImpl } from "./AbstractRelationImpl";
|
|
3
|
+
import { RelationT, RelationU } from "./Relation";
|
|
4
|
+
/** An alias for creating `ManyToManyCollections`s. */
|
|
5
|
+
export declare function hasManyToMany<T extends Entity, U extends Entity>(joinTableName: string, fieldName: keyof T, columnName: string, otherMeta: EntityMetadata<U>, otherFieldName: keyof U, otherColumnName: string): Collection<T, U>;
|
|
3
6
|
export declare class ManyToManyCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<U[]> implements Collection<T, U> {
|
|
4
7
|
joinTableName: string;
|
|
5
8
|
entity: T;
|
|
@@ -18,8 +21,10 @@ export declare class ManyToManyCollection<T extends Entity, U extends Entity> ex
|
|
|
18
21
|
withDeleted?: boolean;
|
|
19
22
|
}): Promise<ReadonlyArray<U>>;
|
|
20
23
|
find(id: IdOf<U>): Promise<U | undefined>;
|
|
24
|
+
includes(other: U): Promise<boolean>;
|
|
21
25
|
add(other: U, percolated?: boolean): void;
|
|
22
26
|
remove(other: U, percolated?: boolean): void;
|
|
27
|
+
get isLoaded(): boolean;
|
|
23
28
|
private doGet;
|
|
24
29
|
get getWithDeleted(): U[];
|
|
25
30
|
get get(): U[];
|
|
@@ -28,14 +33,16 @@ export declare class ManyToManyCollection<T extends Entity, U extends Entity> ex
|
|
|
28
33
|
setFromOpts(others: U[]): void;
|
|
29
34
|
initializeForNewEntity(): void;
|
|
30
35
|
refreshIfLoaded(): Promise<void>;
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
maybeCascadeDelete(): void;
|
|
37
|
+
cleanupOnEntityDeleted(): Promise<void>;
|
|
33
38
|
private maybeApplyAddedAndRemovedBeforeLoaded;
|
|
34
39
|
current(opts?: {
|
|
35
40
|
withDeleted?: boolean;
|
|
36
41
|
}): U[];
|
|
37
42
|
get meta(): EntityMetadata<T>;
|
|
38
43
|
toString(): string;
|
|
44
|
+
[RelationT]: T;
|
|
45
|
+
[RelationU]: U;
|
|
39
46
|
}
|
|
40
47
|
export declare type JoinRow = {
|
|
41
48
|
id: number | undefined;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ManyToManyCollection = exports.hasManyToMany = void 0;
|
|
5
|
+
const __1 = require("../");
|
|
6
|
+
const manyToManyDataLoader_1 = require("../dataloaders/manyToManyDataLoader");
|
|
7
|
+
const manyToManyFindDataLoader_1 = require("../dataloaders/manyToManyFindDataLoader");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const AbstractRelationImpl_1 = require("./AbstractRelationImpl");
|
|
10
|
+
const Relation_1 = require("./Relation");
|
|
11
|
+
/** An alias for creating `ManyToManyCollections`s. */
|
|
12
|
+
function hasManyToMany(joinTableName, fieldName, columnName, otherMeta, otherFieldName, otherColumnName) {
|
|
13
|
+
const entity = __1.currentlyInstantiatingEntity;
|
|
14
|
+
return new ManyToManyCollection(joinTableName, entity, fieldName, columnName, otherMeta, otherFieldName, otherColumnName);
|
|
15
|
+
}
|
|
16
|
+
exports.hasManyToMany = hasManyToMany;
|
|
17
|
+
class ManyToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
18
|
+
constructor(joinTableName,
|
|
19
|
+
// I.e. when entity = Book:
|
|
20
|
+
// fieldName == tags, because it's our collection to tags
|
|
21
|
+
// columnName = book_id, what we use as the `where book_id = us` to find our join table rows
|
|
22
|
+
// otherFieldName = books, how tags points to us
|
|
23
|
+
// otherColumnName = tag_id, how the other side finds its join table rows
|
|
24
|
+
entity, fieldName, columnName, otherMeta, otherFieldName, otherColumnName) {
|
|
25
|
+
super();
|
|
26
|
+
this.joinTableName = joinTableName;
|
|
27
|
+
this.entity = entity;
|
|
28
|
+
this.fieldName = fieldName;
|
|
29
|
+
this.columnName = columnName;
|
|
30
|
+
this.otherMeta = otherMeta;
|
|
31
|
+
this.otherFieldName = otherFieldName;
|
|
32
|
+
this.otherColumnName = otherColumnName;
|
|
33
|
+
this.addedBeforeLoaded = [];
|
|
34
|
+
this.removedBeforeLoaded = [];
|
|
35
|
+
this[_a] = null;
|
|
36
|
+
this[_b] = null;
|
|
37
|
+
this.isCascadeDelete = otherMeta.config.__data.cascadeDeleteFields.includes(fieldName);
|
|
38
|
+
}
|
|
39
|
+
filterDeleted(entities, opts) {
|
|
40
|
+
return opts?.withDeleted === true ? [...entities] : entities.filter((e) => !e.isDeletedEntity);
|
|
41
|
+
}
|
|
42
|
+
async load(opts) {
|
|
43
|
+
(0, __1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
44
|
+
if (this.loaded === undefined) {
|
|
45
|
+
const key = `${this.columnName}=${this.entity.id}`;
|
|
46
|
+
this.loaded = await (0, manyToManyDataLoader_1.manyToManyDataLoader)(this.entity.em, this).load(key);
|
|
47
|
+
this.maybeApplyAddedAndRemovedBeforeLoaded();
|
|
48
|
+
}
|
|
49
|
+
return this.filterDeleted(this.loaded, opts);
|
|
50
|
+
}
|
|
51
|
+
async find(id) {
|
|
52
|
+
(0, __1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
53
|
+
if (this.loaded !== undefined) {
|
|
54
|
+
return this.loaded.find((u) => u.id === id);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const added = this.addedBeforeLoaded.find((u) => u.id === id);
|
|
58
|
+
if (added) {
|
|
59
|
+
return added;
|
|
60
|
+
}
|
|
61
|
+
// Make a cacheable tuple to look up this specific m2m row
|
|
62
|
+
const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;
|
|
63
|
+
const includes = await (0, manyToManyFindDataLoader_1.manyToManyFindDataLoader)(this.entity.em, this).load(key);
|
|
64
|
+
return includes ? this.entity.em.load(id) : undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async includes(other) {
|
|
68
|
+
(0, __1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
69
|
+
if (this.loaded !== undefined) {
|
|
70
|
+
return this.loaded.includes(other);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (this.addedBeforeLoaded.includes(other)) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
else if (other.isNewEntity) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Make a cacheable tuple to look up this specific m2m row
|
|
80
|
+
const key = `${this.columnName}=${this.entity.idOrFail},${this.otherColumnName}=${other.idOrFail}`;
|
|
81
|
+
return (0, manyToManyFindDataLoader_1.manyToManyFindDataLoader)(this.entity.em, this).load(key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
add(other, percolated = false) {
|
|
85
|
+
(0, __1.ensureNotDeleted)(this.entity);
|
|
86
|
+
if (this.loaded !== undefined) {
|
|
87
|
+
if (this.loaded.includes(other)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.loaded.push(other);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
(0, utils_1.remove)(this.removedBeforeLoaded, other);
|
|
94
|
+
if (!this.addedBeforeLoaded.includes(other)) {
|
|
95
|
+
this.addedBeforeLoaded.push(other);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!percolated) {
|
|
99
|
+
const joinRow = {
|
|
100
|
+
id: undefined,
|
|
101
|
+
m2m: this,
|
|
102
|
+
[this.columnName]: this.entity,
|
|
103
|
+
[this.otherColumnName]: other,
|
|
104
|
+
};
|
|
105
|
+
(0, utils_1.getOrSet)(this.entity.em.__data.joinRows, this.joinTableName, []).push(joinRow);
|
|
106
|
+
other[this.otherFieldName].add(this.entity, true);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
remove(other, percolated = false) {
|
|
110
|
+
(0, __1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
111
|
+
if (!percolated) {
|
|
112
|
+
const joinRows = (0, utils_1.getOrSet)(this.entity.em.__data.joinRows, this.joinTableName, []);
|
|
113
|
+
const row = joinRows.find((r) => r[this.columnName] === this.entity && r[this.otherColumnName] === other);
|
|
114
|
+
if (row) {
|
|
115
|
+
row.deleted = true;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const joinRow = {
|
|
119
|
+
// Use -1 to force the sortJoinRows to notice us as dirty ("delete: true but id is set")
|
|
120
|
+
id: -1,
|
|
121
|
+
m2m: this,
|
|
122
|
+
[this.columnName]: this.entity,
|
|
123
|
+
[this.otherColumnName]: other,
|
|
124
|
+
deleted: true,
|
|
125
|
+
};
|
|
126
|
+
(0, utils_1.getOrSet)(this.entity.em.__data.joinRows, this.joinTableName, []).push(joinRow);
|
|
127
|
+
}
|
|
128
|
+
other[this.otherFieldName].remove(this.entity, true);
|
|
129
|
+
}
|
|
130
|
+
if (this.loaded !== undefined) {
|
|
131
|
+
(0, utils_1.remove)(this.loaded, other);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
(0, utils_1.remove)(this.addedBeforeLoaded, other);
|
|
135
|
+
if (!this.removedBeforeLoaded.includes(other)) {
|
|
136
|
+
this.removedBeforeLoaded.push(other);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
get isLoaded() {
|
|
141
|
+
return this.loaded !== undefined;
|
|
142
|
+
}
|
|
143
|
+
doGet() {
|
|
144
|
+
(0, __1.ensureNotDeleted)(this.entity);
|
|
145
|
+
if (this.loaded === undefined) {
|
|
146
|
+
if (this.entity.id === undefined) {
|
|
147
|
+
return this.addedBeforeLoaded;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// This should only be callable in the type system if we've already resolved this to an instance
|
|
151
|
+
throw new Error("get was called when not loaded");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return this.loaded;
|
|
155
|
+
}
|
|
156
|
+
get getWithDeleted() {
|
|
157
|
+
return this.filterDeleted(this.doGet(), { withDeleted: true });
|
|
158
|
+
}
|
|
159
|
+
get get() {
|
|
160
|
+
return this.filterDeleted(this.doGet(), { withDeleted: false });
|
|
161
|
+
}
|
|
162
|
+
set(values) {
|
|
163
|
+
(0, __1.ensureNotDeleted)(this.entity);
|
|
164
|
+
if (this.loaded === undefined) {
|
|
165
|
+
throw new Error("set was called when not loaded");
|
|
166
|
+
}
|
|
167
|
+
// Make a copy for safe iteration
|
|
168
|
+
const loaded = [...this.loaded];
|
|
169
|
+
// Remove old values
|
|
170
|
+
for (const other of loaded) {
|
|
171
|
+
if (!values.includes(other)) {
|
|
172
|
+
this.remove(other);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
for (const other of values) {
|
|
176
|
+
if (!loaded.includes(other)) {
|
|
177
|
+
this.add(other);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
removeAll() {
|
|
182
|
+
(0, __1.ensureNotDeleted)(this.entity);
|
|
183
|
+
if (this.loaded === undefined) {
|
|
184
|
+
throw new Error("removeAll was called when not loaded");
|
|
185
|
+
}
|
|
186
|
+
for (const other of [...this.loaded]) {
|
|
187
|
+
this.remove(other);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// impl details
|
|
191
|
+
setFromOpts(others) {
|
|
192
|
+
this.loaded = [];
|
|
193
|
+
others.forEach((o) => this.add(o));
|
|
194
|
+
}
|
|
195
|
+
initializeForNewEntity() {
|
|
196
|
+
// Don't overwrite any opts values
|
|
197
|
+
if (this.loaded === undefined) {
|
|
198
|
+
this.loaded = [];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async refreshIfLoaded() {
|
|
202
|
+
(0, __1.ensureNotDeleted)(this.entity);
|
|
203
|
+
// TODO We should remember what load hints have been applied to this collection and re-apply them.
|
|
204
|
+
if (this.loaded !== undefined && this.entity.id !== undefined) {
|
|
205
|
+
const key = `${this.columnName}=${this.entity.id}`;
|
|
206
|
+
this.loaded = await (0, manyToManyDataLoader_1.manyToManyDataLoader)(this.entity.em, this).load(key);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
maybeCascadeDelete() {
|
|
210
|
+
if (this.isCascadeDelete) {
|
|
211
|
+
this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async cleanupOnEntityDeleted() {
|
|
215
|
+
const entities = await this.load({ withDeleted: true });
|
|
216
|
+
entities.forEach((other) => {
|
|
217
|
+
const m2m = other[this.otherFieldName];
|
|
218
|
+
m2m.remove(this.entity);
|
|
219
|
+
});
|
|
220
|
+
this.loaded = [];
|
|
221
|
+
}
|
|
222
|
+
maybeApplyAddedAndRemovedBeforeLoaded() {
|
|
223
|
+
if (this.loaded) {
|
|
224
|
+
// this.loaded.unshift(...this.addedBeforeLoaded);
|
|
225
|
+
// this.addedBeforeLoaded = [];
|
|
226
|
+
this.removedBeforeLoaded.forEach((e) => {
|
|
227
|
+
(0, utils_1.remove)(this.loaded, e);
|
|
228
|
+
const { em } = this.entity;
|
|
229
|
+
const row = em.__data.joinRows[this.joinTableName].find((r) => r[this.columnName] === this.entity && r[this.otherColumnName] === e);
|
|
230
|
+
if (row) {
|
|
231
|
+
row.deleted = true;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
this.removedBeforeLoaded = [];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
current(opts) {
|
|
238
|
+
return this.filterDeleted(this.loaded || this.addedBeforeLoaded, opts);
|
|
239
|
+
}
|
|
240
|
+
get meta() {
|
|
241
|
+
return (0, __1.getMetadata)(this.entity);
|
|
242
|
+
}
|
|
243
|
+
toString() {
|
|
244
|
+
return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.ManyToManyCollection = ManyToManyCollection;
|
|
248
|
+
_a = Relation_1.RelationT, _b = Relation_1.RelationU;
|
|
249
|
+
//# sourceMappingURL=ManyToManyCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManyToManyCollection.js","sourceRoot":"","sources":["../../../src/relations/ManyToManyCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Entity, EntityMetadata, IdOf } from "../EntityManager";
|
|
2
|
+
import { LargeCollection } from "./LargeCollection";
|
|
3
|
+
import { RelationT, RelationU } from "./Relation";
|
|
4
|
+
/** An alias for creating `ManyToManyLargeCollection`s. */
|
|
5
|
+
export declare function hasLargeManyToMany<T extends Entity, U extends Entity>(joinTableName: string, fieldName: keyof T, columnName: string, otherMeta: EntityMetadata<U>, otherFieldName: keyof U, otherColumnName: string): LargeCollection<T, U>;
|
|
6
|
+
export declare class ManyToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {
|
|
7
|
+
joinTableName: string;
|
|
8
|
+
entity: T;
|
|
9
|
+
fieldName: keyof T;
|
|
10
|
+
columnName: string;
|
|
11
|
+
otherMeta: EntityMetadata<U>;
|
|
12
|
+
otherFieldName: keyof U;
|
|
13
|
+
otherColumnName: string;
|
|
14
|
+
private locallyAdded;
|
|
15
|
+
private locallyRemoved;
|
|
16
|
+
constructor(joinTableName: string, entity: T, fieldName: keyof T, columnName: string, otherMeta: EntityMetadata<U>, otherFieldName: keyof U, otherColumnName: string);
|
|
17
|
+
find(id: IdOf<U>): Promise<U | undefined>;
|
|
18
|
+
includes(other: U): Promise<boolean>;
|
|
19
|
+
add(other: U): void;
|
|
20
|
+
remove(other: U): void;
|
|
21
|
+
get meta(): EntityMetadata<T>;
|
|
22
|
+
toString(): string;
|
|
23
|
+
[RelationT]: T;
|
|
24
|
+
[RelationU]: U;
|
|
25
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ManyToManyLargeCollection = exports.hasLargeManyToMany = void 0;
|
|
5
|
+
const manyToManyFindDataLoader_1 = require("../dataloaders/manyToManyFindDataLoader");
|
|
6
|
+
const EntityManager_1 = require("../EntityManager");
|
|
7
|
+
const index_1 = require("../index");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const Relation_1 = require("./Relation");
|
|
10
|
+
/** An alias for creating `ManyToManyLargeCollection`s. */
|
|
11
|
+
function hasLargeManyToMany(joinTableName, fieldName, columnName, otherMeta, otherFieldName, otherColumnName) {
|
|
12
|
+
const entity = EntityManager_1.currentlyInstantiatingEntity;
|
|
13
|
+
return new ManyToManyLargeCollection(joinTableName, entity, fieldName, columnName, otherMeta, otherFieldName, otherColumnName);
|
|
14
|
+
}
|
|
15
|
+
exports.hasLargeManyToMany = hasLargeManyToMany;
|
|
16
|
+
class ManyToManyLargeCollection {
|
|
17
|
+
constructor(joinTableName,
|
|
18
|
+
// I.e. when entity = Book:
|
|
19
|
+
// fieldName == tags, because it's our collection to tags
|
|
20
|
+
// columnName = book_id, what we use as the `where book_id = us` to find our join table rows
|
|
21
|
+
// otherFieldName = books, how tags points to us
|
|
22
|
+
// otherColumnName = tag_id, how the other side finds its join table rows
|
|
23
|
+
entity, fieldName, columnName, otherMeta, otherFieldName, otherColumnName) {
|
|
24
|
+
this.joinTableName = joinTableName;
|
|
25
|
+
this.entity = entity;
|
|
26
|
+
this.fieldName = fieldName;
|
|
27
|
+
this.columnName = columnName;
|
|
28
|
+
this.otherMeta = otherMeta;
|
|
29
|
+
this.otherFieldName = otherFieldName;
|
|
30
|
+
this.otherColumnName = otherColumnName;
|
|
31
|
+
// Even though a large collection can never be loaded, we do track local
|
|
32
|
+
// mutations so that `find` can be accurate.
|
|
33
|
+
this.locallyAdded = [];
|
|
34
|
+
this.locallyRemoved = [];
|
|
35
|
+
this[_a] = null;
|
|
36
|
+
this[_b] = null;
|
|
37
|
+
}
|
|
38
|
+
async find(id) {
|
|
39
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
40
|
+
// locallyAdded is never authorative b/c we never become fully loaded (unlike OneToManyCollection),
|
|
41
|
+
// so we can probe our local collection, but if we don't find anything, we still have to query
|
|
42
|
+
const localAdd = this.locallyAdded.find((u) => u.id === id);
|
|
43
|
+
if (localAdd) {
|
|
44
|
+
return localAdd;
|
|
45
|
+
}
|
|
46
|
+
const localRemove = this.locallyRemoved.find((u) => u.id === id);
|
|
47
|
+
if (localRemove) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (this.entity.isNewEntity) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
// Make a cacheable tuple to look up this specific m2m row
|
|
54
|
+
const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${id}`;
|
|
55
|
+
const includes = await (0, manyToManyFindDataLoader_1.manyToManyFindDataLoader)(this.entity.em, this).load(key);
|
|
56
|
+
return includes ? this.entity.em.load(id) : undefined;
|
|
57
|
+
}
|
|
58
|
+
async includes(other) {
|
|
59
|
+
const localAdd = this.locallyAdded.includes(other);
|
|
60
|
+
if (localAdd) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const localRemove = this.locallyRemoved.includes(other);
|
|
64
|
+
if (localRemove) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (this.entity.isNewEntity || other.isNewEntity) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Make a cacheable tuple to look up this specific m2m row
|
|
71
|
+
const key = `${this.columnName}=${this.entity.id},${this.otherColumnName}=${other.id}`;
|
|
72
|
+
return (0, manyToManyFindDataLoader_1.manyToManyFindDataLoader)(this.entity.em, this).load(key);
|
|
73
|
+
}
|
|
74
|
+
add(other) {
|
|
75
|
+
(0, utils_1.remove)(this.locallyRemoved, other);
|
|
76
|
+
if (!this.locallyAdded.includes(other)) {
|
|
77
|
+
this.locallyAdded.push(other);
|
|
78
|
+
}
|
|
79
|
+
other[this.otherFieldName].add(this.entity, true);
|
|
80
|
+
}
|
|
81
|
+
remove(other) {
|
|
82
|
+
(0, utils_1.remove)(this.locallyAdded, other);
|
|
83
|
+
if (!this.locallyRemoved.includes(other)) {
|
|
84
|
+
this.locallyRemoved.push(other);
|
|
85
|
+
}
|
|
86
|
+
other[this.otherFieldName].remove(this.entity, true);
|
|
87
|
+
}
|
|
88
|
+
get meta() {
|
|
89
|
+
return (0, index_1.getMetadata)(this.entity);
|
|
90
|
+
}
|
|
91
|
+
toString() {
|
|
92
|
+
return `ManyToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.ManyToManyLargeCollection = ManyToManyLargeCollection;
|
|
96
|
+
_a = Relation_1.RelationT, _b = Relation_1.RelationU;
|
|
97
|
+
//# sourceMappingURL=ManyToManyLargeCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManyToManyLargeCollection.js","sourceRoot":"","sources":["../../../src/relations/ManyToManyLargeCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Entity, EntityMetadata, IdOf } from "../EntityManager";
|
|
2
|
+
import { Reference } from "../index";
|
|
3
|
+
import { AbstractRelationImpl } from "./AbstractRelationImpl";
|
|
4
|
+
import { ReferenceN } from "./Reference";
|
|
5
|
+
import { RelationT, RelationU } from "./Relation";
|
|
6
|
+
/** An alias for creating `ManyToOneReference`s. */
|
|
7
|
+
export declare function hasOne<T extends Entity, U extends Entity, N extends never | undefined>(otherMeta: EntityMetadata<U>, fieldName: keyof T, otherFieldName: keyof U): ManyToOneReference<T, U, N>;
|
|
8
|
+
/** Type guard utility for determining if an entity field is a ManyToOneReference. */
|
|
9
|
+
export declare function isManyToOneReference(maybeReference: any): maybeReference is ManyToOneReference<any, any, any>;
|
|
10
|
+
export interface ManyToOneReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<T, U, N> {
|
|
11
|
+
/** Returns the id of the current assigned entity (or `undefined` if its new and has no id yet), or `undefined` if this column is nullable and currently unset. */
|
|
12
|
+
id: IdOf<U> | undefined;
|
|
13
|
+
/** Returns the id of the current assigned entity or a runtime error if it's either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */
|
|
14
|
+
idOrFail: IdOf<U>;
|
|
15
|
+
idUntagged: string | undefined;
|
|
16
|
+
idUntaggedOrFail: string;
|
|
17
|
+
/** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */
|
|
18
|
+
readonly isSet: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Manages a foreign key from one entity to another, i.e. `Book.author --> Author`.
|
|
22
|
+
*
|
|
23
|
+
* We keep the current `author` / `author_id` value in the `__orm.data` hash, where the
|
|
24
|
+
* current value could be either the (string) author id from the database, or an entity
|
|
25
|
+
* `Author` that the user has set.
|
|
26
|
+
*
|
|
27
|
+
* Note that if our `images.author_id` column is unique, this `ManyToOneReference` will essentially
|
|
28
|
+
* be half of a one-to-one relationship, but we'll keep using this `ManyToOneReference` on the "many"
|
|
29
|
+
* side, and the other side, i.e. `Author.image` will use a `OneToOneReference` to point back to us.
|
|
30
|
+
*/
|
|
31
|
+
export declare class ManyToOneReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<U> implements ManyToOneReference<T, U, N> {
|
|
32
|
+
private entity;
|
|
33
|
+
otherMeta: EntityMetadata<U>;
|
|
34
|
+
private fieldName;
|
|
35
|
+
otherFieldName: keyof U;
|
|
36
|
+
private loaded;
|
|
37
|
+
private _isLoaded;
|
|
38
|
+
private readonly isCascadeDelete;
|
|
39
|
+
constructor(entity: T, otherMeta: EntityMetadata<U>, fieldName: keyof T, otherFieldName: keyof U);
|
|
40
|
+
load(opts?: {
|
|
41
|
+
withDeleted?: boolean;
|
|
42
|
+
}): Promise<U | N>;
|
|
43
|
+
set(other: U | N): void;
|
|
44
|
+
get isSet(): boolean;
|
|
45
|
+
get isLoaded(): boolean;
|
|
46
|
+
private doGet;
|
|
47
|
+
get getWithDeleted(): U | N;
|
|
48
|
+
get get(): U | N;
|
|
49
|
+
get id(): IdOf<U> | N;
|
|
50
|
+
set id(id: IdOf<U> | N);
|
|
51
|
+
get idOrFail(): IdOf<U>;
|
|
52
|
+
get idUntagged(): string | undefined;
|
|
53
|
+
get idUntaggedOrFail(): string;
|
|
54
|
+
setFromOpts(other: U): void;
|
|
55
|
+
initializeForNewEntity(): void;
|
|
56
|
+
refreshIfLoaded(): Promise<void>;
|
|
57
|
+
maybeCascadeDelete(): void;
|
|
58
|
+
cleanupOnEntityDeleted(): Promise<void>;
|
|
59
|
+
setImpl(other: U | N): void;
|
|
60
|
+
maybeRemove(other: U | undefined): void;
|
|
61
|
+
maybeAdd(other: U | undefined): void;
|
|
62
|
+
current(opts?: {
|
|
63
|
+
withDeleted?: boolean;
|
|
64
|
+
}): U | string | N;
|
|
65
|
+
toString(): string;
|
|
66
|
+
private filterDeleted;
|
|
67
|
+
/** Returns the other relation that points back at us, i.e. we're `book.author_id` and this is `Author.books`. */
|
|
68
|
+
private getOtherRelation;
|
|
69
|
+
/**
|
|
70
|
+
* Looks for an entity in `EntityManager`, b/c we may have it in memory even if
|
|
71
|
+
* our reference is not specifically loaded.
|
|
72
|
+
*/
|
|
73
|
+
maybeFindEntity(): U | undefined;
|
|
74
|
+
[RelationT]: T;
|
|
75
|
+
[RelationU]: U;
|
|
76
|
+
[ReferenceN]: N;
|
|
77
|
+
}
|