@mikro-orm/core 7.0.2 → 7.0.3-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/EntityManager.d.ts +583 -883
  2. package/EntityManager.js +1869 -1897
  3. package/MikroORM.d.ts +74 -103
  4. package/MikroORM.js +179 -178
  5. package/cache/CacheAdapter.d.ts +36 -36
  6. package/cache/FileCacheAdapter.d.ts +24 -30
  7. package/cache/FileCacheAdapter.js +78 -80
  8. package/cache/GeneratedCacheAdapter.d.ts +20 -18
  9. package/cache/GeneratedCacheAdapter.js +30 -30
  10. package/cache/MemoryCacheAdapter.d.ts +20 -18
  11. package/cache/MemoryCacheAdapter.js +36 -35
  12. package/cache/NullCacheAdapter.d.ts +16 -16
  13. package/cache/NullCacheAdapter.js +24 -24
  14. package/connections/Connection.d.ts +84 -95
  15. package/connections/Connection.js +168 -165
  16. package/drivers/DatabaseDriver.d.ts +80 -186
  17. package/drivers/DatabaseDriver.js +443 -450
  18. package/drivers/IDatabaseDriver.d.ts +301 -440
  19. package/entity/BaseEntity.d.ts +83 -120
  20. package/entity/BaseEntity.js +43 -43
  21. package/entity/Collection.d.ts +179 -212
  22. package/entity/Collection.js +721 -727
  23. package/entity/EntityAssigner.d.ts +77 -88
  24. package/entity/EntityAssigner.js +230 -231
  25. package/entity/EntityFactory.d.ts +54 -66
  26. package/entity/EntityFactory.js +383 -425
  27. package/entity/EntityHelper.d.ts +22 -34
  28. package/entity/EntityHelper.js +267 -280
  29. package/entity/EntityIdentifier.d.ts +4 -4
  30. package/entity/EntityIdentifier.js +10 -10
  31. package/entity/EntityLoader.d.ts +73 -103
  32. package/entity/EntityLoader.js +723 -753
  33. package/entity/EntityRepository.d.ts +201 -316
  34. package/entity/EntityRepository.js +213 -213
  35. package/entity/PolymorphicRef.d.ts +5 -5
  36. package/entity/PolymorphicRef.js +10 -10
  37. package/entity/Reference.d.ts +82 -126
  38. package/entity/Reference.js +274 -278
  39. package/entity/WrappedEntity.d.ts +72 -115
  40. package/entity/WrappedEntity.js +166 -168
  41. package/entity/defineEntity.d.ts +614 -1280
  42. package/entity/defineEntity.js +511 -520
  43. package/entity/utils.d.ts +3 -13
  44. package/entity/utils.js +73 -71
  45. package/entity/validators.js +43 -43
  46. package/entity/wrap.js +8 -8
  47. package/enums.d.ts +253 -258
  48. package/enums.js +252 -251
  49. package/errors.d.ts +72 -114
  50. package/errors.js +253 -350
  51. package/events/EventManager.d.ts +14 -26
  52. package/events/EventManager.js +77 -79
  53. package/events/EventSubscriber.d.ts +29 -29
  54. package/events/TransactionEventBroadcaster.d.ts +8 -15
  55. package/events/TransactionEventBroadcaster.js +14 -14
  56. package/exceptions.d.ts +40 -23
  57. package/exceptions.js +52 -35
  58. package/hydration/Hydrator.d.ts +17 -42
  59. package/hydration/Hydrator.js +43 -43
  60. package/hydration/ObjectHydrator.d.ts +17 -50
  61. package/hydration/ObjectHydrator.js +416 -479
  62. package/index.d.ts +2 -116
  63. package/index.js +1 -10
  64. package/logging/DefaultLogger.d.ts +32 -34
  65. package/logging/DefaultLogger.js +86 -86
  66. package/logging/Logger.d.ts +41 -41
  67. package/logging/SimpleLogger.d.ts +11 -13
  68. package/logging/SimpleLogger.js +22 -22
  69. package/logging/colors.d.ts +6 -6
  70. package/logging/colors.js +10 -11
  71. package/logging/inspect.js +7 -7
  72. package/metadata/EntitySchema.d.ts +127 -211
  73. package/metadata/EntitySchema.js +398 -397
  74. package/metadata/MetadataDiscovery.d.ts +114 -114
  75. package/metadata/MetadataDiscovery.js +1863 -1947
  76. package/metadata/MetadataProvider.d.ts +21 -24
  77. package/metadata/MetadataProvider.js +84 -82
  78. package/metadata/MetadataStorage.d.ts +32 -38
  79. package/metadata/MetadataStorage.js +118 -118
  80. package/metadata/MetadataValidator.d.ts +39 -39
  81. package/metadata/MetadataValidator.js +338 -381
  82. package/metadata/discover-entities.d.ts +2 -5
  83. package/metadata/discover-entities.js +27 -27
  84. package/metadata/types.d.ts +531 -615
  85. package/naming-strategy/AbstractNamingStrategy.d.ts +39 -54
  86. package/naming-strategy/AbstractNamingStrategy.js +85 -90
  87. package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
  88. package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
  89. package/naming-strategy/MongoNamingStrategy.d.ts +6 -6
  90. package/naming-strategy/MongoNamingStrategy.js +18 -18
  91. package/naming-strategy/NamingStrategy.d.ts +99 -109
  92. package/naming-strategy/UnderscoreNamingStrategy.d.ts +7 -7
  93. package/naming-strategy/UnderscoreNamingStrategy.js +21 -21
  94. package/not-supported.js +4 -7
  95. package/package.json +1 -1
  96. package/platforms/ExceptionConverter.d.ts +1 -1
  97. package/platforms/ExceptionConverter.js +4 -4
  98. package/platforms/Platform.d.ts +299 -308
  99. package/platforms/Platform.js +636 -659
  100. package/serialization/EntitySerializer.d.ts +26 -48
  101. package/serialization/EntitySerializer.js +218 -224
  102. package/serialization/EntityTransformer.d.ts +6 -10
  103. package/serialization/EntityTransformer.js +217 -219
  104. package/serialization/SerializationContext.d.ts +23 -27
  105. package/serialization/SerializationContext.js +105 -105
  106. package/types/ArrayType.d.ts +8 -8
  107. package/types/ArrayType.js +33 -33
  108. package/types/BigIntType.d.ts +10 -17
  109. package/types/BigIntType.js +37 -37
  110. package/types/BlobType.d.ts +3 -3
  111. package/types/BlobType.js +13 -13
  112. package/types/BooleanType.d.ts +4 -4
  113. package/types/BooleanType.js +12 -12
  114. package/types/CharacterType.d.ts +2 -2
  115. package/types/CharacterType.js +6 -6
  116. package/types/DateTimeType.d.ts +5 -5
  117. package/types/DateTimeType.js +15 -15
  118. package/types/DateType.d.ts +5 -5
  119. package/types/DateType.js +15 -15
  120. package/types/DecimalType.d.ts +7 -7
  121. package/types/DecimalType.js +26 -26
  122. package/types/DoubleType.d.ts +3 -3
  123. package/types/DoubleType.js +12 -12
  124. package/types/EnumArrayType.d.ts +5 -5
  125. package/types/EnumArrayType.js +24 -24
  126. package/types/EnumType.d.ts +3 -3
  127. package/types/EnumType.js +11 -11
  128. package/types/FloatType.d.ts +3 -3
  129. package/types/FloatType.js +9 -9
  130. package/types/IntegerType.d.ts +3 -3
  131. package/types/IntegerType.js +9 -9
  132. package/types/IntervalType.d.ts +4 -4
  133. package/types/IntervalType.js +12 -12
  134. package/types/JsonType.d.ts +8 -8
  135. package/types/JsonType.js +32 -32
  136. package/types/MediumIntType.d.ts +1 -1
  137. package/types/MediumIntType.js +3 -3
  138. package/types/SmallIntType.d.ts +3 -3
  139. package/types/SmallIntType.js +9 -9
  140. package/types/StringType.d.ts +4 -4
  141. package/types/StringType.js +12 -12
  142. package/types/TextType.d.ts +3 -3
  143. package/types/TextType.js +9 -9
  144. package/types/TimeType.d.ts +5 -5
  145. package/types/TimeType.js +17 -17
  146. package/types/TinyIntType.d.ts +3 -3
  147. package/types/TinyIntType.js +10 -10
  148. package/types/Type.d.ts +79 -83
  149. package/types/Type.js +82 -82
  150. package/types/Uint8ArrayType.d.ts +4 -4
  151. package/types/Uint8ArrayType.js +21 -21
  152. package/types/UnknownType.d.ts +4 -4
  153. package/types/UnknownType.js +12 -12
  154. package/types/UuidType.d.ts +5 -5
  155. package/types/UuidType.js +19 -19
  156. package/types/index.d.ts +49 -75
  157. package/types/index.js +26 -52
  158. package/typings.d.ts +729 -1211
  159. package/typings.js +231 -244
  160. package/unit-of-work/ChangeSet.d.ts +26 -26
  161. package/unit-of-work/ChangeSet.js +56 -56
  162. package/unit-of-work/ChangeSetComputer.d.ts +12 -12
  163. package/unit-of-work/ChangeSetComputer.js +170 -178
  164. package/unit-of-work/ChangeSetPersister.d.ts +44 -63
  165. package/unit-of-work/ChangeSetPersister.js +421 -442
  166. package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
  167. package/unit-of-work/CommitOrderCalculator.js +88 -89
  168. package/unit-of-work/IdentityMap.d.ts +31 -31
  169. package/unit-of-work/IdentityMap.js +105 -105
  170. package/unit-of-work/UnitOfWork.d.ts +141 -181
  171. package/unit-of-work/UnitOfWork.js +1183 -1200
  172. package/utils/AbstractMigrator.d.ts +91 -111
  173. package/utils/AbstractMigrator.js +275 -275
  174. package/utils/AbstractSchemaGenerator.d.ts +34 -43
  175. package/utils/AbstractSchemaGenerator.js +122 -121
  176. package/utils/AsyncContext.d.ts +3 -3
  177. package/utils/AsyncContext.js +35 -34
  178. package/utils/Configuration.d.ts +808 -852
  179. package/utils/Configuration.js +344 -359
  180. package/utils/Cursor.d.ts +22 -40
  181. package/utils/Cursor.js +127 -135
  182. package/utils/DataloaderUtils.d.ts +43 -58
  183. package/utils/DataloaderUtils.js +198 -203
  184. package/utils/EntityComparator.d.ts +81 -98
  185. package/utils/EntityComparator.js +728 -824
  186. package/utils/NullHighlighter.d.ts +1 -1
  187. package/utils/NullHighlighter.js +3 -3
  188. package/utils/QueryHelper.d.ts +51 -79
  189. package/utils/QueryHelper.js +361 -372
  190. package/utils/RawQueryFragment.d.ts +34 -50
  191. package/utils/RawQueryFragment.js +105 -107
  192. package/utils/RequestContext.d.ts +32 -32
  193. package/utils/RequestContext.js +53 -52
  194. package/utils/TransactionContext.d.ts +16 -16
  195. package/utils/TransactionContext.js +27 -27
  196. package/utils/TransactionManager.d.ts +58 -58
  197. package/utils/TransactionManager.js +197 -199
  198. package/utils/Utils.d.ts +145 -204
  199. package/utils/Utils.js +813 -814
  200. package/utils/clone.js +113 -104
  201. package/utils/env-vars.js +88 -90
  202. package/utils/fs-utils.d.ts +15 -15
  203. package/utils/fs-utils.js +181 -180
  204. package/utils/upsert-utils.d.ts +5 -20
  205. package/utils/upsert-utils.js +116 -114
@@ -3,31 +3,28 @@ import type { Logger } from '../logging/Logger.js';
3
3
  import type { SyncCacheAdapter } from '../cache/CacheAdapter.js';
4
4
  import type { Platform } from '../platforms/Platform.js';
5
5
  export interface IConfiguration {
6
- get(key: string, defaultValue?: any): any;
7
- getLogger(): Logger;
8
- getMetadataCacheAdapter(): SyncCacheAdapter;
9
- getPlatform(): Platform;
6
+ get(key: string, defaultValue?: any): any;
7
+ getLogger(): Logger;
8
+ getMetadataCacheAdapter(): SyncCacheAdapter;
9
+ getPlatform(): Platform;
10
10
  }
11
11
  /** Base metadata provider that resolves entity type information and manages metadata caching. */
12
12
  export declare class MetadataProvider {
13
- protected readonly config: IConfiguration;
14
- constructor(config: IConfiguration);
15
- /** Resolves entity references and type information for all properties in the given metadata. */
16
- loadEntityMetadata(meta: EntityMetadata): void;
17
- /** Merges cached metadata into the given entity metadata, preserving function expressions. */
18
- loadFromCache(meta: EntityMetadata, cache: EntityMetadata): void;
19
- /** Whether this provider class uses metadata caching by default. */
20
- static useCache(): boolean;
21
- /** Whether metadata caching is enabled for this instance. */
22
- useCache(): boolean;
23
- saveToCache(meta: EntityMetadata): void;
24
- /** Attempts to load metadata from cache, returning undefined if not available. */
25
- getCachedMetadata<T>(
26
- meta: Pick<EntityMetadata<T>, 'className' | 'path' | 'root'>,
27
- root: EntityMetadata<T>,
28
- ): EntityMetadata<T> | undefined;
29
- /** Combines individual metadata cache entries into a single file. */
30
- combineCache(): void;
31
- /** Returns the cache key for the given entity metadata. */
32
- getCacheKey(meta: Pick<EntityMetadata, 'className' | 'path'>): string;
13
+ protected readonly config: IConfiguration;
14
+ constructor(config: IConfiguration);
15
+ /** Resolves entity references and type information for all properties in the given metadata. */
16
+ loadEntityMetadata(meta: EntityMetadata): void;
17
+ /** Merges cached metadata into the given entity metadata, preserving function expressions. */
18
+ loadFromCache(meta: EntityMetadata, cache: EntityMetadata): void;
19
+ /** Whether this provider class uses metadata caching by default. */
20
+ static useCache(): boolean;
21
+ /** Whether metadata caching is enabled for this instance. */
22
+ useCache(): boolean;
23
+ saveToCache(meta: EntityMetadata): void;
24
+ /** Attempts to load metadata from cache, returning undefined if not available. */
25
+ getCachedMetadata<T>(meta: Pick<EntityMetadata<T>, 'className' | 'path' | 'root'>, root: EntityMetadata<T>): EntityMetadata<T> | undefined;
26
+ /** Combines individual metadata cache entries into a single file. */
27
+ combineCache(): void;
28
+ /** Returns the cache key for the given entity metadata. */
29
+ getCacheKey(meta: Pick<EntityMetadata, 'className' | 'path'>): string;
33
30
  }
@@ -2,94 +2,96 @@ import { Utils } from '../utils/Utils.js';
2
2
  import { EntitySchema } from './EntitySchema.js';
3
3
  /** Base metadata provider that resolves entity type information and manages metadata caching. */
4
4
  export class MetadataProvider {
5
- config;
6
- constructor(config) {
7
- this.config = config;
8
- }
9
- /** Resolves entity references and type information for all properties in the given metadata. */
10
- loadEntityMetadata(meta) {
11
- for (const prop of meta.props) {
12
- /* v8 ignore next */
13
- if (typeof prop.entity === 'string') {
14
- prop.type = prop.entity;
15
- } else if (prop.entity) {
16
- const tmp = prop.entity();
17
- prop.type = Array.isArray(tmp)
18
- ? tmp
19
- .map(t => Utils.className(t))
20
- .sort()
21
- .join(' | ')
22
- : Utils.className(tmp);
23
- prop.target = EntitySchema.is(tmp) ? tmp.meta.class : tmp;
24
- } else if (!prop.type && !((prop.enum || prop.array) && (prop.items?.length ?? 0) > 0)) {
25
- throw new Error(`Please provide either 'type' or 'entity' attribute in ${meta.className}.${prop.name}.`);
26
- }
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
27
8
  }
28
- }
29
- /** Merges cached metadata into the given entity metadata, preserving function expressions. */
30
- loadFromCache(meta, cache) {
31
- Object.values(cache.properties).forEach(prop => {
32
- const metaProp = meta.properties[prop.name];
33
- /* v8 ignore next */
34
- if (metaProp?.enum && Array.isArray(metaProp.items)) {
35
- delete prop.items;
36
- }
37
- });
38
- // Preserve function expressions from indexes/uniques — they can't survive JSON cache serialization
39
- const expressionMap = new Map();
40
- for (const arr of [meta.indexes, meta.uniques]) {
41
- for (const idx of arr ?? []) {
42
- if (typeof idx.expression === 'function' && idx.name) {
43
- expressionMap.set(idx.name, idx.expression);
9
+ /** Resolves entity references and type information for all properties in the given metadata. */
10
+ loadEntityMetadata(meta) {
11
+ for (const prop of meta.props) {
12
+ /* v8 ignore next */
13
+ if (typeof prop.entity === 'string') {
14
+ prop.type = prop.entity;
15
+ }
16
+ else if (prop.entity) {
17
+ const tmp = prop.entity();
18
+ prop.type = Array.isArray(tmp)
19
+ ? tmp
20
+ .map(t => Utils.className(t))
21
+ .sort()
22
+ .join(' | ')
23
+ : Utils.className(tmp);
24
+ prop.target = EntitySchema.is(tmp) ? tmp.meta.class : tmp;
25
+ }
26
+ else if (!prop.type && !((prop.enum || prop.array) && (prop.items?.length ?? 0) > 0)) {
27
+ throw new Error(`Please provide either 'type' or 'entity' attribute in ${meta.className}.${prop.name}.`);
28
+ }
44
29
  }
45
- }
46
30
  }
47
- Utils.mergeConfig(meta, cache);
48
- // Restore function expressions that were lost during JSON serialization
49
- if (expressionMap.size > 0) {
50
- for (const arr of [meta.indexes, meta.uniques]) {
51
- for (const idx of arr ?? []) {
52
- const fn = idx.name && expressionMap.get(idx.name);
53
- if (fn && typeof idx.expression !== 'function') {
54
- idx.expression = fn;
55
- }
31
+ /** Merges cached metadata into the given entity metadata, preserving function expressions. */
32
+ loadFromCache(meta, cache) {
33
+ Object.values(cache.properties).forEach(prop => {
34
+ const metaProp = meta.properties[prop.name];
35
+ /* v8 ignore next */
36
+ if (metaProp?.enum && Array.isArray(metaProp.items)) {
37
+ delete prop.items;
38
+ }
39
+ });
40
+ // Preserve function expressions from indexes/uniques — they can't survive JSON cache serialization
41
+ const expressionMap = new Map();
42
+ for (const arr of [meta.indexes, meta.uniques]) {
43
+ for (const idx of arr ?? []) {
44
+ if (typeof idx.expression === 'function' && idx.name) {
45
+ expressionMap.set(idx.name, idx.expression);
46
+ }
47
+ }
56
48
  }
57
- }
49
+ Utils.mergeConfig(meta, cache);
50
+ // Restore function expressions that were lost during JSON serialization
51
+ if (expressionMap.size > 0) {
52
+ for (const arr of [meta.indexes, meta.uniques]) {
53
+ for (const idx of arr ?? []) {
54
+ const fn = idx.name && expressionMap.get(idx.name);
55
+ if (fn && typeof idx.expression !== 'function') {
56
+ idx.expression = fn;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ /** Whether this provider class uses metadata caching by default. */
63
+ static useCache() {
64
+ return false;
58
65
  }
59
- }
60
- /** Whether this provider class uses metadata caching by default. */
61
- static useCache() {
62
- return false;
63
- }
64
- /** Whether metadata caching is enabled for this instance. */
65
- useCache() {
66
- return this.config.get('metadataCache').enabled ?? MetadataProvider.useCache();
67
- }
68
- saveToCache(meta) {
69
- //
70
- }
71
- /** Attempts to load metadata from cache, returning undefined if not available. */
72
- getCachedMetadata(meta, root) {
73
- if (!this.useCache()) {
74
- return undefined;
66
+ /** Whether metadata caching is enabled for this instance. */
67
+ useCache() {
68
+ return this.config.get('metadataCache').enabled ?? MetadataProvider.useCache();
75
69
  }
76
- const cache = meta.path && this.config.getMetadataCacheAdapter().get(this.getCacheKey(meta));
77
- if (cache) {
78
- this.loadFromCache(meta, cache);
79
- meta.root = root;
70
+ saveToCache(meta) {
71
+ //
72
+ }
73
+ /** Attempts to load metadata from cache, returning undefined if not available. */
74
+ getCachedMetadata(meta, root) {
75
+ if (!this.useCache()) {
76
+ return undefined;
77
+ }
78
+ const cache = meta.path && this.config.getMetadataCacheAdapter().get(this.getCacheKey(meta));
79
+ if (cache) {
80
+ this.loadFromCache(meta, cache);
81
+ meta.root = root;
82
+ }
83
+ return cache;
84
+ }
85
+ /** Combines individual metadata cache entries into a single file. */
86
+ combineCache() {
87
+ const path = this.config.getMetadataCacheAdapter().combine?.();
88
+ // override the path in the options, so we can log it from the CLI in `cache:generate` command
89
+ if (path) {
90
+ this.config.get('metadataCache').combined = path;
91
+ }
80
92
  }
81
- return cache;
82
- }
83
- /** Combines individual metadata cache entries into a single file. */
84
- combineCache() {
85
- const path = this.config.getMetadataCacheAdapter().combine?.();
86
- // override the path in the options, so we can log it from the CLI in `cache:generate` command
87
- if (path) {
88
- this.config.get('metadataCache').combined = path;
93
+ /** Returns the cache key for the given entity metadata. */
94
+ getCacheKey(meta) {
95
+ return meta.className;
89
96
  }
90
- }
91
- /** Returns the cache key for the given entity metadata. */
92
- getCacheKey(meta) {
93
- return meta.className;
94
- }
95
97
  }
@@ -2,42 +2,36 @@ import { type Dictionary, EntityMetadata, type EntityName } from '../typings.js'
2
2
  import type { EntityManager } from '../EntityManager.js';
3
3
  /** Registry that stores and provides access to entity metadata by class, name, or id. */
4
4
  export declare class MetadataStorage {
5
- #private;
6
- static readonly PATH_SYMBOL: unique symbol;
7
- constructor(metadata?: Dictionary<EntityMetadata>);
8
- /** Returns the global metadata dictionary, or a specific entry by entity name and path. */
9
- static getMetadata(): Dictionary<EntityMetadata>;
10
- static getMetadata<T = any>(entity: string, path: string): EntityMetadata<T>;
11
- /** Checks whether an entity with the given class name exists in the global metadata. */
12
- static isKnownEntity(name: string): boolean;
13
- /** Clears all entries from the global metadata registry. */
14
- static clear(): void;
15
- /** Returns the map of all registered entity metadata. */
16
- getAll(): Map<EntityName, EntityMetadata>;
17
- /** Returns metadata for the given entity, optionally initializing it if not found. */
18
- get<T = any>(entityName: EntityName<T>, init?: boolean): EntityMetadata<T>;
19
- /** Finds metadata for the given entity, returning undefined if not registered. */
20
- find<T = any>(entityName: EntityName<T>): EntityMetadata<T> | undefined;
21
- /** Checks whether metadata exists for the given entity. */
22
- has<T>(entityName: EntityName<T>): boolean;
23
- /** Registers metadata for the given entity. */
24
- set<T>(entityName: EntityName<T>, meta: EntityMetadata): EntityMetadata;
25
- /** Removes metadata for the given entity from all internal maps. */
26
- reset<T>(entityName: EntityName<T>): void;
27
- /** Decorates all entity prototypes with helper methods (e.g. init, toJSON). */
28
- decorate(em: EntityManager): void;
29
- [Symbol.iterator](): IterableIterator<EntityMetadata>;
30
- /** Returns metadata by its internal numeric id. */
31
- getById<T>(id: number): EntityMetadata<T>;
32
- /** Returns metadata by class name, optionally throwing if not found. */
33
- getByClassName<T = any, V extends boolean = true>(
34
- className: string,
35
- validate?: V,
36
- ): V extends true ? EntityMetadata<T> : EntityMetadata<T> | undefined;
37
- /** Returns metadata by unique name, optionally throwing if not found. */
38
- getByUniqueName<T = any, V extends boolean = true>(
39
- uniqueName: string,
40
- validate?: V,
41
- ): V extends true ? EntityMetadata<T> : EntityMetadata<T> | undefined;
42
- private validate;
5
+ #private;
6
+ static readonly PATH_SYMBOL: unique symbol;
7
+ constructor(metadata?: Dictionary<EntityMetadata>);
8
+ /** Returns the global metadata dictionary, or a specific entry by entity name and path. */
9
+ static getMetadata(): Dictionary<EntityMetadata>;
10
+ static getMetadata<T = any>(entity: string, path: string): EntityMetadata<T>;
11
+ /** Checks whether an entity with the given class name exists in the global metadata. */
12
+ static isKnownEntity(name: string): boolean;
13
+ /** Clears all entries from the global metadata registry. */
14
+ static clear(): void;
15
+ /** Returns the map of all registered entity metadata. */
16
+ getAll(): Map<EntityName, EntityMetadata>;
17
+ /** Returns metadata for the given entity, optionally initializing it if not found. */
18
+ get<T = any>(entityName: EntityName<T>, init?: boolean): EntityMetadata<T>;
19
+ /** Finds metadata for the given entity, returning undefined if not registered. */
20
+ find<T = any>(entityName: EntityName<T>): EntityMetadata<T> | undefined;
21
+ /** Checks whether metadata exists for the given entity. */
22
+ has<T>(entityName: EntityName<T>): boolean;
23
+ /** Registers metadata for the given entity. */
24
+ set<T>(entityName: EntityName<T>, meta: EntityMetadata): EntityMetadata;
25
+ /** Removes metadata for the given entity from all internal maps. */
26
+ reset<T>(entityName: EntityName<T>): void;
27
+ /** Decorates all entity prototypes with helper methods (e.g. init, toJSON). */
28
+ decorate(em: EntityManager): void;
29
+ [Symbol.iterator](): IterableIterator<EntityMetadata>;
30
+ /** Returns metadata by its internal numeric id. */
31
+ getById<T>(id: number): EntityMetadata<T>;
32
+ /** Returns metadata by class name, optionally throwing if not found. */
33
+ getByClassName<T = any, V extends boolean = true>(className: string, validate?: V): V extends true ? EntityMetadata<T> : EntityMetadata<T> | undefined;
34
+ /** Returns metadata by unique name, optionally throwing if not found. */
35
+ getByUniqueName<T = any, V extends boolean = true>(uniqueName: string, validate?: V): V extends true ? EntityMetadata<T> : EntityMetadata<T> | undefined;
36
+ private validate;
43
37
  }
@@ -4,125 +4,125 @@ import { MetadataError } from '../errors.js';
4
4
  import { EntityHelper } from '../entity/EntityHelper.js';
5
5
  import { EntitySchema } from './EntitySchema.js';
6
6
  function getGlobalStorage(namespace) {
7
- const key = `mikro-orm-${namespace}`;
8
- globalThis[key] = globalThis[key] || {};
9
- return globalThis[key];
7
+ const key = `mikro-orm-${namespace}`;
8
+ globalThis[key] = globalThis[key] || {};
9
+ return globalThis[key];
10
10
  }
11
11
  /** Registry that stores and provides access to entity metadata by class, name, or id. */
12
12
  export class MetadataStorage {
13
- static PATH_SYMBOL = Symbol.for('@mikro-orm/core/MetadataStorage.PATH_SYMBOL');
14
- static #metadata = getGlobalStorage('metadata');
15
- #metadataMap = new Map();
16
- #idMap;
17
- #classNameMap;
18
- #uniqueNameMap;
19
- constructor(metadata = {}) {
20
- this.#idMap = {};
21
- this.#uniqueNameMap = {};
22
- this.#classNameMap = Utils.copy(metadata, false);
23
- for (const meta of Object.values(this.#classNameMap)) {
24
- this.#idMap[meta._id] = meta;
25
- this.#uniqueNameMap[meta.uniqueName] = meta;
26
- this.#metadataMap.set(meta.class, meta);
27
- }
28
- }
29
- static getMetadata(entity, path) {
30
- const key = entity && path ? entity + '-' + Utils.hash(path) : null;
31
- if (key && !MetadataStorage.#metadata[key]) {
32
- MetadataStorage.#metadata[key] = new EntityMetadata({ className: entity, path });
33
- }
34
- if (key) {
35
- return MetadataStorage.#metadata[key];
36
- }
37
- return MetadataStorage.#metadata;
38
- }
39
- /** Checks whether an entity with the given class name exists in the global metadata. */
40
- static isKnownEntity(name) {
41
- return !!Object.values(this.#metadata).find(meta => meta.className === name);
42
- }
43
- /** Clears all entries from the global metadata registry. */
44
- static clear() {
45
- Object.keys(this.#metadata).forEach(k => delete this.#metadata[k]);
46
- }
47
- /** Returns the map of all registered entity metadata. */
48
- getAll() {
49
- return this.#metadataMap;
50
- }
51
- /** Returns metadata for the given entity, optionally initializing it if not found. */
52
- get(entityName, init = false) {
53
- const exists = this.find(entityName);
54
- if (exists) {
55
- return exists;
56
- }
57
- const className = Utils.className(entityName);
58
- if (!init) {
59
- throw MetadataError.missingMetadata(className);
60
- }
61
- const meta = new EntityMetadata({ class: entityName, name: className });
62
- this.set(entityName, meta);
63
- return meta;
64
- }
65
- /** Finds metadata for the given entity, returning undefined if not registered. */
66
- find(entityName) {
67
- if (!entityName) {
68
- return;
69
- }
70
- const meta = this.#metadataMap.get(entityName);
71
- if (meta) {
72
- return meta;
73
- }
74
- if (EntitySchema.is(entityName)) {
75
- return this.#metadataMap.get(entityName.meta.class) ?? entityName.meta;
76
- }
77
- return this.#classNameMap[Utils.className(entityName)];
78
- }
79
- /** Checks whether metadata exists for the given entity. */
80
- has(entityName) {
81
- return this.#metadataMap.has(entityName);
82
- }
83
- /** Registers metadata for the given entity. */
84
- set(entityName, meta) {
85
- this.#metadataMap.set(entityName, meta);
86
- this.#idMap[meta._id] = meta;
87
- this.#uniqueNameMap[meta.uniqueName] = meta;
88
- this.#classNameMap[Utils.className(entityName)] = meta;
89
- return meta;
90
- }
91
- /** Removes metadata for the given entity from all internal maps. */
92
- reset(entityName) {
93
- const meta = this.find(entityName);
94
- if (meta) {
95
- this.#metadataMap.delete(meta.class);
96
- delete this.#idMap[meta._id];
97
- delete this.#uniqueNameMap[meta.uniqueName];
98
- delete this.#classNameMap[meta.className];
99
- }
100
- }
101
- /** Decorates all entity prototypes with helper methods (e.g. init, toJSON). */
102
- decorate(em) {
103
- [...this.#metadataMap.values()].filter(meta => meta.prototype).forEach(meta => EntityHelper.decorate(meta, em));
104
- }
105
- *[Symbol.iterator]() {
106
- for (const meta of this.#metadataMap.values()) {
107
- yield meta;
108
- }
109
- }
110
- /** Returns metadata by its internal numeric id. */
111
- getById(id) {
112
- return this.#idMap[id];
113
- }
114
- /** Returns metadata by class name, optionally throwing if not found. */
115
- getByClassName(className, validate = true) {
116
- return this.validate(this.#classNameMap[className], className, validate);
117
- }
118
- /** Returns metadata by unique name, optionally throwing if not found. */
119
- getByUniqueName(uniqueName, validate = true) {
120
- return this.validate(this.#uniqueNameMap[uniqueName], uniqueName, validate);
121
- }
122
- validate(meta, id, validate) {
123
- if (!meta && validate) {
124
- throw MetadataError.missingMetadata(id);
125
- }
126
- return meta;
127
- }
13
+ static PATH_SYMBOL = Symbol.for('@mikro-orm/core/MetadataStorage.PATH_SYMBOL');
14
+ static #metadata = getGlobalStorage('metadata');
15
+ #metadataMap = new Map();
16
+ #idMap;
17
+ #classNameMap;
18
+ #uniqueNameMap;
19
+ constructor(metadata = {}) {
20
+ this.#idMap = {};
21
+ this.#uniqueNameMap = {};
22
+ this.#classNameMap = Utils.copy(metadata, false);
23
+ for (const meta of Object.values(this.#classNameMap)) {
24
+ this.#idMap[meta._id] = meta;
25
+ this.#uniqueNameMap[meta.uniqueName] = meta;
26
+ this.#metadataMap.set(meta.class, meta);
27
+ }
28
+ }
29
+ static getMetadata(entity, path) {
30
+ const key = entity && path ? entity + '-' + Utils.hash(path) : null;
31
+ if (key && !MetadataStorage.#metadata[key]) {
32
+ MetadataStorage.#metadata[key] = new EntityMetadata({ className: entity, path });
33
+ }
34
+ if (key) {
35
+ return MetadataStorage.#metadata[key];
36
+ }
37
+ return MetadataStorage.#metadata;
38
+ }
39
+ /** Checks whether an entity with the given class name exists in the global metadata. */
40
+ static isKnownEntity(name) {
41
+ return !!Object.values(this.#metadata).find(meta => meta.className === name);
42
+ }
43
+ /** Clears all entries from the global metadata registry. */
44
+ static clear() {
45
+ Object.keys(this.#metadata).forEach(k => delete this.#metadata[k]);
46
+ }
47
+ /** Returns the map of all registered entity metadata. */
48
+ getAll() {
49
+ return this.#metadataMap;
50
+ }
51
+ /** Returns metadata for the given entity, optionally initializing it if not found. */
52
+ get(entityName, init = false) {
53
+ const exists = this.find(entityName);
54
+ if (exists) {
55
+ return exists;
56
+ }
57
+ const className = Utils.className(entityName);
58
+ if (!init) {
59
+ throw MetadataError.missingMetadata(className);
60
+ }
61
+ const meta = new EntityMetadata({ class: entityName, name: className });
62
+ this.set(entityName, meta);
63
+ return meta;
64
+ }
65
+ /** Finds metadata for the given entity, returning undefined if not registered. */
66
+ find(entityName) {
67
+ if (!entityName) {
68
+ return;
69
+ }
70
+ const meta = this.#metadataMap.get(entityName);
71
+ if (meta) {
72
+ return meta;
73
+ }
74
+ if (EntitySchema.is(entityName)) {
75
+ return this.#metadataMap.get(entityName.meta.class) ?? entityName.meta;
76
+ }
77
+ return this.#classNameMap[Utils.className(entityName)];
78
+ }
79
+ /** Checks whether metadata exists for the given entity. */
80
+ has(entityName) {
81
+ return this.#metadataMap.has(entityName);
82
+ }
83
+ /** Registers metadata for the given entity. */
84
+ set(entityName, meta) {
85
+ this.#metadataMap.set(entityName, meta);
86
+ this.#idMap[meta._id] = meta;
87
+ this.#uniqueNameMap[meta.uniqueName] = meta;
88
+ this.#classNameMap[Utils.className(entityName)] = meta;
89
+ return meta;
90
+ }
91
+ /** Removes metadata for the given entity from all internal maps. */
92
+ reset(entityName) {
93
+ const meta = this.find(entityName);
94
+ if (meta) {
95
+ this.#metadataMap.delete(meta.class);
96
+ delete this.#idMap[meta._id];
97
+ delete this.#uniqueNameMap[meta.uniqueName];
98
+ delete this.#classNameMap[meta.className];
99
+ }
100
+ }
101
+ /** Decorates all entity prototypes with helper methods (e.g. init, toJSON). */
102
+ decorate(em) {
103
+ [...this.#metadataMap.values()].filter(meta => meta.prototype).forEach(meta => EntityHelper.decorate(meta, em));
104
+ }
105
+ *[Symbol.iterator]() {
106
+ for (const meta of this.#metadataMap.values()) {
107
+ yield meta;
108
+ }
109
+ }
110
+ /** Returns metadata by its internal numeric id. */
111
+ getById(id) {
112
+ return this.#idMap[id];
113
+ }
114
+ /** Returns metadata by class name, optionally throwing if not found. */
115
+ getByClassName(className, validate = true) {
116
+ return this.validate(this.#classNameMap[className], className, validate);
117
+ }
118
+ /** Returns metadata by unique name, optionally throwing if not found. */
119
+ getByUniqueName(uniqueName, validate = true) {
120
+ return this.validate(this.#uniqueNameMap[uniqueName], uniqueName, validate);
121
+ }
122
+ validate(meta, id, validate) {
123
+ if (!meta && validate) {
124
+ throw MetadataError.missingMetadata(id);
125
+ }
126
+ return meta;
127
+ }
128
128
  }
@@ -5,43 +5,43 @@ import type { MetadataStorage } from './MetadataStorage.js';
5
5
  * @internal
6
6
  */
7
7
  export declare class MetadataValidator {
8
- validateEntityDefinition<T>(metadata: MetadataStorage, name: EntityName<T>, options: MetadataDiscoveryOptions): void;
9
- validateDiscovered(discovered: EntityMetadata[], options: MetadataDiscoveryOptions): void;
10
- private validateReference;
11
- private validateTargetKey;
12
- /**
13
- * Checks if a property has a unique constraint (either via `unique: true` or single-property `@Unique` decorator).
14
- * Composite unique constraints are not sufficient for targetKey.
15
- */
16
- private isPropertyUnique;
17
- private validatePolymorphicTargets;
18
- private validateBidirectional;
19
- private validateOwningSide;
20
- private validateInverseSide;
21
- private validateIndexes;
22
- private validateDuplicateFieldNames;
23
- private validateVersionField;
24
- /**
25
- * Validates that entity properties do not use dangerous names that could lead to
26
- * prototype pollution vulnerabilities. This validation ensures that property names
27
- * cannot be exploited to modify object prototypes when values are assigned during
28
- * entity hydration or persistence operations.
29
- *
30
- * @internal
31
- */
32
- private validatePropertyNames;
33
- /**
34
- * Validates view entity configuration.
35
- * View entities must have an expression.
36
- */
37
- private validateViewEntity;
38
- /**
39
- * Validates that STI and TPT are not mixed in the same inheritance hierarchy.
40
- * An entity hierarchy can use either STI (discriminatorColumn) or TPT (inheritance: 'tpt'),
41
- * but not both.
42
- *
43
- * Note: This validation runs before `initTablePerTypeInheritance` sets `inheritanceType`,
44
- * so we check the raw `inheritance` option from the decorator/schema.
45
- */
46
- private validateInheritanceStrategies;
8
+ validateEntityDefinition<T>(metadata: MetadataStorage, name: EntityName<T>, options: MetadataDiscoveryOptions): void;
9
+ validateDiscovered(discovered: EntityMetadata[], options: MetadataDiscoveryOptions): void;
10
+ private validateReference;
11
+ private validateTargetKey;
12
+ /**
13
+ * Checks if a property has a unique constraint (either via `unique: true` or single-property `@Unique` decorator).
14
+ * Composite unique constraints are not sufficient for targetKey.
15
+ */
16
+ private isPropertyUnique;
17
+ private validatePolymorphicTargets;
18
+ private validateBidirectional;
19
+ private validateOwningSide;
20
+ private validateInverseSide;
21
+ private validateIndexes;
22
+ private validateDuplicateFieldNames;
23
+ private validateVersionField;
24
+ /**
25
+ * Validates that entity properties do not use dangerous names that could lead to
26
+ * prototype pollution vulnerabilities. This validation ensures that property names
27
+ * cannot be exploited to modify object prototypes when values are assigned during
28
+ * entity hydration or persistence operations.
29
+ *
30
+ * @internal
31
+ */
32
+ private validatePropertyNames;
33
+ /**
34
+ * Validates view entity configuration.
35
+ * View entities must have an expression.
36
+ */
37
+ private validateViewEntity;
38
+ /**
39
+ * Validates that STI and TPT are not mixed in the same inheritance hierarchy.
40
+ * An entity hierarchy can use either STI (discriminatorColumn) or TPT (inheritance: 'tpt'),
41
+ * but not both.
42
+ *
43
+ * Note: This validation runs before `initTablePerTypeInheritance` sets `inheritanceType`,
44
+ * so we check the raw `inheritance` option from the decorator/schema.
45
+ */
46
+ private validateInheritanceStrategies;
47
47
  }