@mikro-orm/core 7.0.0-dev.2 → 7.0.0-dev.200
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/EntityManager.d.ts +111 -61
- package/EntityManager.js +346 -300
- package/MikroORM.d.ts +44 -35
- package/MikroORM.js +103 -143
- package/README.md +3 -2
- package/cache/FileCacheAdapter.d.ts +1 -1
- package/cache/FileCacheAdapter.js +8 -7
- package/cache/GeneratedCacheAdapter.d.ts +0 -1
- package/cache/GeneratedCacheAdapter.js +0 -2
- package/cache/index.d.ts +0 -1
- package/cache/index.js +0 -1
- package/connections/Connection.d.ts +16 -7
- package/connections/Connection.js +23 -14
- package/drivers/DatabaseDriver.d.ts +25 -16
- package/drivers/DatabaseDriver.js +80 -35
- package/drivers/IDatabaseDriver.d.ts +47 -17
- package/entity/BaseEntity.d.ts +2 -2
- package/entity/BaseEntity.js +0 -3
- package/entity/Collection.d.ts +95 -31
- package/entity/Collection.js +444 -102
- package/entity/EntityAssigner.d.ts +1 -1
- package/entity/EntityAssigner.js +26 -18
- package/entity/EntityFactory.d.ts +13 -1
- package/entity/EntityFactory.js +88 -54
- package/entity/EntityHelper.d.ts +2 -2
- package/entity/EntityHelper.js +38 -15
- package/entity/EntityLoader.d.ts +8 -7
- package/entity/EntityLoader.js +134 -80
- package/entity/EntityRepository.d.ts +24 -4
- package/entity/EntityRepository.js +8 -2
- package/entity/Reference.d.ts +9 -12
- package/entity/Reference.js +34 -9
- package/entity/WrappedEntity.d.ts +2 -7
- package/entity/WrappedEntity.js +3 -8
- package/entity/defineEntity.d.ts +585 -0
- package/entity/defineEntity.js +533 -0
- package/entity/index.d.ts +3 -2
- package/entity/index.js +3 -2
- package/entity/utils.d.ts +7 -0
- package/entity/utils.js +16 -4
- package/entity/validators.d.ts +11 -0
- package/entity/validators.js +65 -0
- package/enums.d.ts +22 -6
- package/enums.js +15 -1
- package/errors.d.ts +23 -9
- package/errors.js +59 -21
- package/events/EventManager.d.ts +2 -1
- package/events/EventManager.js +19 -11
- package/events/EventSubscriber.d.ts +3 -1
- package/hydration/Hydrator.js +1 -2
- package/hydration/ObjectHydrator.d.ts +4 -4
- package/hydration/ObjectHydrator.js +53 -33
- package/index.d.ts +2 -2
- package/index.js +1 -2
- package/logging/DefaultLogger.d.ts +1 -1
- package/logging/DefaultLogger.js +1 -0
- package/logging/SimpleLogger.d.ts +1 -1
- package/logging/colors.d.ts +1 -1
- package/logging/colors.js +7 -6
- package/logging/index.d.ts +1 -0
- package/logging/index.js +1 -0
- package/logging/inspect.d.ts +2 -0
- package/logging/inspect.js +11 -0
- package/metadata/EntitySchema.d.ts +26 -26
- package/metadata/EntitySchema.js +82 -51
- package/metadata/MetadataDiscovery.d.ts +7 -10
- package/metadata/MetadataDiscovery.js +408 -335
- package/metadata/MetadataProvider.d.ts +11 -2
- package/metadata/MetadataProvider.js +46 -2
- package/metadata/MetadataStorage.d.ts +13 -11
- package/metadata/MetadataStorage.js +70 -37
- package/metadata/MetadataValidator.d.ts +17 -9
- package/metadata/MetadataValidator.js +100 -42
- package/metadata/discover-entities.d.ts +5 -0
- package/metadata/discover-entities.js +40 -0
- package/metadata/index.d.ts +1 -1
- package/metadata/index.js +1 -1
- package/metadata/types.d.ts +502 -0
- package/metadata/types.js +1 -0
- package/naming-strategy/AbstractNamingStrategy.d.ts +12 -4
- package/naming-strategy/AbstractNamingStrategy.js +14 -2
- package/naming-strategy/EntityCaseNamingStrategy.d.ts +3 -3
- package/naming-strategy/EntityCaseNamingStrategy.js +6 -5
- package/naming-strategy/MongoNamingStrategy.d.ts +3 -3
- package/naming-strategy/MongoNamingStrategy.js +6 -6
- package/naming-strategy/NamingStrategy.d.ts +24 -4
- package/naming-strategy/UnderscoreNamingStrategy.d.ts +3 -3
- package/naming-strategy/UnderscoreNamingStrategy.js +6 -6
- package/not-supported.d.ts +2 -0
- package/not-supported.js +4 -0
- package/package.json +19 -11
- package/platforms/ExceptionConverter.js +1 -1
- package/platforms/Platform.d.ts +7 -13
- package/platforms/Platform.js +20 -43
- package/serialization/EntitySerializer.d.ts +5 -0
- package/serialization/EntitySerializer.js +47 -27
- package/serialization/EntityTransformer.js +28 -18
- package/serialization/SerializationContext.d.ts +6 -6
- package/serialization/SerializationContext.js +16 -13
- package/types/ArrayType.d.ts +1 -1
- package/types/ArrayType.js +2 -3
- package/types/BigIntType.d.ts +9 -6
- package/types/BigIntType.js +4 -1
- package/types/BlobType.d.ts +0 -1
- package/types/BlobType.js +0 -3
- package/types/BooleanType.d.ts +2 -1
- package/types/BooleanType.js +3 -0
- package/types/DecimalType.d.ts +6 -4
- package/types/DecimalType.js +3 -3
- package/types/DoubleType.js +2 -2
- package/types/EnumArrayType.js +1 -2
- package/types/JsonType.d.ts +1 -1
- package/types/JsonType.js +7 -2
- package/types/TinyIntType.js +1 -1
- package/types/Type.d.ts +2 -4
- package/types/Type.js +3 -3
- package/types/Uint8ArrayType.d.ts +0 -1
- package/types/Uint8ArrayType.js +1 -4
- package/types/index.d.ts +1 -1
- package/typings.d.ts +300 -140
- package/typings.js +62 -44
- package/unit-of-work/ChangeSet.d.ts +2 -6
- package/unit-of-work/ChangeSet.js +4 -5
- package/unit-of-work/ChangeSetComputer.d.ts +1 -3
- package/unit-of-work/ChangeSetComputer.js +26 -13
- package/unit-of-work/ChangeSetPersister.d.ts +5 -4
- package/unit-of-work/ChangeSetPersister.js +77 -35
- package/unit-of-work/CommitOrderCalculator.d.ts +12 -10
- package/unit-of-work/CommitOrderCalculator.js +13 -13
- package/unit-of-work/IdentityMap.d.ts +12 -0
- package/unit-of-work/IdentityMap.js +39 -1
- package/unit-of-work/UnitOfWork.d.ts +23 -3
- package/unit-of-work/UnitOfWork.js +199 -106
- package/utils/AbstractSchemaGenerator.d.ts +5 -5
- package/utils/AbstractSchemaGenerator.js +22 -17
- package/utils/AsyncContext.d.ts +6 -0
- package/utils/AsyncContext.js +42 -0
- package/utils/Configuration.d.ts +779 -207
- package/utils/Configuration.js +146 -190
- package/utils/ConfigurationLoader.d.ts +1 -54
- package/utils/ConfigurationLoader.js +1 -352
- package/utils/Cursor.d.ts +3 -6
- package/utils/Cursor.js +27 -11
- package/utils/DataloaderUtils.d.ts +15 -5
- package/utils/DataloaderUtils.js +65 -17
- package/utils/EntityComparator.d.ts +13 -9
- package/utils/EntityComparator.js +164 -89
- package/utils/QueryHelper.d.ts +14 -6
- package/utils/QueryHelper.js +88 -26
- package/utils/RawQueryFragment.d.ts +48 -25
- package/utils/RawQueryFragment.js +67 -66
- package/utils/RequestContext.js +2 -2
- package/utils/TransactionContext.js +2 -2
- package/utils/TransactionManager.d.ts +65 -0
- package/utils/TransactionManager.js +223 -0
- package/utils/Utils.d.ts +13 -120
- package/utils/Utils.js +104 -375
- package/utils/clone.js +8 -23
- package/utils/env-vars.d.ts +7 -0
- package/utils/env-vars.js +97 -0
- package/utils/fs-utils.d.ts +32 -0
- package/utils/fs-utils.js +178 -0
- package/utils/index.d.ts +2 -1
- package/utils/index.js +2 -1
- package/utils/upsert-utils.d.ts +9 -4
- package/utils/upsert-utils.js +55 -4
- package/decorators/Check.d.ts +0 -3
- package/decorators/Check.js +0 -13
- package/decorators/CreateRequestContext.d.ts +0 -3
- package/decorators/CreateRequestContext.js +0 -29
- package/decorators/Embeddable.d.ts +0 -8
- package/decorators/Embeddable.js +0 -11
- package/decorators/Embedded.d.ts +0 -18
- package/decorators/Embedded.js +0 -18
- package/decorators/Entity.d.ts +0 -18
- package/decorators/Entity.js +0 -13
- package/decorators/Enum.d.ts +0 -9
- package/decorators/Enum.js +0 -16
- package/decorators/Filter.d.ts +0 -2
- package/decorators/Filter.js +0 -8
- package/decorators/Formula.d.ts +0 -5
- package/decorators/Formula.js +0 -15
- package/decorators/Indexed.d.ts +0 -17
- package/decorators/Indexed.js +0 -20
- package/decorators/ManyToMany.d.ts +0 -40
- package/decorators/ManyToMany.js +0 -14
- package/decorators/ManyToOne.d.ts +0 -30
- package/decorators/ManyToOne.js +0 -14
- package/decorators/OneToMany.d.ts +0 -28
- package/decorators/OneToMany.js +0 -17
- package/decorators/OneToOne.d.ts +0 -24
- package/decorators/OneToOne.js +0 -7
- package/decorators/PrimaryKey.d.ts +0 -9
- package/decorators/PrimaryKey.js +0 -20
- package/decorators/Property.d.ts +0 -250
- package/decorators/Property.js +0 -32
- package/decorators/Transactional.d.ts +0 -13
- package/decorators/Transactional.js +0 -28
- package/decorators/hooks.d.ts +0 -16
- package/decorators/hooks.js +0 -47
- package/decorators/index.d.ts +0 -17
- package/decorators/index.js +0 -17
- package/entity/ArrayCollection.d.ts +0 -116
- package/entity/ArrayCollection.js +0 -395
- package/entity/EntityValidator.d.ts +0 -19
- package/entity/EntityValidator.js +0 -150
- package/metadata/ReflectMetadataProvider.d.ts +0 -8
- package/metadata/ReflectMetadataProvider.js +0 -44
- package/utils/resolveContextProvider.d.ts +0 -10
- package/utils/resolveContextProvider.js +0 -28
|
@@ -3,40 +3,43 @@ import { Collection } from '../entity/Collection.js';
|
|
|
3
3
|
import { Reference, ScalarReference } from '../entity/Reference.js';
|
|
4
4
|
import { parseJsonSafe, Utils } from '../utils/Utils.js';
|
|
5
5
|
import { ReferenceKind } from '../enums.js';
|
|
6
|
-
import {
|
|
6
|
+
import { Raw } from '../utils/RawQueryFragment.js';
|
|
7
7
|
export class ObjectHydrator extends Hydrator {
|
|
8
8
|
hydrators = {
|
|
9
|
-
full: new Map(),
|
|
10
|
-
|
|
9
|
+
'full~true': new Map(),
|
|
10
|
+
'full~false': new Map(),
|
|
11
|
+
'reference~true': new Map(),
|
|
12
|
+
'reference~false': new Map(),
|
|
11
13
|
};
|
|
12
14
|
tmpIndex = 0;
|
|
13
15
|
/**
|
|
14
16
|
* @inheritDoc
|
|
15
17
|
*/
|
|
16
|
-
hydrate(entity, meta, data, factory, type, newEntity = false, convertCustomTypes = false, schema, parentSchema) {
|
|
17
|
-
const hydrate = this.getEntityHydrator(meta, type);
|
|
18
|
+
hydrate(entity, meta, data, factory, type, newEntity = false, convertCustomTypes = false, schema, parentSchema, normalizeAccessors) {
|
|
19
|
+
const hydrate = this.getEntityHydrator(meta, type, normalizeAccessors);
|
|
18
20
|
const running = this.running;
|
|
19
21
|
// the running state is used to consider propagation as hydration, saving the values directly to the entity data,
|
|
20
22
|
// but we don't want that for new entities, their propagation should result in entity updates when flushing
|
|
21
23
|
this.running = !newEntity;
|
|
22
|
-
Utils.callCompiledFunction(hydrate, entity, data, factory, newEntity, convertCustomTypes, schema, parentSchema);
|
|
24
|
+
Utils.callCompiledFunction(hydrate, entity, data, factory, newEntity, convertCustomTypes, schema, parentSchema, normalizeAccessors);
|
|
23
25
|
this.running = running;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* @inheritDoc
|
|
27
29
|
*/
|
|
28
|
-
hydrateReference(entity, meta, data, factory, convertCustomTypes = false, schema, parentSchema) {
|
|
29
|
-
const hydrate = this.getEntityHydrator(meta, 'reference');
|
|
30
|
+
hydrateReference(entity, meta, data, factory, convertCustomTypes = false, schema, parentSchema, normalizeAccessors) {
|
|
31
|
+
const hydrate = this.getEntityHydrator(meta, 'reference', normalizeAccessors);
|
|
30
32
|
const running = this.running;
|
|
31
33
|
this.running = true;
|
|
32
|
-
Utils.callCompiledFunction(hydrate, entity, data, factory, false, convertCustomTypes, schema, parentSchema);
|
|
34
|
+
Utils.callCompiledFunction(hydrate, entity, data, factory, false, convertCustomTypes, schema, parentSchema, normalizeAccessors);
|
|
33
35
|
this.running = running;
|
|
34
36
|
}
|
|
35
37
|
/**
|
|
36
38
|
* @internal Highly performance-sensitive method.
|
|
37
39
|
*/
|
|
38
|
-
getEntityHydrator(meta, type) {
|
|
39
|
-
const
|
|
40
|
+
getEntityHydrator(meta, type, normalizeAccessors = false) {
|
|
41
|
+
const key = `${type}~${normalizeAccessors}`;
|
|
42
|
+
const exists = this.hydrators[key].get(meta.class);
|
|
40
43
|
if (exists) {
|
|
41
44
|
return exists;
|
|
42
45
|
}
|
|
@@ -48,22 +51,22 @@ export class ObjectHydrator extends Hydrator {
|
|
|
48
51
|
context.set('Reference', Reference);
|
|
49
52
|
const registerCustomType = (prop, convertorKey, method, context) => {
|
|
50
53
|
context.set(`${method}_${convertorKey}`, (val) => {
|
|
51
|
-
/* v8 ignore next
|
|
52
|
-
if (
|
|
54
|
+
/* v8 ignore next */
|
|
55
|
+
if (Raw.isKnownFragment(val)) {
|
|
53
56
|
return val;
|
|
54
57
|
}
|
|
55
58
|
return prop.customType[method](val, this.platform, { mode: 'serialization' });
|
|
56
59
|
});
|
|
57
60
|
return convertorKey;
|
|
58
61
|
};
|
|
59
|
-
const hydrateScalar = (prop,
|
|
62
|
+
const hydrateScalar = (prop, path, dataKey) => {
|
|
60
63
|
const entityKey = path.map(k => this.wrap(k)).join('');
|
|
61
64
|
const tz = this.platform.getTimezone();
|
|
62
65
|
const convertorKey = path.filter(k => !k.match(/\[idx_\d+]/)).map(k => this.safeKey(k)).join('_');
|
|
63
66
|
const ret = [];
|
|
64
67
|
const idx = this.tmpIndex++;
|
|
65
68
|
const nullVal = this.config.get('forceUndefined') ? 'undefined' : 'null';
|
|
66
|
-
if (prop.getter && !prop.setter) {
|
|
69
|
+
if (prop.getter && !prop.setter && prop.persist === false) {
|
|
67
70
|
return [];
|
|
68
71
|
}
|
|
69
72
|
if (prop.ref) {
|
|
@@ -71,7 +74,14 @@ export class ObjectHydrator extends Hydrator {
|
|
|
71
74
|
ret.push(` const oldValue_${idx} = entity${entityKey};`);
|
|
72
75
|
}
|
|
73
76
|
ret.push(` if (data${dataKey} === null) {`);
|
|
74
|
-
|
|
77
|
+
if (prop.ref) {
|
|
78
|
+
ret.push(` entity${entityKey} = new ScalarReference();`);
|
|
79
|
+
ret.push(` entity${entityKey}.bind(entity, '${prop.name}');`);
|
|
80
|
+
ret.push(` entity${entityKey}.set(${nullVal});`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
ret.push(` entity${entityKey} = ${nullVal};`);
|
|
84
|
+
}
|
|
75
85
|
ret.push(` } else if (typeof data${dataKey} !== 'undefined') {`);
|
|
76
86
|
if (prop.customType) {
|
|
77
87
|
registerCustomType(prop, convertorKey, 'convertToJSValue', context);
|
|
@@ -125,23 +135,27 @@ export class ObjectHydrator extends Hydrator {
|
|
|
125
135
|
ret.push(` if (data${dataKey} === null) {\n entity${entityKey} = ${nullVal};`);
|
|
126
136
|
ret.push(` } else if (typeof data${dataKey} !== 'undefined') {`);
|
|
127
137
|
ret.push(` if (isPrimaryKey(data${dataKey}, true)) {`);
|
|
138
|
+
const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
|
|
139
|
+
context.set(targetKey, prop.targetMeta.class);
|
|
140
|
+
// When targetKey is set, pass the key option to createReference so it uses the alternate key
|
|
141
|
+
const keyOption = prop.targetKey ? `, key: '${prop.targetKey}'` : '';
|
|
128
142
|
if (prop.ref) {
|
|
129
|
-
ret.push(` entity${entityKey} = Reference.create(factory.createReference(
|
|
143
|
+
ret.push(` entity${entityKey} = Reference.create(factory.createReference(${targetKey}, data${dataKey}, { merge: true, convertCustomTypes, normalizeAccessors, schema${keyOption} }));`);
|
|
130
144
|
}
|
|
131
145
|
else {
|
|
132
|
-
ret.push(` entity${entityKey} = factory.createReference(
|
|
146
|
+
ret.push(` entity${entityKey} = factory.createReference(${targetKey}, data${dataKey}, { merge: true, convertCustomTypes, normalizeAccessors, schema${keyOption} });`);
|
|
133
147
|
}
|
|
134
148
|
ret.push(` } else if (data${dataKey} && typeof data${dataKey} === 'object') {`);
|
|
135
149
|
if (prop.ref) {
|
|
136
|
-
ret.push(` entity${entityKey} = Reference.create(factory.${method}(
|
|
150
|
+
ret.push(` entity${entityKey} = Reference.create(factory.${method}(${targetKey}, data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, normalizeAccessors, schema }));`);
|
|
137
151
|
}
|
|
138
152
|
else {
|
|
139
|
-
ret.push(` entity${entityKey} = factory.${method}(
|
|
153
|
+
ret.push(` entity${entityKey} = factory.${method}(${targetKey}, data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, normalizeAccessors, schema });`);
|
|
140
154
|
}
|
|
141
155
|
ret.push(` }`);
|
|
142
156
|
ret.push(` }`);
|
|
143
157
|
if (prop.kind === ReferenceKind.ONE_TO_ONE) {
|
|
144
|
-
const meta2 = this.metadata.get(prop.
|
|
158
|
+
const meta2 = this.metadata.get(prop.targetMeta.class);
|
|
145
159
|
const prop2 = meta2.properties[prop.inversedBy || prop.mappedBy];
|
|
146
160
|
if (prop2 && !prop2.mapToPk) {
|
|
147
161
|
ret.push(` if (data${dataKey} && entity${entityKey} && !entity${entityKey}.${this.safeKey(prop2.name)}) {`);
|
|
@@ -159,7 +173,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
159
173
|
};
|
|
160
174
|
const hydrateToMany = (prop, dataKey, entityKey) => {
|
|
161
175
|
const ret = [];
|
|
162
|
-
ret.push(...this.createCollectionItemMapper(prop));
|
|
176
|
+
ret.push(...this.createCollectionItemMapper(prop, context));
|
|
163
177
|
ret.push(` if (data${dataKey} && !Array.isArray(data${dataKey}) && typeof data${dataKey} === 'object') {`);
|
|
164
178
|
ret.push(` data${dataKey} = [data${dataKey}];`);
|
|
165
179
|
ret.push(` }`);
|
|
@@ -242,10 +256,11 @@ export class ObjectHydrator extends Hydrator {
|
|
|
242
256
|
prop.targetMeta.polymorphs.forEach(childMeta => {
|
|
243
257
|
const childProp = prop.embeddedProps[prop.targetMeta.discriminatorColumn];
|
|
244
258
|
const childDataKey = prop.object ? dataKey + this.wrap(childProp.embedded[1]) : this.wrap(childProp.name);
|
|
259
|
+
context.set(childMeta.className, childMeta.class);
|
|
245
260
|
// weak comparison as we can have numbers that might have been converted to strings due to being object keys
|
|
246
261
|
ret.push(` if (data${childDataKey} == '${childMeta.discriminatorValue}') {`);
|
|
247
262
|
ret.push(` if (entity${entityKey} == null) {`);
|
|
248
|
-
ret.push(` entity${entityKey} = factory.createEmbeddable(
|
|
263
|
+
ret.push(` entity${entityKey} = factory.createEmbeddable(${childMeta.className}, embeddedData, { newEntity, convertCustomTypes, normalizeAccessors });`);
|
|
249
264
|
ret.push(` }`);
|
|
250
265
|
meta.props
|
|
251
266
|
.filter(p => p.embedded?.[0] === prop.name)
|
|
@@ -256,6 +271,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
256
271
|
...prop2,
|
|
257
272
|
name: childProp.name,
|
|
258
273
|
embedded: childProp.embedded,
|
|
274
|
+
embeddedProps: childProp.embeddedProps,
|
|
259
275
|
};
|
|
260
276
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
261
277
|
ret.push(...hydrateProperty(prop3, childProp.object, [...path, childProp.embedded[1]], childDataKey).map(l => ' ' + l));
|
|
@@ -264,8 +280,10 @@ export class ObjectHydrator extends Hydrator {
|
|
|
264
280
|
});
|
|
265
281
|
}
|
|
266
282
|
else {
|
|
283
|
+
const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
|
|
284
|
+
context.set(targetKey, prop.targetMeta.class);
|
|
267
285
|
ret.push(` if (entity${entityKey} == null) {`);
|
|
268
|
-
ret.push(` entity${entityKey} = factory.createEmbeddable(
|
|
286
|
+
ret.push(` entity${entityKey} = factory.createEmbeddable(${targetKey}, embeddedData, { newEntity, convertCustomTypes, normalizeAccessors });`);
|
|
269
287
|
ret.push(` }`);
|
|
270
288
|
meta.props
|
|
271
289
|
.filter(p => p.embedded?.[0] === prop.name)
|
|
@@ -303,7 +321,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
303
321
|
};
|
|
304
322
|
const hydrateProperty = (prop, object = prop.object, path = [prop.name], dataKey) => {
|
|
305
323
|
const entityKey = path.map(k => this.wrap(k)).join('');
|
|
306
|
-
dataKey = dataKey ?? (object ? entityKey : this.wrap(prop.name));
|
|
324
|
+
dataKey = dataKey ?? (object ? entityKey : this.wrap(normalizeAccessors ? (prop.accessor ?? prop.name) : prop.name));
|
|
307
325
|
const ret = [];
|
|
308
326
|
if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind) && !prop.mapToPk) {
|
|
309
327
|
ret.push(...hydrateToOne(prop, dataKey, entityKey));
|
|
@@ -323,7 +341,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
323
341
|
}
|
|
324
342
|
}
|
|
325
343
|
else { // ReferenceKind.SCALAR
|
|
326
|
-
ret.push(...hydrateScalar(prop,
|
|
344
|
+
ret.push(...hydrateScalar(prop, path, dataKey));
|
|
327
345
|
}
|
|
328
346
|
if (this.config.get('forceUndefined')) {
|
|
329
347
|
ret.push(` if (data${dataKey} === null) entity${entityKey} = undefined;`);
|
|
@@ -333,15 +351,15 @@ export class ObjectHydrator extends Hydrator {
|
|
|
333
351
|
for (const prop of props) {
|
|
334
352
|
lines.push(...hydrateProperty(prop));
|
|
335
353
|
}
|
|
336
|
-
const code = `// compiled hydrator for entity ${meta.className} (${type})\n`
|
|
337
|
-
+ `return function(entity, data, factory, newEntity, convertCustomTypes, schema) {\n`
|
|
354
|
+
const code = `// compiled hydrator for entity ${meta.className} (${type + normalizeAccessors ? ' normalized' : ''})\n`
|
|
355
|
+
+ `return function(entity, data, factory, newEntity, convertCustomTypes, schema, parentSchema, normalizeAccessors) {\n`
|
|
338
356
|
+ `${lines.join('\n')}\n}`;
|
|
339
357
|
const hydrator = Utils.createFunction(context, code);
|
|
340
|
-
this.hydrators[
|
|
358
|
+
this.hydrators[key].set(meta.class, hydrator);
|
|
341
359
|
return hydrator;
|
|
342
360
|
}
|
|
343
|
-
createCollectionItemMapper(prop) {
|
|
344
|
-
const meta = this.metadata.get(prop.
|
|
361
|
+
createCollectionItemMapper(prop, context) {
|
|
362
|
+
const meta = this.metadata.get(prop.targetMeta.class);
|
|
345
363
|
const lines = [];
|
|
346
364
|
lines.push(` const createCollectionItem_${this.safeKey(prop.name)} = (value, entity) => {`);
|
|
347
365
|
const prop2 = prop.targetMeta.properties[prop.mappedBy];
|
|
@@ -350,9 +368,11 @@ export class ObjectHydrator extends Hydrator {
|
|
|
350
368
|
lines.push(` value = { ...value, ['${prop2.name}']: Reference.wrapReference(entity, { ref: ${prop2.ref} }) };`);
|
|
351
369
|
lines.push(` }`);
|
|
352
370
|
}
|
|
353
|
-
|
|
371
|
+
const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
|
|
372
|
+
context.set(targetKey, prop.targetMeta.class);
|
|
373
|
+
lines.push(` if (isPrimaryKey(value, ${meta.compositePK})) return factory.createReference(${targetKey}, value, { convertCustomTypes, schema, normalizeAccessors, merge: true });`);
|
|
354
374
|
lines.push(` if (value && value.__entity) return value;`);
|
|
355
|
-
lines.push(` return factory.create(
|
|
375
|
+
lines.push(` return factory.create(${targetKey}, value, { newEntity, convertCustomTypes, schema, normalizeAccessors, merge: true });`);
|
|
356
376
|
lines.push(` }`);
|
|
357
377
|
return lines;
|
|
358
378
|
}
|
package/index.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* @module core
|
|
4
4
|
*/
|
|
5
|
-
export {
|
|
5
|
+
export { EntityMetadata, PrimaryKeyProp, EntityRepositoryType, OptionalProps, EagerProps, HiddenProps, Config } from './typings.js';
|
|
6
|
+
export type { Constructor, ConnectionType, Dictionary, Primary, IPrimaryKey, ObjectQuery, FilterQuery, IWrappedEntity, EntityName, EntityData, Highlighter, MaybePromise, AnyEntity, EntityClass, EntityProperty, QBFilterQuery, PopulateOptions, Populate, Loaded, New, LoadedReference, LoadedCollection, IMigrator, IMigrationGenerator, MigratorEvent, GetRepository, MigrationObject, DeepPartial, PrimaryProperty, Cast, IsUnknown, EntityDictionary, EntityDTO, MigrationDiff, GenerateOptions, FilterObject, IEntityGenerator, ISeedManager, RequiredEntityData, CheckCallback, IndexCallback, FormulaCallback, FormulaTable, SimpleColumnMeta, Rel, Ref, ScalarRef, EntityRef, ISchemaGenerator, UmzugMigration, MigrateOptions, MigrationResult, MigrationRow, EntityKey, EntityValue, EntityDataValue, FilterKey, EntityType, FromEntityType, Selected, IsSubset, NoInfer, EntityProps, ExpandProperty, ExpandScalar, FilterItemValue, ExpandQuery, Scalar, ExpandHint, FilterValue, MergeLoaded, MergeSelected, TypeConfig, AnyString, ClearDatabaseOptions, CreateSchemaOptions, EnsureDatabaseOptions, UpdateSchemaOptions, DropSchemaOptions, RefreshDatabaseOptions, AutoPath, UnboxArray, MetadataProcessor, ImportsResolver, RequiredNullable, DefineConfig, Opt, Hidden, EntitySchemaWithMeta, InferEntity, CheckConstraint, GeneratedColumnCallback, FilterDef, EntityCtor, } from './typings.js';
|
|
6
7
|
export * from './enums.js';
|
|
7
8
|
export * from './errors.js';
|
|
8
9
|
export * from './exceptions.js';
|
|
@@ -22,4 +23,3 @@ export * from './types/index.js';
|
|
|
22
23
|
export * from './naming-strategy/index.js';
|
|
23
24
|
export * from './metadata/index.js';
|
|
24
25
|
export * from './cache/index.js';
|
|
25
|
-
export * from './decorators/index.js';
|
package/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @packageDocumentation
|
|
3
3
|
* @module core
|
|
4
4
|
*/
|
|
5
|
-
export {
|
|
5
|
+
export { EntityMetadata, PrimaryKeyProp, EntityRepositoryType, OptionalProps, EagerProps, HiddenProps, Config } from './typings.js';
|
|
6
6
|
export * from './enums.js';
|
|
7
7
|
export * from './errors.js';
|
|
8
8
|
export * from './exceptions.js';
|
|
@@ -22,4 +22,3 @@ export * from './types/index.js';
|
|
|
22
22
|
export * from './naming-strategy/index.js';
|
|
23
23
|
export * from './metadata/index.js';
|
|
24
24
|
export * from './cache/index.js';
|
|
25
|
-
export * from './decorators/index.js';
|
package/logging/DefaultLogger.js
CHANGED
|
@@ -60,6 +60,7 @@ export class DefaultLogger {
|
|
|
60
60
|
if (namespace === 'deprecated') {
|
|
61
61
|
const { ignoreDeprecations = false } = this.options;
|
|
62
62
|
return Array.isArray(ignoreDeprecations)
|
|
63
|
+
/* v8 ignore next */
|
|
63
64
|
? !ignoreDeprecations.includes(context?.label ?? '')
|
|
64
65
|
: !ignoreDeprecations;
|
|
65
66
|
}
|
package/logging/colors.d.ts
CHANGED
package/logging/colors.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
&&
|
|
6
|
-
&& boolIfDefined(
|
|
1
|
+
import { getEnv } from '../utils/env-vars.js';
|
|
2
|
+
const bool = (k) => ['true', 't', '1'].includes(getEnv(k)?.toLowerCase() ?? '');
|
|
3
|
+
const boolIfDefined = (k) => getEnv(k) != null ? bool(k) : true;
|
|
4
|
+
const enabled = () => !bool('NO_COLOR')
|
|
5
|
+
&& !bool('MIKRO_ORM_NO_COLOR')
|
|
6
|
+
&& boolIfDefined('FORCE_COLOR')
|
|
7
|
+
&& boolIfDefined('MIKRO_ORM_COLORS');
|
|
7
8
|
const wrap = (fn) => (text) => enabled() ? fn(text) : text;
|
|
8
9
|
/** @internal */
|
|
9
10
|
export const colors = {
|
package/logging/index.d.ts
CHANGED
package/logging/index.js
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let nodeInspect;
|
|
2
|
+
/** @internal */
|
|
3
|
+
export function inspect(value, options) {
|
|
4
|
+
nodeInspect ??= globalThis.process?.getBuiltinModule?.('node:util').inspect;
|
|
5
|
+
/* v8 ignore else */
|
|
6
|
+
if (nodeInspect) {
|
|
7
|
+
return nodeInspect(value, options);
|
|
8
|
+
}
|
|
9
|
+
/* v8 ignore next */
|
|
10
|
+
return JSON.stringify(value, null, 2);
|
|
11
|
+
}
|
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
import { EntityMetadata, type AnyEntity, type EntityKey, type Constructor, type DeepPartial, type EntityName, type EntityProperty, type CleanKeys, type ExpandProperty, type IsNever, type
|
|
2
|
-
import type { EmbeddedOptions } from '../decorators/Embedded.js';
|
|
3
|
-
import type { EnumOptions } from '../decorators/Enum.js';
|
|
4
|
-
import type { IndexOptions, UniqueOptions } from '../decorators/Indexed.js';
|
|
5
|
-
import type { ManyToManyOptions } from '../decorators/ManyToMany.js';
|
|
6
|
-
import type { ManyToOneOptions } from '../decorators/ManyToOne.js';
|
|
7
|
-
import type { OneToManyOptions } from '../decorators/OneToMany.js';
|
|
8
|
-
import type { OneToOneOptions } from '../decorators/OneToOne.js';
|
|
9
|
-
import type { PrimaryKeyOptions, SerializedPrimaryKeyOptions } from '../decorators/PrimaryKey.js';
|
|
10
|
-
import type { PropertyOptions } from '../decorators/Property.js';
|
|
1
|
+
import { EntityMetadata, type AnyEntity, type EntityKey, type Constructor, type DeepPartial, type EntityName, type EntityProperty, type CleanKeys, type ExpandProperty, type IsNever, type EntityCtor } from '../typings.js';
|
|
11
2
|
import { ReferenceKind } from '../enums.js';
|
|
12
3
|
import { Type } from '../types/Type.js';
|
|
4
|
+
import type { PropertyOptions, ManyToOneOptions, OneToOneOptions, OneToManyOptions, ManyToManyOptions, EmbeddedOptions, EnumOptions, PrimaryKeyOptions, SerializedPrimaryKeyOptions, IndexOptions, UniqueOptions } from './types.js';
|
|
13
5
|
type TypeType = string | NumberConstructor | StringConstructor | BooleanConstructor | DateConstructor | ArrayConstructor | Constructor<Type<any>> | Type<any>;
|
|
14
6
|
type TypeDef<Target> = {
|
|
15
7
|
type: TypeType;
|
|
16
8
|
} | {
|
|
17
|
-
entity:
|
|
9
|
+
entity: () => EntityName<Target>;
|
|
18
10
|
};
|
|
19
11
|
type EmbeddedTypeDef<Target> = {
|
|
20
12
|
type: TypeType;
|
|
21
13
|
} | {
|
|
22
|
-
entity:
|
|
14
|
+
entity: () => EntityName<Target> | EntityName[];
|
|
23
15
|
};
|
|
24
16
|
export type EntitySchemaProperty<Target, Owner> = ({
|
|
25
17
|
kind: ReferenceKind.MANY_TO_ONE | 'm:1';
|
|
@@ -31,50 +23,56 @@ export type EntitySchemaProperty<Target, Owner> = ({
|
|
|
31
23
|
kind: ReferenceKind.MANY_TO_MANY | 'm:n';
|
|
32
24
|
} & TypeDef<Target> & ManyToManyOptions<Owner, Target>) | ({
|
|
33
25
|
kind: ReferenceKind.EMBEDDED | 'embedded';
|
|
34
|
-
} & EmbeddedTypeDef<Target> & EmbeddedOptions & PropertyOptions<Owner>) | ({
|
|
26
|
+
} & EmbeddedTypeDef<Target> & EmbeddedOptions<Owner, Target> & PropertyOptions<Owner>) | ({
|
|
35
27
|
enum: true;
|
|
36
28
|
} & EnumOptions<Owner>) | (TypeDef<Target> & PropertyOptions<Owner>);
|
|
37
29
|
type OmitBaseProps<Entity, Base> = IsNever<Base> extends true ? Entity : Omit<Entity, keyof Base>;
|
|
38
|
-
export type EntitySchemaMetadata<Entity, Base = never
|
|
30
|
+
export type EntitySchemaMetadata<Entity, Base = never, Class extends EntityCtor = EntityCtor<Entity>> = Omit<Partial<EntityMetadata<Entity>>, 'name' | 'properties' | 'extends'> & ({
|
|
39
31
|
name: string;
|
|
40
32
|
} | {
|
|
41
|
-
class:
|
|
33
|
+
class: Class;
|
|
42
34
|
name?: string;
|
|
43
35
|
}) & {
|
|
44
|
-
extends?:
|
|
36
|
+
extends?: EntityName<Base>;
|
|
45
37
|
} & {
|
|
46
38
|
properties?: {
|
|
47
39
|
[Key in keyof OmitBaseProps<Entity, Base> as CleanKeys<OmitBaseProps<Entity, Base>, Key>]-?: EntitySchemaProperty<ExpandProperty<NonNullable<Entity[Key]>>, Entity>;
|
|
48
40
|
};
|
|
49
41
|
};
|
|
50
|
-
export declare class EntitySchema<Entity = any, Base = never
|
|
42
|
+
export declare class EntitySchema<Entity = any, Base = never, Class extends EntityCtor = EntityCtor<Entity>> {
|
|
51
43
|
/**
|
|
52
44
|
* When schema links the entity class via `class` option, this registry allows the lookup from opposite side,
|
|
53
45
|
* so we can use the class in `entities` option just like the EntitySchema instance.
|
|
54
46
|
*/
|
|
55
|
-
static REGISTRY: Map<Partial<any>, EntitySchema<any, never
|
|
47
|
+
static REGISTRY: Map<Partial<any>, EntitySchema<any, never, EntityCtor<any>>>;
|
|
48
|
+
/** @internal Type-level marker for fast entity type inference */
|
|
49
|
+
readonly '~entity': Entity;
|
|
56
50
|
private readonly _meta;
|
|
57
51
|
private internal;
|
|
58
52
|
private initialized;
|
|
59
|
-
constructor(meta: EntitySchemaMetadata<Entity, Base>);
|
|
53
|
+
constructor(meta: EntitySchemaMetadata<Entity, Base, Class>);
|
|
60
54
|
static fromMetadata<T = AnyEntity, U = never>(meta: EntityMetadata<T> | DeepPartial<EntityMetadata<T>>): EntitySchema<T, U>;
|
|
61
55
|
addProperty(name: EntityKey<Entity>, type?: TypeType, options?: PropertyOptions<Entity> | EntityProperty<Entity>): void;
|
|
62
56
|
addEnum(name: EntityKey<Entity>, type?: TypeType, options?: EnumOptions<Entity>): void;
|
|
63
57
|
addVersion(name: EntityKey<Entity>, type: TypeType, options?: PropertyOptions<Entity>): void;
|
|
64
58
|
addPrimaryKey(name: EntityKey<Entity>, type: TypeType, options?: PrimaryKeyOptions<Entity>): void;
|
|
65
59
|
addSerializedPrimaryKey(name: EntityKey<Entity>, type: TypeType, options?: SerializedPrimaryKeyOptions<Entity>): void;
|
|
66
|
-
addEmbedded<Target = AnyEntity>(name: EntityKey<Entity>, options: EmbeddedOptions): void;
|
|
60
|
+
addEmbedded<Target = AnyEntity>(name: EntityKey<Entity>, options: EmbeddedOptions<Entity, Target>): void;
|
|
67
61
|
addManyToOne<Target = AnyEntity>(name: EntityKey<Entity>, type: TypeType, options: ManyToOneOptions<Entity, Target>): void;
|
|
68
62
|
addManyToMany<Target = AnyEntity>(name: EntityKey<Entity>, type: TypeType, options: ManyToManyOptions<Entity, Target>): void;
|
|
69
63
|
addOneToMany<Target = AnyEntity>(name: EntityKey<Entity>, type: TypeType, options: OneToManyOptions<Entity, Target>): void;
|
|
70
64
|
addOneToOne<Target = AnyEntity>(name: EntityKey<Entity>, type: TypeType, options: OneToOneOptions<Entity, Target>): void;
|
|
71
|
-
addIndex(options: IndexOptions<Entity>): void;
|
|
72
|
-
addUnique(options: UniqueOptions<Entity>): void;
|
|
65
|
+
addIndex<Key extends string>(options: IndexOptions<Entity, Key>): void;
|
|
66
|
+
addUnique<Key extends string>(options: UniqueOptions<Entity, Key>): void;
|
|
73
67
|
setCustomRepository(repository: () => Constructor): void;
|
|
74
|
-
setExtends(base:
|
|
75
|
-
setClass(
|
|
76
|
-
get meta(): EntityMetadata<Entity>;
|
|
77
|
-
get name(): EntityName<Entity>;
|
|
68
|
+
setExtends(base: EntityName): void;
|
|
69
|
+
setClass(cls: Class): void;
|
|
70
|
+
get meta(): EntityMetadata<Entity, Class>;
|
|
71
|
+
get name(): string | EntityName<Entity>;
|
|
72
|
+
get tableName(): string;
|
|
73
|
+
get class(): Class;
|
|
74
|
+
get properties(): Record<string, any>;
|
|
75
|
+
new(...params: ConstructorParameters<Class>): Entity;
|
|
78
76
|
/**
|
|
79
77
|
* @internal
|
|
80
78
|
*/
|
|
@@ -83,5 +81,7 @@ export declare class EntitySchema<Entity = any, Base = never> {
|
|
|
83
81
|
private initPrimaryKeys;
|
|
84
82
|
private normalizeType;
|
|
85
83
|
private createProperty;
|
|
84
|
+
private rename;
|
|
85
|
+
private renameCompositeOptions;
|
|
86
86
|
}
|
|
87
87
|
export {};
|