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.
Files changed (221) hide show
  1. package/build/{BaseEntity.d.ts → src/BaseEntity.d.ts} +2 -1
  2. package/build/{BaseEntity.js → src/BaseEntity.js} +13 -9
  3. package/build/src/BaseEntity.js.map +1 -0
  4. package/build/{EntityManager.d.ts → src/EntityManager.d.ts} +139 -110
  5. package/build/{EntityManager.js → src/EntityManager.js} +281 -262
  6. package/build/src/EntityManager.js.map +1 -0
  7. package/build/{QueryBuilder.d.ts → src/QueryBuilder.d.ts} +53 -3
  8. package/build/src/QueryBuilder.js +341 -0
  9. package/build/src/QueryBuilder.js.map +1 -0
  10. package/build/src/Todo.d.ts +25 -0
  11. package/build/src/Todo.js +52 -0
  12. package/build/src/Todo.js.map +1 -0
  13. package/build/src/changes.d.ts +34 -0
  14. package/build/src/changes.js +37 -0
  15. package/build/src/changes.js.map +1 -0
  16. package/build/src/config.d.ts +43 -0
  17. package/build/src/config.js +114 -0
  18. package/build/src/config.js.map +1 -0
  19. package/build/{createOrUpdatePartial.d.ts → src/createOrUpdatePartial.d.ts} +2 -1
  20. package/build/{createOrUpdatePartial.js → src/createOrUpdatePartial.js} +42 -10
  21. package/build/src/createOrUpdatePartial.js.map +1 -0
  22. package/build/src/dataloaders/findDataLoader.d.ts +5 -0
  23. package/build/src/dataloaders/findDataLoader.js +28 -0
  24. package/build/src/dataloaders/findDataLoader.js.map +1 -0
  25. package/build/src/dataloaders/loadDataLoader.d.ts +3 -0
  26. package/build/src/dataloaders/loadDataLoader.js +37 -0
  27. package/build/src/dataloaders/loadDataLoader.js.map +1 -0
  28. package/build/src/dataloaders/manyToManyDataLoader.d.ts +5 -0
  29. package/build/src/dataloaders/manyToManyDataLoader.js +78 -0
  30. package/build/src/dataloaders/manyToManyDataLoader.js.map +1 -0
  31. package/build/src/dataloaders/manyToManyFindDataLoader.d.ts +5 -0
  32. package/build/src/dataloaders/manyToManyFindDataLoader.js +33 -0
  33. package/build/src/dataloaders/manyToManyFindDataLoader.js.map +1 -0
  34. package/build/src/dataloaders/oneToManyDataLoader.d.ts +4 -0
  35. package/build/src/dataloaders/oneToManyDataLoader.js +40 -0
  36. package/build/src/dataloaders/oneToManyDataLoader.js.map +1 -0
  37. package/build/src/dataloaders/oneToManyFindDataLoader.d.ts +5 -0
  38. package/build/src/dataloaders/oneToManyFindDataLoader.js +32 -0
  39. package/build/src/dataloaders/oneToManyFindDataLoader.js.map +1 -0
  40. package/build/src/dataloaders/oneToOneDataLoader.d.ts +4 -0
  41. package/build/src/dataloaders/oneToOneDataLoader.js +40 -0
  42. package/build/src/dataloaders/oneToOneDataLoader.js.map +1 -0
  43. package/build/src/drivers/IdAssigner.d.ts +33 -0
  44. package/build/src/drivers/IdAssigner.js +106 -0
  45. package/build/src/drivers/IdAssigner.js.map +1 -0
  46. package/build/src/drivers/InMemoryDriver.d.ts +29 -0
  47. package/build/src/drivers/InMemoryDriver.js +306 -0
  48. package/build/src/drivers/InMemoryDriver.js.map +1 -0
  49. package/build/src/drivers/PostgresDriver.d.ts +40 -0
  50. package/build/src/drivers/PostgresDriver.js +376 -0
  51. package/build/src/drivers/PostgresDriver.js.map +1 -0
  52. package/build/src/drivers/driver.d.ts +23 -0
  53. package/build/src/drivers/driver.js +3 -0
  54. package/build/src/drivers/driver.js.map +1 -0
  55. package/build/src/drivers/index.d.ts +4 -0
  56. package/build/src/drivers/index.js +17 -0
  57. package/build/src/drivers/index.js.map +1 -0
  58. package/build/{getProperties.d.ts → src/getProperties.d.ts} +0 -0
  59. package/build/{getProperties.js → src/getProperties.js} +1 -1
  60. package/build/src/getProperties.js.map +1 -0
  61. package/build/src/index.d.ts +62 -0
  62. package/build/src/index.js +263 -0
  63. package/build/src/index.js.map +1 -0
  64. package/build/src/keys.d.ts +30 -0
  65. package/build/{keys.js → src/keys.js} +48 -16
  66. package/build/src/keys.js.map +1 -0
  67. package/build/{loadLens.d.ts → src/loadLens.d.ts} +2 -2
  68. package/build/{loadLens.js → src/loadLens.js} +1 -1
  69. package/build/src/loadLens.js.map +1 -0
  70. package/build/src/loaded.d.ts +49 -0
  71. package/build/src/loaded.js +9 -0
  72. package/build/src/loaded.js.map +1 -0
  73. package/build/{newTestInstance.d.ts → src/newTestInstance.d.ts} +37 -3
  74. package/build/src/newTestInstance.js +342 -0
  75. package/build/src/newTestInstance.js.map +1 -0
  76. package/build/{collections → src/relations}/AbstractRelationImpl.d.ts +6 -5
  77. package/build/{collections → src/relations}/AbstractRelationImpl.js +0 -0
  78. package/build/src/relations/AbstractRelationImpl.js.map +1 -0
  79. package/build/src/relations/Collection.d.ts +26 -0
  80. package/build/src/relations/Collection.js +19 -0
  81. package/build/src/relations/Collection.js.map +1 -0
  82. package/build/{collections → src/relations}/CustomCollection.d.ts +6 -2
  83. package/build/{collections → src/relations}/CustomCollection.js +17 -9
  84. package/build/src/relations/CustomCollection.js.map +1 -0
  85. package/build/{collections → src/relations}/CustomReference.d.ts +7 -2
  86. package/build/{collections → src/relations}/CustomReference.js +16 -9
  87. package/build/src/relations/CustomReference.js.map +1 -0
  88. package/build/src/relations/LargeCollection.d.ts +17 -0
  89. package/build/src/relations/LargeCollection.js +3 -0
  90. package/build/src/relations/LargeCollection.js.map +1 -0
  91. package/build/{collections → src/relations}/ManyToManyCollection.d.ts +9 -2
  92. package/build/src/relations/ManyToManyCollection.js +249 -0
  93. package/build/src/relations/ManyToManyCollection.js.map +1 -0
  94. package/build/src/relations/ManyToManyLargeCollection.d.ts +25 -0
  95. package/build/src/relations/ManyToManyLargeCollection.js +97 -0
  96. package/build/src/relations/ManyToManyLargeCollection.js.map +1 -0
  97. package/build/src/relations/ManyToOneReference.d.ts +77 -0
  98. package/build/{collections → src/relations}/ManyToOneReference.js +101 -48
  99. package/build/src/relations/ManyToOneReference.js.map +1 -0
  100. package/build/{collections → src/relations}/OneToManyCollection.d.ts +10 -2
  101. package/build/{collections → src/relations}/OneToManyCollection.js +54 -59
  102. package/build/src/relations/OneToManyCollection.js.map +1 -0
  103. package/build/src/relations/OneToManyLargeCollection.d.ts +25 -0
  104. package/build/src/relations/OneToManyLargeCollection.js +83 -0
  105. package/build/src/relations/OneToManyLargeCollection.js.map +1 -0
  106. package/build/src/relations/OneToOneReference.d.ts +82 -0
  107. package/build/src/relations/OneToOneReference.js +168 -0
  108. package/build/src/relations/OneToOneReference.js.map +1 -0
  109. package/build/src/relations/PolymorphicReference.d.ts +69 -0
  110. package/build/src/relations/PolymorphicReference.js +210 -0
  111. package/build/src/relations/PolymorphicReference.js.map +1 -0
  112. package/build/src/relations/Reference.d.ts +29 -0
  113. package/build/src/relations/Reference.js +23 -0
  114. package/build/src/relations/Reference.js.map +1 -0
  115. package/build/src/relations/Relation.d.ts +10 -0
  116. package/build/src/relations/Relation.js +13 -0
  117. package/build/src/relations/Relation.js.map +1 -0
  118. package/build/src/relations/hasAsyncProperty.d.ts +36 -0
  119. package/build/src/relations/hasAsyncProperty.js +55 -0
  120. package/build/src/relations/hasAsyncProperty.js.map +1 -0
  121. package/build/{collections → src/relations}/hasManyDerived.d.ts +2 -1
  122. package/build/{collections → src/relations}/hasManyDerived.js +1 -1
  123. package/build/src/relations/hasManyDerived.js.map +1 -0
  124. package/build/{collections → src/relations}/hasManyThrough.d.ts +0 -0
  125. package/build/{collections → src/relations}/hasManyThrough.js +2 -2
  126. package/build/src/relations/hasManyThrough.js.map +1 -0
  127. package/build/{collections → src/relations}/hasOneDerived.d.ts +3 -2
  128. package/build/{collections → src/relations}/hasOneDerived.js +1 -1
  129. package/build/src/relations/hasOneDerived.js.map +1 -0
  130. package/build/{collections → src/relations}/hasOneThrough.d.ts +0 -0
  131. package/build/{collections → src/relations}/hasOneThrough.js +2 -2
  132. package/build/src/relations/hasOneThrough.js.map +1 -0
  133. package/build/src/relations/index.d.ts +18 -0
  134. package/build/src/relations/index.js +53 -0
  135. package/build/src/relations/index.js.map +1 -0
  136. package/build/{reverseHint.d.ts → src/reverseHint.d.ts} +2 -1
  137. package/build/{reverseHint.js → src/reverseHint.js} +13 -9
  138. package/build/src/reverseHint.js.map +1 -0
  139. package/build/src/rules.d.ts +23 -0
  140. package/build/src/rules.js +23 -0
  141. package/build/src/rules.js.map +1 -0
  142. package/build/src/serde.d.ts +121 -0
  143. package/build/src/serde.js +190 -0
  144. package/build/src/serde.js.map +1 -0
  145. package/build/{utils.d.ts → src/utils.d.ts} +2 -0
  146. package/build/{utils.js → src/utils.js} +10 -1
  147. package/build/src/utils.js.map +1 -0
  148. package/build/tsconfig.tsbuildinfo +1 -0
  149. package/package.json +30 -15
  150. package/build/BaseEntity.js.map +0 -1
  151. package/build/EntityManager.js.map +0 -1
  152. package/build/EntityPersister.d.ts +0 -30
  153. package/build/EntityPersister.js +0 -197
  154. package/build/EntityPersister.js.map +0 -1
  155. package/build/QueryBuilder.js +0 -195
  156. package/build/QueryBuilder.js.map +0 -1
  157. package/build/changes.d.ts +0 -23
  158. package/build/changes.js +0 -14
  159. package/build/changes.js.map +0 -1
  160. package/build/collections/AbstractRelationImpl.js.map +0 -1
  161. package/build/collections/CustomCollection.js.map +0 -1
  162. package/build/collections/CustomReference.js.map +0 -1
  163. package/build/collections/ManyToManyCollection.js +0 -288
  164. package/build/collections/ManyToManyCollection.js.map +0 -1
  165. package/build/collections/ManyToOneReference.d.ts +0 -50
  166. package/build/collections/ManyToOneReference.js.map +0 -1
  167. package/build/collections/OneToManyCollection.js.map +0 -1
  168. package/build/collections/OneToOneReference.d.ts +0 -51
  169. package/build/collections/OneToOneReference.js +0 -132
  170. package/build/collections/OneToOneReference.js.map +0 -1
  171. package/build/collections/hasManyDerived.js.map +0 -1
  172. package/build/collections/hasManyThrough.js.map +0 -1
  173. package/build/collections/hasOneDerived.js.map +0 -1
  174. package/build/collections/hasOneThrough.js.map +0 -1
  175. package/build/collections/index.d.ts +0 -19
  176. package/build/collections/index.js +0 -49
  177. package/build/collections/index.js.map +0 -1
  178. package/build/createOrUpdatePartial.js.map +0 -1
  179. package/build/getProperties.js.map +0 -1
  180. package/build/index.d.ts +0 -140
  181. package/build/index.js +0 -278
  182. package/build/index.js.map +0 -1
  183. package/build/keys.d.ts +0 -21
  184. package/build/keys.js.map +0 -1
  185. package/build/loadLens.js.map +0 -1
  186. package/build/newTestInstance.js +0 -153
  187. package/build/newTestInstance.js.map +0 -1
  188. package/build/reverseHint.js.map +0 -1
  189. package/build/serde.d.ts +0 -47
  190. package/build/serde.js +0 -93
  191. package/build/serde.js.map +0 -1
  192. package/build/utils.js.map +0 -1
  193. package/package.json.bak +0 -27
  194. package/src/BaseEntity.ts +0 -104
  195. package/src/EntityManager.ts +0 -1263
  196. package/src/EntityPersister.ts +0 -240
  197. package/src/QueryBuilder.ts +0 -289
  198. package/src/changes.ts +0 -40
  199. package/src/collections/AbstractRelationImpl.ts +0 -28
  200. package/src/collections/CustomCollection.ts +0 -152
  201. package/src/collections/CustomReference.ts +0 -138
  202. package/src/collections/ManyToManyCollection.ts +0 -346
  203. package/src/collections/ManyToOneReference.ts +0 -215
  204. package/src/collections/OneToManyCollection.ts +0 -254
  205. package/src/collections/OneToOneReference.ts +0 -153
  206. package/src/collections/hasManyDerived.ts +0 -29
  207. package/src/collections/hasManyThrough.ts +0 -20
  208. package/src/collections/hasOneDerived.ts +0 -26
  209. package/src/collections/hasOneThrough.ts +0 -20
  210. package/src/collections/index.ts +0 -74
  211. package/src/createOrUpdatePartial.ts +0 -144
  212. package/src/getProperties.ts +0 -27
  213. package/src/index.ts +0 -400
  214. package/src/keys.ts +0 -75
  215. package/src/loadLens.ts +0 -126
  216. package/src/newTestInstance.ts +0 -205
  217. package/src/reverseHint.ts +0 -43
  218. package/src/serde.ts +0 -97
  219. package/src/utils.ts +0 -63
  220. package/tsconfig.json +0 -21
  221. 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.ManyToOneReference = void 0;
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 reference on the "owning"
17
- * side; the other side, i.e. `Author.image` will use a `OneToOneReference` to point back to us.
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 ManyToOneReference extends AbstractRelationImpl_1.AbstractRelationImpl {
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 "isLoaded" for nullable fks.
27
- this.isLoaded = false;
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 index_1.getEm(this.entity).load(this.otherMeta.cstr, current));
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.isLoaded = true;
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.isLoaded) {
51
- const existing = this.maybeFindExisting();
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.isLoaded = true;
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.isLoaded = true;
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.isLoaded) {
125
+ if (this._isLoaded) {
91
126
  const current = this.current();
92
127
  if (typeof current === "string") {
93
- this.loaded = (await index_1.getEm(this.entity).load(this.otherMeta.cstr, current));
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
- onEntityDelete() {
135
+ maybeCascadeDelete() {
101
136
  if (this.isCascadeDelete) {
102
137
  const current = this.current({ withDeleted: true });
103
138
  if (current !== undefined && typeof current !== "string") {
104
- index_1.getEm(this.entity).delete(current);
139
+ this.entity.em.delete(current);
105
140
  }
106
141
  }
107
142
  }
108
- async onEntityDeletedAndFlushing() {
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.isLoaded = true;
162
+ this._isLoaded = true;
122
163
  }
123
164
  // Internal method used by OneToManyCollection
124
165
  setImpl(other) {
125
- var _a, _b;
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
- // we may not be loaded yet, but our previous entity might already be in the UoW
130
- const previousLoaded = (_a = this.loaded) !== null && _a !== void 0 ? _a : this.maybeFindExisting();
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
- const changed = index_1.setField(this.entity, this.fieldName, (_b = other === null || other === void 0 ? void 0 : other.id) !== null && _b !== void 0 ? _b : other);
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.isLoaded = true;
139
- // If had an existing value, remove us from its collection
140
- if (previousLoaded) {
141
- const prevRelation = this.getOtherRelation(previousLoaded);
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
- if (other !== undefined) {
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 (opts === null || opts === void 0 ? void 0 : opts.withDeleted) === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;
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
- maybeFindExisting() {
178
- return this.id !== undefined ? index_1.getEm(this.entity)["findExistingInstance"](this.id) : undefined;
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.ManyToOneReference = ManyToOneReference;
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
- onEntityDelete(): void;
31
- onEntityDeletedAndFlushing(): Promise<void>;
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 __importDefault = (this && this.__importDefault) || function (mod) {
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 dataloader_1 = __importDefault(require("dataloader"));
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.isCascadeDelete = index_1.getMetadata(entity).config.__data.cascadeDeleteFields.includes(fieldName);
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 loaderForCollection(this).load(this.entity.id);
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
- return (await this.load()).find((u) => u.id === id);
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
- const loader = loaderForCollection(this);
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
- onEntityDelete() {
169
+ maybeCascadeDelete() {
146
170
  if (this.isCascadeDelete) {
147
- this.current({ withDeleted: true }).forEach(index_1.getEm(this.entity).delete);
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 onEntityDeletedAndFlushing() {
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) => { var _a; return !((_a = this.loaded) === null || _a === void 0 ? void 0 : _a.includes(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 (opts === null || opts === void 0 ? void 0 : opts.withDeleted) === true ? [...entities] : entities.filter((e) => !e.isDeletedEntity);
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
- function loaderForCollection(collection) {
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
+ }