@mikro-orm/core 7.0.0-dev.21 → 7.0.0-dev.211

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 (211) hide show
  1. package/EntityManager.d.ts +99 -57
  2. package/EntityManager.js +302 -276
  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 +44 -17
  17. package/entity/BaseEntity.d.ts +2 -2
  18. package/entity/BaseEntity.js +0 -3
  19. package/entity/Collection.d.ts +94 -29
  20. package/entity/Collection.js +434 -97
  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 +84 -53
  25. package/entity/EntityHelper.d.ts +2 -2
  26. package/entity/EntityHelper.js +40 -15
  27. package/entity/EntityLoader.d.ts +6 -6
  28. package/entity/EntityLoader.js +119 -82
  29. package/entity/EntityRepository.d.ts +24 -4
  30. package/entity/EntityRepository.js +8 -2
  31. package/entity/Reference.d.ts +6 -5
  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 +594 -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 +21 -5
  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/hydration/Hydrator.js +1 -2
  50. package/hydration/ObjectHydrator.d.ts +4 -4
  51. package/hydration/ObjectHydrator.js +52 -33
  52. package/index.d.ts +2 -2
  53. package/index.js +1 -2
  54. package/logging/DefaultLogger.d.ts +1 -1
  55. package/logging/DefaultLogger.js +1 -0
  56. package/logging/SimpleLogger.d.ts +1 -1
  57. package/logging/colors.d.ts +1 -1
  58. package/logging/colors.js +7 -6
  59. package/logging/index.d.ts +1 -0
  60. package/logging/index.js +1 -0
  61. package/logging/inspect.d.ts +2 -0
  62. package/logging/inspect.js +11 -0
  63. package/metadata/EntitySchema.d.ts +40 -23
  64. package/metadata/EntitySchema.js +81 -34
  65. package/metadata/MetadataDiscovery.d.ts +7 -10
  66. package/metadata/MetadataDiscovery.js +391 -331
  67. package/metadata/MetadataProvider.d.ts +11 -2
  68. package/metadata/MetadataProvider.js +46 -2
  69. package/metadata/MetadataStorage.d.ts +13 -11
  70. package/metadata/MetadataStorage.js +70 -37
  71. package/metadata/MetadataValidator.d.ts +17 -9
  72. package/metadata/MetadataValidator.js +97 -40
  73. package/metadata/discover-entities.d.ts +5 -0
  74. package/metadata/discover-entities.js +40 -0
  75. package/metadata/index.d.ts +1 -1
  76. package/metadata/index.js +1 -1
  77. package/metadata/types.d.ts +502 -0
  78. package/metadata/types.js +1 -0
  79. package/naming-strategy/AbstractNamingStrategy.d.ts +12 -4
  80. package/naming-strategy/AbstractNamingStrategy.js +14 -2
  81. package/naming-strategy/EntityCaseNamingStrategy.d.ts +3 -3
  82. package/naming-strategy/EntityCaseNamingStrategy.js +6 -5
  83. package/naming-strategy/MongoNamingStrategy.d.ts +3 -3
  84. package/naming-strategy/MongoNamingStrategy.js +6 -6
  85. package/naming-strategy/NamingStrategy.d.ts +24 -4
  86. package/naming-strategy/UnderscoreNamingStrategy.d.ts +3 -3
  87. package/naming-strategy/UnderscoreNamingStrategy.js +6 -6
  88. package/not-supported.d.ts +2 -0
  89. package/not-supported.js +4 -0
  90. package/package.json +18 -11
  91. package/platforms/ExceptionConverter.js +1 -1
  92. package/platforms/Platform.d.ts +7 -13
  93. package/platforms/Platform.js +20 -43
  94. package/serialization/EntitySerializer.d.ts +5 -0
  95. package/serialization/EntitySerializer.js +47 -27
  96. package/serialization/EntityTransformer.js +28 -18
  97. package/serialization/SerializationContext.d.ts +6 -6
  98. package/serialization/SerializationContext.js +16 -13
  99. package/types/ArrayType.d.ts +1 -1
  100. package/types/ArrayType.js +2 -3
  101. package/types/BigIntType.d.ts +8 -6
  102. package/types/BigIntType.js +1 -1
  103. package/types/BlobType.d.ts +0 -1
  104. package/types/BlobType.js +0 -3
  105. package/types/BooleanType.d.ts +2 -1
  106. package/types/BooleanType.js +3 -0
  107. package/types/DecimalType.d.ts +6 -4
  108. package/types/DecimalType.js +3 -3
  109. package/types/DoubleType.js +2 -2
  110. package/types/EnumArrayType.js +1 -2
  111. package/types/JsonType.d.ts +1 -1
  112. package/types/JsonType.js +7 -2
  113. package/types/TinyIntType.js +1 -1
  114. package/types/Type.d.ts +2 -4
  115. package/types/Type.js +3 -3
  116. package/types/Uint8ArrayType.d.ts +0 -1
  117. package/types/Uint8ArrayType.js +1 -4
  118. package/types/index.d.ts +1 -1
  119. package/typings.d.ts +290 -137
  120. package/typings.js +59 -44
  121. package/unit-of-work/ChangeSet.d.ts +2 -6
  122. package/unit-of-work/ChangeSet.js +4 -5
  123. package/unit-of-work/ChangeSetComputer.d.ts +1 -3
  124. package/unit-of-work/ChangeSetComputer.js +26 -13
  125. package/unit-of-work/ChangeSetPersister.d.ts +5 -4
  126. package/unit-of-work/ChangeSetPersister.js +70 -34
  127. package/unit-of-work/CommitOrderCalculator.d.ts +12 -10
  128. package/unit-of-work/CommitOrderCalculator.js +13 -13
  129. package/unit-of-work/IdentityMap.d.ts +12 -0
  130. package/unit-of-work/IdentityMap.js +39 -1
  131. package/unit-of-work/UnitOfWork.d.ts +23 -3
  132. package/unit-of-work/UnitOfWork.js +175 -98
  133. package/utils/AbstractSchemaGenerator.d.ts +5 -5
  134. package/utils/AbstractSchemaGenerator.js +18 -16
  135. package/utils/AsyncContext.d.ts +6 -0
  136. package/utils/AsyncContext.js +42 -0
  137. package/utils/Configuration.d.ts +785 -207
  138. package/utils/Configuration.js +147 -190
  139. package/utils/ConfigurationLoader.d.ts +1 -54
  140. package/utils/ConfigurationLoader.js +1 -352
  141. package/utils/Cursor.d.ts +0 -3
  142. package/utils/Cursor.js +27 -11
  143. package/utils/DataloaderUtils.d.ts +15 -5
  144. package/utils/DataloaderUtils.js +64 -30
  145. package/utils/EntityComparator.d.ts +13 -9
  146. package/utils/EntityComparator.js +101 -42
  147. package/utils/QueryHelper.d.ts +14 -6
  148. package/utils/QueryHelper.js +87 -25
  149. package/utils/RawQueryFragment.d.ts +48 -25
  150. package/utils/RawQueryFragment.js +66 -70
  151. package/utils/RequestContext.js +2 -2
  152. package/utils/TransactionContext.js +2 -2
  153. package/utils/TransactionManager.d.ts +65 -0
  154. package/utils/TransactionManager.js +223 -0
  155. package/utils/Utils.d.ts +13 -126
  156. package/utils/Utils.js +100 -391
  157. package/utils/clone.js +8 -23
  158. package/utils/env-vars.d.ts +7 -0
  159. package/utils/env-vars.js +97 -0
  160. package/utils/fs-utils.d.ts +32 -0
  161. package/utils/fs-utils.js +178 -0
  162. package/utils/index.d.ts +2 -1
  163. package/utils/index.js +2 -1
  164. package/utils/upsert-utils.d.ts +9 -4
  165. package/utils/upsert-utils.js +55 -4
  166. package/decorators/Check.d.ts +0 -3
  167. package/decorators/Check.js +0 -13
  168. package/decorators/CreateRequestContext.d.ts +0 -3
  169. package/decorators/CreateRequestContext.js +0 -32
  170. package/decorators/Embeddable.d.ts +0 -8
  171. package/decorators/Embeddable.js +0 -11
  172. package/decorators/Embedded.d.ts +0 -12
  173. package/decorators/Embedded.js +0 -18
  174. package/decorators/Entity.d.ts +0 -18
  175. package/decorators/Entity.js +0 -12
  176. package/decorators/Enum.d.ts +0 -9
  177. package/decorators/Enum.js +0 -16
  178. package/decorators/Filter.d.ts +0 -2
  179. package/decorators/Filter.js +0 -8
  180. package/decorators/Formula.d.ts +0 -4
  181. package/decorators/Formula.js +0 -15
  182. package/decorators/Indexed.d.ts +0 -19
  183. package/decorators/Indexed.js +0 -20
  184. package/decorators/ManyToMany.d.ts +0 -40
  185. package/decorators/ManyToMany.js +0 -14
  186. package/decorators/ManyToOne.d.ts +0 -32
  187. package/decorators/ManyToOne.js +0 -14
  188. package/decorators/OneToMany.d.ts +0 -28
  189. package/decorators/OneToMany.js +0 -17
  190. package/decorators/OneToOne.d.ts +0 -26
  191. package/decorators/OneToOne.js +0 -7
  192. package/decorators/PrimaryKey.d.ts +0 -8
  193. package/decorators/PrimaryKey.js +0 -20
  194. package/decorators/Property.d.ts +0 -250
  195. package/decorators/Property.js +0 -32
  196. package/decorators/Transactional.d.ts +0 -13
  197. package/decorators/Transactional.js +0 -28
  198. package/decorators/hooks.d.ts +0 -16
  199. package/decorators/hooks.js +0 -47
  200. package/decorators/index.d.ts +0 -17
  201. package/decorators/index.js +0 -17
  202. package/entity/ArrayCollection.d.ts +0 -116
  203. package/entity/ArrayCollection.js +0 -402
  204. package/entity/EntityValidator.d.ts +0 -19
  205. package/entity/EntityValidator.js +0 -150
  206. package/exports.d.ts +0 -24
  207. package/exports.js +0 -23
  208. package/metadata/ReflectMetadataProvider.d.ts +0 -8
  209. package/metadata/ReflectMetadataProvider.js +0 -44
  210. package/utils/resolveContextProvider.d.ts +0 -10
  211. package/utils/resolveContextProvider.js +0 -28
package/typings.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Transaction } from './connections/Connection.js';
2
- import { type Cascade, type DeferMode, type EventType, type LoadStrategy, type PopulatePath, type QueryOrderMap, ReferenceKind } from './enums.js';
2
+ import { type Cascade, type DeferMode, type EmbeddedPrefixMode, type EventType, type LoadStrategy, type PopulatePath, type QueryOrderMap, ReferenceKind } from './enums.js';
3
3
  import { type AssignOptions } from './entity/EntityAssigner.js';
4
4
  import { type EntityIdentifier } from './entity/EntityIdentifier.js';
5
5
  import { type EntityLoaderOptions } from './entity/EntityLoader.js';
@@ -7,7 +7,6 @@ import { type Collection } from './entity/Collection.js';
7
7
  import { type EntityFactory } from './entity/EntityFactory.js';
8
8
  import { type EntityRepository } from './entity/EntityRepository.js';
9
9
  import { Reference, type ScalarReference } from './entity/Reference.js';
10
- import type { MikroORM } from './MikroORM.js';
11
10
  import type { SerializationContext } from './serialization/SerializationContext.js';
12
11
  import type { SerializeOptions } from './serialization/EntitySerializer.js';
13
12
  import type { MetadataStorage } from './metadata/MetadataStorage.js';
@@ -15,11 +14,10 @@ import type { EntitySchema } from './metadata/EntitySchema.js';
15
14
  import type { Type, types } from './types/index.js';
16
15
  import type { Platform } from './platforms/Platform.js';
17
16
  import type { Configuration } from './utils/Configuration.js';
18
- import type { RawQueryFragment } from './utils/RawQueryFragment.js';
17
+ import type { Raw } from './utils/RawQueryFragment.js';
19
18
  import type { EntityManager } from './EntityManager.js';
20
- import type { EmbeddedPrefixMode } from './decorators/Embedded.js';
21
19
  import type { EventSubscriber } from './events/EventSubscriber.js';
22
- import type { FindOneOptions, FindOptions, LoadHint } from './drivers/IDatabaseDriver.js';
20
+ import type { FilterOptions, FindOneOptions, FindOptions, LoadHint } from './drivers/IDatabaseDriver.js';
23
21
  export type Constructor<T = unknown> = new (...args: any[]) => T;
24
22
  export type Dictionary<T = any> = {
25
23
  [k: string]: T;
@@ -43,6 +41,60 @@ export type IsAny<T> = 0 extends (1 & T) ? true : false;
43
41
  export type IsNever<T, True = true, False = false> = [T] extends [never] ? True : False;
44
42
  export type MaybePromise<T> = T | Promise<T>;
45
43
  export type NoInfer<T> = [T][T extends any ? 0 : never];
44
+ /**
45
+ * Structural type for matching Collection without triggering full interface evaluation.
46
+ * Using `T extends CollectionShape` instead of `T extends Collection<any, any>` avoids
47
+ * forcing TypeScript to evaluate Collection's 30+ methods, preventing instantiation explosion
48
+ * (~133k → ~2k instantiations).
49
+ *
50
+ * Usage:
51
+ * - Matching only: `T extends CollectionShape`
52
+ * - With inference: `T extends CollectionShape<infer U>`
53
+ */
54
+ type CollectionShape<T = any> = {
55
+ [k: number]: T;
56
+ readonly owner: object;
57
+ };
58
+ /**
59
+ * Structural type for matching LoadedCollection (extends CollectionShape with `$` property).
60
+ *
61
+ * Usage:
62
+ * - Matching only: `T extends LoadedCollectionShape`
63
+ * - With inference: `T extends LoadedCollectionShape<infer U>`
64
+ */
65
+ type LoadedCollectionShape<T = any> = CollectionShape<T> & {
66
+ $: any;
67
+ };
68
+ /**
69
+ * Structural type for matching Reference without triggering full class evaluation.
70
+ * Using `T extends ReferenceShape` instead of `T extends Reference<any>` avoids
71
+ * forcing TypeScript to evaluate Reference's methods, preventing instantiation overhead
72
+ * (~800 → ~15 instantiations).
73
+ *
74
+ * Usage:
75
+ * - Matching only: `T extends ReferenceShape`
76
+ * - With inference: `T extends ReferenceShape<infer U>`
77
+ */
78
+ type ReferenceShape<T = any> = {
79
+ unwrap(): T;
80
+ };
81
+ /**
82
+ * Structural type for matching LoadedReference (Reference with `$` property).
83
+ */
84
+ type LoadedReferenceShape<T = any> = ReferenceShape<T> & {
85
+ $: T;
86
+ };
87
+ /**
88
+ * Structural type for matching any loadable relation (Collection, Reference, or array).
89
+ * Using this instead of `Loadable<any>` in conditional type checks prevents
90
+ * TypeScript from evaluating the full Collection/Reference interfaces.
91
+ */
92
+ type LoadableShape = CollectionShape | ReferenceShape | readonly any[];
93
+ export type UnionKeys<T> = T extends any ? keyof T : never;
94
+ export type UnionPropertyType<T, K extends PropertyKey> = T extends any ? K extends keyof T ? T[K] : never : never;
95
+ export type MergeUnion<T> = [T] extends [object] ? T extends Scalar ? T : {
96
+ [K in UnionKeys<T>]: UnionPropertyType<T, K>;
97
+ } : T;
46
98
  export type DeepPartial<T> = T & {
47
99
  [P in keyof T]?: T[P] extends (infer U)[] ? DeepPartial<U>[] : T[P] extends Readonly<infer U>[] ? Readonly<DeepPartial<U>>[] : DeepPartial<T[P]>;
48
100
  };
@@ -52,36 +104,63 @@ export declare const OptionalProps: unique symbol;
52
104
  export declare const EagerProps: unique symbol;
53
105
  export declare const HiddenProps: unique symbol;
54
106
  export declare const Config: unique symbol;
55
- declare const __optional: unique symbol;
56
- declare const __hidden: unique symbol;
57
- declare const __config: unique symbol;
58
- export type Opt<T = unknown> = T & {
59
- [__optional]?: 1;
60
- };
61
- export type Hidden<T = unknown> = T & {
62
- [__hidden]?: 1;
63
- };
64
- export type DefineConfig<T extends TypeConfig> = T & {
65
- [__config]?: 1;
66
- };
107
+ export type Opt<T = unknown> = T & Opt.Brand;
108
+ export declare namespace Opt {
109
+ const __optional: unique symbol;
110
+ interface Brand {
111
+ [__optional]?: 1;
112
+ }
113
+ }
114
+ export type RequiredNullable<T = never> = (T & RequiredNullable.Brand) | null;
115
+ export declare namespace RequiredNullable {
116
+ const __requiredNullable: unique symbol;
117
+ interface Brand {
118
+ [__requiredNullable]?: 1;
119
+ }
120
+ }
121
+ export type Hidden<T = unknown> = T & Hidden.Brand;
122
+ export declare namespace Hidden {
123
+ const __hidden: unique symbol;
124
+ interface Brand {
125
+ [__hidden]?: 1;
126
+ }
127
+ }
128
+ export type DefineConfig<T extends TypeConfig> = T & DefineConfig.Brand;
129
+ export declare namespace DefineConfig {
130
+ const __config: unique symbol;
131
+ interface Brand {
132
+ [__config]?: 1;
133
+ }
134
+ }
67
135
  export type CleanTypeConfig<T> = Compute<Pick<T, Extract<keyof T, keyof TypeConfig>>>;
68
136
  export interface TypeConfig {
69
137
  forceObject?: boolean;
70
138
  }
71
- export type UnwrapPrimary<T> = T extends Scalar ? T : T extends Reference<infer U> ? Primary<U> : Primary<T>;
139
+ declare const __selectedType: unique symbol;
140
+ declare const __loadedType: unique symbol;
141
+ declare const __loadHint: unique symbol;
142
+ /**
143
+ * Expands a populate hint into all its prefixes.
144
+ * e.g., Prefixes<'a.b.c'> = 'a' | 'a.b' | 'a.b.c'
145
+ * This reflects that loading 'a.b.c' means 'a' and 'a.b' are also loaded.
146
+ * Special case: '*' returns string to ensure Loaded<T, '*'> is assignable to any Loaded<T, Hint>.
147
+ */
148
+ type Prefixes<S extends string> = S extends '*' ? string : S extends `${infer H}.${infer T}` ? H | `${H}.${Prefixes<T>}` : S;
149
+ export type UnwrapPrimary<T> = T extends Scalar ? T : T extends ReferenceShape<infer U> ? Primary<U> : Primary<T>;
72
150
  type PrimaryPropToType<T, Keys extends (keyof T)[]> = {
73
151
  [Index in keyof Keys]: UnwrapPrimary<T[Keys[Index]]>;
74
152
  };
75
153
  type ReadonlyPrimary<T> = T extends any[] ? Readonly<T> : T;
76
154
  export type Primary<T> = IsAny<T> extends true ? any : T extends {
77
155
  [PrimaryKeyProp]?: infer PK;
78
- } ? (PK extends keyof T ? ReadonlyPrimary<UnwrapPrimary<T[PK]>> : (PK extends (keyof T)[] ? ReadonlyPrimary<PrimaryPropToType<T, PK>> : PK)) : T extends {
156
+ } ? PK extends undefined ? Omit<T, typeof PrimaryKeyProp> : PK extends keyof T ? ReadonlyPrimary<UnwrapPrimary<T[PK]>> : PK extends (keyof T)[] ? ReadonlyPrimary<PrimaryPropToType<T, PK>> : PK : T extends {
79
157
  _id?: infer PK;
80
158
  } ? ReadonlyPrimary<PK> | string : T extends {
81
- uuid?: infer PK;
82
- } ? ReadonlyPrimary<PK> : T extends {
83
159
  id?: infer PK;
160
+ } ? ReadonlyPrimary<PK> : T extends {
161
+ uuid?: infer PK;
84
162
  } ? ReadonlyPrimary<PK> : T;
163
+ /** @internal */
85
164
  export type PrimaryProperty<T> = T extends {
86
165
  [PrimaryKeyProp]?: infer PK;
87
166
  } ? (PK extends keyof T ? PK : (PK extends any[] ? PK[number] : never)) : T extends {
@@ -89,10 +168,10 @@ export type PrimaryProperty<T> = T extends {
89
168
  } ? (T extends {
90
169
  id?: any;
91
170
  } ? 'id' | '_id' : '_id') : T extends {
92
- uuid?: any;
93
- } ? 'uuid' : T extends {
94
171
  id?: any;
95
- } ? 'id' : never;
172
+ } ? 'id' : T extends {
173
+ uuid?: any;
174
+ } ? 'uuid' : never;
96
175
  export type IPrimaryKeyValue = number | string | bigint | Date | {
97
176
  toHexString(): string;
98
177
  };
@@ -100,6 +179,7 @@ export type IPrimaryKey<T extends IPrimaryKeyValue = IPrimaryKeyValue> = T;
100
179
  export type Scalar = boolean | number | string | bigint | symbol | Date | RegExp | Uint8Array | {
101
180
  toHexString(): string;
102
181
  };
182
+ type Primitive = boolean | number | string | bigint | symbol;
103
183
  export type ExpandScalar<T> = null | (T extends string ? T | RegExp : T extends Date ? Date | string : T extends bigint ? bigint | string | number : T);
104
184
  export type OperatorMap<T> = {
105
185
  $and?: ExpandQuery<T>[];
@@ -112,6 +192,14 @@ export type OperatorMap<T> = {
112
192
  $none?: ExpandQuery<T>;
113
193
  $some?: ExpandQuery<T>;
114
194
  $every?: ExpandQuery<T>;
195
+ $size?: number | {
196
+ $eq?: number;
197
+ $ne?: number;
198
+ $gt?: number;
199
+ $gte?: number;
200
+ $lt?: number;
201
+ $lte?: number;
202
+ };
115
203
  $gt?: ExpandScalar<T>;
116
204
  $gte?: ExpandScalar<T>;
117
205
  $lt?: ExpandScalar<T>;
@@ -130,10 +218,11 @@ export type OperatorMap<T> = {
130
218
  };
131
219
  export type FilterItemValue<T> = T | ExpandScalar<T> | Primary<T>;
132
220
  export type FilterValue<T> = OperatorMap<FilterItemValue<T>> | FilterItemValue<T> | FilterItemValue<T>[] | null;
221
+ type FilterObjectProp<T, K extends PropertyKey> = K extends keyof MergeUnion<T> ? MergeUnion<T>[K] : K extends keyof T ? T[K] : never;
222
+ type ExpandQueryMerged<T> = [T] extends [object] ? [T] extends [Scalar] ? never : FilterQuery<MergeUnion<T>> : FilterValue<T>;
133
223
  export type FilterObject<T> = {
134
- -readonly [K in EntityKey<T>]?: ExpandQuery<ExpandProperty<T[K]>> | FilterValue<ExpandProperty<T[K]>> | null;
224
+ -readonly [K in EntityKey<T>]?: ExpandQuery<ExpandProperty<FilterObjectProp<T, K>>> | ExpandQueryMerged<ExpandProperty<FilterObjectProp<T, K>>> | FilterValue<ExpandProperty<FilterObjectProp<T, K>>> | null;
135
225
  };
136
- export type ExpandObject<T> = T extends object ? T extends Scalar ? never : FilterObject<T> : never;
137
226
  export type ExpandQuery<T> = T extends object ? T extends Scalar ? never : FilterQuery<T> : FilterValue<T>;
138
227
  export type EntityProps<T> = {
139
228
  -readonly [K in EntityKey<T>]?: T[K];
@@ -143,10 +232,9 @@ export type FilterQuery<T> = ObjectQuery<T> | NonNullable<ExpandScalar<Primary<T
143
232
  export type QBFilterQuery<T = any> = ObjectQuery<T> | Dictionary;
144
233
  export interface IWrappedEntity<Entity extends object> {
145
234
  isInitialized(): boolean;
146
- isTouched(): boolean;
147
235
  isManaged(): boolean;
148
236
  populated(populated?: boolean): void;
149
- populate<Hint extends string = never>(populate: AutoPath<Entity, Hint>[] | false, options?: EntityLoaderOptions<Entity>): Promise<Loaded<Entity, Hint>>;
237
+ populate<Hint extends string = never>(populate: readonly AutoPath<Entity, Hint, PopulatePath.ALL>[] | false, options?: EntityLoaderOptions<Entity>): Promise<Loaded<Entity, Hint>>;
150
238
  init<Hint extends string = never, Fields extends string = '*', Exclude extends string = never>(options?: FindOneOptions<Entity, Hint, Fields, Exclude>): Promise<Loaded<Entity, Hint, Fields, Exclude> | null>;
151
239
  toReference(): Ref<Entity> & LoadedReference<Loaded<Entity, AddEager<Entity>>>;
152
240
  toObject(): EntityDTO<Entity>;
@@ -174,7 +262,6 @@ export interface IWrappedEntityInternal<Entity extends object> extends IWrappedE
174
262
  __factory: EntityFactory;
175
263
  __hydrator: IHydrator;
176
264
  __initialized: boolean;
177
- __touched: boolean;
178
265
  __originalEntityData?: EntityData<Entity>;
179
266
  __loadedProperties: Set<string>;
180
267
  __identifier?: EntityIdentifier | EntityIdentifier[];
@@ -194,16 +281,10 @@ export interface IWrappedEntityInternal<Entity extends object> extends IWrappedE
194
281
  };
195
282
  }
196
283
  export type AnyEntity<T = any> = Partial<T>;
197
- export type EntityClass<T> = Function & {
284
+ export type EntityClass<T = any> = Function & {
198
285
  prototype: T;
199
286
  };
200
- export type EntityClassGroup<T> = {
201
- entity: EntityClass<T>;
202
- schema: EntityMetadata<T> | EntitySchema<T>;
203
- };
204
- export type EntityName<T> = string | EntityClass<T> | EntitySchema<T, any> | {
205
- name: string;
206
- };
287
+ export type EntityName<T = any> = EntityClass<T> | EntityCtor<T> | EntitySchema<T, any>;
207
288
  export type GetRepository<Entity extends {
208
289
  [k: PropertyKey]: any;
209
290
  }, Fallback> = Entity[typeof EntityRepositoryType] extends EntityRepository<any> | undefined ? NonNullable<Entity[typeof EntityRepositoryType]> : Fallback;
@@ -223,11 +304,11 @@ type NonArrayObject = object & {
223
304
  export type EntityDataProp<T, C extends boolean> = T extends Date ? string | Date : T extends Scalar ? T : T extends {
224
305
  __runtime?: infer Runtime;
225
306
  __raw?: infer Raw;
226
- } ? (C extends true ? Raw : Runtime) : T extends Reference<infer U> ? EntityDataNested<U, C> : T extends ScalarReference<infer U> ? EntityDataProp<U, C> : T extends Collection<infer U, any> ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[] : U[] | EntityDataNested<U, C>[] : EntityDataNested<T, C>;
227
- export type RequiredEntityDataProp<T, O, C extends boolean> = T extends Date ? string | Date : T extends Scalar ? T : T extends {
307
+ } ? (C extends true ? Raw : Runtime) : T extends ReferenceShape<infer U> ? EntityDataNested<U, C> : T extends ScalarReference<infer U> ? EntityDataProp<U, C> : T extends CollectionShape<infer U> ? U | U[] | EntityDataNested<U & object, C> | EntityDataNested<U & object, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[] : U[] | EntityDataNested<U, C>[] : EntityDataNested<T, C>;
308
+ export type RequiredEntityDataProp<T, O, C extends boolean> = T extends Date ? string | Date : Exclude<T, null> extends RequiredNullable.Brand ? T | null : T extends Scalar ? T : T extends {
228
309
  __runtime?: infer Runtime;
229
310
  __raw?: infer Raw;
230
- } ? (C extends true ? Raw : Runtime) : T extends Reference<infer U> ? RequiredEntityDataNested<U, O, C> : T extends ScalarReference<infer U> ? RequiredEntityDataProp<U, O, C> : T extends Collection<infer U, any> ? U | U[] | RequiredEntityDataNested<U, O, C> | RequiredEntityDataNested<U, O, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | RequiredEntityDataNested<U, O, C> | RequiredEntityDataNested<U, O, C>[] : U[] | RequiredEntityDataNested<U, O, C>[] : RequiredEntityDataNested<T, O, C>;
311
+ } ? (C extends true ? Raw : Runtime) : T extends ReferenceShape<infer U> ? RequiredEntityDataNested<U, O, C> : T extends ScalarReference<infer U> ? RequiredEntityDataProp<U, O, C> : T extends CollectionShape<infer U> ? U | U[] | RequiredEntityDataNested<U & object, O, C> | RequiredEntityDataNested<U & object, O, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | RequiredEntityDataNested<U, O, C> | RequiredEntityDataNested<U, O, C>[] : U[] | RequiredEntityDataNested<U, O, C>[] : RequiredEntityDataNested<T, O, C>;
231
312
  export type EntityDataNested<T, C extends boolean = false> = T extends undefined ? never : T extends any[] ? Readonly<T> : EntityData<T, C> | ExpandEntityProp<T, C>;
232
313
  type EntityDataItem<T, C extends boolean> = C extends false ? T | EntityDataProp<T, C> | null : EntityDataProp<T, C> | null;
233
314
  export type RequiredEntityDataNested<T, O, C extends boolean> = T extends any[] ? Readonly<T> : RequiredEntityData<T, O> | ExpandRequiredEntityProp<T, O, C>;
@@ -239,8 +320,11 @@ type ExplicitlyOptionalProps<T> = (T extends {
239
320
  type NullableKeys<T, V = null> = {
240
321
  [K in keyof T]: V extends T[K] ? K : never;
241
322
  }[keyof T];
242
- type ProbablyOptionalProps<T> = PrimaryProperty<T> | ExplicitlyOptionalProps<T> | NonNullable<NullableKeys<T, null | undefined>>;
243
- type IsOptional<T, K extends keyof T, I> = T[K] extends Collection<any, any> ? true : ExtractType<T[K]> extends I ? true : K extends ProbablyOptionalProps<T> ? true : false;
323
+ type RequiredNullableKeys<T> = {
324
+ [K in keyof T]: Exclude<T[K], null> extends RequiredNullable.Brand ? K : never;
325
+ }[keyof T];
326
+ type ProbablyOptionalProps<T> = PrimaryProperty<T> | ExplicitlyOptionalProps<T> | Exclude<NonNullable<NullableKeys<T, null | undefined>>, RequiredNullableKeys<T>>;
327
+ type IsOptional<T, K extends keyof T, I> = T[K] extends CollectionShape ? true : ExtractType<T[K]> extends I ? true : K extends ProbablyOptionalProps<T> ? true : false;
244
328
  type RequiredKeys<T, K extends keyof T, I> = IsOptional<T, K, I> extends false ? CleanKeys<T, K> : never;
245
329
  type OptionalKeys<T, K extends keyof T, I> = IsOptional<T, K, I> extends false ? never : CleanKeys<T, K>;
246
330
  export type EntityData<T, C extends boolean = false> = {
@@ -274,7 +358,7 @@ export type Ref<T> = T extends any ? IsAny<T> extends true ? Reference<T & objec
274
358
  type ExtractHiddenProps<T> = (T extends {
275
359
  [HiddenProps]?: infer K;
276
360
  } ? K : never) | ({
277
- [K in keyof T]: T[K] extends Hidden ? K : never;
361
+ [K in keyof T]: T[K] extends Primitive ? (T[K] extends Hidden ? K : never) : never;
278
362
  }[keyof T] & {});
279
363
  type ExcludeHidden<T, K extends keyof T> = K extends ExtractHiddenProps<T> ? never : K;
280
364
  type ExtractConfig<T> = T extends {
@@ -286,9 +370,12 @@ type PrimaryOrObject<T, U, C extends TypeConfig> = PreferExplicitConfig<C, Extra
286
370
  } : Primary<U>;
287
371
  export type EntityDTOProp<E, T, C extends TypeConfig = never> = T extends Scalar ? T : T extends {
288
372
  __serialized?: infer U;
289
- } ? (IsUnknown<U> extends false ? U : T) : T extends LoadedReference<infer U> ? EntityDTO<U, C> : T extends Reference<infer U> ? PrimaryOrObject<E, U, C> : T extends ScalarReference<infer U> ? U : T extends LoadedCollection<infer U> ? EntityDTO<U, C>[] : T extends Collection<infer U> ? PrimaryOrObject<E, U, C>[] : T extends readonly (infer U)[] ? (T extends readonly any[] ? T : U[]) : T extends Relation<T> ? EntityDTO<T, C> : T;
290
- type DTOProbablyOptionalProps<T> = NonNullable<NullableKeys<T, undefined>>;
291
- type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollection<any> ? false : K extends PrimaryProperty<T> ? false : K extends DTOProbablyOptionalProps<T> ? true : false;
373
+ } ? (IsUnknown<U> extends false ? U : T) : T extends LoadedReferenceShape<infer U> ? EntityDTO<U, C> : T extends ReferenceShape<infer U> ? PrimaryOrObject<E, U, C> : T extends ScalarReference<infer U> ? U : T extends LoadedCollectionShape<infer U> ? EntityDTO<U & object, C>[] : T extends CollectionShape<infer U> ? PrimaryOrObject<E, U & object, C>[] : T extends readonly (infer U)[] ? U extends Scalar ? T : EntityDTOProp<E, U, C>[] : T extends Relation<T> ? EntityDTO<T, C> : T;
374
+ type UnwrapLoadedEntity<T> = T extends {
375
+ [__loadedType]?: infer U;
376
+ } ? NonNullable<U> : T;
377
+ type DTOProbablyOptionalProps<T> = NonNullable<NullableKeys<UnwrapLoadedEntity<T>, undefined>>;
378
+ type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollectionShape ? false : K extends PrimaryProperty<UnwrapLoadedEntity<T>> ? false : K extends DTOProbablyOptionalProps<T> ? true : false;
292
379
  type DTORequiredKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? ExcludeHidden<T, K> & CleanKeys<T, K> : never;
293
380
  type DTOOptionalKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? never : ExcludeHidden<T, K> & CleanKeys<T, K>;
294
381
  export type EntityDTO<T, C extends TypeConfig = never> = {
@@ -297,8 +384,22 @@ export type EntityDTO<T, C extends TypeConfig = never> = {
297
384
  [K in keyof T as DTOOptionalKeys<T, K>]?: EntityDTOProp<T, T[K], C> | AddOptional<T[K]>;
298
385
  };
299
386
  type TargetKeys<T> = T extends EntityClass<infer P> ? keyof P : keyof T;
300
- type CheckKey<T> = IsUnknown<T> extends false ? TargetKeys<T> : string;
301
- export type CheckCallback<T> = (columns: Record<CheckKey<T>, string>) => string;
387
+ type PropertyName<T> = IsUnknown<T> extends false ? TargetKeys<T> : string;
388
+ type TableName = {
389
+ name: string;
390
+ schema?: string;
391
+ toString: () => string;
392
+ };
393
+ export type FormulaTable = {
394
+ alias: string;
395
+ name: string;
396
+ schema?: string;
397
+ qualifiedName: string;
398
+ toString: () => string;
399
+ };
400
+ export type IndexCallback<T> = (table: TableName, columns: Record<PropertyName<T>, string>, indexName: string) => string | Raw;
401
+ export type FormulaCallback<T> = (table: FormulaTable, columns: Record<PropertyName<T>, string>) => string;
402
+ export type CheckCallback<T> = (columns: Record<PropertyName<T>, string>) => string;
302
403
  export type GeneratedColumnCallback<T> = (columns: Record<keyof T, string>) => string;
303
404
  export interface CheckConstraint<T = any> {
304
405
  name?: string;
@@ -309,6 +410,7 @@ export type AnyString = string & {};
309
410
  export interface EntityProperty<Owner = any, Target = any> {
310
411
  name: EntityKey<Owner>;
311
412
  entity: () => EntityName<Owner>;
413
+ target: EntityClass<Target>;
312
414
  type: keyof typeof types | AnyString;
313
415
  runtimeType: 'number' | 'string' | 'boolean' | 'bigint' | 'Buffer' | 'Date' | 'object' | 'any' | AnyString;
314
416
  targetMeta?: EntityMetadata<Target>;
@@ -334,7 +436,8 @@ export interface EntityProperty<Owner = any, Target = any> {
334
436
  fieldNameRaw?: string;
335
437
  default?: string | number | boolean | null;
336
438
  defaultRaw?: string;
337
- formula?: (alias: string) => string;
439
+ formula?: FormulaCallback<Owner>;
440
+ filters?: FilterOptions;
338
441
  prefix?: string | boolean;
339
442
  prefixMode?: EmbeddedPrefixMode;
340
443
  embedded?: [EntityKey<Owner>, EntityKey<Owner>];
@@ -347,11 +450,13 @@ export interface EntityProperty<Owner = any, Target = any> {
347
450
  unique?: boolean | string;
348
451
  nullable?: boolean;
349
452
  inherited?: boolean;
453
+ renamedFrom?: string;
454
+ stiFieldNames?: string[];
455
+ stiFieldNameMap?: Dictionary<string>;
350
456
  unsigned?: boolean;
351
457
  mapToPk?: boolean;
352
458
  persist?: boolean;
353
459
  hydrate?: boolean;
354
- trackChanges?: boolean;
355
460
  hidden?: boolean;
356
461
  enum?: boolean;
357
462
  items?: (number | string)[];
@@ -362,6 +467,7 @@ export interface EntityProperty<Owner = any, Target = any> {
362
467
  setter?: boolean;
363
468
  getter?: boolean;
364
469
  getterName?: keyof Owner;
470
+ accessor?: EntityKey<Owner>;
365
471
  cascade: Cascade[];
366
472
  orphanRemoval?: boolean;
367
473
  onCreate?: (entity: Owner, em: EntityManager) => any;
@@ -378,13 +484,14 @@ export interface EntityProperty<Owner = any, Target = any> {
378
484
  fixedOrder?: boolean;
379
485
  fixedOrderColumn?: string;
380
486
  pivotTable: string;
381
- pivotEntity: string;
487
+ pivotEntity: EntityClass<Target>;
382
488
  joinColumns: string[];
383
489
  ownColumns: string[];
384
490
  inverseJoinColumns: string[];
385
491
  referencedColumnNames: string[];
386
492
  referencedTableName: string;
387
493
  referencedPKs: EntityKey<Owner>[];
494
+ targetKey?: string;
388
495
  serializer?: (value: any, options?: SerializeOptions<any>) => any;
389
496
  serializedName?: string;
390
497
  comment?: string;
@@ -394,19 +501,22 @@ export interface EntityProperty<Owner = any, Target = any> {
394
501
  optional?: boolean;
395
502
  ignoreSchemaChanges?: ('type' | 'extra' | 'default')[];
396
503
  deferMode?: DeferMode;
504
+ createForeignKeyConstraint: boolean;
397
505
  foreignKeyName?: string;
398
506
  }
399
- export declare class EntityMetadata<T = any> {
507
+ export declare class EntityMetadata<Entity = any, Class extends EntityCtor<Entity> = EntityCtor<Entity>> {
400
508
  private static counter;
401
509
  readonly _id: number;
402
510
  readonly propertyOrder: Map<string, number>;
403
511
  constructor(meta?: Partial<EntityMetadata>);
404
- addProperty(prop: Partial<EntityProperty<T>>, sync?: boolean): void;
512
+ addProperty(prop: Partial<EntityProperty<Entity>>): void;
405
513
  removeProperty(name: string, sync?: boolean): void;
406
- getPrimaryProps(): EntityProperty<T>[];
407
- getPrimaryProp(): EntityProperty<T>;
514
+ getPrimaryProps(flatten?: boolean): EntityProperty<Entity>[];
515
+ getPrimaryProp(): EntityProperty<Entity>;
516
+ createColumnMappingObject(): Record<PropertyName<Entity>, string>;
408
517
  get tableName(): string;
409
518
  set tableName(name: string);
519
+ get uniqueName(): string;
410
520
  sync(initIndexes?: boolean, config?: Configuration): void;
411
521
  private initIndexes;
412
522
  /** @internal */
@@ -416,67 +526,74 @@ export interface SimpleColumnMeta {
416
526
  name: string;
417
527
  type: string;
418
528
  }
419
- export interface EntityMetadata<T = any> {
529
+ export type EntityCtor<T = any> = abstract new (...args: any[]) => T;
530
+ export interface EntityMetadata<Entity = any, Class extends EntityCtor<Entity> = EntityCtor<Entity>> {
420
531
  name?: string;
421
532
  className: string;
422
533
  tableName: string;
423
534
  schema?: string;
424
535
  pivotTable?: boolean;
425
536
  virtual?: boolean;
426
- expression?: string | ((em: any, where: ObjectQuery<T>, options: FindOptions<T, any, any, any>) => MaybePromise<RawQueryFragment | object | string>);
427
- discriminatorColumn?: EntityKey<T> | AnyString;
537
+ /** True if this entity represents a database view (not a virtual entity). */
538
+ view?: boolean;
539
+ /** True if this is a materialized view (PostgreSQL only). Requires `view: true`. */
540
+ materialized?: boolean;
541
+ /** For materialized views, whether data is populated on creation. Defaults to true. */
542
+ withData?: boolean;
543
+ expression?: string | ((em: any, where: ObjectQuery<Entity>, options: FindOptions<Entity, any, any, any>, stream?: boolean) => MaybePromise<Raw | object | string>);
544
+ discriminatorColumn?: EntityKey<Entity> | AnyString;
428
545
  discriminatorValue?: number | string;
429
- discriminatorMap?: Dictionary<string>;
546
+ discriminatorMap?: Dictionary<EntityClass>;
430
547
  embeddable: boolean;
431
- constructorParams: EntityKey<T>[];
548
+ constructorParams?: (keyof Entity)[];
432
549
  forceConstructor: boolean;
433
- toJsonParams: string[];
434
- extends: string;
550
+ extends?: EntityName<Entity>;
435
551
  collection: string;
436
552
  path: string;
437
- primaryKeys: EntityKey<T>[];
553
+ primaryKeys: EntityKey<Entity>[];
438
554
  simplePK: boolean;
439
555
  compositePK: boolean;
440
- versionProperty: EntityKey<T>;
441
- concurrencyCheckKeys: Set<EntityKey<T>>;
442
- serializedPrimaryKey: EntityKey<T>;
556
+ versionProperty: EntityKey<Entity>;
557
+ concurrencyCheckKeys: Set<EntityKey<Entity>>;
558
+ serializedPrimaryKey?: EntityKey<Entity>;
443
559
  properties: {
444
- [K in EntityKey<T>]: EntityProperty<T>;
560
+ [K in EntityKey<Entity>]: EntityProperty<Entity>;
445
561
  };
446
- props: EntityProperty<T>[];
447
- relations: EntityProperty<T>[];
448
- bidirectionalRelations: EntityProperty<T>[];
562
+ props: EntityProperty<Entity>[];
563
+ relations: EntityProperty<Entity>[];
564
+ bidirectionalRelations: EntityProperty<Entity>[];
449
565
  referencingProperties: {
450
- meta: EntityMetadata<T>;
451
- prop: EntityProperty<T>;
566
+ meta: EntityMetadata<Entity>;
567
+ prop: EntityProperty<Entity>;
452
568
  }[];
453
- comparableProps: EntityProperty<T>[];
454
- trackingProps: EntityProperty<T>[];
455
- hydrateProps: EntityProperty<T>[];
456
- uniqueProps: EntityProperty<T>[];
457
- getterProps: EntityProperty<T>[];
569
+ comparableProps: EntityProperty<Entity>[];
570
+ trackingProps: EntityProperty<Entity>[];
571
+ hydrateProps: EntityProperty<Entity>[];
572
+ validateProps: EntityProperty<Entity>[];
573
+ uniqueProps: EntityProperty<Entity>[];
574
+ getterProps: EntityProperty<Entity>[];
458
575
  indexes: {
459
- properties: EntityKey<T> | EntityKey<T>[];
576
+ properties?: EntityKey<Entity> | EntityKey<Entity>[];
460
577
  name?: string;
461
578
  type?: string;
462
579
  options?: Dictionary;
463
- expression?: string;
580
+ expression?: string | IndexCallback<Entity>;
464
581
  }[];
465
582
  uniques: {
466
- properties: EntityKey<T> | EntityKey<T>[];
583
+ properties?: EntityKey<Entity> | EntityKey<Entity>[];
467
584
  name?: string;
468
585
  options?: Dictionary;
469
- expression?: string;
470
- deferMode?: DeferMode;
586
+ expression?: string | IndexCallback<Entity>;
587
+ deferMode?: DeferMode | `${DeferMode}`;
471
588
  }[];
472
- checks: CheckConstraint<T>[];
589
+ checks: CheckConstraint<Entity>[];
473
590
  repositoryClass?: string;
474
591
  repository: () => EntityClass<EntityRepository<any>>;
475
592
  hooks: {
476
- [K in EventType]?: (keyof T | EventSubscriber<T>[EventType])[];
593
+ [K in EventType]?: (keyof Entity | EventSubscriber<Entity>[EventType])[];
477
594
  };
478
- prototype: T;
479
- class: EntityClass<T>;
595
+ prototype: Entity;
596
+ class: Class;
480
597
  abstract: boolean;
481
598
  filters: Dictionary<FilterDef>;
482
599
  comment?: string;
@@ -484,8 +601,9 @@ export interface EntityMetadata<T = any> {
484
601
  hasUniqueProps?: boolean;
485
602
  readonly?: boolean;
486
603
  polymorphs?: EntityMetadata[];
487
- root: EntityMetadata<T>;
604
+ root: EntityMetadata<Entity>;
488
605
  definedProperties: Dictionary;
606
+ hasTriggers?: boolean;
489
607
  /** @internal can be used for computed numeric cache keys */
490
608
  readonly _id: number;
491
609
  }
@@ -496,6 +614,7 @@ export interface CreateSchemaOptions {
496
614
  export interface ClearDatabaseOptions {
497
615
  schema?: string;
498
616
  truncate?: boolean;
617
+ clearIdentityMap?: boolean;
499
618
  }
500
619
  export interface EnsureDatabaseOptions extends CreateSchemaOptions, ClearDatabaseOptions {
501
620
  clear?: boolean;
@@ -523,25 +642,25 @@ export interface RefreshDatabaseOptions extends CreateSchemaOptions {
523
642
  createSchema?: boolean;
524
643
  }
525
644
  export interface ISchemaGenerator {
526
- createSchema(options?: CreateSchemaOptions): Promise<void>;
527
- ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
645
+ create(options?: CreateSchemaOptions): Promise<void>;
646
+ update(options?: UpdateSchemaOptions): Promise<void>;
647
+ drop(options?: DropSchemaOptions): Promise<void>;
648
+ refresh(options?: RefreshDatabaseOptions): Promise<void>;
649
+ clear(options?: ClearDatabaseOptions): Promise<void>;
650
+ execute(sql: string, options?: {
651
+ wrap?: boolean;
652
+ }): Promise<void>;
528
653
  getCreateSchemaSQL(options?: CreateSchemaOptions): Promise<string>;
529
- dropSchema(options?: DropSchemaOptions): Promise<void>;
530
654
  getDropSchemaSQL(options?: Omit<DropSchemaOptions, 'dropDb'>): Promise<string>;
531
- updateSchema(options?: UpdateSchemaOptions): Promise<void>;
532
655
  getUpdateSchemaSQL(options?: UpdateSchemaOptions): Promise<string>;
533
656
  getUpdateSchemaMigrationSQL(options?: UpdateSchemaOptions): Promise<{
534
657
  up: string;
535
658
  down: string;
536
659
  }>;
660
+ ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
537
661
  createDatabase(name?: string): Promise<void>;
538
662
  dropDatabase(name?: string): Promise<void>;
539
- execute(sql: string, options?: {
540
- wrap?: boolean;
541
- }): Promise<void>;
542
663
  ensureIndexes(): Promise<void>;
543
- refreshDatabase(options?: RefreshDatabaseOptions): Promise<void>;
544
- clearDatabase(options?: ClearDatabaseOptions): Promise<void>;
545
664
  }
546
665
  export type ImportsResolver = (alias: string, basePath: string, extension: '.js' | '', originFileName: string) => {
547
666
  path: string;
@@ -558,7 +677,10 @@ export interface GenerateOptions {
558
677
  undefinedDefaults?: boolean;
559
678
  bidirectionalRelations?: boolean;
560
679
  identifiedReferences?: boolean;
561
- entitySchema?: boolean;
680
+ entityDefinition?: 'decorators' | 'defineEntity' | 'entitySchema';
681
+ decorators?: 'es' | 'legacy';
682
+ inferEntityType?: boolean;
683
+ enumMode?: 'ts-enum' | 'union-type' | 'dictionary';
562
684
  esmImport?: boolean;
563
685
  scalarTypeInDecorator?: boolean;
564
686
  scalarPropertiesForRelations?: 'always' | 'never' | 'smart';
@@ -618,26 +740,26 @@ export interface IMigrator {
618
740
  /**
619
741
  * Checks current schema for changes, generates new migration if there are any.
620
742
  */
621
- createMigration(path?: string, blank?: boolean, initial?: boolean, name?: string): Promise<MigrationResult>;
743
+ create(path?: string, blank?: boolean, initial?: boolean, name?: string): Promise<MigrationResult>;
622
744
  /**
623
745
  * Checks current schema for changes.
624
746
  */
625
- checkMigrationNeeded(): Promise<boolean>;
747
+ checkSchema(): Promise<boolean>;
626
748
  /**
627
749
  * Creates initial migration. This generates the schema based on metadata, and checks whether all the tables
628
750
  * are already present. If yes, it will also automatically log the migration as executed.
629
751
  * Initial migration can be created only if the schema is already aligned with the metadata, or when no schema
630
752
  * is present - in such case regular migration would have the same effect.
631
753
  */
632
- createInitialMigration(path?: string): Promise<MigrationResult>;
754
+ createInitial(path?: string): Promise<MigrationResult>;
633
755
  /**
634
756
  * Returns list of already executed migrations.
635
757
  */
636
- getExecutedMigrations(): Promise<MigrationRow[]>;
758
+ getExecuted(): Promise<MigrationRow[]>;
637
759
  /**
638
760
  * Returns list of pending (not yet executed) migrations found in the migration directory.
639
761
  */
640
- getPendingMigrations(): Promise<UmzugMigration[]>;
762
+ getPending(): Promise<UmzugMigration[]>;
641
763
  /**
642
764
  * Executes specified migrations. Without parameter it will migrate up to the latest version.
643
765
  */
@@ -686,12 +808,17 @@ export interface MigrationObject {
686
808
  name: string;
687
809
  class: Constructor<Migration>;
688
810
  }
689
- export type FilterDef = {
811
+ type EntityFromInput<T> = T extends readonly EntityName<infer U>[] ? U : T extends EntityName<infer U> ? U : never;
812
+ type FilterDefResolved<T extends object = any> = {
690
813
  name: string;
691
- cond: Dictionary | ((args: Dictionary, type: 'read' | 'update' | 'delete', em: any, options?: FindOptions<any, any, any, any> | FindOneOptions<any, any, any, any>, entityName?: EntityName<any>) => Dictionary | Promise<Dictionary>);
814
+ cond: FilterQuery<T> | ((args: Dictionary, type: 'read' | 'update' | 'delete', em: any, options?: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any>, entityName?: string) => MaybePromise<FilterQuery<T>>);
692
815
  default?: boolean;
693
- entity?: string[];
816
+ entity?: EntityName<T> | EntityName<T>[];
694
817
  args?: boolean;
818
+ strict?: boolean;
819
+ };
820
+ export type FilterDef<T extends EntityName | readonly EntityName[] = any> = FilterDefResolved<EntityFromInput<T>> & {
821
+ entity?: T;
695
822
  };
696
823
  export type Populate<T, P extends string = never> = readonly AutoPath<T, P, `${PopulatePath}`>[] | false;
697
824
  export type PopulateOptions<T> = {
@@ -699,40 +826,59 @@ export type PopulateOptions<T> = {
699
826
  strategy?: LoadStrategy;
700
827
  all?: boolean;
701
828
  filter?: boolean;
829
+ joinType?: 'inner join' | 'left join';
702
830
  children?: PopulateOptions<T[keyof T]>[];
831
+ /** When true, ignores `mapToPk` on the property and returns full entity data instead of just PKs. */
832
+ dataOnly?: boolean;
703
833
  };
704
- type Loadable<T extends object> = Collection<T, any> | Reference<T> | Ref<T> | readonly T[];
705
- type ExtractType<T> = T extends Loadable<infer U> ? U : T;
834
+ type ExtractType<T> = T extends CollectionShape<infer U> ? U : T extends ReferenceShape<infer U> ? U : T extends Ref<infer U> ? U : T extends readonly (infer U)[] ? U : T;
706
835
  type ExtractStringKeys<T> = {
707
- [K in keyof T]: CleanKeys<T, K>;
836
+ [K in keyof T]-?: CleanKeys<T, K>;
708
837
  }[keyof T] & {};
709
- type StringKeys<T, E extends string = never> = T extends Collection<any, any> ? ExtractStringKeys<ExtractType<T>> | E : T extends Reference<any> ? ExtractStringKeys<ExtractType<T>> | E : T extends object ? ExtractStringKeys<ExtractType<T>> | E : never;
838
+ /**
839
+ * Extracts string keys from an entity type, handling Collection/Reference wrappers.
840
+ * Simplified to just check `T extends object` since ExtractType handles the unwrapping.
841
+ */
842
+ type StringKeys<T, E extends string = never> = T extends object ? ExtractStringKeys<ExtractType<T>> | E : never;
710
843
  type GetStringKey<T, K extends StringKeys<T, string>, E extends string> = K extends keyof T ? ExtractType<T[K]> : (K extends E ? keyof T : never);
711
844
  type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
712
845
  type CollectionKeys<T> = T extends object ? {
713
- [K in keyof T]: T[K] extends Collection<any> ? IsAny<T[K]> extends true ? never : K & string : never;
846
+ [K in keyof T]-?: T[K] extends CollectionShape ? IsAny<T[K]> extends true ? never : K & string : never;
714
847
  }[keyof T] & {} : never;
715
- export type AutoPath<O, P extends string | boolean, E extends string = never, D extends Prev[number] = 9> = P extends boolean ? P : [D] extends [never] ? never : P extends any ? P extends string ? (P & `${string}.` extends never ? P : P & `${string}.`) extends infer Q ? Q extends `${infer A}.${infer B}` ? A extends StringKeys<O, E> ? `${A}.${AutoPath<NonNullable<GetStringKey<O, A, E>>, B, E, Prev[D]>}` : never : Q extends StringKeys<O, E> ? (NonNullable<GetStringKey<O, Q, E>> extends unknown ? Exclude<P, `${string}.`> : never) | (StringKeys<NonNullable<GetStringKey<O, Q, E>>, E> extends never ? never : `${Q & string}.`) : StringKeys<O, E> | `${CollectionKeys<O>}:ref` : never : never : never;
848
+ export type AutoPath<O, P extends string | boolean, E extends string = never, D extends Prev[number] = 9> = P extends boolean ? P : [D] extends [never] ? never : P extends any ? P extends string ? P extends `${infer A}.${infer B}` ? A extends StringKeys<O, E> ? `${A}.${AutoPath<NonNullable<GetStringKey<O, A, E>>, B, E, Prev[D]>}` : never : P extends StringKeys<O, E> ? (NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>> extends unknown ? Exclude<P, `${string}.`> : never) | (StringKeys<NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>>, E> extends never ? never : `${P & string}.`) : StringKeys<O, E> | `${CollectionKeys<O>}:ref` : never : never;
716
849
  export type UnboxArray<T> = T extends any[] ? ArrayElement<T> : T;
717
850
  export type ArrayElement<ArrayType extends unknown[]> = ArrayType extends (infer ElementType)[] ? ElementType : never;
718
- export type ExpandProperty<T> = T extends Reference<infer U> ? NonNullable<U> : T extends Collection<infer U, any> ? NonNullable<U> : T extends (infer U)[] ? NonNullable<U> : NonNullable<T>;
719
- type LoadedLoadable<T, E extends object> = T extends Collection<any, any> ? LoadedCollection<E> : T extends Reference<any> ? T & LoadedReference<E> : T extends ScalarReference<infer U> ? LoadedScalarReference<U> : T extends Scalar | any[] ? T : E;
851
+ export type ExpandProperty<T> = T extends ReferenceShape<infer U> ? NonNullable<U> : T extends CollectionShape<infer U> ? NonNullable<U> : T extends (infer U)[] ? NonNullable<U> : NonNullable<T>;
852
+ type LoadedLoadable<T, E extends object> = T extends CollectionShape ? LoadedCollection<E> : T extends ScalarReference<infer U> ? LoadedScalarReference<U> : T extends ReferenceShape ? T & LoadedReference<E> : T extends Scalar ? T : T extends (infer U)[] ? U extends Scalar ? T : E[] : E;
720
853
  type IsTrue<T> = IsNever<T> extends true ? false : T extends boolean ? T extends true ? true : false : false;
721
854
  type StringLiteral<T> = T extends string ? string extends T ? never : T : never;
722
855
  type Prefix<T, K> = K extends `${infer S}.${string}` ? S : (K extends '*' ? keyof T : K);
723
856
  type IsPrefixedExclude<T, K extends keyof T, E extends string> = K extends E ? never : K;
724
- export type IsPrefixed<T, K extends keyof T, L extends string, E extends string = never> = IsNever<E> extends false ? IsPrefixedExclude<T, K, E> : K extends symbol ? never : IsTrue<L> extends true ? (T[K] & {} extends Loadable<any> ? K : never) : IsNever<StringLiteral<L>> extends true ? never : K extends Prefix<T, L> ? K : K extends PrimaryProperty<T> ? K : never;
857
+ export type IsPrefixed<T, K extends keyof T, L extends string, E extends string = never> = IsNever<E> extends false ? IsPrefixedExclude<T, K, E> : K extends symbol ? never : IsTrue<L> extends true ? (T[K] & {} extends LoadableShape ? K : never) : IsNever<StringLiteral<L>> extends true ? never : L extends '*' ? K : K extends Prefix<T, L> ? K : K extends PrimaryProperty<T> ? K : never;
725
858
  type Suffix<Key, Hint extends string, All = true | '*'> = Hint extends `${infer Pref}.${infer Suf}` ? (Pref extends Key ? Suf : never) : Hint extends All ? Hint : never;
726
- export type IsSubset<T, U> = keyof U extends keyof T ? {} : Dictionary extends U ? {} : {
859
+ export type IsSubset<T, U> = keyof U extends keyof T ? {} : string extends keyof U ? {} : {
727
860
  [K in keyof U as K extends keyof T ? never : CleanKeys<U, K>]: never;
728
861
  };
729
- declare const __selectedType: unique symbol;
730
- declare const __loadedType: unique symbol;
731
- type AnyStringToNever<T> = string extends T ? never : T;
732
- export type MergeSelected<T, U, F extends string> = T extends Loaded<infer TT, infer P, infer FF, infer E> ? IsNever<Exclude<E, F>> extends true ? Loaded<TT, P, AnyStringToNever<F> | AnyStringToNever<FF>> : Loaded<TT, AnyStringToNever<P>, AnyStringToNever<FF>, AnyStringToNever<Exclude<E, F>>> : T;
733
- type MergeFields<F1 extends string, F2 extends string, P1, P2> = P1 | P2 extends '*' ? '*' : F1 | F2;
734
- type MergeExcludes<F extends string, E extends string> = F extends E ? never : Exclude<E, F>;
735
- export type MergeLoaded<T, U, P extends string, F extends string, E extends string, R extends boolean = false> = T extends Loaded<U, infer PP, infer FF, infer EE> ? string extends FF ? Loaded<T, P, F, AnyStringToNever<EE> | E> : string extends P ? Loaded<U, never, F | (FF & string), MergeExcludes<F | (FF & string), EE | E>> : Loaded<U, P | AnyStringToNever<PP>, MergeFields<F, AnyStringToNever<FF>, P, PP>, MergeExcludes<MergeFields<F, AnyStringToNever<FF>, P, PP>, (R extends true ? never : EE) | E>> : Loaded<T, P, F>;
862
+ /**
863
+ * Fast check if T is a Loaded type by looking for the marker symbol.
864
+ * This is much cheaper than matching against the full Loaded structure.
865
+ */
866
+ type IsLoadedType<T> = T extends {
867
+ [__loadedType]?: any;
868
+ } ? true : false;
869
+ /**
870
+ * Optimized MergeSelected using intersection instead of extraction.
871
+ * When T is already Loaded, we intersect with a new Loaded type for the selected fields.
872
+ * This avoids the expensive pattern matching needed to extract hints from Loaded types.
873
+ */
874
+ export type MergeSelected<T, U, F extends string> = IsLoadedType<T> extends true ? T & Loaded<U, never, F, never> : T;
875
+ /**
876
+ * Optimized MergeLoaded using intersection instead of extraction.
877
+ * When T is already Loaded, we intersect with a new Loaded type for the additional hints.
878
+ * This avoids the expensive pattern matching needed to extract hints from Loaded types.
879
+ * Used for `em.populate` and `em.refresh`.
880
+ */
881
+ export type MergeLoaded<T, U, P extends string, F extends string, E extends string, R extends boolean = false> = IsLoadedType<T> extends true ? T & Loaded<U, P, F, E> : Loaded<T, P, F, E>;
736
882
  export type AddOptional<T> = undefined | null extends T ? null | undefined : null extends T ? null : undefined extends T ? undefined : never;
737
883
  type LoadedProp<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedLoadable<T, Loaded<ExtractType<T>, L, F, E>>;
738
884
  export type AddEager<T> = ExtractEagerProps<T> & string;
@@ -760,9 +906,11 @@ type LoadedInternal<T, L extends string = never, F extends string = '*', E exten
760
906
  } : Selected<T, L, F>;
761
907
  /**
762
908
  * Represents entity with its loaded relations (`populate` hint) and selected properties (`fields` hint).
909
+ * The __loadHint marker uses contravariance to ensure Loaded<A, 'b'> is NOT assignable to Loaded<A, 'b.c'>.
763
910
  */
764
911
  export type Loaded<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedInternal<T, L, F, E> & {
765
912
  [__loadedType]?: T;
913
+ [__loadHint]?: (hint: Prefixes<L>) => void;
766
914
  };
767
915
  export interface LoadedReference<T> extends Reference<NonNullable<T>> {
768
916
  $: NonNullable<T>;
@@ -782,23 +930,23 @@ export interface Highlighter {
782
930
  highlight(text: string): string;
783
931
  }
784
932
  export interface IMetadataStorage {
785
- getAll(): Dictionary<EntityMetadata>;
786
- get<T = any>(entity: string, init?: boolean, validate?: boolean): EntityMetadata<T>;
787
- find<T = any>(entity: string): EntityMetadata<T> | undefined;
788
- has(entity: string): boolean;
789
- set(entity: string, meta: EntityMetadata): EntityMetadata;
790
- reset(entity: string): void;
933
+ getAll(): Map<EntityName, EntityMetadata>;
934
+ get<T = any>(entity: EntityName<T>, init?: boolean, validate?: boolean): EntityMetadata<T>;
935
+ find<T = any>(entity: EntityName<T>): EntityMetadata<T> | undefined;
936
+ has<T>(entity: EntityName<T>): boolean;
937
+ set<T>(entity: EntityName<T>, meta: EntityMetadata): EntityMetadata;
938
+ reset<T>(entity: EntityName<T>): void;
791
939
  }
792
940
  export interface IHydrator {
793
941
  /**
794
942
  * Hydrates the whole entity. This process handles custom type conversions, creating missing Collection instances,
795
943
  * mapping FKs to entity instances, as well as merging those entities.
796
944
  */
797
- hydrate<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, type: 'full' | 'reference', newEntity?: boolean, convertCustomTypes?: boolean, schema?: string, parentSchema?: string): void;
945
+ hydrate<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, type: 'full' | 'reference', newEntity?: boolean, convertCustomTypes?: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean): void;
798
946
  /**
799
947
  * Hydrates primary keys only
800
948
  */
801
- hydrateReference<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, convertCustomTypes?: boolean, schema?: string, parentSchema?: string): void;
949
+ hydrateReference<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, convertCustomTypes?: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean): void;
802
950
  isRunning(): boolean;
803
951
  }
804
952
  export interface HydratorConstructor {
@@ -808,17 +956,22 @@ export interface ISeedManager {
808
956
  seed(...classNames: Constructor<Seeder>[]): Promise<void>;
809
957
  /** @internal */
810
958
  seedString(...classNames: string[]): Promise<void>;
811
- createSeeder(className: string): Promise<string>;
959
+ create(className: string): Promise<string>;
812
960
  }
813
961
  export interface Seeder<T extends Dictionary = Dictionary> {
814
962
  run(em: EntityManager, context?: T): void | Promise<void>;
815
963
  }
816
964
  export type ConnectionType = 'read' | 'write';
817
965
  export type MetadataProcessor = (metadata: EntityMetadata[], platform: Platform) => MaybePromise<void>;
818
- /**
819
- * The type of context that the user intends to inject.
820
- */
821
- export type ContextProvider<T> = MaybePromise<MikroORM> | ((type: T) => MaybePromise<MikroORM | EntityManager | EntityRepository<any> | {
822
- getEntityManager(): EntityManager;
823
- }>);
966
+ export type MaybeReturnType<T> = T extends (...args: any[]) => infer R ? R : T;
967
+ export interface EntitySchemaWithMeta<TName extends string = string, TTableName extends string = string, TEntity = any, TBase = never, TProperties extends Record<string, any> = Record<string, any>, TClass extends EntityCtor = EntityCtor<TEntity>> extends EntitySchema<TEntity, TBase, TClass> {
968
+ readonly name: TName;
969
+ readonly properties: TProperties;
970
+ readonly tableName: TTableName;
971
+ /** @internal Direct entity type access - avoids expensive pattern matching */
972
+ readonly '~entity': TEntity;
973
+ }
974
+ export type InferEntity<Schema> = Schema extends {
975
+ '~entity': infer E;
976
+ } ? E : Schema extends EntitySchema<infer Entity> ? Entity : Schema extends EntityClass<infer Entity> ? Entity : Schema;
824
977
  export {};