@mikro-orm/core 7.0.0-dev.1 → 7.0.0-dev.100

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 (281) hide show
  1. package/EntityManager.d.ts +96 -58
  2. package/EntityManager.js +465 -395
  3. package/MikroORM.d.ts +45 -35
  4. package/MikroORM.js +109 -160
  5. package/README.md +3 -2
  6. package/cache/CacheAdapter.js +1 -2
  7. package/cache/FileCacheAdapter.d.ts +2 -2
  8. package/cache/FileCacheAdapter.js +20 -27
  9. package/cache/GeneratedCacheAdapter.d.ts +2 -3
  10. package/cache/GeneratedCacheAdapter.js +1 -7
  11. package/cache/MemoryCacheAdapter.d.ts +1 -1
  12. package/cache/MemoryCacheAdapter.js +1 -5
  13. package/cache/NullCacheAdapter.d.ts +1 -1
  14. package/cache/NullCacheAdapter.js +1 -5
  15. package/cache/index.d.ts +4 -5
  16. package/cache/index.js +4 -21
  17. package/connections/Connection.d.ts +22 -14
  18. package/connections/Connection.js +27 -23
  19. package/connections/index.d.ts +1 -1
  20. package/connections/index.js +1 -17
  21. package/drivers/DatabaseDriver.d.ts +25 -15
  22. package/drivers/DatabaseDriver.js +77 -64
  23. package/drivers/IDatabaseDriver.d.ts +40 -16
  24. package/drivers/IDatabaseDriver.js +1 -4
  25. package/drivers/index.d.ts +2 -2
  26. package/drivers/index.js +2 -18
  27. package/entity/BaseEntity.d.ts +6 -7
  28. package/entity/BaseEntity.js +16 -23
  29. package/entity/Collection.d.ts +98 -34
  30. package/entity/Collection.js +466 -131
  31. package/entity/EntityAssigner.d.ts +3 -3
  32. package/entity/EntityAssigner.js +67 -64
  33. package/entity/EntityFactory.d.ts +10 -3
  34. package/entity/EntityFactory.js +112 -91
  35. package/entity/EntityHelper.d.ts +2 -2
  36. package/entity/EntityHelper.js +66 -53
  37. package/entity/EntityIdentifier.d.ts +1 -1
  38. package/entity/EntityIdentifier.js +1 -5
  39. package/entity/EntityLoader.d.ts +8 -7
  40. package/entity/EntityLoader.js +161 -128
  41. package/entity/EntityRepository.d.ts +8 -8
  42. package/entity/EntityRepository.js +7 -11
  43. package/entity/Reference.d.ts +10 -13
  44. package/entity/Reference.js +64 -46
  45. package/entity/WrappedEntity.d.ts +12 -17
  46. package/entity/WrappedEntity.js +22 -31
  47. package/entity/defineEntity.d.ts +568 -0
  48. package/entity/defineEntity.js +529 -0
  49. package/entity/index.d.ts +14 -13
  50. package/entity/index.js +14 -29
  51. package/entity/utils.d.ts +8 -1
  52. package/entity/utils.js +22 -13
  53. package/entity/validators.d.ts +11 -0
  54. package/entity/validators.js +65 -0
  55. package/entity/wrap.d.ts +1 -1
  56. package/entity/wrap.js +2 -6
  57. package/enums.d.ts +24 -9
  58. package/enums.js +50 -41
  59. package/errors.d.ts +11 -3
  60. package/errors.js +42 -32
  61. package/events/EventManager.d.ts +5 -4
  62. package/events/EventManager.js +26 -22
  63. package/events/EventSubscriber.d.ts +8 -5
  64. package/events/EventSubscriber.js +1 -2
  65. package/events/TransactionEventBroadcaster.d.ts +3 -3
  66. package/events/TransactionEventBroadcaster.js +1 -5
  67. package/events/index.d.ts +3 -3
  68. package/events/index.js +3 -19
  69. package/exceptions.js +18 -39
  70. package/hydration/Hydrator.d.ts +5 -5
  71. package/hydration/Hydrator.js +2 -6
  72. package/hydration/ObjectHydrator.d.ts +7 -7
  73. package/hydration/ObjectHydrator.js +58 -50
  74. package/hydration/index.d.ts +2 -2
  75. package/hydration/index.js +2 -18
  76. package/index.d.ts +21 -21
  77. package/index.js +20 -46
  78. package/logging/DefaultLogger.d.ts +2 -2
  79. package/logging/DefaultLogger.js +10 -13
  80. package/logging/Logger.d.ts +1 -1
  81. package/logging/Logger.js +1 -2
  82. package/logging/SimpleLogger.d.ts +3 -3
  83. package/logging/SimpleLogger.js +2 -6
  84. package/logging/colors.js +1 -5
  85. package/logging/index.d.ts +5 -4
  86. package/logging/index.js +5 -20
  87. package/logging/inspect.d.ts +2 -0
  88. package/logging/inspect.js +16 -0
  89. package/metadata/EntitySchema.d.ts +14 -10
  90. package/metadata/EntitySchema.js +78 -64
  91. package/metadata/MetadataDiscovery.d.ts +11 -14
  92. package/metadata/MetadataDiscovery.js +278 -317
  93. package/metadata/MetadataProvider.d.ts +13 -4
  94. package/metadata/MetadataProvider.js +47 -8
  95. package/metadata/MetadataStorage.d.ts +2 -7
  96. package/metadata/MetadataStorage.js +19 -35
  97. package/metadata/MetadataValidator.d.ts +3 -10
  98. package/metadata/MetadataValidator.js +51 -64
  99. package/metadata/discover-entities.d.ts +5 -0
  100. package/metadata/discover-entities.js +40 -0
  101. package/metadata/index.d.ts +6 -6
  102. package/metadata/index.js +6 -22
  103. package/metadata/types.d.ts +480 -0
  104. package/metadata/types.js +1 -0
  105. package/naming-strategy/AbstractNamingStrategy.d.ts +7 -3
  106. package/naming-strategy/AbstractNamingStrategy.js +11 -9
  107. package/naming-strategy/EntityCaseNamingStrategy.d.ts +1 -1
  108. package/naming-strategy/EntityCaseNamingStrategy.js +2 -6
  109. package/naming-strategy/MongoNamingStrategy.d.ts +1 -1
  110. package/naming-strategy/MongoNamingStrategy.js +2 -6
  111. package/naming-strategy/NamingStrategy.d.ts +12 -2
  112. package/naming-strategy/NamingStrategy.js +1 -2
  113. package/naming-strategy/UnderscoreNamingStrategy.d.ts +1 -1
  114. package/naming-strategy/UnderscoreNamingStrategy.js +2 -6
  115. package/naming-strategy/index.d.ts +5 -5
  116. package/naming-strategy/index.js +5 -21
  117. package/not-supported.d.ts +2 -0
  118. package/not-supported.js +4 -0
  119. package/package.json +19 -20
  120. package/platforms/ExceptionConverter.d.ts +2 -2
  121. package/platforms/ExceptionConverter.js +4 -8
  122. package/platforms/Platform.d.ts +15 -22
  123. package/platforms/Platform.js +58 -88
  124. package/platforms/index.d.ts +2 -2
  125. package/platforms/index.js +2 -18
  126. package/serialization/EntitySerializer.d.ts +4 -2
  127. package/serialization/EntitySerializer.js +64 -51
  128. package/serialization/EntityTransformer.d.ts +1 -1
  129. package/serialization/EntityTransformer.js +48 -42
  130. package/serialization/SerializationContext.d.ts +2 -2
  131. package/serialization/SerializationContext.js +24 -25
  132. package/serialization/index.d.ts +3 -3
  133. package/serialization/index.js +3 -19
  134. package/types/ArrayType.d.ts +3 -3
  135. package/types/ArrayType.js +6 -11
  136. package/types/BigIntType.d.ts +12 -9
  137. package/types/BigIntType.js +6 -6
  138. package/types/BlobType.d.ts +3 -4
  139. package/types/BlobType.js +2 -11
  140. package/types/BooleanType.d.ts +5 -4
  141. package/types/BooleanType.js +5 -6
  142. package/types/CharacterType.d.ts +3 -3
  143. package/types/CharacterType.js +2 -6
  144. package/types/DateTimeType.d.ts +3 -3
  145. package/types/DateTimeType.js +2 -6
  146. package/types/DateType.d.ts +3 -3
  147. package/types/DateType.js +2 -6
  148. package/types/DecimalType.d.ts +9 -7
  149. package/types/DecimalType.js +5 -8
  150. package/types/DoubleType.d.ts +3 -3
  151. package/types/DoubleType.js +4 -7
  152. package/types/EnumArrayType.d.ts +4 -4
  153. package/types/EnumArrayType.js +4 -10
  154. package/types/EnumType.d.ts +3 -3
  155. package/types/EnumType.js +2 -6
  156. package/types/FloatType.d.ts +3 -3
  157. package/types/FloatType.js +2 -6
  158. package/types/IntegerType.d.ts +3 -3
  159. package/types/IntegerType.js +2 -6
  160. package/types/IntervalType.d.ts +3 -3
  161. package/types/IntervalType.js +2 -6
  162. package/types/JsonType.d.ts +4 -4
  163. package/types/JsonType.js +9 -8
  164. package/types/MediumIntType.d.ts +3 -3
  165. package/types/MediumIntType.js +2 -6
  166. package/types/SmallIntType.d.ts +3 -3
  167. package/types/SmallIntType.js +2 -6
  168. package/types/StringType.d.ts +3 -3
  169. package/types/StringType.js +2 -6
  170. package/types/TextType.d.ts +3 -3
  171. package/types/TextType.js +2 -6
  172. package/types/TimeType.d.ts +3 -3
  173. package/types/TimeType.js +4 -8
  174. package/types/TinyIntType.d.ts +3 -3
  175. package/types/TinyIntType.js +3 -6
  176. package/types/Type.d.ts +4 -6
  177. package/types/Type.js +6 -10
  178. package/types/Uint8ArrayType.d.ts +3 -4
  179. package/types/Uint8ArrayType.js +3 -12
  180. package/types/UnknownType.d.ts +3 -3
  181. package/types/UnknownType.js +2 -6
  182. package/types/UuidType.d.ts +3 -3
  183. package/types/UuidType.js +2 -6
  184. package/types/index.d.ts +25 -25
  185. package/types/index.js +52 -79
  186. package/typings.d.ts +134 -93
  187. package/typings.js +67 -65
  188. package/unit-of-work/ChangeSet.d.ts +1 -4
  189. package/unit-of-work/ChangeSet.js +13 -17
  190. package/unit-of-work/ChangeSetComputer.d.ts +8 -9
  191. package/unit-of-work/ChangeSetComputer.js +36 -38
  192. package/unit-of-work/ChangeSetPersister.d.ts +11 -9
  193. package/unit-of-work/ChangeSetPersister.js +100 -65
  194. package/unit-of-work/CommitOrderCalculator.d.ts +1 -1
  195. package/unit-of-work/CommitOrderCalculator.js +6 -10
  196. package/unit-of-work/IdentityMap.d.ts +1 -1
  197. package/unit-of-work/IdentityMap.js +1 -5
  198. package/unit-of-work/UnitOfWork.d.ts +16 -8
  199. package/unit-of-work/UnitOfWork.js +266 -209
  200. package/unit-of-work/index.d.ts +6 -6
  201. package/unit-of-work/index.js +6 -22
  202. package/utils/AbstractSchemaGenerator.d.ts +11 -11
  203. package/utils/AbstractSchemaGenerator.js +21 -20
  204. package/utils/Configuration.d.ts +774 -224
  205. package/utils/Configuration.js +166 -216
  206. package/utils/ConfigurationLoader.d.ts +1 -53
  207. package/utils/ConfigurationLoader.js +1 -367
  208. package/utils/Cursor.d.ts +6 -9
  209. package/utils/Cursor.js +25 -25
  210. package/utils/DataloaderUtils.d.ts +18 -8
  211. package/utils/DataloaderUtils.js +63 -21
  212. package/utils/EntityComparator.d.ts +9 -5
  213. package/utils/EntityComparator.js +155 -108
  214. package/utils/NullHighlighter.d.ts +1 -1
  215. package/utils/NullHighlighter.js +1 -5
  216. package/utils/QueryHelper.d.ts +12 -4
  217. package/utils/QueryHelper.js +110 -53
  218. package/utils/RawQueryFragment.d.ts +37 -14
  219. package/utils/RawQueryFragment.js +50 -33
  220. package/utils/RequestContext.d.ts +2 -2
  221. package/utils/RequestContext.js +3 -7
  222. package/utils/TransactionContext.d.ts +1 -1
  223. package/utils/TransactionContext.js +4 -8
  224. package/utils/TransactionManager.d.ts +65 -0
  225. package/utils/TransactionManager.js +223 -0
  226. package/utils/Utils.d.ts +16 -100
  227. package/utils/Utils.js +114 -332
  228. package/utils/clone.js +7 -11
  229. package/utils/env-vars.d.ts +3 -0
  230. package/utils/env-vars.js +87 -0
  231. package/utils/fs-utils.d.ts +12 -0
  232. package/utils/fs-utils.js +97 -0
  233. package/utils/index.d.ts +14 -13
  234. package/utils/index.js +14 -29
  235. package/utils/upsert-utils.d.ts +8 -3
  236. package/utils/upsert-utils.js +57 -10
  237. package/decorators/Check.d.ts +0 -3
  238. package/decorators/Check.js +0 -16
  239. package/decorators/CreateRequestContext.d.ts +0 -3
  240. package/decorators/CreateRequestContext.js +0 -33
  241. package/decorators/Embeddable.d.ts +0 -8
  242. package/decorators/Embeddable.js +0 -14
  243. package/decorators/Embedded.d.ts +0 -18
  244. package/decorators/Embedded.js +0 -20
  245. package/decorators/Entity.d.ts +0 -18
  246. package/decorators/Entity.js +0 -16
  247. package/decorators/Enum.d.ts +0 -9
  248. package/decorators/Enum.js +0 -19
  249. package/decorators/Filter.d.ts +0 -2
  250. package/decorators/Filter.js +0 -11
  251. package/decorators/Formula.d.ts +0 -5
  252. package/decorators/Formula.js +0 -18
  253. package/decorators/Indexed.d.ts +0 -17
  254. package/decorators/Indexed.js +0 -24
  255. package/decorators/ManyToMany.d.ts +0 -40
  256. package/decorators/ManyToMany.js +0 -16
  257. package/decorators/ManyToOne.d.ts +0 -30
  258. package/decorators/ManyToOne.js +0 -16
  259. package/decorators/OneToMany.d.ts +0 -28
  260. package/decorators/OneToMany.js +0 -20
  261. package/decorators/OneToOne.d.ts +0 -24
  262. package/decorators/OneToOne.js +0 -10
  263. package/decorators/PrimaryKey.d.ts +0 -9
  264. package/decorators/PrimaryKey.js +0 -23
  265. package/decorators/Property.d.ts +0 -250
  266. package/decorators/Property.js +0 -34
  267. package/decorators/Transactional.d.ts +0 -13
  268. package/decorators/Transactional.js +0 -31
  269. package/decorators/hooks.d.ts +0 -16
  270. package/decorators/hooks.js +0 -59
  271. package/decorators/index.d.ts +0 -17
  272. package/decorators/index.js +0 -36
  273. package/entity/ArrayCollection.d.ts +0 -116
  274. package/entity/ArrayCollection.js +0 -399
  275. package/entity/EntityValidator.d.ts +0 -19
  276. package/entity/EntityValidator.js +0 -154
  277. package/index.mjs +0 -199
  278. package/metadata/ReflectMetadataProvider.d.ts +0 -8
  279. package/metadata/ReflectMetadataProvider.js +0 -48
  280. package/utils/resolveContextProvider.d.ts +0 -10
  281. package/utils/resolveContextProvider.js +0 -31
package/typings.js CHANGED
@@ -1,18 +1,15 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EntityMetadata = exports.Config = exports.HiddenProps = exports.EagerProps = exports.OptionalProps = exports.PrimaryKeyProp = exports.EntityRepositoryType = void 0;
4
- const enums_1 = require("./enums");
5
- const Reference_1 = require("./entity/Reference");
6
- const EntityHelper_1 = require("./entity/EntityHelper");
7
- const Utils_1 = require("./utils/Utils");
8
- const EntityComparator_1 = require("./utils/EntityComparator");
9
- exports.EntityRepositoryType = Symbol('EntityRepositoryType');
10
- exports.PrimaryKeyProp = Symbol('PrimaryKeyProp');
11
- exports.OptionalProps = Symbol('OptionalProps');
12
- exports.EagerProps = Symbol('EagerProps');
13
- exports.HiddenProps = Symbol('HiddenProps');
14
- exports.Config = Symbol('Config');
15
- class EntityMetadata {
1
+ import { ReferenceKind, } from './enums.js';
2
+ import { Reference } from './entity/Reference.js';
3
+ import { EntityHelper } from './entity/EntityHelper.js';
4
+ import { Utils } from './utils/Utils.js';
5
+ import { EntityComparator } from './utils/EntityComparator.js';
6
+ export const EntityRepositoryType = Symbol('EntityRepositoryType');
7
+ export const PrimaryKeyProp = Symbol('PrimaryKeyProp');
8
+ export const OptionalProps = Symbol('OptionalProps');
9
+ export const EagerProps = Symbol('EagerProps');
10
+ export const HiddenProps = Symbol('HiddenProps');
11
+ export const Config = Symbol('Config');
12
+ export class EntityMetadata {
16
13
  static counter = 0;
17
14
  _id = 1000 * EntityMetadata.counter++; // keep the id >= 1000 to allow computing cache keys by simple addition
18
15
  propertyOrder = new Map();
@@ -35,7 +32,7 @@ class EntityMetadata {
35
32
  }
36
33
  this.properties[prop.name] = prop;
37
34
  this.propertyOrder.set(prop.name, this.props.length);
38
- /* istanbul ignore next */
35
+ /* v8 ignore next */
39
36
  if (sync) {
40
37
  this.sync();
41
38
  }
@@ -43,17 +40,34 @@ class EntityMetadata {
43
40
  removeProperty(name, sync = true) {
44
41
  delete this.properties[name];
45
42
  this.propertyOrder.delete(name);
46
- /* istanbul ignore next */
43
+ /* v8 ignore next */
47
44
  if (sync) {
48
45
  this.sync();
49
46
  }
50
47
  }
51
- getPrimaryProps() {
52
- return this.primaryKeys.map(pk => this.properties[pk]);
48
+ getPrimaryProps(flatten = false) {
49
+ const pks = this.primaryKeys.map(pk => this.properties[pk]);
50
+ if (flatten) {
51
+ return pks.flatMap(pk => {
52
+ if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(pk.kind)) {
53
+ return pk.targetMeta.getPrimaryProps(true);
54
+ }
55
+ return [pk];
56
+ });
57
+ }
58
+ return pks;
53
59
  }
54
60
  getPrimaryProp() {
55
61
  return this.properties[this.primaryKeys[0]];
56
62
  }
63
+ createColumnMappingObject() {
64
+ return Object.values(this.properties).reduce((o, prop) => {
65
+ if (prop.fieldNames) {
66
+ o[prop.name] = prop.fieldNames[0];
67
+ }
68
+ return o;
69
+ }, {});
70
+ }
57
71
  get tableName() {
58
72
  return this.collection;
59
73
  }
@@ -64,28 +78,35 @@ class EntityMetadata {
64
78
  this.root ??= this;
65
79
  const props = Object.values(this.properties).sort((a, b) => this.propertyOrder.get(a.name) - this.propertyOrder.get(b.name));
66
80
  this.props = [...props.filter(p => p.primary), ...props.filter(p => !p.primary)];
67
- this.relations = this.props.filter(prop => typeof prop.kind !== 'undefined' && prop.kind !== enums_1.ReferenceKind.SCALAR && prop.kind !== enums_1.ReferenceKind.EMBEDDED);
81
+ this.relations = this.props.filter(prop => typeof prop.kind !== 'undefined' && prop.kind !== ReferenceKind.SCALAR && prop.kind !== ReferenceKind.EMBEDDED);
68
82
  this.bidirectionalRelations = this.relations.filter(prop => prop.mappedBy || prop.inversedBy);
69
83
  this.uniqueProps = this.props.filter(prop => prop.unique);
70
84
  this.getterProps = this.props.filter(prop => prop.getter);
71
- this.comparableProps = this.props.filter(prop => EntityComparator_1.EntityComparator.isComparable(prop, this));
85
+ this.comparableProps = this.props.filter(prop => EntityComparator.isComparable(prop, this));
86
+ this.validateProps = this.props.filter(prop => {
87
+ if (prop.inherited || (prop.persist === false && prop.userDefined !== false)) {
88
+ return false;
89
+ }
90
+ return prop.kind === ReferenceKind.SCALAR && ['string', 'number', 'boolean', 'Date'].includes(prop.type);
91
+ });
72
92
  this.hydrateProps = this.props.filter(prop => {
73
93
  // `prop.userDefined` is either `undefined` or `false`
74
94
  const discriminator = this.root.discriminatorColumn === prop.name && prop.userDefined === false;
75
95
  // even if we don't have a setter, do not ignore value from database!
76
- const onlyGetter = prop.getter && !prop.setter;
96
+ const onlyGetter = prop.getter && !prop.setter && prop.persist === false;
77
97
  return !prop.inherited && prop.hydrate !== false && !discriminator && !prop.embedded && !onlyGetter;
78
98
  });
79
- this.trackingProps = this.hydrateProps
80
- .filter(prop => !prop.getter && !prop.setter && prop.trackChanges !== false)
81
- .filter(prop => ![enums_1.ReferenceKind.ONE_TO_MANY, enums_1.ReferenceKind.MANY_TO_MANY].includes(prop.kind))
82
- .filter(prop => !prop.serializedPrimaryKey);
83
- this.selfReferencing = this.relations.some(prop => [this.className, this.root.className].includes(prop.targetMeta?.root.className ?? prop.type));
99
+ this.trackingProps = this.hydrateProps.filter(prop => {
100
+ return !prop.getter && !prop.setter && [ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind);
101
+ });
102
+ this.selfReferencing = this.relations.some(prop => {
103
+ return [this.className, this.root.className].includes(prop.targetMeta?.root.className ?? prop.type);
104
+ });
84
105
  this.hasUniqueProps = this.uniques.length + this.uniqueProps.length > 0;
85
106
  this.virtual = !!this.expression;
86
107
  if (config) {
87
108
  for (const prop of this.props) {
88
- if (prop.enum && !prop.nativeEnumName && prop.items?.every(item => Utils_1.Utils.isString(item))) {
109
+ if (prop.enum && !prop.nativeEnumName && prop.items?.every(item => typeof item === 'string')) {
89
110
  const name = config.getNamingStrategy().indexName(this.tableName, prop.fieldNames, 'check');
90
111
  const exists = this.checks.findIndex(check => check.name === name);
91
112
  if (exists !== -1) {
@@ -99,11 +120,11 @@ class EntityMetadata {
99
120
  }
100
121
  }
101
122
  }
102
- this.checks = Utils_1.Utils.removeDuplicates(this.checks);
103
- this.indexes = Utils_1.Utils.removeDuplicates(this.indexes);
104
- this.uniques = Utils_1.Utils.removeDuplicates(this.uniques);
105
- for (const hook of Utils_1.Utils.keys(this.hooks)) {
106
- this.hooks[hook] = Utils_1.Utils.removeDuplicates(this.hooks[hook]);
123
+ this.checks = Utils.removeDuplicates(this.checks);
124
+ this.indexes = Utils.removeDuplicates(this.indexes);
125
+ this.uniques = Utils.removeDuplicates(this.uniques);
126
+ for (const hook of Utils.keys(this.hooks)) {
127
+ this.hooks[hook] = Utils.removeDuplicates(this.hooks[hook]);
107
128
  }
108
129
  if (this.virtual) {
109
130
  this.readonly = true;
@@ -112,8 +133,7 @@ class EntityMetadata {
112
133
  this.props.forEach(prop => this.initIndexes(prop));
113
134
  }
114
135
  this.definedProperties = this.trackingProps.reduce((o, prop) => {
115
- const isCollection = [enums_1.ReferenceKind.ONE_TO_MANY, enums_1.ReferenceKind.MANY_TO_MANY].includes(prop.kind);
116
- const isReference = [enums_1.ReferenceKind.ONE_TO_ONE, enums_1.ReferenceKind.MANY_TO_ONE].includes(prop.kind) && (prop.inversedBy || prop.mappedBy) && !prop.mapToPk;
136
+ const isReference = (prop.inversedBy || prop.mappedBy) && !prop.mapToPk;
117
137
  if (isReference) {
118
138
  // eslint-disable-next-line @typescript-eslint/no-this-alias
119
139
  const meta = this;
@@ -124,53 +144,36 @@ class EntityMetadata {
124
144
  set(val) {
125
145
  const wrapped = this.__helper;
126
146
  const hydrator = wrapped.hydrator;
127
- const entity = Reference_1.Reference.unwrapReference(val ?? wrapped.__data[prop.name]);
128
- const old = Reference_1.Reference.unwrapReference(wrapped.__data[prop.name]);
129
- wrapped.__data[prop.name] = Reference_1.Reference.wrapReference(val, prop);
147
+ const entity = Reference.unwrapReference(val ?? wrapped.__data[prop.name]);
148
+ const old = Reference.unwrapReference(wrapped.__data[prop.name]);
149
+ if (old && old !== entity && prop.kind === ReferenceKind.MANY_TO_ONE && prop.inversedBy && old[prop.inversedBy]) {
150
+ old[prop.inversedBy].removeWithoutPropagation(this);
151
+ }
152
+ wrapped.__data[prop.name] = Reference.wrapReference(val, prop);
130
153
  // when propagation from inside hydration, we set the FK to the entity data immediately
131
154
  if (val && hydrator.isRunning() && wrapped.__originalEntityData && prop.owner) {
132
- wrapped.__originalEntityData[prop.name] = Utils_1.Utils.getPrimaryKeyValues(val, prop.targetMeta.primaryKeys, true);
155
+ wrapped.__originalEntityData[prop.name] = Utils.getPrimaryKeyValues(val, prop.targetMeta, true);
133
156
  }
134
- else {
135
- wrapped.__touched = !hydrator.isRunning();
136
- }
137
- EntityHelper_1.EntityHelper.propagate(meta, entity, this, prop, Reference_1.Reference.unwrapReference(val), old);
157
+ EntityHelper.propagate(meta, entity, this, prop, Reference.unwrapReference(val), old);
138
158
  },
139
159
  enumerable: true,
140
160
  configurable: true,
141
161
  };
142
162
  }
143
- if (prop.inherited || prop.primary || isCollection || prop.persist === false || prop.trackChanges === false || isReference || prop.embedded) {
144
- return o;
145
- }
146
- o[prop.name] = {
147
- get() {
148
- return this.__helper.__data[prop.name];
149
- },
150
- set(val) {
151
- if (typeof val === 'object' && !!val && '__raw' in val) {
152
- val.assign();
153
- }
154
- this.__helper.__data[prop.name] = val;
155
- this.__helper.__touched = !this.__helper.hydrator.isRunning();
156
- },
157
- enumerable: true,
158
- configurable: true,
159
- };
160
163
  return o;
161
164
  }, { __gettersDefined: { value: true, enumerable: false } });
162
165
  }
163
166
  initIndexes(prop) {
164
167
  const simpleIndex = this.indexes.find(index => index.properties === prop.name && !index.options && !index.type && !index.expression);
165
168
  const simpleUnique = this.uniques.find(index => index.properties === prop.name && !index.options);
166
- const owner = prop.kind === enums_1.ReferenceKind.MANY_TO_ONE;
169
+ const owner = prop.kind === ReferenceKind.MANY_TO_ONE;
167
170
  if (!prop.index && simpleIndex) {
168
- Utils_1.Utils.defaultValue(simpleIndex, 'name', true);
171
+ Utils.defaultValue(simpleIndex, 'name', true);
169
172
  prop.index = simpleIndex.name;
170
173
  this.indexes.splice(this.indexes.indexOf(simpleIndex), 1);
171
174
  }
172
175
  if (!prop.unique && simpleUnique) {
173
- Utils_1.Utils.defaultValue(simpleUnique, 'name', true);
176
+ Utils.defaultValue(simpleUnique, 'name', true);
174
177
  prop.unique = simpleUnique.name;
175
178
  this.uniques.splice(this.uniques.indexOf(simpleUnique), 1);
176
179
  }
@@ -178,7 +181,7 @@ class EntityMetadata {
178
181
  this.indexes.push({ properties: prop.name });
179
182
  prop.index = false;
180
183
  }
181
- /* istanbul ignore next */
184
+ /* v8 ignore next */
182
185
  if (owner && prop.fieldNames.length > 1 && prop.unique) {
183
186
  this.uniques.push({ properties: prop.name });
184
187
  prop.unique = false;
@@ -189,4 +192,3 @@ class EntityMetadata {
189
192
  return this;
190
193
  }
191
194
  }
192
- exports.EntityMetadata = EntityMetadata;
@@ -1,5 +1,4 @@
1
- import { inspect } from 'node:util';
2
- import type { EntityData, EntityMetadata, EntityDictionary, Primary } from '../typings';
1
+ import type { EntityData, EntityMetadata, EntityDictionary, Primary } from '../typings.js';
3
2
  export declare class ChangeSet<T extends object> {
4
3
  entity: T;
5
4
  type: ChangeSetType;
@@ -10,8 +9,6 @@ export declare class ChangeSet<T extends object> {
10
9
  constructor(entity: T, type: ChangeSetType, payload: EntityDictionary<T>, meta: EntityMetadata<T>);
11
10
  getPrimaryKey(object?: boolean): Primary<T> | null;
12
11
  getSerializedPrimaryKey(): string | null;
13
- /** @ignore */
14
- [inspect.custom](depth?: number): string;
15
12
  }
16
13
  export interface ChangeSet<T> {
17
14
  name: string;
@@ -1,10 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChangeSetType = exports.ChangeSet = void 0;
4
- const node_util_1 = require("node:util");
5
- const wrap_1 = require("../entity/wrap");
6
- const Utils_1 = require("../utils/Utils");
7
- class ChangeSet {
1
+ import { helper } from '../entity/wrap.js';
2
+ import { Utils } from '../utils/Utils.js';
3
+ import { inspect } from '../logging/inspect.js';
4
+ export class ChangeSet {
8
5
  entity;
9
6
  type;
10
7
  payload;
@@ -19,11 +16,11 @@ class ChangeSet {
19
16
  this.name = meta.className;
20
17
  this.rootName = meta.root.className;
21
18
  this.collection = meta.root.collection;
22
- this.schema = (0, wrap_1.helper)(entity).__schema ?? meta.root.schema;
19
+ this.schema = helper(entity).__schema ?? meta.root.schema;
23
20
  }
24
21
  getPrimaryKey(object = false) {
25
22
  if (!this.originalEntity) {
26
- this.primaryKey ??= (0, wrap_1.helper)(this.entity).getPrimaryKey(true);
23
+ this.primaryKey ??= helper(this.entity).getPrimaryKey(true);
27
24
  }
28
25
  else if (this.meta.compositePK) {
29
26
  this.primaryKey = this.meta.primaryKeys.map(pk => this.originalEntity[pk]);
@@ -40,31 +37,30 @@ class ChangeSet {
40
37
  });
41
38
  }
42
39
  if (object && this.primaryKey != null) {
43
- return Utils_1.Utils.primaryKeyToObject(this.meta, this.primaryKey);
40
+ return Utils.primaryKeyToObject(this.meta, this.primaryKey);
44
41
  }
45
42
  return this.primaryKey ?? null;
46
43
  }
47
44
  getSerializedPrimaryKey() {
48
- this.serializedPrimaryKey ??= (0, wrap_1.helper)(this.entity).getSerializedPrimaryKey();
45
+ this.serializedPrimaryKey ??= helper(this.entity).getSerializedPrimaryKey();
49
46
  return this.serializedPrimaryKey;
50
47
  }
51
48
  /** @ignore */
52
- [node_util_1.inspect.custom](depth = 2) {
49
+ [Symbol.for('nodejs.util.inspect.custom')](depth = 2) {
53
50
  const object = { ...this };
54
51
  const hidden = ['meta', 'serializedPrimaryKey'];
55
52
  hidden.forEach(k => delete object[k]);
56
- const ret = (0, node_util_1.inspect)(object, { depth });
53
+ const ret = inspect(object, { depth });
57
54
  const name = `${this.constructor.name}<${this.meta.className}>`;
58
- /* istanbul ignore next */
55
+ /* v8 ignore next */
59
56
  return ret === '[Object]' ? `[${name}]` : name + ' ' + ret;
60
57
  }
61
58
  }
62
- exports.ChangeSet = ChangeSet;
63
- var ChangeSetType;
59
+ export var ChangeSetType;
64
60
  (function (ChangeSetType) {
65
61
  ChangeSetType["CREATE"] = "create";
66
62
  ChangeSetType["UPDATE"] = "update";
67
63
  ChangeSetType["DELETE"] = "delete";
68
64
  ChangeSetType["UPDATE_EARLY"] = "update_early";
69
65
  ChangeSetType["DELETE_EARLY"] = "delete_early";
70
- })(ChangeSetType || (exports.ChangeSetType = ChangeSetType = {}));
66
+ })(ChangeSetType || (ChangeSetType = {}));
@@ -1,19 +1,18 @@
1
- import { type Configuration } from '../utils/Configuration';
2
- import type { MetadataStorage } from '../metadata';
3
- import type { AnyEntity } from '../typings';
4
- import { ChangeSet } from './ChangeSet';
5
- import { type Collection, type EntityValidator } from '../entity';
6
- import type { Platform } from '../platforms';
7
- import type { EntityManager } from '../EntityManager';
1
+ import { type Configuration } from '../utils/Configuration.js';
2
+ import type { MetadataStorage } from '../metadata/MetadataStorage.js';
3
+ import type { AnyEntity } from '../typings.js';
4
+ import { ChangeSet } from './ChangeSet.js';
5
+ import { type Collection } from '../entity/Collection.js';
6
+ import type { Platform } from '../platforms/Platform.js';
7
+ import type { EntityManager } from '../EntityManager.js';
8
8
  export declare class ChangeSetComputer {
9
- private readonly validator;
10
9
  private readonly collectionUpdates;
11
10
  private readonly metadata;
12
11
  private readonly platform;
13
12
  private readonly config;
14
13
  private readonly em;
15
14
  private readonly comparator;
16
- constructor(validator: EntityValidator, collectionUpdates: Set<Collection<AnyEntity>>, metadata: MetadataStorage, platform: Platform, config: Configuration, em: EntityManager);
15
+ constructor(collectionUpdates: Set<Collection<AnyEntity>>, metadata: MetadataStorage, platform: Platform, config: Configuration, em: EntityManager);
17
16
  computeChangeSet<T extends object>(entity: T): ChangeSet<T> | null;
18
17
  /**
19
18
  * Traverses entity graph and executes `onCreate` and `onUpdate` methods, assigning the values to given properties.
@@ -1,20 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChangeSetComputer = void 0;
4
- const Utils_1 = require("../utils/Utils");
5
- const ChangeSet_1 = require("./ChangeSet");
6
- const entity_1 = require("../entity");
7
- const enums_1 = require("../enums");
8
- class ChangeSetComputer {
9
- validator;
1
+ import { Utils } from '../utils/Utils.js';
2
+ import { ChangeSet, ChangeSetType } from './ChangeSet.js';
3
+ import { helper } from '../entity/wrap.js';
4
+ import { validateEntity } from '../entity/validators.js';
5
+ import { ReferenceKind } from '../enums.js';
6
+ export class ChangeSetComputer {
10
7
  collectionUpdates;
11
8
  metadata;
12
9
  platform;
13
10
  config;
14
11
  em;
15
12
  comparator;
16
- constructor(validator, collectionUpdates, metadata, platform, config, em) {
17
- this.validator = validator;
13
+ constructor(collectionUpdates, metadata, platform, config, em) {
18
14
  this.collectionUpdates = collectionUpdates;
19
15
  this.metadata = metadata;
20
16
  this.platform = platform;
@@ -27,33 +23,34 @@ class ChangeSetComputer {
27
23
  if (meta.readonly) {
28
24
  return null;
29
25
  }
30
- const wrapped = (0, entity_1.helper)(entity);
31
- const type = wrapped.__originalEntityData ? ChangeSet_1.ChangeSetType.UPDATE : ChangeSet_1.ChangeSetType.CREATE;
26
+ const wrapped = helper(entity);
27
+ const type = wrapped.__originalEntityData ? ChangeSetType.UPDATE : ChangeSetType.CREATE;
32
28
  const map = new Map();
33
29
  // Execute `onCreate` and `onUpdate` on properties recursively, saves `onUpdate` results
34
30
  // to the `map` as we want to apply those only if something else changed.
35
- if (type === ChangeSet_1.ChangeSetType.CREATE) { // run update hooks only after we know there are other changes
31
+ if (type === ChangeSetType.CREATE) { // run update hooks only after we know there are other changes
36
32
  for (const prop of meta.hydrateProps) {
37
33
  this.processPropertyInitializers(entity, prop, type, map);
38
34
  }
39
35
  }
40
- if (type === ChangeSet_1.ChangeSetType.UPDATE && !wrapped.__initialized && !wrapped.isTouched()) {
41
- return null;
36
+ if (type === ChangeSetType.UPDATE && !wrapped.__initialized) {
37
+ const data = this.comparator.prepareEntity(entity);
38
+ if (Utils.equals(data, wrapped.__originalEntityData)) {
39
+ return null;
40
+ }
42
41
  }
43
- const changeSet = new ChangeSet_1.ChangeSet(entity, type, this.computePayload(entity), meta);
42
+ const changeSet = new ChangeSet(entity, type, this.computePayload(entity), meta);
44
43
  changeSet.originalEntity = wrapped.__originalEntityData;
45
- if (this.config.get('validate')) {
46
- this.validator.validate(changeSet.entity, changeSet.payload, meta);
47
- }
48
44
  for (const prop of meta.relations.filter(prop => prop.persist !== false || prop.userDefined === false)) {
49
45
  this.processProperty(changeSet, prop);
50
46
  }
51
- if (changeSet.type === ChangeSet_1.ChangeSetType.UPDATE && !Utils_1.Utils.hasObjectKeys(changeSet.payload)) {
47
+ if (changeSet.type === ChangeSetType.UPDATE && !Utils.hasObjectKeys(changeSet.payload)) {
52
48
  return null;
53
49
  }
50
+ validateEntity(changeSet.entity, meta);
54
51
  // Execute `onCreate` and `onUpdate` on properties recursively, saves `onUpdate` results
55
52
  // to the `map` as we want to apply those only if something else changed.
56
- if (type === ChangeSet_1.ChangeSetType.UPDATE) {
53
+ if (type === ChangeSetType.UPDATE) {
57
54
  for (const prop of meta.hydrateProps) {
58
55
  this.processPropertyInitializers(entity, prop, type, map);
59
56
  }
@@ -66,7 +63,7 @@ class ChangeSetComputer {
66
63
  }
67
64
  // Recompute the changeset, we need to merge this as here we ignore relations.
68
65
  const diff = this.computePayload(entity, true);
69
- Utils_1.Utils.merge(changeSet.payload, diff);
66
+ Utils.merge(changeSet.payload, diff);
70
67
  }
71
68
  return changeSet;
72
69
  }
@@ -75,17 +72,17 @@ class ChangeSetComputer {
75
72
  */
76
73
  processPropertyInitializers(entity, prop, type, map, nested) {
77
74
  if (prop.onCreate
78
- && type === ChangeSet_1.ChangeSetType.CREATE
75
+ && type === ChangeSetType.CREATE
79
76
  && (entity[prop.name] == null
80
- || (Utils_1.Utils.isScalarReference(entity[prop.name]) && entity[prop.name].unwrap() == null))) {
77
+ || (Utils.isScalarReference(entity[prop.name]) && entity[prop.name].unwrap() == null))) {
81
78
  entity[prop.name] = prop.onCreate(entity, this.em);
82
79
  }
83
- if (prop.onUpdate && type === ChangeSet_1.ChangeSetType.UPDATE) {
80
+ if (prop.onUpdate && type === ChangeSetType.UPDATE) {
84
81
  const pairs = map.get(entity) ?? [];
85
82
  pairs.push([prop.name, prop.onUpdate(entity, this.em)]);
86
83
  map.set(entity, pairs);
87
84
  }
88
- if (prop.kind === enums_1.ReferenceKind.EMBEDDED && entity[prop.name]) {
85
+ if (prop.kind === ReferenceKind.EMBEDDED && entity[prop.name]) {
89
86
  for (const embeddedProp of prop.targetMeta.hydrateProps) {
90
87
  this.processPropertyInitializers(entity[prop.name], embeddedProp, type, map, nested || prop.object);
91
88
  }
@@ -93,7 +90,7 @@ class ChangeSetComputer {
93
90
  }
94
91
  computePayload(entity, ignoreUndefined = false) {
95
92
  const data = this.comparator.prepareEntity(entity);
96
- const wrapped = (0, entity_1.helper)(entity);
93
+ const wrapped = helper(entity);
97
94
  const entityName = wrapped.__meta.className;
98
95
  const originalEntityData = wrapped.__originalEntityData;
99
96
  if (!wrapped.__initialized) {
@@ -106,7 +103,7 @@ class ChangeSetComputer {
106
103
  const comparator = this.comparator.getEntityComparator(entityName);
107
104
  const diff = comparator(originalEntityData, data);
108
105
  if (ignoreUndefined) {
109
- Utils_1.Utils.keys(diff)
106
+ Utils.keys(diff)
110
107
  .filter(k => diff[k] === undefined)
111
108
  .forEach(k => delete diff[k]);
112
109
  }
@@ -116,38 +113,39 @@ class ChangeSetComputer {
116
113
  }
117
114
  processProperty(changeSet, prop, target) {
118
115
  if (!target) {
119
- const targets = Utils_1.Utils.unwrapProperty(changeSet.entity, changeSet.meta, prop);
116
+ const targets = Utils.unwrapProperty(changeSet.entity, changeSet.meta, prop);
120
117
  targets.forEach(([t]) => this.processProperty(changeSet, prop, t));
121
118
  return;
122
119
  }
123
- if (Utils_1.Utils.isCollection(target)) { // m:n or 1:m
120
+ if (Utils.isCollection(target)) { // m:n or 1:m
124
121
  this.processToMany(prop, changeSet);
125
122
  }
126
- if ([enums_1.ReferenceKind.MANY_TO_ONE, enums_1.ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {
123
+ if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {
127
124
  this.processToOne(prop, changeSet);
128
125
  }
129
126
  }
130
127
  processToOne(prop, changeSet) {
131
- const isToOneOwner = prop.kind === enums_1.ReferenceKind.MANY_TO_ONE || (prop.kind === enums_1.ReferenceKind.ONE_TO_ONE && prop.owner);
128
+ const isToOneOwner = prop.kind === ReferenceKind.MANY_TO_ONE || (prop.kind === ReferenceKind.ONE_TO_ONE && prop.owner);
132
129
  if (!isToOneOwner || prop.mapToPk) {
133
130
  return;
134
131
  }
135
- const targets = Utils_1.Utils.unwrapProperty(changeSet.entity, changeSet.meta, prop);
132
+ const targets = Utils.unwrapProperty(changeSet.entity, changeSet.meta, prop);
136
133
  targets.forEach(([target, idx]) => {
137
134
  if (!target.__helper.hasPrimaryKey()) {
138
- Utils_1.Utils.setPayloadProperty(changeSet.payload, this.metadata.find(changeSet.name), prop, target.__helper.__identifier, idx);
135
+ Utils.setPayloadProperty(changeSet.payload, this.metadata.find(changeSet.name), prop, target.__helper.__identifier, idx);
139
136
  }
140
137
  });
141
138
  }
142
139
  processToMany(prop, changeSet) {
143
140
  const target = changeSet.entity[prop.name];
144
- if (!target.isDirty() && changeSet.type !== ChangeSet_1.ChangeSetType.CREATE) {
141
+ if (!target.isDirty() && changeSet.type !== ChangeSetType.CREATE) {
145
142
  return;
146
143
  }
147
- this.collectionUpdates.add(target);
144
+ if (target.isDirty()) {
145
+ this.collectionUpdates.add(target);
146
+ }
148
147
  if (prop.owner && !this.platform.usesPivotTable()) {
149
148
  changeSet.payload[prop.name] = target.getItems(false).map((item) => item.__helper.__identifier ?? item.__helper.getPrimaryKey());
150
149
  }
151
150
  }
152
151
  }
153
- exports.ChangeSetComputer = ChangeSetComputer;
@@ -1,28 +1,30 @@
1
- import type { MetadataStorage } from '../metadata';
2
- import type { Dictionary, EntityDictionary, EntityMetadata, IHydrator } from '../typings';
3
- import { type EntityFactory, type EntityValidator } from '../entity';
4
- import { type ChangeSet } from './ChangeSet';
5
- import { type Configuration } from '../utils/Configuration';
6
- import type { DriverMethodOptions, IDatabaseDriver } from '../drivers';
1
+ import type { MetadataStorage } from '../metadata/MetadataStorage.js';
2
+ import type { Dictionary, EntityDictionary, EntityMetadata, IHydrator } from '../typings.js';
3
+ import { type EntityFactory } from '../entity/EntityFactory.js';
4
+ import { type ChangeSet } from './ChangeSet.js';
5
+ import { type Configuration } from '../utils/Configuration.js';
6
+ import type { DriverMethodOptions, IDatabaseDriver } from '../drivers/IDatabaseDriver.js';
7
+ import type { EntityManager } from '../EntityManager.js';
7
8
  export declare class ChangeSetPersister {
8
9
  private readonly driver;
9
10
  private readonly metadata;
10
11
  private readonly hydrator;
11
12
  private readonly factory;
12
- private readonly validator;
13
13
  private readonly config;
14
+ private readonly em;
14
15
  private readonly platform;
15
16
  private readonly comparator;
16
17
  private readonly usesReturningStatement;
17
- constructor(driver: IDatabaseDriver, metadata: MetadataStorage, hydrator: IHydrator, factory: EntityFactory, validator: EntityValidator, config: Configuration);
18
+ constructor(driver: IDatabaseDriver, metadata: MetadataStorage, hydrator: IHydrator, factory: EntityFactory, config: Configuration, em: EntityManager);
18
19
  executeInserts<T extends object>(changeSets: ChangeSet<T>[], options?: DriverMethodOptions, withSchema?: boolean): Promise<void>;
19
20
  executeUpdates<T extends object>(changeSets: ChangeSet<T>[], batched: boolean, options?: DriverMethodOptions, withSchema?: boolean): Promise<void>;
20
21
  executeDeletes<T extends object>(changeSets: ChangeSet<T>[], options?: DriverMethodOptions, withSchema?: boolean): Promise<void>;
21
22
  private runForEachSchema;
23
+ private validateRequired;
22
24
  private processProperties;
23
25
  private persistNewEntity;
24
26
  private persistNewEntities;
25
- private propagateSchemaFromMetadata;
27
+ private prepareOptions;
26
28
  private persistNewEntitiesBatch;
27
29
  private persistManagedEntity;
28
30
  private persistManagedEntities;