@mikro-orm/core 7.0.2-dev.9 → 7.0.2

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 (207) hide show
  1. package/EntityManager.d.ts +883 -579
  2. package/EntityManager.js +1897 -1865
  3. package/MikroORM.d.ts +103 -72
  4. package/MikroORM.js +178 -177
  5. package/README.md +128 -294
  6. package/cache/CacheAdapter.d.ts +38 -36
  7. package/cache/FileCacheAdapter.d.ts +30 -24
  8. package/cache/FileCacheAdapter.js +80 -78
  9. package/cache/GeneratedCacheAdapter.d.ts +19 -20
  10. package/cache/GeneratedCacheAdapter.js +31 -30
  11. package/cache/MemoryCacheAdapter.d.ts +19 -20
  12. package/cache/MemoryCacheAdapter.js +36 -36
  13. package/cache/NullCacheAdapter.d.ts +17 -16
  14. package/cache/NullCacheAdapter.js +25 -24
  15. package/connections/Connection.d.ts +99 -75
  16. package/connections/Connection.js +166 -160
  17. package/drivers/DatabaseDriver.d.ts +187 -69
  18. package/drivers/DatabaseDriver.js +451 -432
  19. package/drivers/IDatabaseDriver.d.ts +464 -281
  20. package/drivers/IDatabaseDriver.js +1 -0
  21. package/entity/BaseEntity.d.ts +121 -73
  22. package/entity/BaseEntity.js +44 -33
  23. package/entity/Collection.d.ts +216 -157
  24. package/entity/Collection.js +728 -707
  25. package/entity/EntityAssigner.d.ts +90 -76
  26. package/entity/EntityAssigner.js +232 -229
  27. package/entity/EntityFactory.d.ts +68 -40
  28. package/entity/EntityFactory.js +427 -366
  29. package/entity/EntityHelper.d.ts +34 -22
  30. package/entity/EntityHelper.js +280 -267
  31. package/entity/EntityIdentifier.d.ts +4 -4
  32. package/entity/EntityIdentifier.js +10 -10
  33. package/entity/EntityLoader.d.ts +105 -56
  34. package/entity/EntityLoader.js +754 -722
  35. package/entity/EntityRepository.d.ts +317 -200
  36. package/entity/EntityRepository.js +214 -212
  37. package/entity/PolymorphicRef.d.ts +5 -5
  38. package/entity/PolymorphicRef.js +10 -10
  39. package/entity/Reference.d.ts +130 -66
  40. package/entity/Reference.js +280 -260
  41. package/entity/WrappedEntity.d.ts +116 -53
  42. package/entity/WrappedEntity.js +169 -147
  43. package/entity/defineEntity.d.ts +1290 -614
  44. package/entity/defineEntity.js +521 -511
  45. package/entity/utils.d.ts +13 -3
  46. package/entity/utils.js +71 -73
  47. package/entity/validators.js +43 -43
  48. package/entity/wrap.js +8 -8
  49. package/enums.d.ts +275 -138
  50. package/enums.js +268 -137
  51. package/errors.d.ts +120 -72
  52. package/errors.js +356 -253
  53. package/events/EventManager.d.ts +27 -10
  54. package/events/EventManager.js +80 -73
  55. package/events/EventSubscriber.d.ts +33 -29
  56. package/events/TransactionEventBroadcaster.d.ts +16 -7
  57. package/events/TransactionEventBroadcaster.js +15 -13
  58. package/exceptions.d.ts +23 -40
  59. package/exceptions.js +35 -52
  60. package/hydration/Hydrator.d.ts +43 -16
  61. package/hydration/Hydrator.js +44 -42
  62. package/hydration/ObjectHydrator.d.ts +51 -17
  63. package/hydration/ObjectHydrator.js +480 -416
  64. package/index.d.ts +116 -2
  65. package/index.js +10 -1
  66. package/logging/DefaultLogger.d.ts +35 -30
  67. package/logging/DefaultLogger.js +87 -84
  68. package/logging/Logger.d.ts +45 -40
  69. package/logging/SimpleLogger.d.ts +13 -11
  70. package/logging/SimpleLogger.js +22 -22
  71. package/logging/colors.d.ts +6 -6
  72. package/logging/colors.js +11 -10
  73. package/logging/inspect.js +7 -7
  74. package/metadata/EntitySchema.d.ts +214 -108
  75. package/metadata/EntitySchema.js +398 -379
  76. package/metadata/MetadataDiscovery.d.ts +115 -111
  77. package/metadata/MetadataDiscovery.js +1948 -1857
  78. package/metadata/MetadataProvider.d.ts +25 -14
  79. package/metadata/MetadataProvider.js +83 -77
  80. package/metadata/MetadataStorage.d.ts +39 -19
  81. package/metadata/MetadataStorage.js +119 -106
  82. package/metadata/MetadataValidator.d.ts +39 -39
  83. package/metadata/MetadataValidator.js +381 -338
  84. package/metadata/discover-entities.d.ts +5 -2
  85. package/metadata/discover-entities.js +27 -27
  86. package/metadata/types.d.ts +615 -531
  87. package/naming-strategy/AbstractNamingStrategy.d.ts +55 -39
  88. package/naming-strategy/AbstractNamingStrategy.js +91 -85
  89. package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
  90. package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
  91. package/naming-strategy/MongoNamingStrategy.d.ts +7 -6
  92. package/naming-strategy/MongoNamingStrategy.js +19 -18
  93. package/naming-strategy/NamingStrategy.d.ts +109 -99
  94. package/naming-strategy/UnderscoreNamingStrategy.d.ts +8 -7
  95. package/naming-strategy/UnderscoreNamingStrategy.js +22 -21
  96. package/not-supported.js +7 -4
  97. package/package.json +1 -1
  98. package/platforms/ExceptionConverter.d.ts +2 -1
  99. package/platforms/ExceptionConverter.js +5 -4
  100. package/platforms/Platform.d.ts +310 -236
  101. package/platforms/Platform.js +661 -573
  102. package/serialization/EntitySerializer.d.ts +49 -25
  103. package/serialization/EntitySerializer.js +224 -216
  104. package/serialization/EntityTransformer.d.ts +11 -5
  105. package/serialization/EntityTransformer.js +220 -216
  106. package/serialization/SerializationContext.d.ts +27 -18
  107. package/serialization/SerializationContext.js +105 -100
  108. package/types/ArrayType.d.ts +9 -8
  109. package/types/ArrayType.js +34 -33
  110. package/types/BigIntType.d.ts +17 -10
  111. package/types/BigIntType.js +37 -37
  112. package/types/BlobType.d.ts +4 -3
  113. package/types/BlobType.js +14 -13
  114. package/types/BooleanType.d.ts +5 -4
  115. package/types/BooleanType.js +13 -12
  116. package/types/CharacterType.d.ts +3 -2
  117. package/types/CharacterType.js +7 -6
  118. package/types/DateTimeType.d.ts +6 -5
  119. package/types/DateTimeType.js +16 -15
  120. package/types/DateType.d.ts +6 -5
  121. package/types/DateType.js +16 -15
  122. package/types/DecimalType.d.ts +7 -7
  123. package/types/DecimalType.js +26 -26
  124. package/types/DoubleType.d.ts +3 -3
  125. package/types/DoubleType.js +12 -12
  126. package/types/EnumArrayType.d.ts +6 -5
  127. package/types/EnumArrayType.js +25 -24
  128. package/types/EnumType.d.ts +4 -3
  129. package/types/EnumType.js +12 -11
  130. package/types/FloatType.d.ts +4 -3
  131. package/types/FloatType.js +10 -9
  132. package/types/IntegerType.d.ts +4 -3
  133. package/types/IntegerType.js +10 -9
  134. package/types/IntervalType.d.ts +5 -4
  135. package/types/IntervalType.js +13 -12
  136. package/types/JsonType.d.ts +9 -8
  137. package/types/JsonType.js +33 -32
  138. package/types/MediumIntType.d.ts +2 -1
  139. package/types/MediumIntType.js +4 -3
  140. package/types/SmallIntType.d.ts +4 -3
  141. package/types/SmallIntType.js +10 -9
  142. package/types/StringType.d.ts +5 -4
  143. package/types/StringType.js +13 -12
  144. package/types/TextType.d.ts +4 -3
  145. package/types/TextType.js +10 -9
  146. package/types/TimeType.d.ts +6 -5
  147. package/types/TimeType.js +18 -17
  148. package/types/TinyIntType.d.ts +4 -3
  149. package/types/TinyIntType.js +11 -10
  150. package/types/Type.d.ts +88 -73
  151. package/types/Type.js +85 -74
  152. package/types/Uint8ArrayType.d.ts +5 -4
  153. package/types/Uint8ArrayType.js +22 -21
  154. package/types/UnknownType.d.ts +5 -4
  155. package/types/UnknownType.js +13 -12
  156. package/types/UuidType.d.ts +6 -5
  157. package/types/UuidType.js +20 -19
  158. package/types/index.d.ts +77 -49
  159. package/types/index.js +64 -26
  160. package/typings.d.ts +1388 -729
  161. package/typings.js +255 -231
  162. package/unit-of-work/ChangeSet.d.ts +28 -24
  163. package/unit-of-work/ChangeSet.js +58 -54
  164. package/unit-of-work/ChangeSetComputer.d.ts +13 -11
  165. package/unit-of-work/ChangeSetComputer.js +180 -159
  166. package/unit-of-work/ChangeSetPersister.d.ts +64 -41
  167. package/unit-of-work/ChangeSetPersister.js +443 -418
  168. package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
  169. package/unit-of-work/CommitOrderCalculator.js +89 -88
  170. package/unit-of-work/IdentityMap.d.ts +32 -25
  171. package/unit-of-work/IdentityMap.js +106 -99
  172. package/unit-of-work/UnitOfWork.d.ts +182 -127
  173. package/unit-of-work/UnitOfWork.js +1201 -1169
  174. package/utils/AbstractMigrator.d.ts +111 -91
  175. package/utils/AbstractMigrator.js +275 -275
  176. package/utils/AbstractSchemaGenerator.d.ts +43 -34
  177. package/utils/AbstractSchemaGenerator.js +121 -122
  178. package/utils/AsyncContext.d.ts +3 -3
  179. package/utils/AsyncContext.js +34 -35
  180. package/utils/Configuration.d.ts +853 -801
  181. package/utils/Configuration.js +360 -337
  182. package/utils/Cursor.d.ts +40 -22
  183. package/utils/Cursor.js +135 -127
  184. package/utils/DataloaderUtils.d.ts +58 -43
  185. package/utils/DataloaderUtils.js +203 -198
  186. package/utils/EntityComparator.d.ts +99 -80
  187. package/utils/EntityComparator.js +825 -727
  188. package/utils/NullHighlighter.d.ts +2 -1
  189. package/utils/NullHighlighter.js +4 -3
  190. package/utils/QueryHelper.d.ts +79 -51
  191. package/utils/QueryHelper.js +372 -361
  192. package/utils/RawQueryFragment.d.ts +54 -28
  193. package/utils/RawQueryFragment.js +110 -99
  194. package/utils/RequestContext.d.ts +33 -32
  195. package/utils/RequestContext.js +52 -53
  196. package/utils/TransactionContext.d.ts +17 -16
  197. package/utils/TransactionContext.js +28 -27
  198. package/utils/TransactionManager.d.ts +58 -58
  199. package/utils/TransactionManager.js +199 -197
  200. package/utils/Utils.d.ts +210 -145
  201. package/utils/Utils.js +820 -813
  202. package/utils/clone.js +104 -113
  203. package/utils/env-vars.js +90 -88
  204. package/utils/fs-utils.d.ts +15 -15
  205. package/utils/fs-utils.js +180 -181
  206. package/utils/upsert-utils.d.ts +20 -5
  207. package/utils/upsert-utils.js +114 -116
@@ -1,19 +1,19 @@
1
1
  import type { EntityProperty } from '../typings.js';
2
2
  export declare const enum NodeState {
3
- NOT_VISITED = 0,
4
- IN_PROGRESS = 1,
5
- VISITED = 2
3
+ NOT_VISITED = 0,
4
+ IN_PROGRESS = 1,
5
+ VISITED = 2,
6
6
  }
7
7
  type Hash = number;
8
8
  export interface Node {
9
- hash: Hash;
10
- state: NodeState;
11
- dependencies: Map<Hash, Edge>;
9
+ hash: Hash;
10
+ state: NodeState;
11
+ dependencies: Map<Hash, Edge>;
12
12
  }
13
13
  export interface Edge {
14
- from: Hash;
15
- to: Hash;
16
- weight: number;
14
+ from: Hash;
15
+ to: Hash;
16
+ weight: number;
17
17
  }
18
18
  /**
19
19
  * CommitOrderCalculator implements topological sorting, which is an ordering
@@ -26,36 +26,36 @@ export interface Edge {
26
26
  * @internal
27
27
  */
28
28
  export declare class CommitOrderCalculator {
29
- #private;
30
- /**
31
- * Checks for node existence in graph.
32
- */
33
- hasNode(hash: Hash): boolean;
34
- /**
35
- * Adds a new node to the graph, assigning its hash.
36
- */
37
- addNode(hash: Hash): void;
38
- /**
39
- * Adds a new dependency (edge) to the graph using their hashes.
40
- */
41
- addDependency(from: Hash, to: Hash, weight: number): void;
42
- discoverProperty(prop: EntityProperty, entityName: Hash): void;
43
- /**
44
- * Return a valid order list of all current nodes.
45
- * The desired topological sorting is the reverse post order of these searches.
46
- *
47
- * @internal Highly performance-sensitive method.
48
- */
49
- sort(): Hash[];
50
- /**
51
- * Visit a given node definition for reordering.
52
- *
53
- * @internal Highly performance-sensitive method.
54
- */
55
- private visit;
56
- /**
57
- * Visits all target's dependencies if in cycle with given node
58
- */
59
- private visitOpenNode;
29
+ #private;
30
+ /**
31
+ * Checks for node existence in graph.
32
+ */
33
+ hasNode(hash: Hash): boolean;
34
+ /**
35
+ * Adds a new node to the graph, assigning its hash.
36
+ */
37
+ addNode(hash: Hash): void;
38
+ /**
39
+ * Adds a new dependency (edge) to the graph using their hashes.
40
+ */
41
+ addDependency(from: Hash, to: Hash, weight: number): void;
42
+ discoverProperty(prop: EntityProperty, entityName: Hash): void;
43
+ /**
44
+ * Return a valid order list of all current nodes.
45
+ * The desired topological sorting is the reverse post order of these searches.
46
+ *
47
+ * @internal Highly performance-sensitive method.
48
+ */
49
+ sort(): Hash[];
50
+ /**
51
+ * Visit a given node definition for reordering.
52
+ *
53
+ * @internal Highly performance-sensitive method.
54
+ */
55
+ private visit;
56
+ /**
57
+ * Visits all target's dependencies if in cycle with given node
58
+ */
59
+ private visitOpenNode;
60
60
  }
61
61
  export {};
@@ -1,9 +1,9 @@
1
1
  import { ReferenceKind } from '../enums.js';
2
2
  export var NodeState;
3
3
  (function (NodeState) {
4
- NodeState[NodeState["NOT_VISITED"] = 0] = "NOT_VISITED";
5
- NodeState[NodeState["IN_PROGRESS"] = 1] = "IN_PROGRESS";
6
- NodeState[NodeState["VISITED"] = 2] = "VISITED";
4
+ NodeState[(NodeState['NOT_VISITED'] = 0)] = 'NOT_VISITED';
5
+ NodeState[(NodeState['IN_PROGRESS'] = 1)] = 'IN_PROGRESS';
6
+ NodeState[(NodeState['VISITED'] = 2)] = 'VISITED';
7
7
  })(NodeState || (NodeState = {}));
8
8
  /**
9
9
  * CommitOrderCalculator implements topological sorting, which is an ordering
@@ -16,96 +16,97 @@ export var NodeState;
16
16
  * @internal
17
17
  */
18
18
  export class CommitOrderCalculator {
19
- /** Matrix of nodes, keys are provided hashes and values are the node definition objects. */
20
- #nodes = new Map();
21
- /** Volatile variable holding calculated nodes during sorting process. */
22
- #sortedNodeList = [];
23
- /**
24
- * Checks for node existence in graph.
25
- */
26
- hasNode(hash) {
27
- return this.#nodes.has(hash);
19
+ /** Matrix of nodes, keys are provided hashes and values are the node definition objects. */
20
+ #nodes = new Map();
21
+ /** Volatile variable holding calculated nodes during sorting process. */
22
+ #sortedNodeList = [];
23
+ /**
24
+ * Checks for node existence in graph.
25
+ */
26
+ hasNode(hash) {
27
+ return this.#nodes.has(hash);
28
+ }
29
+ /**
30
+ * Adds a new node to the graph, assigning its hash.
31
+ */
32
+ addNode(hash) {
33
+ this.#nodes.set(hash, { hash, state: 0 /* NodeState.NOT_VISITED */, dependencies: new Map() });
34
+ }
35
+ /**
36
+ * Adds a new dependency (edge) to the graph using their hashes.
37
+ */
38
+ addDependency(from, to, weight) {
39
+ this.#nodes.get(from).dependencies.set(to, { from, to, weight });
40
+ }
41
+ discoverProperty(prop, entityName) {
42
+ const toOneOwner =
43
+ (prop.kind === ReferenceKind.ONE_TO_ONE && prop.owner) || prop.kind === ReferenceKind.MANY_TO_ONE;
44
+ const toManyOwner = prop.kind === ReferenceKind.MANY_TO_MANY && prop.owner && !prop.pivotEntity;
45
+ if (!toOneOwner && !toManyOwner) {
46
+ return;
28
47
  }
29
- /**
30
- * Adds a new node to the graph, assigning its hash.
31
- */
32
- addNode(hash) {
33
- this.#nodes.set(hash, { hash, state: 0 /* NodeState.NOT_VISITED */, dependencies: new Map() });
48
+ const propertyType = prop.targetMeta?.root._id;
49
+ if (propertyType == null || !this.hasNode(propertyType)) {
50
+ return;
34
51
  }
35
- /**
36
- * Adds a new dependency (edge) to the graph using their hashes.
37
- */
38
- addDependency(from, to, weight) {
39
- this.#nodes.get(from).dependencies.set(to, { from, to, weight });
52
+ this.addDependency(propertyType, entityName, prop.nullable || prop.persist === false ? 0 : 1);
53
+ }
54
+ /**
55
+ * Return a valid order list of all current nodes.
56
+ * The desired topological sorting is the reverse post order of these searches.
57
+ *
58
+ * @internal Highly performance-sensitive method.
59
+ */
60
+ sort() {
61
+ for (const vertex of this.#nodes.values()) {
62
+ if (vertex.state !== 0 /* NodeState.NOT_VISITED */) {
63
+ continue;
64
+ }
65
+ this.visit(vertex);
40
66
  }
41
- discoverProperty(prop, entityName) {
42
- const toOneOwner = (prop.kind === ReferenceKind.ONE_TO_ONE && prop.owner) || prop.kind === ReferenceKind.MANY_TO_ONE;
43
- const toManyOwner = prop.kind === ReferenceKind.MANY_TO_MANY && prop.owner && !prop.pivotEntity;
44
- if (!toOneOwner && !toManyOwner) {
45
- return;
46
- }
47
- const propertyType = prop.targetMeta?.root._id;
48
- if (propertyType == null || !this.hasNode(propertyType)) {
49
- return;
50
- }
51
- this.addDependency(propertyType, entityName, prop.nullable || prop.persist === false ? 0 : 1);
67
+ const sortedList = this.#sortedNodeList.reverse();
68
+ this.#nodes = new Map();
69
+ this.#sortedNodeList = [];
70
+ return sortedList;
71
+ }
72
+ /**
73
+ * Visit a given node definition for reordering.
74
+ *
75
+ * @internal Highly performance-sensitive method.
76
+ */
77
+ visit(node) {
78
+ node.state = 1 /* NodeState.IN_PROGRESS */;
79
+ for (const edge of node.dependencies.values()) {
80
+ const target = this.#nodes.get(edge.to);
81
+ switch (target.state) {
82
+ case 2 /* NodeState.VISITED */:
83
+ break; // Do nothing, since node was already visited
84
+ case 1 /* NodeState.IN_PROGRESS */:
85
+ this.visitOpenNode(node, target, edge);
86
+ break;
87
+ case 0 /* NodeState.NOT_VISITED */:
88
+ this.visit(target);
89
+ }
52
90
  }
53
- /**
54
- * Return a valid order list of all current nodes.
55
- * The desired topological sorting is the reverse post order of these searches.
56
- *
57
- * @internal Highly performance-sensitive method.
58
- */
59
- sort() {
60
- for (const vertex of this.#nodes.values()) {
61
- if (vertex.state !== 0 /* NodeState.NOT_VISITED */) {
62
- continue;
63
- }
64
- this.visit(vertex);
65
- }
66
- const sortedList = this.#sortedNodeList.reverse();
67
- this.#nodes = new Map();
68
- this.#sortedNodeList = [];
69
- return sortedList;
91
+ if (node.state !== 2 /* NodeState.VISITED */) {
92
+ node.state = 2 /* NodeState.VISITED */;
93
+ this.#sortedNodeList.push(node.hash);
70
94
  }
71
- /**
72
- * Visit a given node definition for reordering.
73
- *
74
- * @internal Highly performance-sensitive method.
75
- */
76
- visit(node) {
77
- node.state = 1 /* NodeState.IN_PROGRESS */;
78
- for (const edge of node.dependencies.values()) {
79
- const target = this.#nodes.get(edge.to);
80
- switch (target.state) {
81
- case 2 /* NodeState.VISITED */:
82
- break; // Do nothing, since node was already visited
83
- case 1 /* NodeState.IN_PROGRESS */:
84
- this.visitOpenNode(node, target, edge);
85
- break;
86
- case 0 /* NodeState.NOT_VISITED */:
87
- this.visit(target);
88
- }
89
- }
90
- if (node.state !== 2 /* NodeState.VISITED */) {
91
- node.state = 2 /* NodeState.VISITED */;
92
- this.#sortedNodeList.push(node.hash);
93
- }
95
+ }
96
+ /**
97
+ * Visits all target's dependencies if in cycle with given node
98
+ */
99
+ visitOpenNode(node, target, edge) {
100
+ if (!target.dependencies.has(node.hash) || target.dependencies.get(node.hash).weight >= edge.weight) {
101
+ return;
94
102
  }
95
- /**
96
- * Visits all target's dependencies if in cycle with given node
97
- */
98
- visitOpenNode(node, target, edge) {
99
- if (!target.dependencies.has(node.hash) || target.dependencies.get(node.hash).weight >= edge.weight) {
100
- return;
101
- }
102
- for (const edge of target.dependencies.values()) {
103
- const targetNode = this.#nodes.get(edge.to);
104
- if (targetNode.state === 0 /* NodeState.NOT_VISITED */) {
105
- this.visit(targetNode);
106
- }
107
- }
108
- target.state = 2 /* NodeState.VISITED */;
109
- this.#sortedNodeList.push(target.hash);
103
+ for (const edge of target.dependencies.values()) {
104
+ const targetNode = this.#nodes.get(edge.to);
105
+ if (targetNode.state === 0 /* NodeState.NOT_VISITED */) {
106
+ this.visit(targetNode);
107
+ }
110
108
  }
109
+ target.state = 2 /* NodeState.VISITED */;
110
+ this.#sortedNodeList.push(target.hash);
111
+ }
111
112
  }
@@ -1,28 +1,35 @@
1
1
  import type { AnyEntity, EntityMetadata } from '../typings.js';
2
+ /** @internal Stores managed entity instances keyed by their primary key hash, ensuring each row is loaded once. */
2
3
  export declare class IdentityMap {
3
- #private;
4
- constructor(defaultSchema?: string);
5
- store<T>(item: T): void;
6
- /**
7
- * Stores an entity under an alternate key (non-PK property).
8
- * This allows looking up entities by unique properties that are not the primary key.
9
- */
10
- storeByKey<T>(item: T, key: string, value: string, schema?: string): void;
11
- delete<T>(item: T): void;
12
- getByHash<T>(meta: EntityMetadata<T>, hash: string): T | undefined;
13
- getStore<T>(meta: EntityMetadata<T>): Map<string, T>;
14
- clear(): void;
15
- values(): AnyEntity[];
16
- [Symbol.iterator](): IterableIterator<AnyEntity>;
17
- keys(): string[];
18
- /**
19
- * For back compatibility only.
20
- */
21
- get<T>(hash: string): T | undefined;
22
- private getPkHash;
23
- /**
24
- * Creates a hash for an alternate key lookup.
25
- * Format: `[key]value` or `schema:[key]value`
26
- */
27
- getKeyHash(key: string, value: string, schema?: string): string;
4
+ #private;
5
+ constructor(defaultSchema?: string);
6
+ /** Stores an entity in the identity map under its primary key hash. */
7
+ store<T>(item: T): void;
8
+ /**
9
+ * Stores an entity under an alternate key (non-PK property).
10
+ * This allows looking up entities by unique properties that are not the primary key.
11
+ */
12
+ storeByKey<T>(item: T, key: string, value: string, schema?: string): void;
13
+ /** Removes an entity and its alternate key entries from the identity map. */
14
+ delete<T>(item: T): void;
15
+ /** Retrieves an entity by its hash key from the identity map. */
16
+ getByHash<T>(meta: EntityMetadata<T>, hash: string): T | undefined;
17
+ /** Returns (or creates) the per-entity-class store within the identity map. */
18
+ getStore<T>(meta: EntityMetadata<T>): Map<string, T>;
19
+ clear(): void;
20
+ /** Returns all entities currently in the identity map. */
21
+ values(): AnyEntity[];
22
+ [Symbol.iterator](): IterableIterator<AnyEntity>;
23
+ /** Returns all hash keys currently in the identity map. */
24
+ keys(): string[];
25
+ /**
26
+ * For back compatibility only.
27
+ */
28
+ get<T>(hash: string): T | undefined;
29
+ private getPkHash;
30
+ /**
31
+ * Creates a hash for an alternate key lookup.
32
+ * Format: `[key]value` or `schema:[key]value`
33
+ */
34
+ getKeyHash(key: string, value: string, schema?: string): string;
28
35
  }
@@ -1,110 +1,117 @@
1
+ /** @internal Stores managed entity instances keyed by their primary key hash, ensuring each row is loaded once. */
1
2
  export class IdentityMap {
2
- #defaultSchema;
3
- #registry = new Map();
4
- /** Tracks alternate key hashes for each entity so we can clean them up on delete */
5
- #alternateKeys = new WeakMap();
6
- constructor(defaultSchema) {
7
- this.#defaultSchema = defaultSchema;
3
+ #defaultSchema;
4
+ #registry = new Map();
5
+ /** Tracks alternate key hashes for each entity so we can clean them up on delete */
6
+ #alternateKeys = new WeakMap();
7
+ constructor(defaultSchema) {
8
+ this.#defaultSchema = defaultSchema;
9
+ }
10
+ /** Stores an entity in the identity map under its primary key hash. */
11
+ store(item) {
12
+ this.getStore(item.__meta.root).set(this.getPkHash(item), item);
13
+ }
14
+ /**
15
+ * Stores an entity under an alternate key (non-PK property).
16
+ * This allows looking up entities by unique properties that are not the primary key.
17
+ */
18
+ storeByKey(item, key, value, schema) {
19
+ const hash = this.getKeyHash(key, value, schema);
20
+ this.getStore(item.__meta.root).set(hash, item);
21
+ // Track this alternate key so we can clean it up when the entity is deleted
22
+ let keys = this.#alternateKeys.get(item);
23
+ if (!keys) {
24
+ keys = new Set();
25
+ this.#alternateKeys.set(item, keys);
8
26
  }
9
- store(item) {
10
- this.getStore(item.__meta.root).set(this.getPkHash(item), item);
27
+ keys.add(hash);
28
+ }
29
+ /** Removes an entity and its alternate key entries from the identity map. */
30
+ delete(item) {
31
+ const meta = item.__meta.root;
32
+ const store = this.getStore(meta);
33
+ store.delete(this.getPkHash(item));
34
+ // Also delete any alternate key entries for this entity
35
+ const altKeys = this.#alternateKeys.get(item);
36
+ if (altKeys) {
37
+ for (const hash of altKeys) {
38
+ store.delete(hash);
39
+ }
40
+ this.#alternateKeys.delete(item);
11
41
  }
12
- /**
13
- * Stores an entity under an alternate key (non-PK property).
14
- * This allows looking up entities by unique properties that are not the primary key.
15
- */
16
- storeByKey(item, key, value, schema) {
17
- const hash = this.getKeyHash(key, value, schema);
18
- this.getStore(item.__meta.root).set(hash, item);
19
- // Track this alternate key so we can clean it up when the entity is deleted
20
- let keys = this.#alternateKeys.get(item);
21
- if (!keys) {
22
- keys = new Set();
23
- this.#alternateKeys.set(item, keys);
24
- }
25
- keys.add(hash);
42
+ }
43
+ /** Retrieves an entity by its hash key from the identity map. */
44
+ getByHash(meta, hash) {
45
+ const store = this.getStore(meta);
46
+ return store.has(hash) ? store.get(hash) : undefined;
47
+ }
48
+ /** Returns (or creates) the per-entity-class store within the identity map. */
49
+ getStore(meta) {
50
+ const store = this.#registry.get(meta.class);
51
+ if (store) {
52
+ return store;
26
53
  }
27
- delete(item) {
28
- const meta = item.__meta.root;
29
- const store = this.getStore(meta);
30
- store.delete(this.getPkHash(item));
31
- // Also delete any alternate key entries for this entity
32
- const altKeys = this.#alternateKeys.get(item);
33
- if (altKeys) {
34
- for (const hash of altKeys) {
35
- store.delete(hash);
36
- }
37
- this.#alternateKeys.delete(item);
38
- }
54
+ const newStore = new Map();
55
+ this.#registry.set(meta.class, newStore);
56
+ return newStore;
57
+ }
58
+ clear() {
59
+ this.#registry.clear();
60
+ }
61
+ /** Returns all entities currently in the identity map. */
62
+ values() {
63
+ const ret = [];
64
+ for (const store of this.#registry.values()) {
65
+ ret.push(...store.values());
39
66
  }
40
- getByHash(meta, hash) {
41
- const store = this.getStore(meta);
42
- return store.has(hash) ? store.get(hash) : undefined;
67
+ return ret;
68
+ }
69
+ *[Symbol.iterator]() {
70
+ for (const store of this.#registry.values()) {
71
+ for (const item of store.values()) {
72
+ yield item;
73
+ }
43
74
  }
44
- getStore(meta) {
45
- const store = this.#registry.get(meta.class);
46
- if (store) {
47
- return store;
48
- }
49
- const newStore = new Map();
50
- this.#registry.set(meta.class, newStore);
51
- return newStore;
75
+ }
76
+ /** Returns all hash keys currently in the identity map. */
77
+ keys() {
78
+ const ret = [];
79
+ for (const [cls, store] of this.#registry) {
80
+ ret.push(...[...store.keys()].map(hash => `${cls.name}-${hash}`));
52
81
  }
53
- clear() {
54
- this.#registry.clear();
82
+ return ret;
83
+ }
84
+ /**
85
+ * For back compatibility only.
86
+ */
87
+ get(hash) {
88
+ const [name, id] = hash.split('-', 2);
89
+ const cls = [...this.#registry.keys()].find(k => k.name === name);
90
+ if (!cls) {
91
+ return undefined;
55
92
  }
56
- values() {
57
- const ret = [];
58
- for (const store of this.#registry.values()) {
59
- ret.push(...store.values());
60
- }
61
- return ret;
93
+ const store = this.#registry.get(cls);
94
+ return store.has(id) ? store.get(id) : undefined;
95
+ }
96
+ getPkHash(item) {
97
+ const wrapped = item.__helper;
98
+ const meta = wrapped.__meta;
99
+ const hash = wrapped.getSerializedPrimaryKey();
100
+ const schema = wrapped.__schema ?? meta.root.schema ?? this.#defaultSchema;
101
+ if (schema) {
102
+ return schema + ':' + hash;
62
103
  }
63
- *[Symbol.iterator]() {
64
- for (const store of this.#registry.values()) {
65
- for (const item of store.values()) {
66
- yield item;
67
- }
68
- }
69
- }
70
- keys() {
71
- const ret = [];
72
- for (const [cls, store] of this.#registry) {
73
- ret.push(...[...store.keys()].map(hash => `${cls.name}-${hash}`));
74
- }
75
- return ret;
76
- }
77
- /**
78
- * For back compatibility only.
79
- */
80
- get(hash) {
81
- const [name, id] = hash.split('-', 2);
82
- const cls = [...this.#registry.keys()].find(k => k.name === name);
83
- if (!cls) {
84
- return undefined;
85
- }
86
- const store = this.#registry.get(cls);
87
- return store.has(id) ? store.get(id) : undefined;
88
- }
89
- getPkHash(item) {
90
- const wrapped = item.__helper;
91
- const meta = wrapped.__meta;
92
- const hash = wrapped.getSerializedPrimaryKey();
93
- const schema = wrapped.__schema ?? meta.root.schema ?? this.#defaultSchema;
94
- if (schema) {
95
- return schema + ':' + hash;
96
- }
97
- return hash;
98
- }
99
- /**
100
- * Creates a hash for an alternate key lookup.
101
- * Format: `[key]value` or `schema:[key]value`
102
- */
103
- getKeyHash(key, value, schema) {
104
- const hash = `[${key}]${value}`;
105
- if (schema) {
106
- return schema + ':' + hash;
107
- }
108
- return hash;
104
+ return hash;
105
+ }
106
+ /**
107
+ * Creates a hash for an alternate key lookup.
108
+ * Format: `[key]value` or `schema:[key]value`
109
+ */
110
+ getKeyHash(key, value, schema) {
111
+ const hash = `[${key}]${value}`;
112
+ if (schema) {
113
+ return schema + ':' + hash;
109
114
  }
115
+ return hash;
116
+ }
110
117
  }