@mikro-orm/core 7.0.0-dev.9 → 7.0.0-dev.91
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 +77 -48
- package/EntityManager.js +288 -225
- package/MikroORM.d.ts +40 -31
- package/MikroORM.js +98 -137
- package/README.md +3 -2
- package/cache/FileCacheAdapter.d.ts +1 -1
- package/cache/FileCacheAdapter.js +6 -5
- 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 +11 -7
- package/connections/Connection.js +16 -14
- package/drivers/DatabaseDriver.d.ts +11 -5
- package/drivers/DatabaseDriver.js +23 -11
- package/drivers/IDatabaseDriver.d.ts +25 -4
- package/entity/BaseEntity.d.ts +0 -1
- package/entity/BaseEntity.js +0 -3
- package/entity/Collection.d.ts +95 -30
- package/entity/Collection.js +432 -93
- package/entity/EntityAssigner.d.ts +1 -1
- package/entity/EntityAssigner.js +17 -9
- package/entity/EntityFactory.d.ts +7 -0
- package/entity/EntityFactory.js +63 -41
- package/entity/EntityHelper.js +26 -12
- package/entity/EntityLoader.d.ts +5 -4
- package/entity/EntityLoader.js +63 -38
- package/entity/EntityRepository.d.ts +1 -1
- package/entity/Reference.d.ts +6 -5
- package/entity/Reference.js +34 -9
- package/entity/WrappedEntity.d.ts +2 -7
- package/entity/WrappedEntity.js +2 -7
- package/entity/defineEntity.d.ts +568 -0
- package/entity/defineEntity.js +529 -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 +21 -6
- package/enums.js +14 -1
- package/errors.d.ts +10 -2
- package/errors.js +29 -10
- 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 +35 -25
- 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/index.d.ts +1 -0
- package/logging/index.js +1 -0
- package/logging/inspect.d.ts +2 -0
- package/logging/inspect.js +16 -0
- package/metadata/EntitySchema.d.ts +9 -13
- package/metadata/EntitySchema.js +44 -26
- package/metadata/MetadataDiscovery.d.ts +6 -9
- package/metadata/MetadataDiscovery.js +165 -205
- package/metadata/MetadataProvider.d.ts +11 -2
- package/metadata/MetadataProvider.js +44 -2
- package/metadata/MetadataStorage.d.ts +1 -6
- package/metadata/MetadataStorage.js +6 -18
- package/metadata/MetadataValidator.d.ts +0 -7
- package/metadata/MetadataValidator.js +0 -10
- 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 +480 -0
- package/metadata/types.js +1 -0
- package/naming-strategy/AbstractNamingStrategy.d.ts +5 -1
- package/naming-strategy/AbstractNamingStrategy.js +8 -2
- package/naming-strategy/NamingStrategy.d.ts +11 -1
- package/not-supported.d.ts +2 -0
- package/not-supported.js +4 -0
- package/package.json +18 -10
- package/platforms/ExceptionConverter.js +1 -1
- package/platforms/Platform.d.ts +6 -13
- package/platforms/Platform.js +15 -41
- package/serialization/EntitySerializer.d.ts +2 -0
- package/serialization/EntitySerializer.js +32 -14
- package/serialization/EntityTransformer.js +22 -12
- package/serialization/SerializationContext.js +16 -13
- package/types/ArrayType.d.ts +1 -1
- package/types/ArrayType.js +2 -3
- package/types/BigIntType.d.ts +8 -6
- package/types/BigIntType.js +1 -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 +109 -73
- package/typings.js +38 -35
- package/unit-of-work/ChangeSet.d.ts +0 -3
- package/unit-of-work/ChangeSet.js +2 -2
- package/unit-of-work/ChangeSetComputer.d.ts +1 -3
- package/unit-of-work/ChangeSetComputer.js +11 -9
- package/unit-of-work/ChangeSetPersister.d.ts +5 -4
- package/unit-of-work/ChangeSetPersister.js +51 -19
- package/unit-of-work/UnitOfWork.d.ts +8 -1
- package/unit-of-work/UnitOfWork.js +91 -49
- package/utils/AbstractSchemaGenerator.d.ts +5 -5
- package/utils/AbstractSchemaGenerator.js +11 -9
- package/utils/Configuration.d.ts +757 -206
- package/utils/Configuration.js +140 -188
- package/utils/ConfigurationLoader.d.ts +1 -54
- package/utils/ConfigurationLoader.js +1 -352
- package/utils/Cursor.d.ts +0 -3
- package/utils/Cursor.js +6 -3
- package/utils/DataloaderUtils.d.ts +15 -5
- package/utils/DataloaderUtils.js +54 -8
- package/utils/EntityComparator.d.ts +8 -4
- package/utils/EntityComparator.js +52 -17
- package/utils/QueryHelper.d.ts +9 -1
- package/utils/QueryHelper.js +70 -9
- package/utils/RawQueryFragment.d.ts +36 -13
- package/utils/RawQueryFragment.js +36 -16
- package/utils/TransactionManager.d.ts +65 -0
- package/utils/TransactionManager.js +223 -0
- package/utils/Utils.d.ts +9 -97
- package/utils/Utils.js +83 -302
- package/utils/clone.js +2 -3
- package/utils/env-vars.d.ts +3 -0
- package/utils/env-vars.js +87 -0
- package/utils/fs-utils.d.ts +12 -0
- package/utils/fs-utils.js +97 -0
- package/utils/index.d.ts +2 -1
- package/utils/index.js +2 -1
- package/utils/upsert-utils.d.ts +7 -2
- 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 -32
- 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 -12
- 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 -4
- package/decorators/Formula.js +0 -15
- package/decorators/Indexed.d.ts +0 -19
- 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 -8
- 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 -402
- 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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Utils } from '../utils/Utils.js';
|
|
2
|
+
import { ValidationError } from '../errors.js';
|
|
3
|
+
import { isRaw } from '../utils/RawQueryFragment.js';
|
|
4
|
+
import { SCALAR_TYPES } from '../enums.js';
|
|
5
|
+
/** @internal */
|
|
6
|
+
export function validateProperty(prop, givenValue, entity) {
|
|
7
|
+
if (givenValue == null || isRaw(givenValue)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const expectedType = prop.runtimeType;
|
|
11
|
+
const propName = prop.embedded ? prop.name.replace(/~/g, '.') : prop.name;
|
|
12
|
+
const givenType = Utils.getObjectType(givenValue);
|
|
13
|
+
if (prop.enum && prop.items) {
|
|
14
|
+
/* v8 ignore next */
|
|
15
|
+
if (!prop.items.some(it => it === givenValue)) {
|
|
16
|
+
throw ValidationError.fromWrongPropertyType(entity, propName, expectedType, givenType, givenValue);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (givenType !== expectedType && SCALAR_TYPES.has(expectedType)) {
|
|
21
|
+
throw ValidationError.fromWrongPropertyType(entity, propName, expectedType, givenType, givenValue);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function getValue(o, prop) {
|
|
26
|
+
if (prop.embedded && prop.embedded[0] in o) {
|
|
27
|
+
return o[prop.embedded[0]]?.[prop.embedded[1]];
|
|
28
|
+
}
|
|
29
|
+
/* v8 ignore next */
|
|
30
|
+
if (prop.ref) {
|
|
31
|
+
return o[prop.name]?.unwrap();
|
|
32
|
+
}
|
|
33
|
+
return o[prop.name];
|
|
34
|
+
}
|
|
35
|
+
/** @internal */
|
|
36
|
+
export function validateEntity(entity, meta) {
|
|
37
|
+
for (const prop of meta.validateProps) {
|
|
38
|
+
validateProperty(prop, getValue(entity, prop), entity);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** @internal */
|
|
42
|
+
export function validateParams(params, type = 'search condition', field) {
|
|
43
|
+
if (Utils.isPrimaryKey(params) || Utils.isEntity(params)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(params)) {
|
|
47
|
+
return params.forEach(item => validateParams(item, type, field));
|
|
48
|
+
}
|
|
49
|
+
if (Utils.isPlainObject(params)) {
|
|
50
|
+
Object.keys(params).forEach(k => validateParams(params[k], type, k));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** @internal */
|
|
54
|
+
export function validatePrimaryKey(entity, meta) {
|
|
55
|
+
const pkExists = meta.primaryKeys.every(pk => entity[pk] != null) || (meta.serializedPrimaryKey && entity[meta.serializedPrimaryKey] != null);
|
|
56
|
+
if (!entity || !pkExists) {
|
|
57
|
+
throw ValidationError.fromMergeWithoutPK(meta);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** @internal */
|
|
61
|
+
export function validateEmptyWhere(where) {
|
|
62
|
+
if (Utils.isEmpty(where)) {
|
|
63
|
+
throw new Error(`You cannot call 'EntityManager.findOne()' with empty 'where' parameter`);
|
|
64
|
+
}
|
|
65
|
+
}
|
package/enums.d.ts
CHANGED
|
@@ -66,7 +66,7 @@ export declare enum QueryOrderNumeric {
|
|
|
66
66
|
ASC = 1,
|
|
67
67
|
DESC = -1
|
|
68
68
|
}
|
|
69
|
-
export type QueryOrderKeysFlat = QueryOrder | QueryOrderNumeric |
|
|
69
|
+
export type QueryOrderKeysFlat = QueryOrder | QueryOrderNumeric | `${QueryOrder}`;
|
|
70
70
|
export type QueryOrderKeys<T> = QueryOrderKeysFlat | QueryOrderMap<T>;
|
|
71
71
|
export type QueryOrderMap<T> = {
|
|
72
72
|
[K in EntityKey<T>]?: QueryOrderKeys<ExpandProperty<T[K]>>;
|
|
@@ -85,9 +85,11 @@ export declare enum QueryFlag {
|
|
|
85
85
|
INCLUDE_LAZY_FORMULAS = "INCLUDE_LAZY_FORMULAS",
|
|
86
86
|
AUTO_JOIN_ONE_TO_ONE_OWNER = "AUTO_JOIN_ONE_TO_ONE_OWNER",
|
|
87
87
|
INFER_POPULATE = "INFER_POPULATE",
|
|
88
|
-
|
|
88
|
+
DISABLE_NESTED_INNER_JOIN = "DISABLE_NESTED_INNER_JOIN",
|
|
89
|
+
IDENTITY_INSERT = "IDENTITY_INSERT",// mssql only
|
|
90
|
+
OUTPUT_TABLE = "OUTPUT_TABLE"
|
|
89
91
|
}
|
|
90
|
-
export declare const SCALAR_TYPES: string
|
|
92
|
+
export declare const SCALAR_TYPES: Set<string>;
|
|
91
93
|
export declare enum ReferenceKind {
|
|
92
94
|
SCALAR = "scalar",
|
|
93
95
|
ONE_TO_ONE = "1:1",
|
|
@@ -108,7 +110,8 @@ export declare enum Cascade {
|
|
|
108
110
|
}
|
|
109
111
|
export declare enum LoadStrategy {
|
|
110
112
|
SELECT_IN = "select-in",
|
|
111
|
-
JOINED = "joined"
|
|
113
|
+
JOINED = "joined",
|
|
114
|
+
BALANCED = "balanced"
|
|
112
115
|
}
|
|
113
116
|
export declare enum DataloaderType {
|
|
114
117
|
NONE = 0,
|
|
@@ -156,12 +159,22 @@ export declare enum EventType {
|
|
|
156
159
|
}
|
|
157
160
|
export declare const EventTypeMap: Record<EventType, number>;
|
|
158
161
|
export type TransactionEventType = EventType.beforeTransactionStart | EventType.afterTransactionStart | EventType.beforeTransactionCommit | EventType.afterTransactionCommit | EventType.beforeTransactionRollback | EventType.afterTransactionRollback;
|
|
162
|
+
export declare enum TransactionPropagation {
|
|
163
|
+
REQUIRED = "required",
|
|
164
|
+
REQUIRES_NEW = "requires_new",
|
|
165
|
+
NESTED = "nested",
|
|
166
|
+
NOT_SUPPORTED = "not_supported",
|
|
167
|
+
SUPPORTS = "supports",
|
|
168
|
+
MANDATORY = "mandatory",
|
|
169
|
+
NEVER = "never"
|
|
170
|
+
}
|
|
159
171
|
export interface TransactionOptions {
|
|
160
172
|
ctx?: Transaction;
|
|
161
|
-
|
|
173
|
+
propagation?: TransactionPropagation | `${TransactionPropagation}`;
|
|
174
|
+
isolationLevel?: IsolationLevel | `${IsolationLevel}`;
|
|
162
175
|
readOnly?: boolean;
|
|
163
176
|
clear?: boolean;
|
|
164
|
-
flushMode?: FlushMode
|
|
177
|
+
flushMode?: FlushMode | `${FlushMode}`;
|
|
165
178
|
ignoreNestedTransactions?: boolean;
|
|
166
179
|
loggerContext?: LogContext;
|
|
167
180
|
}
|
|
@@ -171,3 +184,5 @@ export declare enum DeferMode {
|
|
|
171
184
|
INITIALLY_IMMEDIATE = "immediate",
|
|
172
185
|
INITIALLY_DEFERRED = "deferred"
|
|
173
186
|
}
|
|
187
|
+
/** With `absolute` the prefix is set at the root of the entity (regardless of the nesting level) */
|
|
188
|
+
export type EmbeddedPrefixMode = 'absolute' | 'relative';
|
package/enums.js
CHANGED
|
@@ -95,9 +95,11 @@ export var QueryFlag;
|
|
|
95
95
|
QueryFlag["INCLUDE_LAZY_FORMULAS"] = "INCLUDE_LAZY_FORMULAS";
|
|
96
96
|
QueryFlag["AUTO_JOIN_ONE_TO_ONE_OWNER"] = "AUTO_JOIN_ONE_TO_ONE_OWNER";
|
|
97
97
|
QueryFlag["INFER_POPULATE"] = "INFER_POPULATE";
|
|
98
|
+
QueryFlag["DISABLE_NESTED_INNER_JOIN"] = "DISABLE_NESTED_INNER_JOIN";
|
|
98
99
|
QueryFlag["IDENTITY_INSERT"] = "IDENTITY_INSERT";
|
|
100
|
+
QueryFlag["OUTPUT_TABLE"] = "OUTPUT_TABLE";
|
|
99
101
|
})(QueryFlag || (QueryFlag = {}));
|
|
100
|
-
export const SCALAR_TYPES = ['string', 'number', 'boolean', 'bigint', 'Date', 'Buffer', 'RegExp'];
|
|
102
|
+
export const SCALAR_TYPES = new Set(['string', 'number', 'boolean', 'bigint', 'Uint8Array', 'Date', 'Buffer', 'RegExp']);
|
|
101
103
|
export var ReferenceKind;
|
|
102
104
|
(function (ReferenceKind) {
|
|
103
105
|
ReferenceKind["SCALAR"] = "scalar";
|
|
@@ -122,6 +124,7 @@ export var LoadStrategy;
|
|
|
122
124
|
(function (LoadStrategy) {
|
|
123
125
|
LoadStrategy["SELECT_IN"] = "select-in";
|
|
124
126
|
LoadStrategy["JOINED"] = "joined";
|
|
127
|
+
LoadStrategy["BALANCED"] = "balanced";
|
|
125
128
|
})(LoadStrategy || (LoadStrategy = {}));
|
|
126
129
|
export var DataloaderType;
|
|
127
130
|
(function (DataloaderType) {
|
|
@@ -175,6 +178,16 @@ export const EventTypeMap = Object.keys(EventType).reduce((a, b, i) => {
|
|
|
175
178
|
a[b] = i;
|
|
176
179
|
return a;
|
|
177
180
|
}, {});
|
|
181
|
+
export var TransactionPropagation;
|
|
182
|
+
(function (TransactionPropagation) {
|
|
183
|
+
TransactionPropagation["REQUIRED"] = "required";
|
|
184
|
+
TransactionPropagation["REQUIRES_NEW"] = "requires_new";
|
|
185
|
+
TransactionPropagation["NESTED"] = "nested";
|
|
186
|
+
TransactionPropagation["NOT_SUPPORTED"] = "not_supported";
|
|
187
|
+
TransactionPropagation["SUPPORTS"] = "supports";
|
|
188
|
+
TransactionPropagation["MANDATORY"] = "mandatory";
|
|
189
|
+
TransactionPropagation["NEVER"] = "never";
|
|
190
|
+
})(TransactionPropagation || (TransactionPropagation = {}));
|
|
178
191
|
export class PlainObject {
|
|
179
192
|
}
|
|
180
193
|
export var DeferMode;
|
package/errors.d.ts
CHANGED
|
@@ -8,13 +8,14 @@ export declare class ValidationError<T extends AnyEntity = AnyEntity> extends Er
|
|
|
8
8
|
getEntity(): AnyEntity | undefined;
|
|
9
9
|
static fromWrongPropertyType(entity: AnyEntity, property: string, expectedType: string, givenType: string, givenValue: string): ValidationError;
|
|
10
10
|
static fromWrongRepositoryType(entityName: string, repoType: string, method: string): ValidationError;
|
|
11
|
-
static fromCollectionNotInitialized(entity: AnyEntity, prop: EntityProperty): ValidationError;
|
|
12
11
|
static fromMergeWithoutPK(meta: EntityMetadata): ValidationError;
|
|
13
12
|
static transactionRequired(): ValidationError;
|
|
14
13
|
static entityNotManaged(entity: AnyEntity): ValidationError;
|
|
15
14
|
static notEntity(owner: AnyEntity, prop: EntityProperty, data: any): ValidationError;
|
|
16
15
|
static notDiscoveredEntity(data: any, meta?: EntityMetadata, action?: string): ValidationError;
|
|
17
16
|
static invalidPropertyName(entityName: string, invalid: string): ValidationError;
|
|
17
|
+
static invalidCollectionValues(entityName: string, propName: string, invalid: unknown): ValidationError;
|
|
18
|
+
static invalidEnumArrayItems(entityName: string, invalid: unknown): ValidationError;
|
|
18
19
|
static invalidType(type: Constructor<any>, value: any, mode: string): ValidationError;
|
|
19
20
|
static propertyRequired(entity: AnyEntity, property: EntityProperty): ValidationError;
|
|
20
21
|
static cannotModifyInverseCollection(owner: AnyEntity, property: EntityProperty): ValidationError;
|
|
@@ -24,7 +25,9 @@ export declare class ValidationError<T extends AnyEntity = AnyEntity> extends Er
|
|
|
24
25
|
static cannotCommit(): ValidationError;
|
|
25
26
|
static cannotUseGlobalContext(): ValidationError;
|
|
26
27
|
static cannotUseOperatorsInsideEmbeddables(className: string, propName: string, payload: unknown): ValidationError;
|
|
28
|
+
static cannotUseGroupOperatorsInsideScalars(className: string, propName: string, payload: unknown): ValidationError;
|
|
27
29
|
static invalidEmbeddableQuery(className: string, propName: string, embeddableType: string): ValidationError;
|
|
30
|
+
static invalidQueryCondition(cond: unknown): ValidationError;
|
|
28
31
|
}
|
|
29
32
|
export declare class CursorError<T extends AnyEntity = AnyEntity> extends ValidationError<T> {
|
|
30
33
|
static entityNotPopulated(entity: AnyEntity, prop: string): ValidationError;
|
|
@@ -43,7 +46,6 @@ export declare class MetadataError<T extends AnyEntity = AnyEntity> extends Vali
|
|
|
43
46
|
static fromWrongOwnership(meta: EntityMetadata, prop: EntityProperty, key: 'inversedBy' | 'mappedBy'): MetadataError;
|
|
44
47
|
static fromWrongReferenceKind(meta: EntityMetadata, owner: EntityProperty, prop: EntityProperty): MetadataError;
|
|
45
48
|
static fromInversideSidePrimary(meta: EntityMetadata, owner: EntityProperty, prop: EntityProperty): MetadataError;
|
|
46
|
-
static entityNotFound(name: string, path: string): MetadataError;
|
|
47
49
|
static unknownIndexProperty(meta: EntityMetadata, prop: string, type: string): MetadataError;
|
|
48
50
|
static multipleVersionFields(meta: EntityMetadata, fields: string[]): MetadataError;
|
|
49
51
|
static invalidVersionFieldType(meta: EntityMetadata): MetadataError;
|
|
@@ -65,4 +67,10 @@ export declare class MetadataError<T extends AnyEntity = AnyEntity> extends Vali
|
|
|
65
67
|
export declare class NotFoundError<T extends AnyEntity = AnyEntity> extends ValidationError<T> {
|
|
66
68
|
static findOneFailed(name: string, where: Dictionary | IPrimaryKey): NotFoundError;
|
|
67
69
|
static findExactlyOneFailed(name: string, where: Dictionary | IPrimaryKey): NotFoundError;
|
|
70
|
+
static failedToLoadProperty(name: string, propName: string, where: unknown): NotFoundError;
|
|
71
|
+
}
|
|
72
|
+
export declare class TransactionStateError extends ValidationError {
|
|
73
|
+
static requiredTransactionNotFound(propagation: string): TransactionStateError;
|
|
74
|
+
static transactionNotAllowed(propagation: string): TransactionStateError;
|
|
75
|
+
static invalidPropagation(propagation: string): TransactionStateError;
|
|
68
76
|
}
|
package/errors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { inspect } from '
|
|
1
|
+
import { inspect } from './logging/inspect.js';
|
|
2
2
|
export class ValidationError extends Error {
|
|
3
3
|
entity;
|
|
4
4
|
constructor(message, entity) {
|
|
@@ -23,11 +23,6 @@ export class ValidationError extends Error {
|
|
|
23
23
|
const msg = `Trying to use EntityRepository.${method}() with '${entityName}' entity while the repository is of type '${repoType}'`;
|
|
24
24
|
return new ValidationError(msg);
|
|
25
25
|
}
|
|
26
|
-
static fromCollectionNotInitialized(entity, prop) {
|
|
27
|
-
const entityName = entity.constructor.name;
|
|
28
|
-
const msg = `${entityName}.${prop.name} is not initialized, define it as '${prop.name} = new Collection<${prop.type}>(this);'`;
|
|
29
|
-
return new ValidationError(msg);
|
|
30
|
-
}
|
|
31
26
|
static fromMergeWithoutPK(meta) {
|
|
32
27
|
return new ValidationError(`You cannot merge entity '${meta.className}' without identifier!`);
|
|
33
28
|
}
|
|
@@ -53,6 +48,12 @@ export class ValidationError extends Error {
|
|
|
53
48
|
static invalidPropertyName(entityName, invalid) {
|
|
54
49
|
return new ValidationError(`Entity '${entityName}' does not have property '${invalid}'`);
|
|
55
50
|
}
|
|
51
|
+
static invalidCollectionValues(entityName, propName, invalid) {
|
|
52
|
+
return new ValidationError(`Invalid collection values provided for '${entityName}.${propName}' in ${entityName}.assign(): ${inspect(invalid)}`);
|
|
53
|
+
}
|
|
54
|
+
static invalidEnumArrayItems(entityName, invalid) {
|
|
55
|
+
return new ValidationError(`Invalid enum array items provided in ${entityName}: ${inspect(invalid)}`);
|
|
56
|
+
}
|
|
56
57
|
static invalidType(type, value, mode) {
|
|
57
58
|
const valueType = Object.prototype.toString.call(value).match(/\[object (\w+)]/)[1].toLowerCase();
|
|
58
59
|
if (value instanceof Date) {
|
|
@@ -94,9 +95,16 @@ export class ValidationError extends Error {
|
|
|
94
95
|
static cannotUseOperatorsInsideEmbeddables(className, propName, payload) {
|
|
95
96
|
return new ValidationError(`Using operators inside embeddables is not allowed, move the operator above. (property: ${className}.${propName}, payload: ${inspect(payload)})`);
|
|
96
97
|
}
|
|
98
|
+
static cannotUseGroupOperatorsInsideScalars(className, propName, payload) {
|
|
99
|
+
return new ValidationError(`Using group operators ($and/$or) inside scalar properties is not allowed, move the operator above. (property: ${className}.${propName}, payload: ${inspect(payload)})`);
|
|
100
|
+
}
|
|
97
101
|
static invalidEmbeddableQuery(className, propName, embeddableType) {
|
|
98
102
|
return new ValidationError(`Invalid query for entity '${className}', property '${propName}' does not exist in embeddable '${embeddableType}'`);
|
|
99
103
|
}
|
|
104
|
+
/* v8 ignore next */
|
|
105
|
+
static invalidQueryCondition(cond) {
|
|
106
|
+
return new ValidationError(`Invalid query condition: ${inspect(cond, { depth: 5 })}`);
|
|
107
|
+
}
|
|
100
108
|
}
|
|
101
109
|
export class CursorError extends ValidationError {
|
|
102
110
|
static entityNotPopulated(entity, prop) {
|
|
@@ -151,10 +159,6 @@ export class MetadataError extends ValidationError {
|
|
|
151
159
|
static fromInversideSidePrimary(meta, owner, prop) {
|
|
152
160
|
return new MetadataError(`${meta.className}.${prop.name} cannot be primary key as it is defined as inverse side. Maybe you should swap the use of 'inversedBy' and 'mappedBy'.`);
|
|
153
161
|
}
|
|
154
|
-
/* v8 ignore next 3 */
|
|
155
|
-
static entityNotFound(name, path) {
|
|
156
|
-
return new MetadataError(`Entity '${name}' not found in ${path}`);
|
|
157
|
-
}
|
|
158
162
|
static unknownIndexProperty(meta, prop, type) {
|
|
159
163
|
return new MetadataError(`Entity ${meta.className} has wrong ${type} definition: '${prop}' does not exist. You need to use property name, not column name.`);
|
|
160
164
|
}
|
|
@@ -219,4 +223,19 @@ export class NotFoundError extends ValidationError {
|
|
|
219
223
|
static findExactlyOneFailed(name, where) {
|
|
220
224
|
return new NotFoundError(`Wrong number of ${name} entities found for query ${inspect(where)}, expected exactly one`);
|
|
221
225
|
}
|
|
226
|
+
static failedToLoadProperty(name, propName, where) {
|
|
227
|
+
const whereString = typeof where === 'object' ? inspect(where) : where;
|
|
228
|
+
return new NotFoundError(`${name} (${whereString}) failed to load property '${propName}'`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export class TransactionStateError extends ValidationError {
|
|
232
|
+
static requiredTransactionNotFound(propagation) {
|
|
233
|
+
return new TransactionStateError(`No existing transaction found for transaction marked with propagation "${propagation}"`);
|
|
234
|
+
}
|
|
235
|
+
static transactionNotAllowed(propagation) {
|
|
236
|
+
return new TransactionStateError(`Existing transaction found for transaction marked with propagation "${propagation}"`);
|
|
237
|
+
}
|
|
238
|
+
static invalidPropagation(propagation) {
|
|
239
|
+
return new TransactionStateError(`Unsupported transaction propagation type: ${propagation}`);
|
|
240
|
+
}
|
|
222
241
|
}
|
package/events/EventManager.d.ts
CHANGED
|
@@ -6,8 +6,9 @@ export declare class EventManager {
|
|
|
6
6
|
private readonly entities;
|
|
7
7
|
private readonly cache;
|
|
8
8
|
private readonly subscribers;
|
|
9
|
-
constructor(subscribers: EventSubscriber
|
|
9
|
+
constructor(subscribers: Iterable<EventSubscriber>);
|
|
10
10
|
registerSubscriber(subscriber: EventSubscriber): void;
|
|
11
|
+
getSubscribers(): Set<EventSubscriber>;
|
|
11
12
|
dispatchEvent<T extends object>(event: TransactionEventType, args: TransactionEventArgs, meta?: EntityMetadata<T>): unknown;
|
|
12
13
|
dispatchEvent<T extends object>(event: EventType.onInit, args: Partial<EventArgs<T>>, meta?: EntityMetadata<T>): unknown;
|
|
13
14
|
dispatchEvent<T extends object>(event: EventType, args: Partial<EventArgs<T> | FlushEventArgs>, meta?: EntityMetadata<T>): Promise<unknown>;
|
package/events/EventManager.js
CHANGED
|
@@ -4,21 +4,29 @@ export class EventManager {
|
|
|
4
4
|
listeners = {};
|
|
5
5
|
entities = new Map();
|
|
6
6
|
cache = new Map();
|
|
7
|
-
subscribers =
|
|
7
|
+
subscribers = new Set();
|
|
8
8
|
constructor(subscribers) {
|
|
9
|
-
|
|
9
|
+
for (const subscriber of subscribers) {
|
|
10
|
+
this.registerSubscriber(subscriber);
|
|
11
|
+
}
|
|
10
12
|
}
|
|
11
13
|
registerSubscriber(subscriber) {
|
|
12
|
-
this.subscribers.
|
|
14
|
+
if (this.subscribers.has(subscriber)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.subscribers.add(subscriber);
|
|
13
18
|
this.entities.set(subscriber, this.getSubscribedEntities(subscriber));
|
|
14
19
|
this.cache.clear();
|
|
15
20
|
Utils.keys(EventType)
|
|
16
21
|
.filter(event => event in subscriber)
|
|
17
22
|
.forEach(event => {
|
|
18
|
-
this.listeners[event] ??=
|
|
19
|
-
this.listeners[event].
|
|
23
|
+
this.listeners[event] ??= new Set();
|
|
24
|
+
this.listeners[event].add(subscriber);
|
|
20
25
|
});
|
|
21
26
|
}
|
|
27
|
+
getSubscribers() {
|
|
28
|
+
return this.subscribers;
|
|
29
|
+
}
|
|
22
30
|
dispatchEvent(event, args, meta) {
|
|
23
31
|
const listeners = [];
|
|
24
32
|
const entity = args.entity;
|
|
@@ -30,9 +38,9 @@ export class EventManager {
|
|
|
30
38
|
const handler = typeof hook === 'function' ? hook : entity[hook] ?? prototypeHook;
|
|
31
39
|
return handler.bind(entity);
|
|
32
40
|
}));
|
|
33
|
-
for (const listener of this.listeners[event]
|
|
41
|
+
for (const listener of this.listeners[event] ?? new Set()) {
|
|
34
42
|
const entities = this.entities.get(listener);
|
|
35
|
-
if (entities.
|
|
43
|
+
if (entities.size === 0 || !entity || entities.has(entity.constructor.name)) {
|
|
36
44
|
listeners.push(listener[event].bind(listener));
|
|
37
45
|
}
|
|
38
46
|
}
|
|
@@ -51,9 +59,9 @@ export class EventManager {
|
|
|
51
59
|
this.cache.set(cacheKey, true);
|
|
52
60
|
return true;
|
|
53
61
|
}
|
|
54
|
-
for (const listener of this.listeners[event] ??
|
|
62
|
+
for (const listener of this.listeners[event] ?? new Set()) {
|
|
55
63
|
const entities = this.entities.get(listener);
|
|
56
|
-
if (entities.
|
|
64
|
+
if (entities.size === 0 || entities.has(meta.className)) {
|
|
57
65
|
this.cache.set(cacheKey, true);
|
|
58
66
|
return true;
|
|
59
67
|
}
|
|
@@ -66,8 +74,8 @@ export class EventManager {
|
|
|
66
74
|
}
|
|
67
75
|
getSubscribedEntities(listener) {
|
|
68
76
|
if (!listener.getSubscribedEntities) {
|
|
69
|
-
return
|
|
77
|
+
return new Set();
|
|
70
78
|
}
|
|
71
|
-
return listener.getSubscribedEntities().map(name => Utils.className(name));
|
|
79
|
+
return new Set(listener.getSubscribedEntities().map(name => Utils.className(name)));
|
|
72
80
|
}
|
|
73
81
|
}
|
|
@@ -13,7 +13,9 @@ export interface FlushEventArgs extends Omit<EventArgs<any>, 'entity' | 'changeS
|
|
|
13
13
|
uow: UnitOfWork;
|
|
14
14
|
}
|
|
15
15
|
export interface TransactionEventArgs extends Omit<EventArgs<any>, 'entity' | 'meta' | 'changeSet'> {
|
|
16
|
-
transaction?: Transaction
|
|
16
|
+
transaction?: Transaction & {
|
|
17
|
+
savepointName?: string;
|
|
18
|
+
};
|
|
17
19
|
uow?: UnitOfWork;
|
|
18
20
|
}
|
|
19
21
|
export interface EventSubscriber<T = any> {
|
package/hydration/Hydrator.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import type { EntityData, EntityMetadata } from '../typings.js';
|
|
2
2
|
import { Hydrator } from './Hydrator.js';
|
|
3
3
|
import type { EntityFactory } from '../entity/EntityFactory.js';
|
|
4
|
-
type EntityHydrator<T extends object> = (entity: T, data: EntityData<T>, factory: EntityFactory, newEntity: boolean, convertCustomTypes: boolean, schema?: string, parentSchema?: string) => void;
|
|
4
|
+
type EntityHydrator<T extends object> = (entity: T, data: EntityData<T>, factory: EntityFactory, newEntity: boolean, convertCustomTypes: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean) => void;
|
|
5
5
|
export declare class ObjectHydrator extends Hydrator {
|
|
6
6
|
private readonly hydrators;
|
|
7
7
|
private tmpIndex;
|
|
8
8
|
/**
|
|
9
9
|
* @inheritDoc
|
|
10
10
|
*/
|
|
11
|
-
hydrate<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, type: 'full' | 'reference', newEntity?: boolean, convertCustomTypes?: boolean, schema?: string, parentSchema?: string): void;
|
|
11
|
+
hydrate<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, type: 'full' | 'reference', newEntity?: boolean, convertCustomTypes?: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean): void;
|
|
12
12
|
/**
|
|
13
13
|
* @inheritDoc
|
|
14
14
|
*/
|
|
15
|
-
hydrateReference<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, convertCustomTypes?: boolean, schema?: string, parentSchema?: string): void;
|
|
15
|
+
hydrateReference<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, convertCustomTypes?: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean): void;
|
|
16
16
|
/**
|
|
17
17
|
* @internal Highly performance-sensitive method.
|
|
18
18
|
*/
|
|
19
|
-
getEntityHydrator<T extends object>(meta: EntityMetadata<T>, type: 'full' | 'reference'): EntityHydrator<T>;
|
|
19
|
+
getEntityHydrator<T extends object>(meta: EntityMetadata<T>, type: 'full' | 'reference', normalizeAccessors?: boolean): EntityHydrator<T>;
|
|
20
20
|
private createCollectionItemMapper;
|
|
21
21
|
private wrap;
|
|
22
22
|
private safeKey;
|
|
@@ -6,37 +6,40 @@ import { ReferenceKind } from '../enums.js';
|
|
|
6
6
|
import { RawQueryFragment } 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.className);
|
|
40
43
|
if (exists) {
|
|
41
44
|
return exists;
|
|
42
45
|
}
|
|
@@ -48,7 +51,7 @@ 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
|
|
54
|
+
/* v8 ignore next */
|
|
52
55
|
if (RawQueryFragment.isKnownFragment(val)) {
|
|
53
56
|
return val;
|
|
54
57
|
}
|
|
@@ -63,7 +66,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
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);
|
|
@@ -126,17 +136,17 @@ export class ObjectHydrator extends Hydrator {
|
|
|
126
136
|
ret.push(` } else if (typeof data${dataKey} !== 'undefined') {`);
|
|
127
137
|
ret.push(` if (isPrimaryKey(data${dataKey}, true)) {`);
|
|
128
138
|
if (prop.ref) {
|
|
129
|
-
ret.push(` entity${entityKey} = Reference.create(factory.createReference('${prop.type}', data${dataKey}, { merge: true, convertCustomTypes, schema }));`);
|
|
139
|
+
ret.push(` entity${entityKey} = Reference.create(factory.createReference('${prop.type}', data${dataKey}, { merge: true, convertCustomTypes, normalizeAccessors, schema }));`);
|
|
130
140
|
}
|
|
131
141
|
else {
|
|
132
|
-
ret.push(` entity${entityKey} = factory.createReference('${prop.type}', data${dataKey}, { merge: true, convertCustomTypes, schema });`);
|
|
142
|
+
ret.push(` entity${entityKey} = factory.createReference('${prop.type}', data${dataKey}, { merge: true, convertCustomTypes, normalizeAccessors, schema });`);
|
|
133
143
|
}
|
|
134
144
|
ret.push(` } else if (data${dataKey} && typeof data${dataKey} === 'object') {`);
|
|
135
145
|
if (prop.ref) {
|
|
136
|
-
ret.push(` entity${entityKey} = Reference.create(factory.${method}('${prop.type}', data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, schema }));`);
|
|
146
|
+
ret.push(` entity${entityKey} = Reference.create(factory.${method}('${prop.type}', data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, normalizeAccessors, schema }));`);
|
|
137
147
|
}
|
|
138
148
|
else {
|
|
139
|
-
ret.push(` entity${entityKey} = factory.${method}('${prop.type}', data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, schema });`);
|
|
149
|
+
ret.push(` entity${entityKey} = factory.${method}('${prop.type}', data${dataKey}, { initialized: true, merge: true, newEntity, convertCustomTypes, normalizeAccessors, schema });`);
|
|
140
150
|
}
|
|
141
151
|
ret.push(` }`);
|
|
142
152
|
ret.push(` }`);
|
|
@@ -245,7 +255,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
245
255
|
// weak comparison as we can have numbers that might have been converted to strings due to being object keys
|
|
246
256
|
ret.push(` if (data${childDataKey} == '${childMeta.discriminatorValue}') {`);
|
|
247
257
|
ret.push(` if (entity${entityKey} == null) {`);
|
|
248
|
-
ret.push(` entity${entityKey} = factory.createEmbeddable('${childMeta.className}', embeddedData, { newEntity, convertCustomTypes });`);
|
|
258
|
+
ret.push(` entity${entityKey} = factory.createEmbeddable('${childMeta.className}', embeddedData, { newEntity, convertCustomTypes, normalizeAccessors });`);
|
|
249
259
|
ret.push(` }`);
|
|
250
260
|
meta.props
|
|
251
261
|
.filter(p => p.embedded?.[0] === prop.name)
|
|
@@ -266,7 +276,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
266
276
|
}
|
|
267
277
|
else {
|
|
268
278
|
ret.push(` if (entity${entityKey} == null) {`);
|
|
269
|
-
ret.push(` entity${entityKey} = factory.createEmbeddable('${prop.targetMeta.className}', embeddedData, { newEntity, convertCustomTypes });`);
|
|
279
|
+
ret.push(` entity${entityKey} = factory.createEmbeddable('${prop.targetMeta.className}', embeddedData, { newEntity, convertCustomTypes, normalizeAccessors });`);
|
|
270
280
|
ret.push(` }`);
|
|
271
281
|
meta.props
|
|
272
282
|
.filter(p => p.embedded?.[0] === prop.name)
|
|
@@ -304,7 +314,7 @@ export class ObjectHydrator extends Hydrator {
|
|
|
304
314
|
};
|
|
305
315
|
const hydrateProperty = (prop, object = prop.object, path = [prop.name], dataKey) => {
|
|
306
316
|
const entityKey = path.map(k => this.wrap(k)).join('');
|
|
307
|
-
dataKey = dataKey ?? (object ? entityKey : this.wrap(prop.name));
|
|
317
|
+
dataKey = dataKey ?? (object ? entityKey : this.wrap(normalizeAccessors ? (prop.accessor ?? prop.name) : prop.name));
|
|
308
318
|
const ret = [];
|
|
309
319
|
if ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind) && !prop.mapToPk) {
|
|
310
320
|
ret.push(...hydrateToOne(prop, dataKey, entityKey));
|
|
@@ -334,11 +344,11 @@ export class ObjectHydrator extends Hydrator {
|
|
|
334
344
|
for (const prop of props) {
|
|
335
345
|
lines.push(...hydrateProperty(prop));
|
|
336
346
|
}
|
|
337
|
-
const code = `// compiled hydrator for entity ${meta.className} (${type})\n`
|
|
338
|
-
+ `return function(entity, data, factory, newEntity, convertCustomTypes, schema) {\n`
|
|
347
|
+
const code = `// compiled hydrator for entity ${meta.className} (${type + normalizeAccessors ? ' normalized' : ''})\n`
|
|
348
|
+
+ `return function(entity, data, factory, newEntity, convertCustomTypes, schema, parentSchema, normalizeAccessors) {\n`
|
|
339
349
|
+ `${lines.join('\n')}\n}`;
|
|
340
350
|
const hydrator = Utils.createFunction(context, code);
|
|
341
|
-
this.hydrators[
|
|
351
|
+
this.hydrators[key].set(meta.className, hydrator);
|
|
342
352
|
return hydrator;
|
|
343
353
|
}
|
|
344
354
|
createCollectionItemMapper(prop) {
|
|
@@ -351,9 +361,9 @@ export class ObjectHydrator extends Hydrator {
|
|
|
351
361
|
lines.push(` value = { ...value, ['${prop2.name}']: Reference.wrapReference(entity, { ref: ${prop2.ref} }) };`);
|
|
352
362
|
lines.push(` }`);
|
|
353
363
|
}
|
|
354
|
-
lines.push(` if (isPrimaryKey(value, ${meta.compositePK})) return factory.createReference('${prop.type}', value, { convertCustomTypes, schema, merge: true });`);
|
|
364
|
+
lines.push(` if (isPrimaryKey(value, ${meta.compositePK})) return factory.createReference('${prop.type}', value, { convertCustomTypes, schema, normalizeAccessors, merge: true });`);
|
|
355
365
|
lines.push(` if (value && value.__entity) return value;`);
|
|
356
|
-
lines.push(` return factory.create('${prop.type}', value, { newEntity, convertCustomTypes, schema, merge: true });`);
|
|
366
|
+
lines.push(` return factory.create('${prop.type}', value, { newEntity, convertCustomTypes, schema, normalizeAccessors, merge: true });`);
|
|
357
367
|
lines.push(` }`);
|
|
358
368
|
return lines;
|
|
359
369
|
}
|
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, 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, } 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
|
}
|