@mikro-orm/core 7.0.0-dev.21 → 7.0.0-dev.210
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 +99 -57
- package/EntityManager.js +302 -276
- 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 +44 -17
- package/entity/BaseEntity.d.ts +2 -2
- package/entity/BaseEntity.js +0 -3
- package/entity/Collection.d.ts +94 -29
- package/entity/Collection.js +434 -97
- package/entity/EntityAssigner.d.ts +1 -1
- package/entity/EntityAssigner.js +26 -18
- package/entity/EntityFactory.d.ts +13 -1
- package/entity/EntityFactory.js +84 -53
- package/entity/EntityHelper.d.ts +2 -2
- package/entity/EntityHelper.js +35 -15
- package/entity/EntityLoader.d.ts +6 -6
- package/entity/EntityLoader.js +119 -82
- package/entity/EntityRepository.d.ts +24 -4
- package/entity/EntityRepository.js +8 -2
- package/entity/Reference.d.ts +6 -5
- package/entity/Reference.js +34 -9
- package/entity/WrappedEntity.d.ts +2 -7
- package/entity/WrappedEntity.js +3 -8
- package/entity/defineEntity.d.ts +594 -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 +21 -5
- 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/hydration/Hydrator.js +1 -2
- package/hydration/ObjectHydrator.d.ts +4 -4
- package/hydration/ObjectHydrator.js +52 -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 +40 -23
- package/metadata/EntitySchema.js +81 -34
- package/metadata/MetadataDiscovery.d.ts +7 -10
- package/metadata/MetadataDiscovery.js +391 -331
- 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 +97 -40
- 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 +18 -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 +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 +290 -137
- package/typings.js +59 -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 +70 -34
- 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 +175 -98
- package/utils/AbstractSchemaGenerator.d.ts +5 -5
- package/utils/AbstractSchemaGenerator.js +18 -16
- package/utils/AsyncContext.d.ts +6 -0
- package/utils/AsyncContext.js +42 -0
- package/utils/Configuration.d.ts +785 -207
- package/utils/Configuration.js +147 -190
- package/utils/ConfigurationLoader.d.ts +1 -54
- package/utils/ConfigurationLoader.js +1 -352
- package/utils/Cursor.d.ts +0 -3
- package/utils/Cursor.js +27 -11
- package/utils/DataloaderUtils.d.ts +15 -5
- package/utils/DataloaderUtils.js +64 -30
- package/utils/EntityComparator.d.ts +13 -9
- package/utils/EntityComparator.js +101 -42
- package/utils/QueryHelper.d.ts +14 -6
- package/utils/QueryHelper.js +87 -25
- package/utils/RawQueryFragment.d.ts +48 -25
- package/utils/RawQueryFragment.js +66 -70
- 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 -126
- package/utils/Utils.js +100 -391
- 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 -32
- package/decorators/Embeddable.d.ts +0 -8
- package/decorators/Embeddable.js +0 -11
- package/decorators/Embedded.d.ts +0 -12
- 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 -32
- 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 -26
- 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/exports.d.ts +0 -24
- package/exports.js +0 -23
- 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
|
@@ -7,7 +7,7 @@ export interface NamingStrategy {
|
|
|
7
7
|
/**
|
|
8
8
|
* Return a table name for an entity class
|
|
9
9
|
*/
|
|
10
|
-
classToTableName(entityName: string): string;
|
|
10
|
+
classToTableName(entityName: string, tableName?: string): string;
|
|
11
11
|
/**
|
|
12
12
|
* Return a migration name. This name should allow ordering.
|
|
13
13
|
*/
|
|
@@ -25,7 +25,17 @@ export interface NamingStrategy {
|
|
|
25
25
|
*
|
|
26
26
|
* @return A new class name that will be used for the enum.
|
|
27
27
|
*/
|
|
28
|
-
getEnumClassName(columnName: string, tableName: string, schemaName?: string): string;
|
|
28
|
+
getEnumClassName(columnName: string, tableName: string | undefined, schemaName?: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get an enum type name. Used with `enumType: 'dictionary'` and `enumType: 'union-type'` entity generator option.
|
|
31
|
+
*
|
|
32
|
+
* @param columnName The column name which has the enum.
|
|
33
|
+
* @param tableName The table name of the column.
|
|
34
|
+
* @param schemaName The schema name of the column.
|
|
35
|
+
*
|
|
36
|
+
* @return A new type name that will be used for the enum.
|
|
37
|
+
*/
|
|
38
|
+
getEnumTypeName(columnName: string, tableName: string | undefined, schemaName?: string): string;
|
|
29
39
|
/**
|
|
30
40
|
* Get an enum option name for a given enum value.
|
|
31
41
|
*
|
|
@@ -57,11 +67,11 @@ export interface NamingStrategy {
|
|
|
57
67
|
/**
|
|
58
68
|
* Return a join table name
|
|
59
69
|
*/
|
|
60
|
-
joinTableName(sourceEntity: string, targetEntity: string, propertyName: string): string;
|
|
70
|
+
joinTableName(sourceEntity: string, targetEntity: string, propertyName: string, tableName?: string): string;
|
|
61
71
|
/**
|
|
62
72
|
* Return the foreign key column name for the given parameters
|
|
63
73
|
*/
|
|
64
|
-
joinKeyColumnName(entityName: string, referencedColumnName?: string, composite?: boolean): string;
|
|
74
|
+
joinKeyColumnName(entityName: string, referencedColumnName?: string, composite?: boolean, tableName?: string): string;
|
|
65
75
|
/**
|
|
66
76
|
* Returns key/constraint name for the given type. Some drivers might not support all the types (e.g. mysql and sqlite enforce the PK name).
|
|
67
77
|
*/
|
|
@@ -75,4 +85,14 @@ export interface NamingStrategy {
|
|
|
75
85
|
* Returns the name of the inverse side property. Used in the `EntityGenerator` with `bidirectionalRelations` option.
|
|
76
86
|
*/
|
|
77
87
|
inverseSideName(entityName: string, propertyName: string, kind: ReferenceKind): string;
|
|
88
|
+
/**
|
|
89
|
+
* Return a property name for a many-to-many relation (used in `EntityGenerator`).
|
|
90
|
+
*
|
|
91
|
+
* @param ownerEntityName - The owner entity class name
|
|
92
|
+
* @param targetEntityName - The target entity class name
|
|
93
|
+
* @param pivotTableName - The pivot table name
|
|
94
|
+
* @param ownerTableName - The owner table name
|
|
95
|
+
* @param schemaName - The schema name (if any)
|
|
96
|
+
*/
|
|
97
|
+
manyToManyPropertyName(ownerEntityName: string, targetEntityName: string, pivotTableName: string, ownerTableName: string, schemaName?: string): string;
|
|
78
98
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AbstractNamingStrategy } from './AbstractNamingStrategy.js';
|
|
2
2
|
export declare class UnderscoreNamingStrategy extends AbstractNamingStrategy {
|
|
3
|
-
classToTableName(entityName: string): string;
|
|
3
|
+
classToTableName(entityName: string, tableName?: string): string;
|
|
4
4
|
joinColumnName(propertyName: string): string;
|
|
5
|
-
joinKeyColumnName(entityName: string, referencedColumnName?: string): string;
|
|
6
|
-
joinTableName(sourceEntity: string, targetEntity: string, propertyName: string): string;
|
|
5
|
+
joinKeyColumnName(entityName: string, referencedColumnName?: string, composite?: boolean, tableName?: string): string;
|
|
6
|
+
joinTableName(sourceEntity: string, targetEntity: string, propertyName: string, tableName?: string): string;
|
|
7
7
|
propertyToColumnName(propertyName: string, object?: boolean): string;
|
|
8
8
|
referenceColumnName(): string;
|
|
9
9
|
private underscore;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { AbstractNamingStrategy } from './AbstractNamingStrategy.js';
|
|
2
2
|
export class UnderscoreNamingStrategy extends AbstractNamingStrategy {
|
|
3
|
-
classToTableName(entityName) {
|
|
4
|
-
return this.underscore(entityName);
|
|
3
|
+
classToTableName(entityName, tableName) {
|
|
4
|
+
return tableName ?? this.underscore(entityName);
|
|
5
5
|
}
|
|
6
6
|
joinColumnName(propertyName) {
|
|
7
7
|
return this.underscore(propertyName) + '_' + this.referenceColumnName();
|
|
8
8
|
}
|
|
9
|
-
joinKeyColumnName(entityName, referencedColumnName) {
|
|
10
|
-
return this.classToTableName(entityName) + '_' + (referencedColumnName || this.referenceColumnName());
|
|
9
|
+
joinKeyColumnName(entityName, referencedColumnName, composite, tableName) {
|
|
10
|
+
return this.classToTableName(entityName, tableName) + '_' + (referencedColumnName || this.referenceColumnName());
|
|
11
11
|
}
|
|
12
|
-
joinTableName(sourceEntity, targetEntity, propertyName) {
|
|
13
|
-
return this.classToTableName(sourceEntity) + '_' + this.classToTableName(propertyName);
|
|
12
|
+
joinTableName(sourceEntity, targetEntity, propertyName, tableName) {
|
|
13
|
+
return this.classToTableName(sourceEntity, tableName) + '_' + this.classToTableName(propertyName);
|
|
14
14
|
}
|
|
15
15
|
propertyToColumnName(propertyName, object) {
|
|
16
16
|
return this.underscore(propertyName);
|
package/not-supported.js
ADDED
package/package.json
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikro-orm/core",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "7.0.0-dev.
|
|
4
|
+
"version": "7.0.0-dev.210",
|
|
5
5
|
"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.",
|
|
6
6
|
"exports": {
|
|
7
7
|
"./package.json": "./package.json",
|
|
8
8
|
".": "./index.js",
|
|
9
|
-
"./
|
|
9
|
+
"./file-discovery": {
|
|
10
|
+
"node": "./metadata/discover-entities.js",
|
|
11
|
+
"browser": "./not-supported.js"
|
|
12
|
+
},
|
|
13
|
+
"./fs-utils": {
|
|
14
|
+
"node": "./utils/fs-utils.js",
|
|
15
|
+
"browser": "./not-supported.js"
|
|
16
|
+
}
|
|
10
17
|
},
|
|
11
18
|
"repository": {
|
|
12
19
|
"type": "git",
|
|
@@ -40,10 +47,10 @@
|
|
|
40
47
|
},
|
|
41
48
|
"homepage": "https://mikro-orm.io",
|
|
42
49
|
"engines": {
|
|
43
|
-
"node": ">= 22.
|
|
50
|
+
"node": ">= 22.17.0"
|
|
44
51
|
},
|
|
45
52
|
"scripts": {
|
|
46
|
-
"build": "yarn
|
|
53
|
+
"build": "yarn compile && yarn copy",
|
|
47
54
|
"clean": "yarn run -T rimraf ./dist",
|
|
48
55
|
"compile": "yarn run -T tsc -p tsconfig.build.json",
|
|
49
56
|
"copy": "node ../../scripts/copy.mjs"
|
|
@@ -51,12 +58,12 @@
|
|
|
51
58
|
"publishConfig": {
|
|
52
59
|
"access": "public"
|
|
53
60
|
},
|
|
54
|
-
"
|
|
55
|
-
"dataloader": "2.2.3"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"dataloader": "2.2.3"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"dataloader": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
61
68
|
}
|
|
62
69
|
}
|
package/platforms/Platform.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { inspect } from 'node:util';
|
|
2
1
|
import { EntityRepository } from '../entity/EntityRepository.js';
|
|
3
2
|
import { type NamingStrategy } from '../naming-strategy/NamingStrategy.js';
|
|
4
|
-
import type { Constructor, EntityProperty, IPrimaryKey, ISchemaGenerator, PopulateOptions, Primary,
|
|
3
|
+
import type { Constructor, EntityMetadata, EntityProperty, IPrimaryKey, ISchemaGenerator, PopulateOptions, Primary, SimpleColumnMeta } from '../typings.js';
|
|
5
4
|
import { ExceptionConverter } from './ExceptionConverter.js';
|
|
6
5
|
import type { EntityManager } from '../EntityManager.js';
|
|
7
6
|
import type { Configuration } from '../utils/Configuration.js';
|
|
@@ -28,9 +27,9 @@ export declare abstract class Platform {
|
|
|
28
27
|
supportsNativeEnums(): boolean;
|
|
29
28
|
/** for postgres text enums (default) */
|
|
30
29
|
usesEnumCheckConstraints(): boolean;
|
|
30
|
+
supportsMaterializedViews(): boolean;
|
|
31
31
|
getSchemaHelper(): unknown;
|
|
32
32
|
indexForeignKeys(): boolean;
|
|
33
|
-
allowsMultiInsert(): boolean;
|
|
34
33
|
/**
|
|
35
34
|
* Whether or not the driver supports retuning list of created PKs back when multi-inserting
|
|
36
35
|
*/
|
|
@@ -48,11 +47,6 @@ export declare abstract class Platform {
|
|
|
48
47
|
* Converts scalar primary key representation to native driver wrapper (e.g. string to mongodb's ObjectId)
|
|
49
48
|
*/
|
|
50
49
|
denormalizePrimaryKey(data: IPrimaryKey): IPrimaryKey;
|
|
51
|
-
/**
|
|
52
|
-
* Used when serializing via toObject and toJSON methods, allows to use different PK field name (like `id` instead of `_id`)
|
|
53
|
-
*/
|
|
54
|
-
getSerializedPrimaryKeyField(field: string): string;
|
|
55
|
-
usesDifferentSerializedPrimaryKey(): boolean;
|
|
56
50
|
/**
|
|
57
51
|
* Returns the SQL specific for the platform to get the current timestamp
|
|
58
52
|
*/
|
|
@@ -158,7 +152,7 @@ export declare abstract class Platform {
|
|
|
158
152
|
getFullTextIndexExpression(indexName: string, schemaName: string | undefined, tableName: string, columns: SimpleColumnMeta[]): string;
|
|
159
153
|
convertsJsonAutomatically(): boolean;
|
|
160
154
|
convertJsonToDatabaseValue(value: unknown, context?: TransformContext): unknown;
|
|
161
|
-
convertJsonToJSValue(value: unknown,
|
|
155
|
+
convertJsonToJSValue(value: unknown, context?: TransformContext): unknown;
|
|
162
156
|
convertDateToJSValue(value: string | Date): string;
|
|
163
157
|
convertIntervalToJSValue(value: string): unknown;
|
|
164
158
|
convertIntervalToDatabaseValue(value: unknown): unknown;
|
|
@@ -175,7 +169,9 @@ export declare abstract class Platform {
|
|
|
175
169
|
getExtension<T>(extensionName: string, extensionKey: string, moduleName: string, em: EntityManager): T;
|
|
176
170
|
getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): ISchemaGenerator;
|
|
177
171
|
processDateProperty(value: unknown): string | number | Date;
|
|
178
|
-
quoteIdentifier(id: string
|
|
172
|
+
quoteIdentifier(id: string | {
|
|
173
|
+
toString: () => string;
|
|
174
|
+
}, quote?: string): string;
|
|
179
175
|
quoteValue(value: any): string;
|
|
180
176
|
escape(value: any): string;
|
|
181
177
|
formatQuery(sql: string, params: readonly any[]): string;
|
|
@@ -193,7 +189,7 @@ export declare abstract class Platform {
|
|
|
193
189
|
getDefaultPrimaryName(tableName: string, columns: string[]): string;
|
|
194
190
|
supportsCustomPrimaryKeyNames(): boolean;
|
|
195
191
|
isPopulated<T>(key: string, populate: readonly PopulateOptions<T>[] | boolean): boolean;
|
|
196
|
-
shouldHaveColumn<T>(prop: EntityProperty<T>, populate: readonly PopulateOptions<T>[] | boolean, exclude?: string[], includeFormulas?: boolean): boolean;
|
|
192
|
+
shouldHaveColumn<T>(prop: EntityProperty<T>, populate: readonly PopulateOptions<T>[] | boolean, exclude?: string[], includeFormulas?: boolean, ignoreInlineEmbeddables?: boolean): boolean;
|
|
197
193
|
/**
|
|
198
194
|
* Currently not supported due to how knex does complex sqlite diffing (always based on current schema)
|
|
199
195
|
*/
|
|
@@ -225,6 +221,4 @@ export declare abstract class Platform {
|
|
|
225
221
|
* @internal
|
|
226
222
|
*/
|
|
227
223
|
clone(): this;
|
|
228
|
-
/** @ignore */
|
|
229
|
-
[inspect.custom](): string;
|
|
230
224
|
}
|
package/platforms/Platform.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { inspect } from 'node:util';
|
|
2
1
|
import { clone } from '../utils/clone.js';
|
|
3
2
|
import { EntityRepository } from '../entity/EntityRepository.js';
|
|
4
3
|
import { UnderscoreNamingStrategy } from '../naming-strategy/UnderscoreNamingStrategy.js';
|
|
5
4
|
import { ExceptionConverter } from './ExceptionConverter.js';
|
|
6
|
-
import { ArrayType, BigIntType, BlobType,
|
|
7
|
-
import { parseJsonSafe
|
|
5
|
+
import { ArrayType, BigIntType, BlobType, BooleanType, CharacterType, DateTimeType, DateType, DecimalType, DoubleType, EnumType, FloatType, IntegerType, IntervalType, JsonType, MediumIntType, SmallIntType, StringType, TextType, TimeType, TinyIntType, Type, Uint8ArrayType, UnknownType, UuidType, } from '../types/index.js';
|
|
6
|
+
import { parseJsonSafe } from '../utils/Utils.js';
|
|
8
7
|
import { ReferenceKind } from '../enums.js';
|
|
9
|
-
import {
|
|
8
|
+
import { Raw } from '../utils/RawQueryFragment.js';
|
|
10
9
|
export const JsonProperty = Symbol('JsonProperty');
|
|
11
10
|
export class Platform {
|
|
12
11
|
exceptionConverter = new ExceptionConverter();
|
|
@@ -42,15 +41,15 @@ export class Platform {
|
|
|
42
41
|
usesEnumCheckConstraints() {
|
|
43
42
|
return false;
|
|
44
43
|
}
|
|
44
|
+
supportsMaterializedViews() {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
45
47
|
getSchemaHelper() {
|
|
46
48
|
return undefined;
|
|
47
49
|
}
|
|
48
50
|
indexForeignKeys() {
|
|
49
51
|
return false;
|
|
50
52
|
}
|
|
51
|
-
allowsMultiInsert() {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
53
|
/**
|
|
55
54
|
* Whether or not the driver supports retuning list of created PKs back when multi-inserting
|
|
56
55
|
*/
|
|
@@ -78,15 +77,6 @@ export class Platform {
|
|
|
78
77
|
denormalizePrimaryKey(data) {
|
|
79
78
|
return data;
|
|
80
79
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Used when serializing via toObject and toJSON methods, allows to use different PK field name (like `id` instead of `_id`)
|
|
83
|
-
*/
|
|
84
|
-
getSerializedPrimaryKeyField(field) {
|
|
85
|
-
return field;
|
|
86
|
-
}
|
|
87
|
-
usesDifferentSerializedPrimaryKey() {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
80
|
/**
|
|
91
81
|
* Returns the SQL specific for the platform to get the current timestamp
|
|
92
82
|
*/
|
|
@@ -133,7 +123,7 @@ export class Platform {
|
|
|
133
123
|
return true;
|
|
134
124
|
}
|
|
135
125
|
isBigIntProperty(prop) {
|
|
136
|
-
return prop.columnTypes
|
|
126
|
+
return prop.columnTypes?.[0] === 'bigint';
|
|
137
127
|
}
|
|
138
128
|
getDefaultSchemaName() {
|
|
139
129
|
return undefined;
|
|
@@ -169,7 +159,7 @@ export class Platform {
|
|
|
169
159
|
return `text`;
|
|
170
160
|
}
|
|
171
161
|
getEnumTypeDeclarationSQL(column) {
|
|
172
|
-
if (column.items?.every(item =>
|
|
162
|
+
if (column.items?.every(item => typeof item === 'string')) {
|
|
173
163
|
return `enum('${column.items.join("','")}')`;
|
|
174
164
|
}
|
|
175
165
|
return this.getTinyIntTypeDeclarationSQL(column);
|
|
@@ -269,7 +259,7 @@ export class Platform {
|
|
|
269
259
|
getSearchJsonPropertyKey(path, type, aliased, value) {
|
|
270
260
|
return path.join('.');
|
|
271
261
|
}
|
|
272
|
-
/* v8 ignore next
|
|
262
|
+
/* v8 ignore next */
|
|
273
263
|
getJsonIndexDefinition(index) {
|
|
274
264
|
return index.columnNames;
|
|
275
265
|
}
|
|
@@ -288,11 +278,7 @@ export class Platform {
|
|
|
288
278
|
convertJsonToDatabaseValue(value, context) {
|
|
289
279
|
return JSON.stringify(value);
|
|
290
280
|
}
|
|
291
|
-
convertJsonToJSValue(value,
|
|
292
|
-
const isObjectEmbedded = prop.embedded && prop.object;
|
|
293
|
-
if ((this.convertsJsonAutomatically() || isObjectEmbedded) && ['json', 'jsonb', this.getJsonDeclarationSQL()].includes(prop.columnTypes[0])) {
|
|
294
|
-
return value;
|
|
295
|
-
}
|
|
281
|
+
convertJsonToJSValue(value, context) {
|
|
296
282
|
return parseJsonSafe(value);
|
|
297
283
|
}
|
|
298
284
|
convertDateToJSValue(value) {
|
|
@@ -306,7 +292,7 @@ export class Platform {
|
|
|
306
292
|
}
|
|
307
293
|
parseDate(value) {
|
|
308
294
|
const date = new Date(value);
|
|
309
|
-
/* v8 ignore next
|
|
295
|
+
/* v8 ignore next */
|
|
310
296
|
if (isNaN(date.getTime())) {
|
|
311
297
|
return value;
|
|
312
298
|
}
|
|
@@ -336,19 +322,10 @@ export class Platform {
|
|
|
336
322
|
if (extension) {
|
|
337
323
|
return extension;
|
|
338
324
|
}
|
|
339
|
-
/* v8 ignore next
|
|
340
|
-
|
|
341
|
-
module: moduleName,
|
|
342
|
-
warning: `Please install ${moduleName} package.`,
|
|
343
|
-
});
|
|
344
|
-
/* v8 ignore next 3 */
|
|
345
|
-
if (module) {
|
|
346
|
-
return this.config.getCachedService(module[extensionName], em);
|
|
347
|
-
}
|
|
348
|
-
/* v8 ignore next 2 */
|
|
349
|
-
throw new Error(`${extensionName} extension not registered.`);
|
|
325
|
+
/* v8 ignore next */
|
|
326
|
+
throw new Error(`${extensionName} extension not registered. Provide it in the ORM config, or use the async \`MikroORM.init()\` method to load extensions automatically.`);
|
|
350
327
|
}
|
|
351
|
-
/* v8 ignore next
|
|
328
|
+
/* v8 ignore next: kept for type inference only */
|
|
352
329
|
getSchemaGenerator(driver, em) {
|
|
353
330
|
throw new Error(`${driver.constructor.name} does not support SchemaGenerator`);
|
|
354
331
|
}
|
|
@@ -356,7 +333,7 @@ export class Platform {
|
|
|
356
333
|
return value;
|
|
357
334
|
}
|
|
358
335
|
quoteIdentifier(id, quote = '`') {
|
|
359
|
-
const raw =
|
|
336
|
+
const raw = Raw.getKnownFragment(id);
|
|
360
337
|
if (raw) {
|
|
361
338
|
return this.formatQuery(raw.sql, raw.params);
|
|
362
339
|
}
|
|
@@ -365,7 +342,7 @@ export class Platform {
|
|
|
365
342
|
quoteValue(value) {
|
|
366
343
|
return value;
|
|
367
344
|
}
|
|
368
|
-
/* v8 ignore next
|
|
345
|
+
/* v8 ignore next */
|
|
369
346
|
escape(value) {
|
|
370
347
|
return value;
|
|
371
348
|
}
|
|
@@ -455,7 +432,7 @@ export class Platform {
|
|
|
455
432
|
isPopulated(key, populate) {
|
|
456
433
|
return populate === true || (populate !== false && populate.some(p => p.field === key || p.all));
|
|
457
434
|
}
|
|
458
|
-
shouldHaveColumn(prop, populate, exclude, includeFormulas = true) {
|
|
435
|
+
shouldHaveColumn(prop, populate, exclude, includeFormulas = true, ignoreInlineEmbeddables = true) {
|
|
459
436
|
if (exclude?.includes(prop.name)) {
|
|
460
437
|
return false;
|
|
461
438
|
}
|
|
@@ -475,7 +452,7 @@ export class Platform {
|
|
|
475
452
|
return true;
|
|
476
453
|
}
|
|
477
454
|
if (prop.kind === ReferenceKind.EMBEDDED) {
|
|
478
|
-
return
|
|
455
|
+
return prop.object || ignoreInlineEmbeddables;
|
|
479
456
|
}
|
|
480
457
|
return prop.kind === ReferenceKind.ONE_TO_ONE && prop.owner;
|
|
481
458
|
}
|
|
@@ -522,9 +499,9 @@ export class Platform {
|
|
|
522
499
|
clone() {
|
|
523
500
|
return this;
|
|
524
501
|
}
|
|
525
|
-
/* v8 ignore next 4 */
|
|
526
502
|
/** @ignore */
|
|
527
|
-
|
|
503
|
+
/* v8 ignore next */
|
|
504
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
528
505
|
return `[${this.constructor.name}]`;
|
|
529
506
|
}
|
|
530
507
|
}
|
|
@@ -4,6 +4,7 @@ export declare class EntitySerializer {
|
|
|
4
4
|
static serialize<T extends object, P extends string = never, E extends string = never>(entity: T, options?: SerializeOptions<T, P, E>): EntityDTO<Loaded<T, P>>;
|
|
5
5
|
private static propertyName;
|
|
6
6
|
private static processProperty;
|
|
7
|
+
private static processCustomType;
|
|
7
8
|
private static extractChildOptions;
|
|
8
9
|
private static processEntity;
|
|
9
10
|
private static processCollection;
|
|
@@ -17,10 +18,14 @@ export interface SerializeOptions<T, P extends string = never, E extends string
|
|
|
17
18
|
forceObject?: boolean;
|
|
18
19
|
/** Ignore custom property serializers. */
|
|
19
20
|
ignoreSerializers?: boolean;
|
|
21
|
+
/** Include properties marked as `hidden`. */
|
|
22
|
+
includeHidden?: boolean;
|
|
20
23
|
/** Skip properties with `null` value. */
|
|
21
24
|
skipNull?: boolean;
|
|
22
25
|
/** Only include properties for a specific group. If a property does not specify any group, it will be included, otherwise only properties with a matching group are included. */
|
|
23
26
|
groups?: string[];
|
|
27
|
+
/** Convert custom types to their database representation. By default, the `Type.toJSON` method is invoked instead. */
|
|
28
|
+
convertCustomTypes?: boolean;
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
31
|
* Converts entity instance to POJO, converting the `Collection`s to arrays and unwrapping the `Reference` wrapper, while respecting the serialization options.
|
|
@@ -15,8 +15,8 @@ function isVisible(meta, propName, options) {
|
|
|
15
15
|
if (options.exclude?.find(item => item === propName)) {
|
|
16
16
|
return false;
|
|
17
17
|
}
|
|
18
|
-
const visible = prop && !prop.hidden;
|
|
19
|
-
const prefixed = prop && !prop.primary && propName.startsWith('_'); // ignore prefixed properties, if it's not a PK
|
|
18
|
+
const visible = prop && !(prop.hidden && !options.includeHidden);
|
|
19
|
+
const prefixed = prop && !prop.primary && !prop.accessor && propName.startsWith('_'); // ignore prefixed properties, if it's not a PK
|
|
20
20
|
return visible && !prefixed;
|
|
21
21
|
}
|
|
22
22
|
function isPopulated(propName, options) {
|
|
@@ -41,23 +41,41 @@ export class EntitySerializer {
|
|
|
41
41
|
}
|
|
42
42
|
const root = wrapped.__serializationContext.root;
|
|
43
43
|
const ret = {};
|
|
44
|
-
const
|
|
45
|
-
|
|
44
|
+
const props = new Set();
|
|
45
|
+
if (meta.serializedPrimaryKey && !meta.compositePK) {
|
|
46
|
+
props.add(meta.serializedPrimaryKey);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
meta.primaryKeys.forEach(pk => props.add(pk));
|
|
50
|
+
}
|
|
51
|
+
if (wrapped.isInitialized() || !wrapped.hasPrimaryKey()) {
|
|
52
|
+
const entityKeys = new Set(Object.keys(entity));
|
|
53
|
+
for (const prop of meta.props) {
|
|
54
|
+
if (entityKeys.has(prop.name) || (prop.getter && prop.accessor === prop.name)) {
|
|
55
|
+
props.add(prop.name);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const key of entityKeys) {
|
|
59
|
+
if (!meta.properties[key]) {
|
|
60
|
+
props.add(key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
46
64
|
const visited = root.visited.has(entity);
|
|
47
65
|
if (!visited) {
|
|
48
66
|
root.visited.add(entity);
|
|
49
67
|
}
|
|
50
|
-
for (const prop of
|
|
68
|
+
for (const prop of props) {
|
|
51
69
|
if (!isVisible(meta, prop, options)) {
|
|
52
70
|
continue;
|
|
53
71
|
}
|
|
54
|
-
const cycle = root.visit(meta.
|
|
72
|
+
const cycle = root.visit(meta.class, prop);
|
|
55
73
|
if (cycle && visited) {
|
|
56
74
|
continue;
|
|
57
75
|
}
|
|
58
76
|
const val = this.processProperty(prop, entity, options);
|
|
59
77
|
if (!cycle) {
|
|
60
|
-
root.leave(meta.
|
|
78
|
+
root.leave(meta.class, prop);
|
|
61
79
|
}
|
|
62
80
|
if (options.skipNull && Utils.isPlainObject(val)) {
|
|
63
81
|
Utils.dropUndefinedProperties(val, null);
|
|
@@ -67,7 +85,7 @@ export class EntitySerializer {
|
|
|
67
85
|
}
|
|
68
86
|
const visible = typeof val !== 'undefined' && !(val === null && options.skipNull);
|
|
69
87
|
if (visible) {
|
|
70
|
-
ret[this.propertyName(meta, prop
|
|
88
|
+
ret[this.propertyName(meta, prop)] = val;
|
|
71
89
|
}
|
|
72
90
|
}
|
|
73
91
|
if (contextCreated) {
|
|
@@ -81,26 +99,26 @@ export class EntitySerializer {
|
|
|
81
99
|
if (prop.getterName != null) {
|
|
82
100
|
const visible = entity[prop.getterName] instanceof Function && isVisible(meta, prop.name, options);
|
|
83
101
|
if (visible) {
|
|
84
|
-
ret[this.propertyName(meta, prop.name
|
|
102
|
+
ret[this.propertyName(meta, prop.name)] = this.processProperty(prop.getterName, entity, options);
|
|
85
103
|
}
|
|
86
104
|
}
|
|
87
105
|
else {
|
|
88
106
|
// decorated getters
|
|
89
107
|
const visible = typeof entity[prop.name] !== 'undefined' && isVisible(meta, prop.name, options);
|
|
90
108
|
if (visible) {
|
|
91
|
-
ret[this.propertyName(meta, prop.name
|
|
109
|
+
ret[this.propertyName(meta, prop.name)] = this.processProperty(prop.name, entity, options);
|
|
92
110
|
}
|
|
93
111
|
}
|
|
94
112
|
}
|
|
95
113
|
return ret;
|
|
96
114
|
}
|
|
97
|
-
static propertyName(meta, prop
|
|
98
|
-
/* v8 ignore next
|
|
115
|
+
static propertyName(meta, prop) {
|
|
116
|
+
/* v8 ignore next */
|
|
99
117
|
if (meta.properties[prop]?.serializedName) {
|
|
100
118
|
return meta.properties[prop].serializedName;
|
|
101
119
|
}
|
|
102
|
-
if (meta.properties[prop]?.primary &&
|
|
103
|
-
return
|
|
120
|
+
if (meta.properties[prop]?.primary && meta.serializedPrimaryKey) {
|
|
121
|
+
return meta.serializedPrimaryKey;
|
|
104
122
|
}
|
|
105
123
|
return prop;
|
|
106
124
|
}
|
|
@@ -119,7 +137,7 @@ export class EntitySerializer {
|
|
|
119
137
|
}
|
|
120
138
|
return returnValue;
|
|
121
139
|
}
|
|
122
|
-
/* v8 ignore next
|
|
140
|
+
/* v8 ignore next */
|
|
123
141
|
if (!options.ignoreSerializers && serializer) {
|
|
124
142
|
return serializer(value);
|
|
125
143
|
}
|
|
@@ -132,7 +150,7 @@ export class EntitySerializer {
|
|
|
132
150
|
if (Utils.isScalarReference(value)) {
|
|
133
151
|
return value.unwrap();
|
|
134
152
|
}
|
|
135
|
-
/* v8 ignore next
|
|
153
|
+
/* v8 ignore next */
|
|
136
154
|
if (property?.kind === ReferenceKind.EMBEDDED) {
|
|
137
155
|
if (Array.isArray(value)) {
|
|
138
156
|
return value.map(item => helper(item).toJSON());
|
|
@@ -141,12 +159,20 @@ export class EntitySerializer {
|
|
|
141
159
|
return helper(value).toJSON();
|
|
142
160
|
}
|
|
143
161
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return customType.toJSON(value, wrapped.__platform);
|
|
162
|
+
if (property.customType) {
|
|
163
|
+
return this.processCustomType(value, property, wrapped.__platform, options.convertCustomTypes);
|
|
147
164
|
}
|
|
148
165
|
return wrapped.__platform.normalizePrimaryKey(value);
|
|
149
166
|
}
|
|
167
|
+
static processCustomType(value, prop, platform, convertCustomTypes) {
|
|
168
|
+
if (!prop.customType) {
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
if (convertCustomTypes) {
|
|
172
|
+
return prop.customType.convertToDatabaseValue(value, platform, { mode: 'serialization' });
|
|
173
|
+
}
|
|
174
|
+
return prop.customType.toJSON(value, platform);
|
|
175
|
+
}
|
|
150
176
|
static extractChildOptions(options, prop) {
|
|
151
177
|
return {
|
|
152
178
|
...options,
|
|
@@ -165,10 +191,7 @@ export class EntitySerializer {
|
|
|
165
191
|
if (expand) {
|
|
166
192
|
return this.serialize(child, childOptions);
|
|
167
193
|
}
|
|
168
|
-
|
|
169
|
-
if (prop.customType) {
|
|
170
|
-
pk = prop.customType.toJSON(pk, wrapped.__platform);
|
|
171
|
-
}
|
|
194
|
+
const pk = this.processCustomType(wrapped.getPrimaryKey(), prop, wrapped.__platform, options.convertCustomTypes);
|
|
172
195
|
if (options.forceObject || wrapped.__config.get('serialization').forceObject) {
|
|
173
196
|
return Utils.primaryKeyToObject(meta, pk, visible);
|
|
174
197
|
}
|
|
@@ -192,10 +215,7 @@ export class EntitySerializer {
|
|
|
192
215
|
if (populated || !wrapped.__managed) {
|
|
193
216
|
return this.serialize(item, this.extractChildOptions(options, prop.name));
|
|
194
217
|
}
|
|
195
|
-
|
|
196
|
-
if (prop.customType) {
|
|
197
|
-
pk = prop.customType.toJSON(pk, wrapped.__platform);
|
|
198
|
-
}
|
|
218
|
+
const pk = this.processCustomType(wrapped.getPrimaryKey(), prop, wrapped.__platform, options.convertCustomTypes);
|
|
199
219
|
if (options.forceObject || wrapped.__config.get('serialization').forceObject) {
|
|
200
220
|
return Utils.primaryKeyToObject(wrapped.__meta, pk);
|
|
201
221
|
}
|