@mikro-orm/core 7.0.0-dev.2 → 7.0.0-dev.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/EntityManager.d.ts +111 -61
  2. package/EntityManager.js +346 -300
  3. package/MikroORM.d.ts +44 -35
  4. package/MikroORM.js +103 -143
  5. package/README.md +3 -2
  6. package/cache/FileCacheAdapter.d.ts +1 -1
  7. package/cache/FileCacheAdapter.js +8 -7
  8. package/cache/GeneratedCacheAdapter.d.ts +0 -1
  9. package/cache/GeneratedCacheAdapter.js +0 -2
  10. package/cache/index.d.ts +0 -1
  11. package/cache/index.js +0 -1
  12. package/connections/Connection.d.ts +16 -7
  13. package/connections/Connection.js +23 -14
  14. package/drivers/DatabaseDriver.d.ts +25 -16
  15. package/drivers/DatabaseDriver.js +80 -35
  16. package/drivers/IDatabaseDriver.d.ts +47 -17
  17. package/entity/BaseEntity.d.ts +2 -2
  18. package/entity/BaseEntity.js +0 -3
  19. package/entity/Collection.d.ts +95 -31
  20. package/entity/Collection.js +444 -102
  21. package/entity/EntityAssigner.d.ts +1 -1
  22. package/entity/EntityAssigner.js +26 -18
  23. package/entity/EntityFactory.d.ts +13 -1
  24. package/entity/EntityFactory.js +88 -54
  25. package/entity/EntityHelper.d.ts +2 -2
  26. package/entity/EntityHelper.js +38 -15
  27. package/entity/EntityLoader.d.ts +8 -7
  28. package/entity/EntityLoader.js +134 -80
  29. package/entity/EntityRepository.d.ts +24 -4
  30. package/entity/EntityRepository.js +8 -2
  31. package/entity/Reference.d.ts +9 -12
  32. package/entity/Reference.js +34 -9
  33. package/entity/WrappedEntity.d.ts +2 -7
  34. package/entity/WrappedEntity.js +3 -8
  35. package/entity/defineEntity.d.ts +585 -0
  36. package/entity/defineEntity.js +533 -0
  37. package/entity/index.d.ts +3 -2
  38. package/entity/index.js +3 -2
  39. package/entity/utils.d.ts +7 -0
  40. package/entity/utils.js +16 -4
  41. package/entity/validators.d.ts +11 -0
  42. package/entity/validators.js +65 -0
  43. package/enums.d.ts +22 -6
  44. package/enums.js +15 -1
  45. package/errors.d.ts +23 -9
  46. package/errors.js +59 -21
  47. package/events/EventManager.d.ts +2 -1
  48. package/events/EventManager.js +19 -11
  49. package/events/EventSubscriber.d.ts +3 -1
  50. package/hydration/Hydrator.js +1 -2
  51. package/hydration/ObjectHydrator.d.ts +4 -4
  52. package/hydration/ObjectHydrator.js +53 -33
  53. package/index.d.ts +2 -2
  54. package/index.js +1 -2
  55. package/logging/DefaultLogger.d.ts +1 -1
  56. package/logging/DefaultLogger.js +1 -0
  57. package/logging/SimpleLogger.d.ts +1 -1
  58. package/logging/colors.d.ts +1 -1
  59. package/logging/colors.js +7 -6
  60. package/logging/index.d.ts +1 -0
  61. package/logging/index.js +1 -0
  62. package/logging/inspect.d.ts +2 -0
  63. package/logging/inspect.js +11 -0
  64. package/metadata/EntitySchema.d.ts +26 -26
  65. package/metadata/EntitySchema.js +82 -51
  66. package/metadata/MetadataDiscovery.d.ts +7 -10
  67. package/metadata/MetadataDiscovery.js +408 -335
  68. package/metadata/MetadataProvider.d.ts +11 -2
  69. package/metadata/MetadataProvider.js +46 -2
  70. package/metadata/MetadataStorage.d.ts +13 -11
  71. package/metadata/MetadataStorage.js +70 -37
  72. package/metadata/MetadataValidator.d.ts +17 -9
  73. package/metadata/MetadataValidator.js +100 -42
  74. package/metadata/discover-entities.d.ts +5 -0
  75. package/metadata/discover-entities.js +40 -0
  76. package/metadata/index.d.ts +1 -1
  77. package/metadata/index.js +1 -1
  78. package/metadata/types.d.ts +502 -0
  79. package/metadata/types.js +1 -0
  80. package/naming-strategy/AbstractNamingStrategy.d.ts +12 -4
  81. package/naming-strategy/AbstractNamingStrategy.js +14 -2
  82. package/naming-strategy/EntityCaseNamingStrategy.d.ts +3 -3
  83. package/naming-strategy/EntityCaseNamingStrategy.js +6 -5
  84. package/naming-strategy/MongoNamingStrategy.d.ts +3 -3
  85. package/naming-strategy/MongoNamingStrategy.js +6 -6
  86. package/naming-strategy/NamingStrategy.d.ts +24 -4
  87. package/naming-strategy/UnderscoreNamingStrategy.d.ts +3 -3
  88. package/naming-strategy/UnderscoreNamingStrategy.js +6 -6
  89. package/not-supported.d.ts +2 -0
  90. package/not-supported.js +4 -0
  91. package/package.json +19 -11
  92. package/platforms/ExceptionConverter.js +1 -1
  93. package/platforms/Platform.d.ts +7 -13
  94. package/platforms/Platform.js +20 -43
  95. package/serialization/EntitySerializer.d.ts +5 -0
  96. package/serialization/EntitySerializer.js +47 -27
  97. package/serialization/EntityTransformer.js +28 -18
  98. package/serialization/SerializationContext.d.ts +6 -6
  99. package/serialization/SerializationContext.js +16 -13
  100. package/types/ArrayType.d.ts +1 -1
  101. package/types/ArrayType.js +2 -3
  102. package/types/BigIntType.d.ts +9 -6
  103. package/types/BigIntType.js +4 -1
  104. package/types/BlobType.d.ts +0 -1
  105. package/types/BlobType.js +0 -3
  106. package/types/BooleanType.d.ts +2 -1
  107. package/types/BooleanType.js +3 -0
  108. package/types/DecimalType.d.ts +6 -4
  109. package/types/DecimalType.js +3 -3
  110. package/types/DoubleType.js +2 -2
  111. package/types/EnumArrayType.js +1 -2
  112. package/types/JsonType.d.ts +1 -1
  113. package/types/JsonType.js +7 -2
  114. package/types/TinyIntType.js +1 -1
  115. package/types/Type.d.ts +2 -4
  116. package/types/Type.js +3 -3
  117. package/types/Uint8ArrayType.d.ts +0 -1
  118. package/types/Uint8ArrayType.js +1 -4
  119. package/types/index.d.ts +1 -1
  120. package/typings.d.ts +300 -140
  121. package/typings.js +62 -44
  122. package/unit-of-work/ChangeSet.d.ts +2 -6
  123. package/unit-of-work/ChangeSet.js +4 -5
  124. package/unit-of-work/ChangeSetComputer.d.ts +1 -3
  125. package/unit-of-work/ChangeSetComputer.js +26 -13
  126. package/unit-of-work/ChangeSetPersister.d.ts +5 -4
  127. package/unit-of-work/ChangeSetPersister.js +77 -35
  128. package/unit-of-work/CommitOrderCalculator.d.ts +12 -10
  129. package/unit-of-work/CommitOrderCalculator.js +13 -13
  130. package/unit-of-work/IdentityMap.d.ts +12 -0
  131. package/unit-of-work/IdentityMap.js +39 -1
  132. package/unit-of-work/UnitOfWork.d.ts +23 -3
  133. package/unit-of-work/UnitOfWork.js +199 -106
  134. package/utils/AbstractSchemaGenerator.d.ts +5 -5
  135. package/utils/AbstractSchemaGenerator.js +22 -17
  136. package/utils/AsyncContext.d.ts +6 -0
  137. package/utils/AsyncContext.js +42 -0
  138. package/utils/Configuration.d.ts +779 -207
  139. package/utils/Configuration.js +146 -190
  140. package/utils/ConfigurationLoader.d.ts +1 -54
  141. package/utils/ConfigurationLoader.js +1 -352
  142. package/utils/Cursor.d.ts +3 -6
  143. package/utils/Cursor.js +27 -11
  144. package/utils/DataloaderUtils.d.ts +15 -5
  145. package/utils/DataloaderUtils.js +65 -17
  146. package/utils/EntityComparator.d.ts +13 -9
  147. package/utils/EntityComparator.js +164 -89
  148. package/utils/QueryHelper.d.ts +14 -6
  149. package/utils/QueryHelper.js +88 -26
  150. package/utils/RawQueryFragment.d.ts +48 -25
  151. package/utils/RawQueryFragment.js +67 -66
  152. package/utils/RequestContext.js +2 -2
  153. package/utils/TransactionContext.js +2 -2
  154. package/utils/TransactionManager.d.ts +65 -0
  155. package/utils/TransactionManager.js +223 -0
  156. package/utils/Utils.d.ts +13 -120
  157. package/utils/Utils.js +104 -375
  158. package/utils/clone.js +8 -23
  159. package/utils/env-vars.d.ts +7 -0
  160. package/utils/env-vars.js +97 -0
  161. package/utils/fs-utils.d.ts +32 -0
  162. package/utils/fs-utils.js +178 -0
  163. package/utils/index.d.ts +2 -1
  164. package/utils/index.js +2 -1
  165. package/utils/upsert-utils.d.ts +9 -4
  166. package/utils/upsert-utils.js +55 -4
  167. package/decorators/Check.d.ts +0 -3
  168. package/decorators/Check.js +0 -13
  169. package/decorators/CreateRequestContext.d.ts +0 -3
  170. package/decorators/CreateRequestContext.js +0 -29
  171. package/decorators/Embeddable.d.ts +0 -8
  172. package/decorators/Embeddable.js +0 -11
  173. package/decorators/Embedded.d.ts +0 -18
  174. package/decorators/Embedded.js +0 -18
  175. package/decorators/Entity.d.ts +0 -18
  176. package/decorators/Entity.js +0 -13
  177. package/decorators/Enum.d.ts +0 -9
  178. package/decorators/Enum.js +0 -16
  179. package/decorators/Filter.d.ts +0 -2
  180. package/decorators/Filter.js +0 -8
  181. package/decorators/Formula.d.ts +0 -5
  182. package/decorators/Formula.js +0 -15
  183. package/decorators/Indexed.d.ts +0 -17
  184. package/decorators/Indexed.js +0 -20
  185. package/decorators/ManyToMany.d.ts +0 -40
  186. package/decorators/ManyToMany.js +0 -14
  187. package/decorators/ManyToOne.d.ts +0 -30
  188. package/decorators/ManyToOne.js +0 -14
  189. package/decorators/OneToMany.d.ts +0 -28
  190. package/decorators/OneToMany.js +0 -17
  191. package/decorators/OneToOne.d.ts +0 -24
  192. package/decorators/OneToOne.js +0 -7
  193. package/decorators/PrimaryKey.d.ts +0 -9
  194. package/decorators/PrimaryKey.js +0 -20
  195. package/decorators/Property.d.ts +0 -250
  196. package/decorators/Property.js +0 -32
  197. package/decorators/Transactional.d.ts +0 -13
  198. package/decorators/Transactional.js +0 -28
  199. package/decorators/hooks.d.ts +0 -16
  200. package/decorators/hooks.js +0 -47
  201. package/decorators/index.d.ts +0 -17
  202. package/decorators/index.js +0 -17
  203. package/entity/ArrayCollection.d.ts +0 -116
  204. package/entity/ArrayCollection.js +0 -395
  205. package/entity/EntityValidator.d.ts +0 -19
  206. package/entity/EntityValidator.js +0 -150
  207. package/metadata/ReflectMetadataProvider.d.ts +0 -8
  208. package/metadata/ReflectMetadataProvider.js +0 -44
  209. package/utils/resolveContextProvider.d.ts +0 -10
  210. package/utils/resolveContextProvider.js +0 -28
@@ -1,16 +1,13 @@
1
- import { inspect } from 'node:util';
2
- import DataLoader from 'dataloader';
3
1
  import { type Configuration } from './utils/Configuration.js';
4
2
  import { Cursor } from './utils/Cursor.js';
5
3
  import { EntityFactory } from './entity/EntityFactory.js';
6
4
  import { type AssignOptions } from './entity/EntityAssigner.js';
7
- import { EntityValidator } from './entity/EntityValidator.js';
8
5
  import { type EntityRepository } from './entity/EntityRepository.js';
9
- import { type EntityLoaderOptions } from './entity/EntityLoader.js';
6
+ import { EntityLoader, type EntityLoaderOptions } from './entity/EntityLoader.js';
10
7
  import { Reference } from './entity/Reference.js';
11
8
  import { UnitOfWork } from './unit-of-work/UnitOfWork.js';
12
- import type { CountOptions, DeleteOptions, FindAllOptions, FindByCursorOptions, FindOneOptions, FindOneOrFailOptions, FindOptions, GetReferenceOptions, IDatabaseDriver, LockOptions, NativeInsertUpdateOptions, UpdateOptions, UpsertManyOptions, UpsertOptions } from './drivers/IDatabaseDriver.js';
13
- import type { AnyEntity, AnyString, ArrayElement, AutoPath, ConnectionType, Dictionary, EntityData, EntityDictionary, EntityDTO, EntityMetadata, EntityName, FilterQuery, FromEntityType, GetRepository, IHydrator, IsSubset, Loaded, MaybePromise, MergeLoaded, MergeSelected, NoInfer, ObjectQuery, Primary, Ref, RequiredEntityData, UnboxArray } from './typings.js';
9
+ import type { CountOptions, DeleteOptions, FilterOptions, FindAllOptions, FindByCursorOptions, FindOneOptions, FindOneOrFailOptions, FindOptions, GetReferenceOptions, IDatabaseDriver, LockOptions, NativeInsertUpdateOptions, StreamOptions, UpdateOptions, UpsertManyOptions, UpsertOptions } from './drivers/IDatabaseDriver.js';
10
+ import type { AnyString, ArrayElement, AutoPath, ConnectionType, Dictionary, EntityClass, EntityData, EntityDictionary, EntityDTO, EntityMetadata, EntityName, FilterDef, FilterQuery, FromEntityType, GetRepository, IHydrator, IsSubset, Loaded, MergeLoaded, MergeSelected, NoInfer, ObjectQuery, PopulateOptions, Primary, Ref, RequiredEntityData, UnboxArray } from './typings.js';
14
11
  import { FlushMode, LockMode, PopulatePath, type TransactionOptions } from './enums.js';
15
12
  import type { MetadataStorage } from './metadata/MetadataStorage.js';
16
13
  import type { Transaction } from './connections/Connection.js';
@@ -27,13 +24,13 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
27
24
  protected readonly metadata: MetadataStorage;
28
25
  protected readonly useContext: boolean;
29
26
  protected readonly eventManager: EventManager;
27
+ /** @internal */
28
+ readonly '~entities'?: unknown;
30
29
  private static counter;
31
30
  readonly _id: number;
32
31
  readonly global = false;
33
32
  readonly name: string;
34
- protected readonly refLoader: DataLoader<[Reference<any>, (Omit<import("./entity/Reference.js").LoadReferenceOptions<any, any, "*", never>, "dataloader"> | undefined)?], any, [Reference<any>, (Omit<import("./entity/Reference.js").LoadReferenceOptions<any, any, "*", never>, "dataloader"> | undefined)?]>;
35
- protected readonly colLoader: DataLoader<[import("./index.js").Collection<any, object>, (Omit<import("./index.js").InitCollectionOptions<any, any, "*", never>, "dataloader"> | undefined)?], any, [import("./index.js").Collection<any, object>, (Omit<import("./index.js").InitCollectionOptions<any, any, "*", never>, "dataloader"> | undefined)?]>;
36
- private readonly validator;
33
+ private readonly loaders;
37
34
  private readonly repositoryMap;
38
35
  private readonly entityLoader;
39
36
  protected readonly comparator: EntityComparator;
@@ -72,14 +69,28 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
72
69
  * Shortcut for `em.getRepository()`.
73
70
  */
74
71
  repo<Entity extends object, Repository extends EntityRepository<Entity> = EntityRepository<Entity>>(entityName: EntityName<Entity>): GetRepository<Entity, Repository>;
75
- /**
76
- * Gets EntityValidator instance
77
- */
78
- getValidator(): EntityValidator;
79
72
  /**
80
73
  * Finds all entities matching your `where` query. You can pass additional options via the `options` parameter.
81
74
  */
82
75
  find<Entity extends object, Hint extends string = never, Fields extends string = PopulatePath.ALL, Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: FindOptions<Entity, Hint, Fields, Excludes>): Promise<Loaded<Entity, Hint, Fields, Excludes>[]>;
76
+ /**
77
+ * Finds all entities and returns an async iterable (async generator) that yields results one by one.
78
+ * The results are merged and mapped to entity instances, without adding them to the identity map.
79
+ * You can disable merging by passing the options `{ mergeResults: false }`.
80
+ * With `mergeResults` disabled, to-many collections will contain at most one item, and you will get duplicate
81
+ * root entities when there are multiple items in the populated collection.
82
+ * This is useful for processing large datasets without loading everything into memory at once.
83
+ *
84
+ * ```ts
85
+ * const stream = em.stream(Book, { populate: ['author'] });
86
+ *
87
+ * for await (const book of stream) {
88
+ * // book is an instance of Book entity
89
+ * console.log(book.title, book.author.name);
90
+ * }
91
+ * ```
92
+ */
93
+ stream<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entityName: EntityName<Entity>, options?: StreamOptions<NoInfer<Entity>, Hint, Fields, Excludes>): AsyncIterableIterator<Loaded<Entity, Hint, Fields, Excludes>>;
83
94
  /**
84
95
  * Finds all entities of given type, optionally matching the `where` condition provided in the `options` parameter.
85
96
  */
@@ -88,19 +99,7 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
88
99
  /**
89
100
  * Registers global filter to this entity manager. Global filters are enabled by default (unless disabled via last parameter).
90
101
  */
91
- addFilter<T1>(name: string, cond: FilterQuery<T1> | ((args: Dictionary) => MaybePromise<FilterQuery<T1>>), entityName?: EntityName<T1> | [EntityName<T1>], enabled?: boolean): void;
92
- /**
93
- * Registers global filter to this entity manager. Global filters are enabled by default (unless disabled via last parameter).
94
- */
95
- addFilter<T1, T2>(name: string, cond: FilterQuery<T1 | T2> | ((args: Dictionary) => MaybePromise<FilterQuery<T1 | T2>>), entityName?: [EntityName<T1>, EntityName<T2>], enabled?: boolean): void;
96
- /**
97
- * Registers global filter to this entity manager. Global filters are enabled by default (unless disabled via last parameter).
98
- */
99
- addFilter<T1, T2, T3>(name: string, cond: FilterQuery<T1 | T2 | T3> | ((args: Dictionary) => MaybePromise<FilterQuery<T1 | T2 | T3>>), entityName?: [EntityName<T1>, EntityName<T2>, EntityName<T3>], enabled?: boolean): void;
100
- /**
101
- * Registers global filter to this entity manager. Global filters are enabled by default (unless disabled via last parameter).
102
- */
103
- addFilter(name: string, cond: Dictionary | ((args: Dictionary) => MaybePromise<FilterQuery<AnyEntity>>), entityName?: EntityName<AnyEntity> | EntityName<AnyEntity>[], enabled?: boolean): void;
102
+ addFilter<T extends EntityName | readonly EntityName[]>(options: FilterDef<T>): void;
104
103
  /**
105
104
  * Sets filter parameter values globally inside context defined by this entity manager.
106
105
  * If you want to set shared value for all contexts, be sure to use the root entity manager.
@@ -117,20 +116,25 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
117
116
  /**
118
117
  * Gets logger context for this entity manager.
119
118
  */
120
- getLoggerContext<T extends Dictionary = Dictionary>(): T;
121
- setFlushMode(flushMode?: FlushMode): void;
122
- protected processWhere<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entityName: string, where: FilterQuery<Entity>, options: FindOptions<Entity, Hint, Fields, Excludes> | FindOneOptions<Entity, Hint, Fields, Excludes>, type: 'read' | 'update' | 'delete'): Promise<FilterQuery<Entity>>;
123
- protected applyDiscriminatorCondition<Entity extends object>(entityName: string, where: FilterQuery<Entity>): FilterQuery<Entity>;
119
+ getLoggerContext<T extends Dictionary = Dictionary>(options?: {
120
+ disableContextResolution?: boolean;
121
+ }): T;
122
+ setFlushMode(flushMode?: FlushMode | `${FlushMode}`): void;
123
+ protected processWhere<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<Entity>, options: FindOptions<Entity, Hint, Fields, Excludes> | FindOneOptions<Entity, Hint, Fields, Excludes>, type: 'read' | 'update' | 'delete'): Promise<FilterQuery<Entity>>;
124
+ protected applyDiscriminatorCondition<Entity extends object>(entityName: EntityName<Entity>, where: FilterQuery<Entity>): FilterQuery<Entity>;
124
125
  protected createPopulateWhere<Entity extends object>(cond: ObjectQuery<Entity>, options: FindOptions<Entity, any, any, any> | FindOneOptions<Entity, any, any, any> | CountOptions<Entity, any>): ObjectQuery<Entity>;
125
- protected getJoinedFilters<Entity extends object>(meta: EntityMetadata<Entity>, cond: ObjectQuery<Entity>, options: FindOptions<Entity, any, any, any> | FindOneOptions<Entity, any, any, any>): Promise<ObjectQuery<Entity>>;
126
+ protected getJoinedFilters<Entity extends object>(meta: EntityMetadata<Entity>, options: FindOptions<Entity, any, any, any> | FindOneOptions<Entity, any, any, any>): Promise<ObjectQuery<Entity> | undefined>;
126
127
  /**
127
128
  * When filters are active on M:1 or 1:1 relations, we need to ref join them eagerly as they might affect the FK value.
128
129
  */
129
- protected autoJoinRefsForFilters<T extends object>(meta: EntityMetadata<T>, options: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any>): Promise<void>;
130
+ protected autoJoinRefsForFilters<T extends object>(meta: EntityMetadata<T>, options: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any>, parent?: {
131
+ class: EntityClass;
132
+ propName: string;
133
+ }): Promise<void>;
130
134
  /**
131
135
  * @internal
132
136
  */
133
- applyFilters<Entity extends object>(entityName: string, where: FilterQuery<Entity> | undefined, options: Dictionary<boolean | Dictionary> | string[] | boolean, type: 'read' | 'update' | 'delete', findOptions?: FindOptions<any, any, any, any> | FindOneOptions<any, any, any, any>): Promise<FilterQuery<Entity> | undefined>;
137
+ applyFilters<Entity extends object>(entityName: EntityName<Entity>, where: FilterQuery<Entity> | undefined, options: FilterOptions | undefined, type: 'read' | 'update' | 'delete', findOptions?: FindOptions<any, any, any, any> | FindOneOptions<any, any, any, any>): Promise<FilterQuery<Entity> | undefined>;
134
138
  /**
135
139
  * Calls `em.find()` and `em.count()` with the same arguments (where applicable) and returns the results as tuple
136
140
  * where the first element is the array of entities, and the second is the count.
@@ -150,27 +154,31 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
150
154
  * - POJO/entity instance
151
155
  *
152
156
  * ```ts
153
- * const currentCursor = await em.findByCursor(User, {}, {
157
+ * const currentCursor = await em.findByCursor(User, {
154
158
  * first: 10,
155
159
  * after: previousCursor, // cursor instance
156
160
  * orderBy: { id: 'desc' },
157
161
  * });
158
162
  *
159
163
  * // to fetch next page
160
- * const nextCursor = await em.findByCursor(User, {}, {
164
+ * const nextCursor = await em.findByCursor(User, {
161
165
  * first: 10,
162
166
  * after: currentCursor.endCursor, // opaque string
163
167
  * orderBy: { id: 'desc' },
164
168
  * });
165
169
  *
166
170
  * // to fetch next page
167
- * const nextCursor2 = await em.findByCursor(User, {}, {
171
+ * const nextCursor2 = await em.findByCursor(User, {
168
172
  * first: 10,
169
173
  * after: { id: lastSeenId }, // entity-like POJO
170
174
  * orderBy: { id: 'desc' },
171
175
  * });
172
176
  * ```
173
177
  *
178
+ * The options also support an `includeCount` (true by default) option. If set to false, the `totalCount` is not
179
+ * returned as part of the cursor. This is useful for performance reason, when you don't care about the total number
180
+ * of pages.
181
+ *
174
182
  * The `Cursor` object provides the following interface:
175
183
  *
176
184
  * ```ts
@@ -180,7 +188,7 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
180
188
  * User { ... },
181
189
  * User { ... },
182
190
  * ],
183
- * totalCount: 50,
191
+ * totalCount: 50, // not included if `includeCount: false`
184
192
  * startCursor: 'WzRd',
185
193
  * endCursor: 'WzZd',
186
194
  * hasPrevPage: true,
@@ -188,7 +196,7 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
188
196
  * }
189
197
  * ```
190
198
  */
191
- findByCursor<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options: FindByCursorOptions<Entity, Hint, Fields, Excludes>): Promise<Cursor<Entity, Hint, Fields, Excludes>>;
199
+ findByCursor<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never, IncludeCount extends boolean = true>(entityName: EntityName<Entity>, options: FindByCursorOptions<Entity, Hint, Fields, Excludes, IncludeCount>): Promise<Cursor<Entity, Hint, Fields, Excludes, IncludeCount>>;
192
200
  /**
193
201
  * Refreshes the persistent state of an entity from the database, overriding any local changes that have not yet been
194
202
  * persisted. Returns the same entity instance (same object reference), but re-hydrated. If the entity is no longer
@@ -263,6 +271,29 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
263
271
  upsertMany<Entity extends object, Fields extends string = any>(entityNameOrEntity: EntityName<Entity> | Entity[], data?: (EntityData<Entity> | NoInfer<Entity>)[], options?: UpsertManyOptions<Entity, Fields>): Promise<Entity[]>;
264
272
  /**
265
273
  * Runs your callback wrapped inside a database transaction.
274
+ *
275
+ * If a transaction is already active, a new savepoint (nested transaction) will be created by default. This behavior
276
+ * can be controlled via the `propagation` option. Use the provided EntityManager instance for all operations that
277
+ * should be part of the transaction. You can safely use a global EntityManager instance from a DI container, as this
278
+ * method automatically creates an async context for the transaction.
279
+ *
280
+ * **Concurrency note:** When running multiple transactions concurrently (e.g. in parallel requests or jobs), use the
281
+ * `clear: true` option. This ensures the callback runs in a clear fork of the EntityManager, providing full isolation
282
+ * between concurrent transactional handlers. Using `clear: true` is an alternative to forking explicitly and calling
283
+ * the method on the new fork – it already provides the necessary isolation for safe concurrent usage.
284
+ *
285
+ * **Propagation note:** Changes made within a transaction (whether top-level or nested) are always propagated to the
286
+ * parent context, unless the parent context is a global one. If you want to avoid that, fork the EntityManager first
287
+ * and then call this method on the fork.
288
+ *
289
+ * **Example:**
290
+ * ```ts
291
+ * await em.transactional(async (em) => {
292
+ * const author = new Author('Jon');
293
+ * em.persist(author);
294
+ * // flush is called automatically at the end of the callback
295
+ * });
296
+ * ```
266
297
  */
267
298
  transactional<T>(cb: (em: this) => T | Promise<T>, options?: TransactionOptions): Promise<T>;
268
299
  /**
@@ -351,10 +382,26 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
351
382
  * Shortcut for `wrap(entity).assign(data, { em })`
352
383
  */
353
384
  assign<Entity extends object, Naked extends FromEntityType<Entity> = FromEntityType<Entity>, Convert extends boolean = false, Data extends EntityData<Naked, Convert> | Partial<EntityDTO<Naked>> = EntityData<Naked, Convert> | Partial<EntityDTO<Naked>>>(entity: Entity | Partial<Entity>, data: Data & IsSubset<EntityData<Naked, Convert>, Data>, options?: AssignOptions<Convert>): MergeSelected<Entity, Naked, keyof Data & string>;
385
+ /**
386
+ * Gets a reference to the entity identified by the given type and alternate key property without actually loading it.
387
+ * The key option specifies which property to use for identity map lookup instead of the primary key.
388
+ */
389
+ getReference<Entity extends object, K extends string & keyof Entity>(entityName: EntityName<Entity>, id: Entity[K], options: Omit<GetReferenceOptions, 'key' | 'wrapped'> & {
390
+ key: K;
391
+ wrapped: true;
392
+ }): Ref<Entity>;
393
+ /**
394
+ * Gets a reference to the entity identified by the given type and alternate key property without actually loading it.
395
+ * The key option specifies which property to use for identity map lookup instead of the primary key.
396
+ */
397
+ getReference<Entity extends object, K extends string & keyof Entity>(entityName: EntityName<Entity>, id: Entity[K], options: Omit<GetReferenceOptions, 'key'> & {
398
+ key: K;
399
+ wrapped?: false;
400
+ }): Entity;
354
401
  /**
355
402
  * Gets a reference to the entity identified by the given type and identifier without actually loading it, if the entity is not yet loaded
356
403
  */
357
- getReference<Entity extends object>(entityName: EntityName<Entity>, id: Primary<Entity>, options: Omit<GetReferenceOptions, 'wrapped'> & {
404
+ getReference<Entity extends object>(entityName: EntityName<Entity>, id: Primary<Entity>, options: Omit<GetReferenceOptions, 'wrapped' | 'key'> & {
358
405
  wrapped: true;
359
406
  }): Ref<Entity>;
360
407
  /**
@@ -364,7 +411,7 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
364
411
  /**
365
412
  * Gets a reference to the entity identified by the given type and identifier without actually loading it, if the entity is not yet loaded
366
413
  */
367
- getReference<Entity extends object>(entityName: EntityName<Entity>, id: Primary<Entity>, options: Omit<GetReferenceOptions, 'wrapped'> & {
414
+ getReference<Entity extends object>(entityName: EntityName<Entity>, id: Primary<Entity>, options: Omit<GetReferenceOptions, 'wrapped' | 'key'> & {
368
415
  wrapped: false;
369
416
  }): Entity;
370
417
  /**
@@ -380,11 +427,6 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
380
427
  * The entity will be entered into the database at or before transaction commit or as a result of the flush operation.
381
428
  */
382
429
  persist<Entity extends object>(entity: Entity | Reference<Entity> | Iterable<Entity | Reference<Entity>>): this;
383
- /**
384
- * Persists your entity immediately, flushing all not yet persisted changes to the database too.
385
- * Equivalent to `em.persist(e).flush()`.
386
- */
387
- persistAndFlush(entity: AnyEntity | Reference<AnyEntity> | Iterable<AnyEntity | Reference<AnyEntity>>): Promise<void>;
388
430
  /**
389
431
  * Marks entity for removal.
390
432
  * A removed entity will be removed from the database at or before transaction commit or as a result of the flush operation.
@@ -392,11 +434,6 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
392
434
  * To remove entities by condition, use `em.nativeDelete()`.
393
435
  */
394
436
  remove<Entity extends object>(entity: Entity | Reference<Entity> | Iterable<Entity | Reference<Entity>>): this;
395
- /**
396
- * Removes an entity instance immediately, flushing all not yet persisted changes to the database too.
397
- * Equivalent to `em.remove(e).flush()`
398
- */
399
- removeAndFlush(entity: AnyEntity | Reference<AnyEntity> | Iterable<AnyEntity | Reference<AnyEntity>>): Promise<void>;
400
437
  /**
401
438
  * Flushes all changes to objects that have been queued up to now to the database.
402
439
  * This effectively synchronizes the in-memory state of managed objects with the database.
@@ -419,7 +456,7 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
419
456
  /**
420
457
  * Loads specified relations in batch. This will execute one query for each relation, that will populate it on all the specified entities.
421
458
  */
422
- populate<Entity extends object, Naked extends FromEntityType<UnboxArray<Entity>> = FromEntityType<UnboxArray<Entity>>, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entities: Entity, populate: AutoPath<Naked, Hint, PopulatePath.ALL>[] | false, options?: EntityLoaderOptions<Naked, Fields, Excludes>): Promise<Entity extends object[] ? MergeLoaded<ArrayElement<Entity>, Naked, Hint, Fields, Excludes>[] : MergeLoaded<Entity, Naked, Hint, Fields, Excludes>>;
459
+ populate<Entity extends object, Naked extends FromEntityType<UnboxArray<Entity>> = FromEntityType<UnboxArray<Entity>>, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entities: Entity, populate: readonly AutoPath<Naked, Hint, PopulatePath.ALL>[] | false, options?: EntityLoaderOptions<Naked, Fields, Excludes>): Promise<Entity extends object[] ? MergeLoaded<ArrayElement<Entity>, Naked, Hint, Fields, Excludes>[] : MergeLoaded<Entity, Naked, Hint, Fields, Excludes>>;
423
460
  /**
424
461
  * Returns new EntityManager instance with its own identity map
425
462
  */
@@ -432,6 +469,10 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
432
469
  * Gets the EntityFactory used by the EntityManager.
433
470
  */
434
471
  getEntityFactory(): EntityFactory;
472
+ /**
473
+ * @internal use `em.populate()` as the user facing API, this is exposed only for internal usage
474
+ */
475
+ getEntityLoader(): EntityLoader;
435
476
  /**
436
477
  * Gets the Hydrator used by the EntityManager.
437
478
  */
@@ -473,30 +514,31 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
473
514
  private checkLockRequirements;
474
515
  private lockAndPopulate;
475
516
  private buildFields;
476
- private preparePopulate;
517
+ /** @internal */
518
+ preparePopulate<Entity extends object>(entityName: EntityName<Entity>, options: Pick<FindOptions<Entity, any, any, any>, 'populate' | 'strategy' | 'fields' | 'flags' | 'filters' | 'exclude'>, validate?: boolean): Promise<PopulateOptions<Entity>[]>;
477
519
  /**
478
520
  * when the entity is found in identity map, we check if it was partially loaded or we are trying to populate
479
521
  * some additional lazy properties, if so, we reload and merge the data from database
480
522
  */
481
523
  protected shouldRefresh<T extends object, P extends string = never, F extends string = '*', E extends string = never>(meta: EntityMetadata<T>, entity: T, options: FindOneOptions<T, P, F, E>): boolean;
482
- protected prepareOptions(options: FindOptions<any, any, any, any> | FindOneOptions<any, any, any, any>): void;
524
+ protected prepareOptions(options: FindOptions<any, any, any, any> | FindOneOptions<any, any, any, any> | CountOptions<any, any>): void;
483
525
  /**
484
526
  * @internal
485
527
  */
486
- cacheKey<T extends object>(entityName: string, options: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any> | CountOptions<T, any>, method: string, where: FilterQuery<T>): unknown[];
528
+ cacheKey<T extends object>(entityName: EntityName<T>, options: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any> | CountOptions<T, any>, method: string, where: FilterQuery<T>): unknown[];
487
529
  /**
488
530
  * @internal
489
531
  */
490
- tryCache<T extends object, R>(entityName: string, config: boolean | number | [string, number] | undefined, key: unknown, refresh?: boolean, merge?: boolean): Promise<{
491
- data?: R;
532
+ tryCache<T extends object, R>(entityName: EntityName<T>, config: boolean | number | [string, number] | undefined, key: unknown, refresh?: boolean, merge?: boolean): Promise<{
533
+ data?: R | null;
492
534
  key: string;
493
535
  } | undefined>;
494
536
  /**
495
537
  * @internal
496
538
  */
497
- storeCache(config: boolean | number | [string, number] | undefined, key: {
539
+ storeCache<T>(config: boolean | number | [string, number] | undefined, key: {
498
540
  key: string;
499
- }, data: unknown | (() => unknown)): Promise<void>;
541
+ }, data: T | (() => T)): Promise<void>;
500
542
  /**
501
543
  * Clears result cache for given cache key. If we want to be able to call this method,
502
544
  * we need to set the cache key explicitly when storing the cache.
@@ -520,13 +562,13 @@ export declare class EntityManager<Driver extends IDatabaseDriver = IDatabaseDri
520
562
  * if executed inside request context handler.
521
563
  */
522
564
  set schema(schema: string | null | undefined);
565
+ /** @internal */
566
+ getDataLoader(type: 'ref' | '1:m' | 'm:n'): Promise<any>;
523
567
  /**
524
568
  * Returns the ID of this EntityManager. Respects the context, so global EM will give you the contextual ID
525
569
  * if executed inside request context handler.
526
570
  */
527
571
  get id(): number;
528
- /** @ignore */
529
- [inspect.custom](): string;
530
572
  }
531
573
  export interface CreateOptions<Convert extends boolean> {
532
574
  /** creates a managed entity instance instead, bypassing the constructor call */
@@ -539,11 +581,19 @@ export interface CreateOptions<Convert extends boolean> {
539
581
  partial?: boolean;
540
582
  /** convert raw database values based on mapped types (by default, already converted values are expected) */
541
583
  convertCustomTypes?: Convert;
584
+ /**
585
+ * Property `onCreate` hooks are normally executed during `flush` operation.
586
+ * With this option, they will be processed early inside `em.create()` method.
587
+ */
588
+ processOnCreateHooksEarly?: boolean;
542
589
  }
543
590
  export interface MergeOptions {
544
591
  refresh?: boolean;
545
592
  convertCustomTypes?: boolean;
546
593
  schema?: string;
594
+ disableContextResolution?: boolean;
595
+ validate?: boolean;
596
+ cascade?: boolean; /** @default true */
547
597
  }
548
598
  export interface ForkOptions {
549
599
  /** do we want a clear identity map? defaults to true */
@@ -557,7 +607,7 @@ export interface ForkOptions {
557
607
  /** use this flag to ignore the current async context - this is required if we want to call `em.fork()` inside the `getContext` handler */
558
608
  disableContextResolution?: boolean;
559
609
  /** set flush mode for this fork, overrides the global option can be overridden locally via FindOptions */
560
- flushMode?: FlushMode;
610
+ flushMode?: FlushMode | `${FlushMode}`;
561
611
  /** disable transactions for this fork */
562
612
  disableTransactions?: boolean;
563
613
  /** should we keep the transaction context of the parent EM? */