@mikro-orm/core 6.5.10-dev.5 → 6.5.10-dev.6

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.
@@ -160,6 +160,7 @@ class EntityFactory {
160
160
  this.create(prop.type, data[prop.name], options); // we can ignore the value, we just care about the `mergeData` call
161
161
  }
162
162
  });
163
+ this.unitOfWork.normalizeEntityData(meta, originalEntityData);
163
164
  (0, wrap_1.helper)(entity).__touched = false;
164
165
  }
165
166
  createReference(entityName, id, options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/core",
3
- "version": "6.5.10-dev.5",
3
+ "version": "6.5.10-dev.6",
4
4
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -64,7 +64,7 @@
64
64
  "esprima": "4.0.1",
65
65
  "fs-extra": "11.3.2",
66
66
  "globby": "11.1.0",
67
- "mikro-orm": "6.5.10-dev.5",
67
+ "mikro-orm": "6.5.10-dev.6",
68
68
  "reflect-metadata": "0.2.2"
69
69
  }
70
70
  }
@@ -27,6 +27,12 @@ export declare class UnitOfWork {
27
27
  private working;
28
28
  constructor(em: EntityManager);
29
29
  merge<T extends object>(entity: T, visited?: Set<AnyEntity>): void;
30
+ /**
31
+ * Entity data can wary in its shape, e.g. we might get a deep relation graph with joined strategy, but for diffing,
32
+ * we need to normalize the shape, so relation values are only raw FKs. This method handles that.
33
+ * @internal
34
+ */
35
+ normalizeEntityData<T extends object>(meta: EntityMetadata<T>, data: EntityData<T>): void;
30
36
  /**
31
37
  * @internal
32
38
  */
@@ -64,6 +64,40 @@ class UnitOfWork {
64
64
  }
65
65
  this.cascade(entity, enums_1.Cascade.MERGE, visited ?? new Set());
66
66
  }
67
+ /**
68
+ * Entity data can wary in its shape, e.g. we might get a deep relation graph with joined strategy, but for diffing,
69
+ * we need to normalize the shape, so relation values are only raw FKs. This method handles that.
70
+ * @internal
71
+ */
72
+ normalizeEntityData(meta, data) {
73
+ const forceUndefined = this.em.config.get('forceUndefined');
74
+ for (const key of Utils_1.Utils.keys(data)) {
75
+ const prop = meta.properties[key];
76
+ if (!prop) {
77
+ continue;
78
+ }
79
+ if ([enums_1.ReferenceKind.MANY_TO_ONE, enums_1.ReferenceKind.ONE_TO_ONE].includes(prop.kind) && Utils_1.Utils.isPlainObject(data[prop.name])) {
80
+ data[prop.name] = Utils_1.Utils.getPrimaryKeyValues(data[prop.name], prop.targetMeta, true);
81
+ }
82
+ else if (prop.kind === enums_1.ReferenceKind.EMBEDDED && !prop.object && Utils_1.Utils.isPlainObject(data[prop.name])) {
83
+ for (const p of prop.targetMeta.props) {
84
+ /* istanbul ignore next */
85
+ const prefix = prop.prefix === false ? '' : prop.prefix === true ? prop.name + '_' : prop.prefix;
86
+ data[prefix + p.name] = data[prop.name][p.name];
87
+ }
88
+ data[prop.name] = Utils_1.Utils.getPrimaryKeyValues(data[prop.name], prop.targetMeta, true);
89
+ }
90
+ if (prop.hydrate === false && prop.customType?.ensureComparable(meta, prop)) {
91
+ const converted = prop.customType.convertToJSValue(data[key], this.platform, { key, mode: 'hydration', force: true });
92
+ data[key] = prop.customType.convertToDatabaseValue(converted, this.platform, { key, mode: 'hydration' });
93
+ }
94
+ if (forceUndefined) {
95
+ if (data[key] === null) {
96
+ data[key] = undefined;
97
+ }
98
+ }
99
+ }
100
+ }
67
101
  /**
68
102
  * @internal
69
103
  */
@@ -81,31 +115,11 @@ class UnitOfWork {
81
115
  wrapped.__em ??= this.em;
82
116
  wrapped.__managed = true;
83
117
  if (data && (options?.refresh || !wrapped.__originalEntityData)) {
118
+ this.normalizeEntityData(wrapped.__meta, data);
84
119
  for (const key of Utils_1.Utils.keys(data)) {
85
120
  const prop = wrapped.__meta.properties[key];
86
- if (!prop) {
87
- continue;
88
- }
89
- wrapped.__loadedProperties.add(key);
90
- if ([enums_1.ReferenceKind.MANY_TO_ONE, enums_1.ReferenceKind.ONE_TO_ONE].includes(prop.kind) && Utils_1.Utils.isPlainObject(data[prop.name])) {
91
- data[prop.name] = Utils_1.Utils.getPrimaryKeyValues(data[prop.name], prop.targetMeta, true);
92
- }
93
- else if (prop.kind === enums_1.ReferenceKind.EMBEDDED && !prop.object && Utils_1.Utils.isPlainObject(data[prop.name])) {
94
- for (const p of prop.targetMeta.props) {
95
- /* istanbul ignore next */
96
- const prefix = prop.prefix === false ? '' : prop.prefix === true ? prop.name + '_' : prop.prefix;
97
- data[prefix + p.name] = data[prop.name][p.name];
98
- }
99
- data[prop.name] = Utils_1.Utils.getPrimaryKeyValues(data[prop.name], prop.targetMeta, true);
100
- }
101
- if (prop.hydrate === false && prop.customType?.ensureComparable(wrapped.__meta, prop)) {
102
- const converted = prop.customType.convertToJSValue(data[key], this.platform, { key, mode: 'hydration', force: true });
103
- data[key] = prop.customType.convertToDatabaseValue(converted, this.platform, { key, mode: 'hydration' });
104
- }
105
- if (forceUndefined) {
106
- if (data[key] === null) {
107
- data[key] = undefined;
108
- }
121
+ if (prop) {
122
+ wrapped.__loadedProperties.add(key);
109
123
  }
110
124
  }
111
125
  wrapped.__originalEntityData = data;