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,10 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
+
exports.ManyToOneReferenceImpl = exports.isManyToOneReference = exports.hasOne = void 0;
|
|
4
5
|
const EntityManager_1 = require("../EntityManager");
|
|
5
6
|
const index_1 = require("../index");
|
|
6
7
|
const AbstractRelationImpl_1 = require("./AbstractRelationImpl");
|
|
7
8
|
const OneToManyCollection_1 = require("./OneToManyCollection");
|
|
9
|
+
const Reference_1 = require("./Reference");
|
|
10
|
+
const Relation_1 = require("./Relation");
|
|
11
|
+
/** An alias for creating `ManyToOneReference`s. */
|
|
12
|
+
function hasOne(otherMeta, fieldName, otherFieldName) {
|
|
13
|
+
const entity = EntityManager_1.currentlyInstantiatingEntity;
|
|
14
|
+
return new ManyToOneReferenceImpl(entity, otherMeta, fieldName, otherFieldName);
|
|
15
|
+
}
|
|
16
|
+
exports.hasOne = hasOne;
|
|
17
|
+
/** Type guard utility for determining if an entity field is a ManyToOneReference. */
|
|
18
|
+
function isManyToOneReference(maybeReference) {
|
|
19
|
+
return maybeReference instanceof ManyToOneReferenceImpl;
|
|
20
|
+
}
|
|
21
|
+
exports.isManyToOneReference = isManyToOneReference;
|
|
8
22
|
/**
|
|
9
23
|
* Manages a foreign key from one entity to another, i.e. `Book.author --> Author`.
|
|
10
24
|
*
|
|
@@ -13,28 +27,34 @@ const OneToManyCollection_1 = require("./OneToManyCollection");
|
|
|
13
27
|
* `Author` that the user has set.
|
|
14
28
|
*
|
|
15
29
|
* Note that if our `images.author_id` column is unique, this `ManyToOneReference` will essentially
|
|
16
|
-
* be half of a one-to-one relationship, but we'll keep using this
|
|
17
|
-
* side
|
|
30
|
+
* be half of a one-to-one relationship, but we'll keep using this `ManyToOneReference` on the "many"
|
|
31
|
+
* side, and the other side, i.e. `Author.image` will use a `OneToOneReference` to point back to us.
|
|
18
32
|
*/
|
|
19
|
-
class
|
|
33
|
+
class ManyToOneReferenceImpl extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
20
34
|
constructor(entity, otherMeta, fieldName, otherFieldName) {
|
|
21
35
|
super();
|
|
22
36
|
this.entity = entity;
|
|
23
37
|
this.otherMeta = otherMeta;
|
|
24
38
|
this.fieldName = fieldName;
|
|
25
39
|
this.otherFieldName = otherFieldName;
|
|
26
|
-
// We need a separate boolean to b/c loaded == undefined can still mean "
|
|
27
|
-
this.
|
|
40
|
+
// We need a separate boolean to b/c loaded == undefined can still mean "_isLoaded" for nullable fks.
|
|
41
|
+
this._isLoaded = false;
|
|
42
|
+
this[_a] = null;
|
|
43
|
+
this[_b] = null;
|
|
44
|
+
this[_c] = null;
|
|
28
45
|
this.isCascadeDelete = otherMeta.config.__data.cascadeDeleteFields.includes(fieldName);
|
|
29
46
|
}
|
|
30
47
|
async load(opts) {
|
|
31
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
48
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
49
|
+
if (this._isLoaded && this.loaded) {
|
|
50
|
+
return this.loaded;
|
|
51
|
+
}
|
|
32
52
|
const current = this.current();
|
|
33
53
|
// Resolve the id to an entity
|
|
34
|
-
if (!EntityManager_1.isEntity(current) && current !== undefined) {
|
|
35
|
-
this.loaded = (await
|
|
54
|
+
if (!(0, EntityManager_1.isEntity)(current) && current !== undefined) {
|
|
55
|
+
this.loaded = (await this.entity.em.load(this.otherMeta.cstr, current));
|
|
36
56
|
}
|
|
37
|
-
this.
|
|
57
|
+
this._isLoaded = true;
|
|
38
58
|
return this.filterDeleted(this.loaded, opts);
|
|
39
59
|
}
|
|
40
60
|
set(other) {
|
|
@@ -43,17 +63,20 @@ class ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
43
63
|
get isSet() {
|
|
44
64
|
return this.current() !== undefined;
|
|
45
65
|
}
|
|
66
|
+
get isLoaded() {
|
|
67
|
+
return this._isLoaded;
|
|
68
|
+
}
|
|
46
69
|
doGet(opts) {
|
|
47
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
70
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
48
71
|
// This should only be callable in the type system if we've already resolved this to an instance,
|
|
49
72
|
// but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW
|
|
50
|
-
if (!this.
|
|
51
|
-
const existing = this.
|
|
73
|
+
if (!this._isLoaded) {
|
|
74
|
+
const existing = this.maybeFindEntity();
|
|
52
75
|
if (existing === undefined) {
|
|
53
76
|
throw new Error(`${this.entity}.${this.fieldName} was not loaded`);
|
|
54
77
|
}
|
|
55
78
|
this.loaded = existing;
|
|
56
|
-
this.
|
|
79
|
+
this._isLoaded = true;
|
|
57
80
|
}
|
|
58
81
|
return this.filterDeleted(this.loaded, opts);
|
|
59
82
|
}
|
|
@@ -64,18 +87,30 @@ class ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
64
87
|
return this.doGet({ withDeleted: false });
|
|
65
88
|
}
|
|
66
89
|
get id() {
|
|
67
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
68
|
-
return index_1.maybeResolveReferenceToId(this.current());
|
|
90
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
91
|
+
return (0, index_1.maybeResolveReferenceToId)(this.current());
|
|
92
|
+
}
|
|
93
|
+
set id(id) {
|
|
94
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
95
|
+
const previous = this.maybeFindEntity();
|
|
96
|
+
const changed = (0, index_1.setField)(this.entity, this.fieldName, id);
|
|
97
|
+
if (!changed) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.loaded = id ? this.entity.em.getEntity(id) : undefined;
|
|
101
|
+
this._isLoaded = !!this.loaded;
|
|
102
|
+
this.maybeRemove(previous);
|
|
103
|
+
this.maybeAdd(this.maybeFindEntity());
|
|
69
104
|
}
|
|
70
105
|
get idOrFail() {
|
|
71
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
72
|
-
return this.id || index_1.fail("Reference is unset or assigned to a new entity");
|
|
106
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
107
|
+
return this.id || (0, index_1.fail)("Reference is unset or assigned to a new entity");
|
|
73
108
|
}
|
|
74
109
|
get idUntagged() {
|
|
75
|
-
return this.id && index_1.deTagIds(this.otherMeta, [this.id])[0];
|
|
110
|
+
return this.id && (0, index_1.deTagIds)(this.otherMeta, [this.id])[0];
|
|
76
111
|
}
|
|
77
112
|
get idUntaggedOrFail() {
|
|
78
|
-
return this.idUntagged || index_1.fail("Reference is unset or assigned to a new entity");
|
|
113
|
+
return this.idUntagged || (0, index_1.fail)("Reference is unset or assigned to a new entity");
|
|
79
114
|
}
|
|
80
115
|
// private impl
|
|
81
116
|
setFromOpts(other) {
|
|
@@ -83,74 +118,86 @@ class ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
83
118
|
}
|
|
84
119
|
initializeForNewEntity() {
|
|
85
120
|
// Our codegen'd Opts type will ensure our field is inititalized if necessary/notNull
|
|
86
|
-
this.
|
|
121
|
+
this._isLoaded = true;
|
|
87
122
|
}
|
|
88
123
|
async refreshIfLoaded() {
|
|
89
124
|
// TODO We should remember what load hints have been applied to this collection and re-apply them.
|
|
90
|
-
if (this.
|
|
125
|
+
if (this._isLoaded) {
|
|
91
126
|
const current = this.current();
|
|
92
127
|
if (typeof current === "string") {
|
|
93
|
-
this.loaded = (await
|
|
128
|
+
this.loaded = (await this.entity.em.load(this.otherMeta.cstr, current));
|
|
94
129
|
}
|
|
95
130
|
else {
|
|
96
131
|
this.loaded = current;
|
|
97
132
|
}
|
|
98
133
|
}
|
|
99
134
|
}
|
|
100
|
-
|
|
135
|
+
maybeCascadeDelete() {
|
|
101
136
|
if (this.isCascadeDelete) {
|
|
102
137
|
const current = this.current({ withDeleted: true });
|
|
103
138
|
if (current !== undefined && typeof current !== "string") {
|
|
104
|
-
|
|
139
|
+
this.entity.em.delete(current);
|
|
105
140
|
}
|
|
106
141
|
}
|
|
107
142
|
}
|
|
108
|
-
async
|
|
143
|
+
async cleanupOnEntityDeleted() {
|
|
109
144
|
const current = await this.load({ withDeleted: true });
|
|
110
145
|
if (current !== undefined) {
|
|
111
146
|
const o2m = this.getOtherRelation(current);
|
|
112
147
|
if (o2m instanceof OneToManyCollection_1.OneToManyCollection) {
|
|
113
148
|
o2m.remove(this.entity, { requireLoaded: false });
|
|
114
149
|
}
|
|
115
|
-
else {
|
|
150
|
+
else if (o2m instanceof index_1.OneToManyLargeCollection) {
|
|
151
|
+
o2m.remove(this.entity);
|
|
152
|
+
}
|
|
153
|
+
else if (o2m instanceof index_1.OneToOneReferenceImpl) {
|
|
116
154
|
o2m.set(undefined);
|
|
117
155
|
}
|
|
156
|
+
else {
|
|
157
|
+
throw new Error(`Unhandled ${o2m}`);
|
|
158
|
+
}
|
|
118
159
|
}
|
|
119
|
-
index_1.setField(this.entity, this.fieldName, undefined);
|
|
160
|
+
(0, index_1.setField)(this.entity, this.fieldName, undefined);
|
|
120
161
|
this.loaded = undefined;
|
|
121
|
-
this.
|
|
162
|
+
this._isLoaded = true;
|
|
122
163
|
}
|
|
123
164
|
// Internal method used by OneToManyCollection
|
|
124
165
|
setImpl(other) {
|
|
125
|
-
|
|
126
|
-
if ((other === null || other === void 0 ? void 0 : other.isNewEntity) ? other === this.loaded : this.id === (other === null || other === void 0 ? void 0 : other.id)) {
|
|
166
|
+
if ((0, EntityManager_1.sameEntity)(other, this.otherMeta, this.current())) {
|
|
127
167
|
return;
|
|
128
168
|
}
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
169
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
170
|
+
const previous = this.maybeFindEntity();
|
|
132
171
|
// Prefer to keep the id in our data hash, but if this is a new entity w/o an id, use the entity itself
|
|
133
|
-
|
|
134
|
-
if (!changed) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
172
|
+
(0, index_1.setField)(this.entity, this.fieldName, other?.id ?? other);
|
|
137
173
|
this.loaded = other;
|
|
138
|
-
this.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
174
|
+
this._isLoaded = true;
|
|
175
|
+
this.maybeRemove(previous);
|
|
176
|
+
this.maybeAdd(other);
|
|
177
|
+
}
|
|
178
|
+
maybeRemove(other) {
|
|
179
|
+
if (other) {
|
|
180
|
+
const prevRelation = this.getOtherRelation(other);
|
|
142
181
|
if (prevRelation instanceof OneToManyCollection_1.OneToManyCollection) {
|
|
143
182
|
prevRelation.removeIfLoaded(this.entity);
|
|
144
183
|
}
|
|
184
|
+
else if (prevRelation instanceof index_1.OneToManyLargeCollection) {
|
|
185
|
+
prevRelation.remove(this.entity);
|
|
186
|
+
}
|
|
145
187
|
else {
|
|
146
188
|
prevRelation.set(undefined);
|
|
147
189
|
}
|
|
148
190
|
}
|
|
149
|
-
|
|
191
|
+
}
|
|
192
|
+
maybeAdd(other) {
|
|
193
|
+
if (other) {
|
|
150
194
|
const newRelation = this.getOtherRelation(other);
|
|
151
195
|
if (newRelation instanceof OneToManyCollection_1.OneToManyCollection) {
|
|
152
196
|
newRelation.add(this.entity);
|
|
153
197
|
}
|
|
198
|
+
else if (newRelation instanceof index_1.OneToManyLargeCollection) {
|
|
199
|
+
newRelation.add(this.entity);
|
|
200
|
+
}
|
|
154
201
|
else {
|
|
155
202
|
newRelation.set(this.entity);
|
|
156
203
|
}
|
|
@@ -159,7 +206,7 @@ class ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
159
206
|
// We need to keep U in data[fieldName] to handle entities without an id assigned yet.
|
|
160
207
|
current(opts) {
|
|
161
208
|
const current = this.entity.__orm.data[this.fieldName];
|
|
162
|
-
if (current !== undefined && EntityManager_1.isEntity(current)) {
|
|
209
|
+
if (current !== undefined && (0, EntityManager_1.isEntity)(current)) {
|
|
163
210
|
return this.filterDeleted(current, opts);
|
|
164
211
|
}
|
|
165
212
|
return current;
|
|
@@ -168,15 +215,21 @@ class ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
168
215
|
return `ManyToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName}, id: ${this.id})`;
|
|
169
216
|
}
|
|
170
217
|
filterDeleted(entity, opts) {
|
|
171
|
-
return
|
|
218
|
+
return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;
|
|
172
219
|
}
|
|
173
220
|
/** Returns the other relation that points back at us, i.e. we're `book.author_id` and this is `Author.books`. */
|
|
174
221
|
getOtherRelation(other) {
|
|
175
222
|
return other[this.otherFieldName];
|
|
176
223
|
}
|
|
177
|
-
|
|
178
|
-
|
|
224
|
+
/**
|
|
225
|
+
* Looks for an entity in `EntityManager`, b/c we may have it in memory even if
|
|
226
|
+
* our reference is not specifically loaded.
|
|
227
|
+
*/
|
|
228
|
+
maybeFindEntity() {
|
|
229
|
+
// Check this.loaded first b/c a new entity won't have an id yet
|
|
230
|
+
return this.loaded ?? (this.id !== undefined ? this.entity.em.getEntity(this.id) : undefined);
|
|
179
231
|
}
|
|
180
232
|
}
|
|
181
|
-
exports.
|
|
233
|
+
exports.ManyToOneReferenceImpl = ManyToOneReferenceImpl;
|
|
234
|
+
_a = Relation_1.RelationT, _b = Relation_1.RelationU, _c = Reference_1.ReferenceN;
|
|
182
235
|
//# sourceMappingURL=ManyToOneReference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManyToOneReference.js","sourceRoot":"","sources":["../../../src/relations/ManyToOneReference.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Collection, Entity, EntityMetadata, IdOf } from "../index";
|
|
2
2
|
import { AbstractRelationImpl } from "./AbstractRelationImpl";
|
|
3
|
+
import { RelationT, RelationU } from "./Relation";
|
|
4
|
+
/** An alias for creating `OneToManyCollection`s. */
|
|
5
|
+
export declare function hasMany<T extends Entity, U extends Entity>(otherMeta: EntityMetadata<U>, fieldName: keyof T, otherFieldName: keyof U, otherColumnName: string): Collection<T, U>;
|
|
3
6
|
export declare class OneToManyCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<U[]> implements Collection<T, U> {
|
|
4
7
|
entity: T;
|
|
5
8
|
otherMeta: EntityMetadata<U>;
|
|
@@ -14,6 +17,8 @@ export declare class OneToManyCollection<T extends Entity, U extends Entity> ext
|
|
|
14
17
|
withDeleted?: boolean;
|
|
15
18
|
}): Promise<readonly U[]>;
|
|
16
19
|
find(id: IdOf<U>): Promise<U | undefined>;
|
|
20
|
+
includes(other: U): Promise<boolean>;
|
|
21
|
+
get isLoaded(): boolean;
|
|
17
22
|
get get(): U[];
|
|
18
23
|
get getWithDeleted(): U[];
|
|
19
24
|
private doGet;
|
|
@@ -27,14 +32,17 @@ export declare class OneToManyCollection<T extends Entity, U extends Entity> ext
|
|
|
27
32
|
initializeForNewEntity(): void;
|
|
28
33
|
removeIfLoaded(other: U): void;
|
|
29
34
|
refreshIfLoaded(): Promise<void>;
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
maybeCascadeDelete(): void;
|
|
36
|
+
cleanupOnEntityDeleted(): Promise<void>;
|
|
32
37
|
private maybeAppendAddedBeforeLoaded;
|
|
33
38
|
current(opts?: {
|
|
34
39
|
withDeleted?: boolean;
|
|
35
40
|
}): U[];
|
|
41
|
+
get meta(): EntityMetadata<T>;
|
|
36
42
|
toString(): string;
|
|
37
43
|
private filterDeleted;
|
|
38
44
|
/** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */
|
|
39
45
|
private getOtherRelation;
|
|
46
|
+
[RelationT]: T;
|
|
47
|
+
[RelationU]: U;
|
|
40
48
|
}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
2
|
+
var _a, _b;
|
|
5
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.OneToManyCollection = void 0;
|
|
7
|
-
const
|
|
4
|
+
exports.OneToManyCollection = exports.hasMany = void 0;
|
|
5
|
+
const oneToManyDataLoader_1 = require("../dataloaders/oneToManyDataLoader");
|
|
6
|
+
const oneToManyFindDataLoader_1 = require("../dataloaders/oneToManyFindDataLoader");
|
|
8
7
|
const index_1 = require("../index");
|
|
9
8
|
const utils_1 = require("../utils");
|
|
10
9
|
const AbstractRelationImpl_1 = require("./AbstractRelationImpl");
|
|
10
|
+
const Relation_1 = require("./Relation");
|
|
11
|
+
/** An alias for creating `OneToManyCollection`s. */
|
|
12
|
+
function hasMany(otherMeta, fieldName, otherFieldName, otherColumnName) {
|
|
13
|
+
const entity = index_1.currentlyInstantiatingEntity;
|
|
14
|
+
return new OneToManyCollection(entity, otherMeta, fieldName, otherFieldName, otherColumnName);
|
|
15
|
+
}
|
|
16
|
+
exports.hasMany = hasMany;
|
|
11
17
|
class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
12
18
|
constructor(
|
|
13
19
|
// These are public to our internal implementation but not exposed in the Collection API
|
|
@@ -23,24 +29,44 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
23
29
|
// groups the hydrated rows by their _current parent m2o field value_, which for a removed child will no
|
|
24
30
|
// longer be us, so it will effectively not show up in our post-load `loaded` array.
|
|
25
31
|
this.addedBeforeLoaded = [];
|
|
26
|
-
this
|
|
32
|
+
this[_a] = null;
|
|
33
|
+
this[_b] = null;
|
|
34
|
+
this.isCascadeDelete = (0, index_1.getMetadata)(entity).config.__data.cascadeDeleteFields.includes(fieldName);
|
|
27
35
|
}
|
|
28
36
|
// opts is an internal parameter
|
|
29
37
|
async load(opts) {
|
|
30
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
38
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
31
39
|
if (this.loaded === undefined) {
|
|
32
40
|
if (this.entity.id === undefined) {
|
|
33
41
|
this.loaded = [];
|
|
34
42
|
}
|
|
35
43
|
else {
|
|
36
|
-
this.loaded = await
|
|
44
|
+
this.loaded = await (0, oneToManyDataLoader_1.oneToManyDataLoader)(this.entity.em, this).load(this.entity.id);
|
|
37
45
|
}
|
|
38
46
|
this.maybeAppendAddedBeforeLoaded();
|
|
39
47
|
}
|
|
40
48
|
return this.filterDeleted(this.loaded, opts);
|
|
41
49
|
}
|
|
42
50
|
async find(id) {
|
|
43
|
-
|
|
51
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
52
|
+
if (this.loaded !== undefined) {
|
|
53
|
+
return this.loaded.find((other) => other.id === id);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const added = this.addedBeforeLoaded.find((u) => u.id === id);
|
|
57
|
+
if (added) {
|
|
58
|
+
return added;
|
|
59
|
+
}
|
|
60
|
+
// Make a cacheable tuple to look up this specific o2m row
|
|
61
|
+
const key = `id=${id},${this.otherColumnName}=${this.entity.idOrFail}`;
|
|
62
|
+
return (0, oneToManyFindDataLoader_1.oneToManyFindDataLoader)(this.entity.em, this).load(key);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async includes(other) {
|
|
66
|
+
return (0, index_1.sameEntity)(this.entity, this.meta, this.getOtherRelation(other).current());
|
|
67
|
+
}
|
|
68
|
+
get isLoaded() {
|
|
69
|
+
return this.loaded !== undefined;
|
|
44
70
|
}
|
|
45
71
|
get get() {
|
|
46
72
|
return this.filterDeleted(this.doGet(), { withDeleted: false });
|
|
@@ -49,7 +75,7 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
49
75
|
return this.filterDeleted(this.doGet(), { withDeleted: true });
|
|
50
76
|
}
|
|
51
77
|
doGet() {
|
|
52
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
78
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
53
79
|
if (this.loaded === undefined) {
|
|
54
80
|
if (this.entity.id === undefined) {
|
|
55
81
|
return this.addedBeforeLoaded;
|
|
@@ -62,7 +88,7 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
62
88
|
return this.loaded;
|
|
63
89
|
}
|
|
64
90
|
set(values) {
|
|
65
|
-
index_1.ensureNotDeleted(this.entity);
|
|
91
|
+
(0, index_1.ensureNotDeleted)(this.entity);
|
|
66
92
|
if (this.loaded === undefined) {
|
|
67
93
|
throw new Error("set was called when not loaded");
|
|
68
94
|
}
|
|
@@ -81,7 +107,7 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
81
107
|
}
|
|
82
108
|
}
|
|
83
109
|
add(other) {
|
|
84
|
-
index_1.ensureNotDeleted(this.entity);
|
|
110
|
+
(0, index_1.ensureNotDeleted)(this.entity);
|
|
85
111
|
if (this.loaded === undefined) {
|
|
86
112
|
if (!this.addedBeforeLoaded.includes(other)) {
|
|
87
113
|
this.addedBeforeLoaded.push(other);
|
|
@@ -98,16 +124,16 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
98
124
|
// We're not supported remove(other) because that might leave other.otherFieldName as undefined,
|
|
99
125
|
// which we don't know if that's valid or not, i.e. depending on whether the field is nullable.
|
|
100
126
|
remove(other, opts = { requireLoaded: true }) {
|
|
101
|
-
index_1.ensureNotDeleted(this.entity, { ignore: "pending" });
|
|
127
|
+
(0, index_1.ensureNotDeleted)(this.entity, { ignore: "pending" });
|
|
102
128
|
if (this.loaded === undefined && opts.requireLoaded) {
|
|
103
129
|
throw new Error("remove was called when not loaded");
|
|
104
130
|
}
|
|
105
|
-
utils_1.remove(this.loaded || this.addedBeforeLoaded, other);
|
|
131
|
+
(0, utils_1.remove)(this.loaded || this.addedBeforeLoaded, other);
|
|
106
132
|
// This will no-op and mark other dirty if necessary
|
|
107
133
|
this.getOtherRelation(other).set(undefined);
|
|
108
134
|
}
|
|
109
135
|
removeAll() {
|
|
110
|
-
index_1.ensureNotDeleted(this.entity);
|
|
136
|
+
(0, index_1.ensureNotDeleted)(this.entity);
|
|
111
137
|
if (this.loaded === undefined) {
|
|
112
138
|
throw new Error("removeAll was called when not loaded");
|
|
113
139
|
}
|
|
@@ -128,31 +154,29 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
128
154
|
}
|
|
129
155
|
removeIfLoaded(other) {
|
|
130
156
|
if (this.loaded !== undefined) {
|
|
131
|
-
utils_1.remove(this.loaded, other);
|
|
157
|
+
(0, utils_1.remove)(this.loaded, other);
|
|
132
158
|
}
|
|
133
159
|
else {
|
|
134
|
-
utils_1.remove(this.addedBeforeLoaded, other);
|
|
160
|
+
(0, utils_1.remove)(this.addedBeforeLoaded, other);
|
|
135
161
|
}
|
|
136
162
|
}
|
|
137
163
|
async refreshIfLoaded() {
|
|
138
164
|
// TODO We should remember what load hints have been applied to this collection and re-apply them.
|
|
139
165
|
if (this.loaded !== undefined && this.entity.id !== undefined) {
|
|
140
|
-
|
|
141
|
-
loader.clear(this.entity.id);
|
|
142
|
-
this.loaded = await loader.load(this.entity.id);
|
|
166
|
+
this.loaded = await (0, oneToManyDataLoader_1.oneToManyDataLoader)(this.entity.em, this).load(this.entity.id);
|
|
143
167
|
}
|
|
144
168
|
}
|
|
145
|
-
|
|
169
|
+
maybeCascadeDelete() {
|
|
146
170
|
if (this.isCascadeDelete) {
|
|
147
|
-
this.current({ withDeleted: true }).forEach(
|
|
171
|
+
this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));
|
|
148
172
|
}
|
|
149
173
|
}
|
|
150
174
|
// We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.
|
|
151
|
-
async
|
|
175
|
+
async cleanupOnEntityDeleted() {
|
|
152
176
|
const current = await this.load({ withDeleted: true });
|
|
153
177
|
current.forEach((other) => {
|
|
154
178
|
const m2o = this.getOtherRelation(other);
|
|
155
|
-
if (index_1.maybeResolveReferenceToId(m2o.current()) === this.entity.id) {
|
|
179
|
+
if ((0, index_1.maybeResolveReferenceToId)(m2o.current()) === this.entity.id) {
|
|
156
180
|
// TODO What if other.otherFieldName is required/not-null?
|
|
157
181
|
m2o.set(undefined);
|
|
158
182
|
}
|
|
@@ -162,7 +186,7 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
162
186
|
}
|
|
163
187
|
maybeAppendAddedBeforeLoaded() {
|
|
164
188
|
if (this.loaded) {
|
|
165
|
-
const newEntities = this.addedBeforeLoaded.filter((e) =>
|
|
189
|
+
const newEntities = this.addedBeforeLoaded.filter((e) => !this.loaded?.includes(e));
|
|
166
190
|
// Push on the end to better match the db order of "newer things come last"
|
|
167
191
|
for (const e of newEntities) {
|
|
168
192
|
this.loaded.push(e);
|
|
@@ -173,11 +197,14 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
173
197
|
current(opts) {
|
|
174
198
|
return this.filterDeleted(this.loaded || this.addedBeforeLoaded, opts);
|
|
175
199
|
}
|
|
200
|
+
get meta() {
|
|
201
|
+
return (0, index_1.getMetadata)(this.entity);
|
|
202
|
+
}
|
|
176
203
|
toString() {
|
|
177
204
|
return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;
|
|
178
205
|
}
|
|
179
206
|
filterDeleted(entities, opts) {
|
|
180
|
-
return
|
|
207
|
+
return opts?.withDeleted === true ? [...entities] : entities.filter((e) => !e.isDeletedEntity);
|
|
181
208
|
}
|
|
182
209
|
/** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */
|
|
183
210
|
getOtherRelation(other) {
|
|
@@ -185,37 +212,5 @@ class OneToManyCollection extends AbstractRelationImpl_1.AbstractRelationImpl {
|
|
|
185
212
|
}
|
|
186
213
|
}
|
|
187
214
|
exports.OneToManyCollection = OneToManyCollection;
|
|
188
|
-
|
|
189
|
-
const em = index_1.getEm(collection.entity);
|
|
190
|
-
// The metadata for the entity that contains the collection
|
|
191
|
-
const meta = index_1.getMetadata(collection.entity);
|
|
192
|
-
const loaderName = `${meta.tableName}.${collection.fieldName}`;
|
|
193
|
-
return utils_1.getOrSet(em.__data.loaders, loaderName, () => {
|
|
194
|
-
return new dataloader_1.default(async (_keys) => {
|
|
195
|
-
const { otherMeta } = collection;
|
|
196
|
-
index_1.assertIdsAreTagged(_keys);
|
|
197
|
-
const keys = index_1.deTagIds(meta, _keys);
|
|
198
|
-
const rows = await em.knex
|
|
199
|
-
.select("*")
|
|
200
|
-
.from(otherMeta.tableName)
|
|
201
|
-
.whereIn(collection.otherColumnName, keys)
|
|
202
|
-
.orderBy("id");
|
|
203
|
-
const entities = rows.map((row) => em.hydrate(otherMeta.cstr, row, { overwriteExisting: false }));
|
|
204
|
-
// .filter((e) => !e.isDeletedEntity);
|
|
205
|
-
const rowsById = utils_1.groupBy(entities, (entity) => {
|
|
206
|
-
// TODO If this came from the UoW, it may not be an id? I.e. pre-insert.
|
|
207
|
-
const ownerId = index_1.maybeResolveReferenceToId(entity.__orm.data[collection.otherFieldName]);
|
|
208
|
-
// We almost always expect ownerId to be found, b/c normally we just hydrated this entity
|
|
209
|
-
// directly from a SQL row with owner_id=X, however we might be loading this collection
|
|
210
|
-
// (i.e. find all children where owner_id=X) when the SQL thinks a child is still pointing
|
|
211
|
-
// at the parent (i.e. owner_id=X in the db), but our already-loaded child has had its
|
|
212
|
-
// `child.owner` field either changed to some other owner, or set to undefined. In either,
|
|
213
|
-
// that child should no longer be parent of this owner's collection, so just return a
|
|
214
|
-
// dummy value.
|
|
215
|
-
return ownerId !== null && ownerId !== void 0 ? ownerId : "dummyNoLongerOwned";
|
|
216
|
-
});
|
|
217
|
-
return _keys.map((k) => rowsById.get(k) || []);
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
}
|
|
215
|
+
_a = Relation_1.RelationT, _b = Relation_1.RelationU;
|
|
221
216
|
//# sourceMappingURL=OneToManyCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OneToManyCollection.js","sourceRoot":"","sources":["../../../src/relations/OneToManyCollection.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 `OneToManyLargeCollection`s. */
|
|
5
|
+
export declare function hasLargeMany<T extends Entity, U extends Entity>(otherMeta: EntityMetadata<U>, fieldName: keyof T, otherFieldName: keyof U, otherColumnName: string): LargeCollection<T, U>;
|
|
6
|
+
export declare class OneToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {
|
|
7
|
+
entity: T;
|
|
8
|
+
otherMeta: EntityMetadata<U>;
|
|
9
|
+
fieldName: keyof T;
|
|
10
|
+
otherFieldName: keyof U;
|
|
11
|
+
otherColumnName: string;
|
|
12
|
+
private locallyAdded;
|
|
13
|
+
private locallyRemoved;
|
|
14
|
+
constructor(entity: T, otherMeta: EntityMetadata<U>, fieldName: keyof T, otherFieldName: keyof U, otherColumnName: string);
|
|
15
|
+
find(id: IdOf<U>): Promise<U | undefined>;
|
|
16
|
+
includes(other: U): Promise<boolean>;
|
|
17
|
+
add(other: U): void;
|
|
18
|
+
remove(other: U): void;
|
|
19
|
+
get meta(): EntityMetadata<T>;
|
|
20
|
+
toString(): string;
|
|
21
|
+
/** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */
|
|
22
|
+
private getOtherRelation;
|
|
23
|
+
[RelationT]: T;
|
|
24
|
+
[RelationU]: U;
|
|
25
|
+
}
|