@mikro-orm/core 7.0.4-dev.8 → 7.0.4

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 (206) hide show
  1. package/EntityManager.d.ts +884 -583
  2. package/EntityManager.js +1922 -1895
  3. package/MikroORM.d.ts +103 -74
  4. package/MikroORM.js +178 -179
  5. package/README.md +1 -1
  6. package/cache/CacheAdapter.d.ts +36 -36
  7. package/cache/FileCacheAdapter.d.ts +30 -24
  8. package/cache/FileCacheAdapter.js +80 -78
  9. package/cache/GeneratedCacheAdapter.d.ts +18 -20
  10. package/cache/GeneratedCacheAdapter.js +30 -30
  11. package/cache/MemoryCacheAdapter.d.ts +18 -20
  12. package/cache/MemoryCacheAdapter.js +35 -36
  13. package/cache/NullCacheAdapter.d.ts +16 -16
  14. package/cache/NullCacheAdapter.js +24 -24
  15. package/connections/Connection.d.ts +95 -84
  16. package/connections/Connection.js +165 -168
  17. package/drivers/DatabaseDriver.d.ts +186 -80
  18. package/drivers/DatabaseDriver.js +450 -443
  19. package/drivers/IDatabaseDriver.d.ts +440 -301
  20. package/entity/BaseEntity.d.ts +120 -83
  21. package/entity/BaseEntity.js +43 -43
  22. package/entity/Collection.d.ts +212 -179
  23. package/entity/Collection.js +727 -721
  24. package/entity/EntityAssigner.d.ts +88 -77
  25. package/entity/EntityAssigner.js +231 -230
  26. package/entity/EntityFactory.d.ts +66 -54
  27. package/entity/EntityFactory.js +425 -383
  28. package/entity/EntityHelper.d.ts +34 -22
  29. package/entity/EntityHelper.js +280 -267
  30. package/entity/EntityIdentifier.d.ts +4 -4
  31. package/entity/EntityIdentifier.js +10 -10
  32. package/entity/EntityLoader.d.ts +98 -72
  33. package/entity/EntityLoader.js +753 -723
  34. package/entity/EntityRepository.d.ts +316 -201
  35. package/entity/EntityRepository.js +213 -213
  36. package/entity/PolymorphicRef.d.ts +5 -5
  37. package/entity/PolymorphicRef.js +10 -10
  38. package/entity/Reference.d.ts +126 -82
  39. package/entity/Reference.js +278 -274
  40. package/entity/WrappedEntity.d.ts +115 -72
  41. package/entity/WrappedEntity.js +168 -166
  42. package/entity/defineEntity.d.ts +1315 -636
  43. package/entity/defineEntity.js +527 -518
  44. package/entity/utils.d.ts +13 -3
  45. package/entity/utils.js +71 -73
  46. package/entity/validators.js +43 -43
  47. package/entity/wrap.js +8 -8
  48. package/enums.d.ts +258 -253
  49. package/enums.js +251 -252
  50. package/errors.d.ts +114 -72
  51. package/errors.js +350 -253
  52. package/events/EventManager.d.ts +26 -14
  53. package/events/EventManager.js +79 -77
  54. package/events/EventSubscriber.d.ts +29 -29
  55. package/events/TransactionEventBroadcaster.d.ts +15 -8
  56. package/events/TransactionEventBroadcaster.js +14 -14
  57. package/exceptions.d.ts +23 -40
  58. package/exceptions.js +35 -52
  59. package/hydration/Hydrator.d.ts +42 -17
  60. package/hydration/Hydrator.js +43 -43
  61. package/hydration/ObjectHydrator.d.ts +50 -17
  62. package/hydration/ObjectHydrator.js +481 -416
  63. package/index.d.ts +116 -2
  64. package/index.js +10 -1
  65. package/logging/DefaultLogger.d.ts +34 -32
  66. package/logging/DefaultLogger.js +86 -86
  67. package/logging/Logger.d.ts +41 -41
  68. package/logging/SimpleLogger.d.ts +13 -11
  69. package/logging/SimpleLogger.js +22 -22
  70. package/logging/colors.d.ts +6 -6
  71. package/logging/colors.js +11 -10
  72. package/logging/inspect.js +7 -7
  73. package/metadata/EntitySchema.d.ts +211 -127
  74. package/metadata/EntitySchema.js +397 -398
  75. package/metadata/MetadataDiscovery.d.ts +114 -114
  76. package/metadata/MetadataDiscovery.js +1951 -1863
  77. package/metadata/MetadataProvider.d.ts +24 -21
  78. package/metadata/MetadataProvider.js +82 -84
  79. package/metadata/MetadataStorage.d.ts +38 -32
  80. package/metadata/MetadataStorage.js +118 -118
  81. package/metadata/MetadataValidator.d.ts +39 -39
  82. package/metadata/MetadataValidator.js +381 -338
  83. package/metadata/discover-entities.d.ts +5 -2
  84. package/metadata/discover-entities.js +35 -27
  85. package/metadata/types.d.ts +615 -531
  86. package/naming-strategy/AbstractNamingStrategy.d.ts +54 -39
  87. package/naming-strategy/AbstractNamingStrategy.js +90 -85
  88. package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
  89. package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
  90. package/naming-strategy/MongoNamingStrategy.d.ts +6 -6
  91. package/naming-strategy/MongoNamingStrategy.js +18 -18
  92. package/naming-strategy/NamingStrategy.d.ts +109 -99
  93. package/naming-strategy/UnderscoreNamingStrategy.d.ts +7 -7
  94. package/naming-strategy/UnderscoreNamingStrategy.js +21 -21
  95. package/not-supported.js +7 -4
  96. package/package.json +1 -1
  97. package/platforms/ExceptionConverter.d.ts +1 -1
  98. package/platforms/ExceptionConverter.js +4 -4
  99. package/platforms/Platform.d.ts +310 -299
  100. package/platforms/Platform.js +663 -636
  101. package/serialization/EntitySerializer.d.ts +49 -26
  102. package/serialization/EntitySerializer.js +224 -218
  103. package/serialization/EntityTransformer.d.ts +10 -6
  104. package/serialization/EntityTransformer.js +219 -217
  105. package/serialization/SerializationContext.d.ts +27 -23
  106. package/serialization/SerializationContext.js +105 -105
  107. package/types/ArrayType.d.ts +8 -8
  108. package/types/ArrayType.js +33 -33
  109. package/types/BigIntType.d.ts +17 -10
  110. package/types/BigIntType.js +37 -37
  111. package/types/BlobType.d.ts +3 -3
  112. package/types/BlobType.js +13 -13
  113. package/types/BooleanType.d.ts +4 -4
  114. package/types/BooleanType.js +12 -12
  115. package/types/CharacterType.d.ts +2 -2
  116. package/types/CharacterType.js +6 -6
  117. package/types/DateTimeType.d.ts +5 -5
  118. package/types/DateTimeType.js +15 -15
  119. package/types/DateType.d.ts +5 -5
  120. package/types/DateType.js +15 -15
  121. package/types/DecimalType.d.ts +7 -7
  122. package/types/DecimalType.js +26 -26
  123. package/types/DoubleType.d.ts +3 -3
  124. package/types/DoubleType.js +12 -12
  125. package/types/EnumArrayType.d.ts +5 -5
  126. package/types/EnumArrayType.js +24 -24
  127. package/types/EnumType.d.ts +3 -3
  128. package/types/EnumType.js +11 -11
  129. package/types/FloatType.d.ts +3 -3
  130. package/types/FloatType.js +9 -9
  131. package/types/IntegerType.d.ts +3 -3
  132. package/types/IntegerType.js +9 -9
  133. package/types/IntervalType.d.ts +4 -4
  134. package/types/IntervalType.js +12 -12
  135. package/types/JsonType.d.ts +8 -8
  136. package/types/JsonType.js +32 -32
  137. package/types/MediumIntType.d.ts +1 -1
  138. package/types/MediumIntType.js +3 -3
  139. package/types/SmallIntType.d.ts +3 -3
  140. package/types/SmallIntType.js +9 -9
  141. package/types/StringType.d.ts +4 -4
  142. package/types/StringType.js +12 -12
  143. package/types/TextType.d.ts +3 -3
  144. package/types/TextType.js +9 -9
  145. package/types/TimeType.d.ts +5 -5
  146. package/types/TimeType.js +17 -17
  147. package/types/TinyIntType.d.ts +3 -3
  148. package/types/TinyIntType.js +10 -10
  149. package/types/Type.d.ts +83 -79
  150. package/types/Type.js +82 -82
  151. package/types/Uint8ArrayType.d.ts +4 -4
  152. package/types/Uint8ArrayType.js +21 -21
  153. package/types/UnknownType.d.ts +4 -4
  154. package/types/UnknownType.js +12 -12
  155. package/types/UuidType.d.ts +5 -5
  156. package/types/UuidType.js +19 -19
  157. package/types/index.d.ts +75 -49
  158. package/types/index.js +52 -26
  159. package/typings.d.ts +1250 -737
  160. package/typings.js +244 -231
  161. package/unit-of-work/ChangeSet.d.ts +26 -26
  162. package/unit-of-work/ChangeSet.js +56 -56
  163. package/unit-of-work/ChangeSetComputer.d.ts +12 -12
  164. package/unit-of-work/ChangeSetComputer.js +178 -170
  165. package/unit-of-work/ChangeSetPersister.d.ts +63 -44
  166. package/unit-of-work/ChangeSetPersister.js +442 -421
  167. package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
  168. package/unit-of-work/CommitOrderCalculator.js +89 -88
  169. package/unit-of-work/IdentityMap.d.ts +31 -31
  170. package/unit-of-work/IdentityMap.js +105 -105
  171. package/unit-of-work/UnitOfWork.d.ts +181 -141
  172. package/unit-of-work/UnitOfWork.js +1200 -1183
  173. package/utils/AbstractMigrator.d.ts +111 -91
  174. package/utils/AbstractMigrator.js +275 -275
  175. package/utils/AbstractSchemaGenerator.d.ts +43 -34
  176. package/utils/AbstractSchemaGenerator.js +121 -122
  177. package/utils/AsyncContext.d.ts +3 -3
  178. package/utils/AsyncContext.js +34 -35
  179. package/utils/Configuration.d.ts +852 -808
  180. package/utils/Configuration.js +359 -344
  181. package/utils/Cursor.d.ts +40 -22
  182. package/utils/Cursor.js +135 -127
  183. package/utils/DataloaderUtils.d.ts +58 -43
  184. package/utils/DataloaderUtils.js +203 -198
  185. package/utils/EntityComparator.d.ts +98 -81
  186. package/utils/EntityComparator.js +828 -728
  187. package/utils/NullHighlighter.d.ts +1 -1
  188. package/utils/NullHighlighter.js +3 -3
  189. package/utils/QueryHelper.d.ts +79 -51
  190. package/utils/QueryHelper.js +372 -361
  191. package/utils/RawQueryFragment.d.ts +50 -34
  192. package/utils/RawQueryFragment.js +107 -105
  193. package/utils/RequestContext.d.ts +32 -32
  194. package/utils/RequestContext.js +52 -53
  195. package/utils/TransactionContext.d.ts +16 -16
  196. package/utils/TransactionContext.js +27 -27
  197. package/utils/TransactionManager.d.ts +58 -58
  198. package/utils/TransactionManager.js +199 -197
  199. package/utils/Utils.d.ts +204 -145
  200. package/utils/Utils.js +812 -810
  201. package/utils/clone.js +104 -113
  202. package/utils/env-vars.js +90 -88
  203. package/utils/fs-utils.d.ts +15 -15
  204. package/utils/fs-utils.js +180 -181
  205. package/utils/upsert-utils.d.ts +20 -5
  206. package/utils/upsert-utils.js +114 -116
package/typings.d.ts CHANGED
@@ -1,5 +1,14 @@
1
1
  import type { Transaction } from './connections/Connection.js';
2
- import { type Cascade, type DeferMode, type EmbeddedPrefixMode, type EventType, type LoadStrategy, type PopulatePath, type QueryOrderMap, ReferenceKind } from './enums.js';
2
+ import {
3
+ type Cascade,
4
+ type DeferMode,
5
+ type EmbeddedPrefixMode,
6
+ type EventType,
7
+ type LoadStrategy,
8
+ type PopulatePath,
9
+ type QueryOrderMap,
10
+ ReferenceKind,
11
+ } from './enums.js';
3
12
  import { type AssignOptions } from './entity/EntityAssigner.js';
4
13
  import { type EntityIdentifier } from './entity/EntityIdentifier.js';
5
14
  import { type EntityLoaderOptions } from './entity/EntityLoader.js';
@@ -24,7 +33,7 @@ export type { Raw };
24
33
  export type Constructor<T = unknown> = new (...args: any[]) => T;
25
34
  /** Simple string-keyed object type. Use instead of `Record<string, T>` for convenience. */
26
35
  export type Dictionary<T = any> = {
27
- [k: string]: T;
36
+ [k: string]: T;
28
37
  };
29
38
  /** Record of compiled functions, used internally for hydration and comparison. */
30
39
  export type CompiledFunctions = Record<string, (...args: any[]) => any>;
@@ -32,9 +41,10 @@ export type CompiledFunctions = Record<string, (...args: any[]) => any>;
32
41
  * Extracts string property keys from an entity, excluding symbols, functions, and internal keys.
33
42
  * Pass `B = true` to also exclude scalar properties (useful for getting only relation keys).
34
43
  */
35
- export type EntityKey<T = unknown, B extends boolean = false> = string & {
44
+ export type EntityKey<T = unknown, B extends boolean = false> = string &
45
+ {
36
46
  [K in keyof T]-?: CleanKeys<T, K, B> extends never ? never : K;
37
- }[keyof T];
47
+ }[keyof T];
38
48
  /** Resolves to the value type of entity properties (keyed by `EntityKey<T>`). */
39
49
  export type EntityValue<T> = T[EntityKey<T>];
40
50
  /** Resolves to the value type within `EntityData<T>` (the data shape used for create/update). */
@@ -45,11 +55,26 @@ export type FilterKey<T> = keyof FilterQuery<T>;
45
55
  export type AsyncFunction<R = any, T = Dictionary> = (args: T) => Promise<T>;
46
56
  /** Identity mapped type that forces TypeScript to eagerly evaluate and flatten `T`. */
47
57
  export type Compute<T> = {
48
- [K in keyof T]: T[K];
58
+ [K in keyof T]: T[K];
49
59
  } & {};
50
- type InternalKeys = 'EntityRepositoryType' | 'PrimaryKeyProp' | 'OptionalProps' | 'EagerProps' | 'HiddenProps' | '__selectedType' | '__loadedType';
60
+ type InternalKeys =
61
+ | 'EntityRepositoryType'
62
+ | 'PrimaryKeyProp'
63
+ | 'OptionalProps'
64
+ | 'EagerProps'
65
+ | 'HiddenProps'
66
+ | '__selectedType'
67
+ | '__loadedType';
51
68
  /** Filters out function, symbol, and internal keys from an entity type. When `B = true`, also excludes scalar keys. */
52
- export type CleanKeys<T, K extends keyof T, B extends boolean = false> = T[K] & {} extends Function ? never : K extends symbol | InternalKeys ? never : B extends true ? T[K] & {} extends Scalar ? never : K : K;
69
+ export type CleanKeys<T, K extends keyof T, B extends boolean = false> = T[K] & {} extends Function
70
+ ? never
71
+ : K extends symbol | InternalKeys
72
+ ? never
73
+ : B extends true
74
+ ? T[K] & {} extends Scalar
75
+ ? never
76
+ : K
77
+ : K;
53
78
  /** Extracts keys of `T` whose values are functions. */
54
79
  export type FunctionKeys<T, K extends keyof T> = T[K] extends Function ? K : never;
55
80
  /** Conditional cast: returns `T` if it extends `R`, otherwise returns `R`. */
@@ -73,8 +98,8 @@ export type MaybePromise<T> = T | Promise<T>;
73
98
  * - With inference: `T extends CollectionShape<infer U>`
74
99
  */
75
100
  type CollectionShape<T = any> = {
76
- [k: number]: T;
77
- readonly owner: object;
101
+ [k: number]: T;
102
+ readonly owner: object;
78
103
  };
79
104
  /**
80
105
  * Structural type for matching LoadedCollection (extends CollectionShape with `$` property).
@@ -84,7 +109,7 @@ type CollectionShape<T = any> = {
84
109
  * - With inference: `T extends LoadedCollectionShape<infer U>`
85
110
  */
86
111
  type LoadedCollectionShape<T = any> = CollectionShape<T> & {
87
- $: any;
112
+ $: any;
88
113
  };
89
114
  /**
90
115
  * Structural type for matching Reference without triggering full class evaluation.
@@ -97,7 +122,7 @@ type LoadedCollectionShape<T = any> = CollectionShape<T> & {
97
122
  * - With inference: `T extends ReferenceShape<infer U>`
98
123
  */
99
124
  type ReferenceShape<T = any> = {
100
- unwrap(): T;
125
+ unwrap(): T;
101
126
  };
102
127
  /**
103
128
  * Structural type for matching LoadedReference (Reference with `$` property).
@@ -106,7 +131,7 @@ type ReferenceShape<T = any> = {
106
131
  * We infer T from $ to get the full Loaded type for EntityDTO.
107
132
  */
108
133
  type LoadedReferenceShape<T = any> = ReferenceShape & {
109
- $: T;
134
+ $: T;
110
135
  };
111
136
  /**
112
137
  * Structural type for matching any loadable relation (Collection, Reference, or array).
@@ -123,12 +148,22 @@ type IsUnion<T, U = T> = T extends any ? ([U] extends [T] ? false : true) : fals
123
148
  * Merges all members of a union type into a single object with all their properties.
124
149
  * For non-union types, returns `T` directly to avoid expensive key iteration.
125
150
  */
126
- export type MergeUnion<T> = [T] extends [object] ? T extends Scalar ? T : IsUnion<T> extends true ? {
127
- [K in UnionKeys<T>]: UnionPropertyType<T, K>;
128
- } : T : T;
151
+ export type MergeUnion<T> = [T] extends [object]
152
+ ? T extends Scalar
153
+ ? T
154
+ : IsUnion<T> extends true
155
+ ? {
156
+ [K in UnionKeys<T>]: UnionPropertyType<T, K>;
157
+ }
158
+ : T
159
+ : T;
129
160
  /** Recursively makes all properties of `T` optional, including nested objects and arrays. */
130
161
  export type DeepPartial<T> = T & {
131
- [P in keyof T]?: T[P] extends (infer U)[] ? DeepPartial<U>[] : T[P] extends Readonly<infer U>[] ? Readonly<DeepPartial<U>>[] : DeepPartial<T[P]>;
162
+ [P in keyof T]?: T[P] extends (infer U)[]
163
+ ? DeepPartial<U>[]
164
+ : T[P] extends Readonly<infer U>[]
165
+ ? Readonly<DeepPartial<U>>[]
166
+ : DeepPartial<T[P]>;
132
167
  };
133
168
  /** Symbol used to declare a custom repository type on an entity class (e.g., `[EntityRepositoryType]?: BookRepository`). */
134
169
  export declare const EntityRepositoryType: unique symbol;
@@ -146,18 +181,22 @@ export declare const Config: unique symbol;
146
181
  export declare const EntityName: unique symbol;
147
182
  /** Extracts the entity name string literal from an entity type that declares `[EntityName]`. */
148
183
  export type InferEntityName<T> = T extends {
149
- [EntityName]?: infer Name;
150
- } ? (Name extends string ? Name : never) : never;
184
+ [EntityName]?: infer Name;
185
+ }
186
+ ? Name extends string
187
+ ? Name
188
+ : never
189
+ : never;
151
190
  /**
152
191
  * Branded type that marks a property as optional in `em.create()`.
153
192
  * Use as a property type wrapper: `createdAt: Opt<Date>` instead of listing in `[OptionalProps]`.
154
193
  */
155
194
  export type Opt<T = unknown> = T & Opt.Brand;
156
195
  export declare namespace Opt {
157
- const __optional: unique symbol;
158
- interface Brand {
159
- [__optional]?: 1;
160
- }
196
+ const __optional: unique symbol;
197
+ interface Brand {
198
+ [__optional]?: 1;
199
+ }
161
200
  }
162
201
  /**
163
202
  * Branded type that marks a nullable property as required in `em.create()`.
@@ -165,10 +204,10 @@ export declare namespace Opt {
165
204
  */
166
205
  export type RequiredNullable<T = never> = (T & RequiredNullable.Brand) | null;
167
206
  export declare namespace RequiredNullable {
168
- const __requiredNullable: unique symbol;
169
- interface Brand {
170
- [__requiredNullable]?: 1;
171
- }
207
+ const __requiredNullable: unique symbol;
208
+ interface Brand {
209
+ [__requiredNullable]?: 1;
210
+ }
172
211
  }
173
212
  /**
174
213
  * Branded type that marks a property as hidden from serialization.
@@ -176,10 +215,10 @@ export declare namespace RequiredNullable {
176
215
  */
177
216
  export type Hidden<T = unknown> = T & Hidden.Brand;
178
217
  export declare namespace Hidden {
179
- const __hidden: unique symbol;
180
- interface Brand {
181
- [__hidden]?: 1;
182
- }
218
+ const __hidden: unique symbol;
219
+ interface Brand {
220
+ [__hidden]?: 1;
221
+ }
183
222
  }
184
223
  /**
185
224
  * Branded type for entity-level configuration (e.g., `[Config]?: DefineConfig<{ forceObject: true }>`).
@@ -187,16 +226,16 @@ export declare namespace Hidden {
187
226
  */
188
227
  export type DefineConfig<T extends TypeConfig> = T & DefineConfig.Brand;
189
228
  export declare namespace DefineConfig {
190
- const __config: unique symbol;
191
- interface Brand {
192
- [__config]?: 1;
193
- }
229
+ const __config: unique symbol;
230
+ interface Brand {
231
+ [__config]?: 1;
232
+ }
194
233
  }
195
234
  /** Extracts only the `TypeConfig` keys from a branded config type, stripping the brand. */
196
235
  export type CleanTypeConfig<T> = Compute<Pick<T, Extract<keyof T, keyof TypeConfig>>>;
197
236
  /** Configuration options that can be set on an entity via the `[Config]` symbol. */
198
237
  export interface TypeConfig {
199
- forceObject?: boolean;
238
+ forceObject?: boolean;
200
239
  }
201
240
  declare const __selectedType: unique symbol;
202
241
  declare const __loadedType: unique symbol;
@@ -208,116 +247,186 @@ declare const __fieldsHint: unique symbol;
208
247
  * This reflects that loading 'a.b.c' means 'a' and 'a.b' are also loaded.
209
248
  * Special case: '*' returns string to ensure Loaded<T, '*'> is assignable to any Loaded<T, Hint>.
210
249
  */
211
- export type Prefixes<S extends string> = S extends '*' ? string : S extends `${infer H}.${infer T}` ? H | `${H}.${Prefixes<T>}` : S;
250
+ export type Prefixes<S extends string> = S extends '*'
251
+ ? string
252
+ : S extends `${infer H}.${infer T}`
253
+ ? H | `${H}.${Prefixes<T>}`
254
+ : S;
212
255
  /** Unwraps a value to its primary key type. Scalars pass through; References are unwrapped first. */
213
256
  export type UnwrapPrimary<T> = T extends Scalar ? T : T extends ReferenceShape<infer U> ? Primary<U> : Primary<T>;
214
257
  type PrimaryPropToType<T, Keys extends (keyof T)[]> = {
215
- [Index in keyof Keys]: UnwrapPrimary<T[Keys[Index]]>;
258
+ [Index in keyof Keys]: UnwrapPrimary<T[Keys[Index]]>;
216
259
  };
217
260
  type ReadonlyPrimary<T> = T extends any[] ? Readonly<T> : T;
218
261
  /**
219
262
  * Resolves the primary key type for an entity. Uses `[PrimaryKeyProp]` if declared,
220
263
  * otherwise falls back to `_id`, `id`, or `uuid` properties. For composite keys, returns a tuple.
221
264
  */
222
- export type Primary<T> = IsAny<T> extends true ? any : T extends {
223
- [PrimaryKeyProp]?: infer PK;
224
- } ? 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 {
225
- _id?: infer PK;
226
- } ? ReadonlyPrimary<PK> | string : T extends {
227
- id?: infer PK;
228
- } ? ReadonlyPrimary<PK> : T extends {
229
- uuid?: infer PK;
230
- } ? ReadonlyPrimary<PK> : T;
265
+ export type Primary<T> =
266
+ IsAny<T> extends true
267
+ ? any
268
+ : T extends {
269
+ [PrimaryKeyProp]?: infer PK;
270
+ }
271
+ ? PK extends undefined
272
+ ? Omit<T, typeof PrimaryKeyProp>
273
+ : PK extends keyof T
274
+ ? ReadonlyPrimary<UnwrapPrimary<T[PK]>>
275
+ : PK extends (keyof T)[]
276
+ ? ReadonlyPrimary<PrimaryPropToType<T, PK>>
277
+ : PK
278
+ : T extends {
279
+ _id?: infer PK;
280
+ }
281
+ ? ReadonlyPrimary<PK> | string
282
+ : T extends {
283
+ id?: infer PK;
284
+ }
285
+ ? ReadonlyPrimary<PK>
286
+ : T extends {
287
+ uuid?: infer PK;
288
+ }
289
+ ? ReadonlyPrimary<PK>
290
+ : T;
231
291
  /** @internal */
232
292
  export type PrimaryProperty<T> = T extends {
233
- [PrimaryKeyProp]?: infer PK;
234
- } ? PK extends keyof T ? PK : PK extends any[] ? PK[number] : never : T extends {
235
- _id?: any;
236
- } ? T extends {
237
- id?: any;
238
- } ? 'id' | '_id' : '_id' : T extends {
239
- id?: any;
240
- } ? 'id' : T extends {
241
- uuid?: any;
242
- } ? 'uuid' : never;
293
+ [PrimaryKeyProp]?: infer PK;
294
+ }
295
+ ? PK extends keyof T
296
+ ? PK
297
+ : PK extends any[]
298
+ ? PK[number]
299
+ : never
300
+ : T extends {
301
+ _id?: any;
302
+ }
303
+ ? T extends {
304
+ id?: any;
305
+ }
306
+ ? 'id' | '_id'
307
+ : '_id'
308
+ : T extends {
309
+ id?: any;
310
+ }
311
+ ? 'id'
312
+ : T extends {
313
+ uuid?: any;
314
+ }
315
+ ? 'uuid'
316
+ : never;
243
317
  /** Union of all allowed primary key value types (number, string, bigint, Date, ObjectId-like). */
244
- export type IPrimaryKeyValue = number | string | bigint | Date | {
245
- toHexString(): string;
246
- };
318
+ export type IPrimaryKeyValue =
319
+ | number
320
+ | string
321
+ | bigint
322
+ | Date
323
+ | {
324
+ toHexString(): string;
325
+ };
247
326
  /** Alias for a primary key value, constrained to `IPrimaryKeyValue`. */
248
327
  export type IPrimaryKey<T extends IPrimaryKeyValue = IPrimaryKeyValue> = T;
249
328
  /** Union of types considered "scalar" (non-entity) values. Used to distinguish entity relations from plain values. */
250
- export type Scalar = boolean | number | string | bigint | symbol | Date | RegExp | Uint8Array | {
251
- toHexString(): string;
252
- };
329
+ export type Scalar =
330
+ | boolean
331
+ | number
332
+ | string
333
+ | bigint
334
+ | symbol
335
+ | Date
336
+ | RegExp
337
+ | Uint8Array
338
+ | {
339
+ toHexString(): string;
340
+ };
253
341
  type Primitive = boolean | number | string | bigint | symbol;
254
342
  /** Expands a scalar type to include alternative representations accepted in queries (e.g., `Date | string`). */
255
- export type ExpandScalar<T> = null | (T extends string ? T | RegExp : T extends Date ? Date | string : T extends bigint ? bigint | string | number : T);
343
+ export type ExpandScalar<T> =
344
+ | null
345
+ | (T extends string ? T | RegExp : T extends Date ? Date | string : T extends bigint ? bigint | string | number : T);
256
346
  /** Marker interface for query builders that can be used as subqueries */
257
347
  export interface Subquery {
258
- readonly __subquery: true;
348
+ readonly __subquery: true;
259
349
  }
260
350
  /** Map of query operators (`$eq`, `$gt`, `$in`, etc.) available for filtering a value of type `T`. */
261
351
  export type OperatorMap<T> = {
262
- $and?: ExpandQuery<T>[];
263
- $or?: ExpandQuery<T>[];
264
- $eq?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
265
- $ne?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
266
- $in?: readonly ExpandScalar<T>[] | readonly Primary<T>[] | Raw | Subquery;
267
- $nin?: readonly ExpandScalar<T>[] | readonly Primary<T>[] | Raw | Subquery;
268
- $not?: ExpandQuery<T>;
269
- $none?: ExpandQuery<T>;
270
- $some?: ExpandQuery<T>;
271
- $every?: ExpandQuery<T>;
272
- $size?: number | {
352
+ $and?: ExpandQuery<T>[];
353
+ $or?: ExpandQuery<T>[];
354
+ $eq?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
355
+ $ne?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
356
+ $in?: readonly ExpandScalar<T>[] | readonly Primary<T>[] | Raw | Subquery;
357
+ $nin?: readonly ExpandScalar<T>[] | readonly Primary<T>[] | Raw | Subquery;
358
+ $not?: ExpandQuery<T>;
359
+ $none?: ExpandQuery<T>;
360
+ $some?: ExpandQuery<T>;
361
+ $every?: ExpandQuery<T>;
362
+ $size?:
363
+ | number
364
+ | {
273
365
  $eq?: number;
274
366
  $ne?: number;
275
367
  $gt?: number;
276
368
  $gte?: number;
277
369
  $lt?: number;
278
370
  $lte?: number;
279
- };
280
- $gt?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
281
- $gte?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
282
- $lt?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
283
- $lte?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
284
- $like?: string;
285
- $re?: string;
286
- $ilike?: string;
287
- $fulltext?: string;
288
- $overlap?: readonly string[] | string | object;
289
- $contains?: readonly string[] | string | object;
290
- $contained?: readonly string[] | string | object;
291
- $exists?: boolean;
292
- $hasKey?: string;
293
- $hasKeys?: readonly string[];
294
- $hasSomeKeys?: readonly string[];
371
+ };
372
+ $gt?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
373
+ $gte?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
374
+ $lt?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
375
+ $lte?: ExpandScalar<T> | readonly ExpandScalar<T>[] | Subquery;
376
+ $like?: string;
377
+ $re?: string;
378
+ $ilike?: string;
379
+ $fulltext?: string;
380
+ $overlap?: readonly string[] | string | object;
381
+ $contains?: readonly string[] | string | object;
382
+ $contained?: readonly string[] | string | object;
383
+ $exists?: boolean;
384
+ $hasKey?: string;
385
+ $hasKeys?: readonly string[];
386
+ $hasSomeKeys?: readonly string[];
295
387
  };
296
388
  /** A single filter value: the raw value, its expanded scalar form, its primary key, or a raw SQL expression. */
297
389
  export type FilterItemValue<T> = T | ExpandScalar<T> | Primary<T> | Raw;
298
390
  /** A complete filter value: an operator map, a single value, an array of values, or null. */
299
391
  export type FilterValue<T> = OperatorMap<FilterItemValue<T>> | FilterItemValue<T> | FilterItemValue<T>[] | null;
300
- type FilterObjectProp<T, K extends PropertyKey> = K extends keyof MergeUnion<T> ? MergeUnion<T>[K] : K extends keyof T ? T[K] : never;
301
- type ExpandQueryMerged<T> = [T] extends [object] ? [T] extends [Scalar] ? never : FilterQuery<MergeUnion<T>> : FilterValue<T>;
392
+ type FilterObjectProp<T, K extends PropertyKey> = K extends keyof MergeUnion<T>
393
+ ? MergeUnion<T>[K]
394
+ : K extends keyof T
395
+ ? T[K]
396
+ : never;
397
+ type ExpandQueryMerged<T> = [T] extends [object]
398
+ ? [T] extends [Scalar]
399
+ ? never
400
+ : FilterQuery<MergeUnion<T>>
401
+ : FilterValue<T>;
302
402
  type ElemMatchCondition<T extends Record<string, any>> = {
303
- [K in keyof T]?: T[K] | OperatorMap<T[K]>;
403
+ [K in keyof T]?: T[K] | OperatorMap<T[K]>;
304
404
  } & {
305
- $or?: ElemMatchCondition<T>[];
306
- $and?: ElemMatchCondition<T>[];
307
- $not?: ElemMatchCondition<T>;
405
+ $or?: ElemMatchCondition<T>[];
406
+ $and?: ElemMatchCondition<T>[];
407
+ $not?: ElemMatchCondition<T>;
308
408
  };
309
- type ElemMatchFilter<T> = T extends readonly (infer E)[] ? E extends Record<string, any> ? {
310
- $elemMatch: ElemMatchCondition<E>;
311
- } : never : never;
409
+ type ElemMatchFilter<T> = T extends readonly (infer E)[]
410
+ ? E extends Record<string, any>
411
+ ? {
412
+ $elemMatch: ElemMatchCondition<E>;
413
+ }
414
+ : never
415
+ : never;
312
416
  /** Object form of a filter query, mapping entity keys to their filter conditions. */
313
417
  export type FilterObject<T> = {
314
- -readonly [K in EntityKey<T>]?: ExpandQuery<ExpandProperty<FilterObjectProp<T, K>>> | ExpandQueryMerged<ExpandProperty<FilterObjectProp<T, K>>> | FilterValue<ExpandProperty<FilterObjectProp<T, K>>> | ElemMatchFilter<FilterObjectProp<T, K>> | null;
418
+ -readonly [K in EntityKey<T>]?:
419
+ | ExpandQuery<ExpandProperty<FilterObjectProp<T, K>>>
420
+ | ExpandQueryMerged<ExpandProperty<FilterObjectProp<T, K>>>
421
+ | FilterValue<ExpandProperty<FilterObjectProp<T, K>>>
422
+ | ElemMatchFilter<FilterObjectProp<T, K>>
423
+ | null;
315
424
  };
316
425
  /** Recursively expands a type into its `FilterQuery` form for nested object filtering. */
317
426
  export type ExpandQuery<T> = T extends object ? (T extends Scalar ? never : FilterQuery<T>) : FilterValue<T>;
318
427
  /** Partial entity shape with all entity properties optional. */
319
428
  export type EntityProps<T> = {
320
- -readonly [K in EntityKey<T>]?: T[K];
429
+ -readonly [K in EntityKey<T>]?: T[K];
321
430
  };
322
431
  /** Object-based query filter combining operator maps with property-level filters. */
323
432
  export type ObjectQuery<T> = OperatorMap<T> & FilterObject<T>;
@@ -325,72 +434,107 @@ export type ObjectQuery<T> = OperatorMap<T> & FilterObject<T>;
325
434
  * The main query filter type used in `em.find()`, `em.findOne()`, etc.
326
435
  * Accepts an object query, a primary key value, entity props with operators, or an array of filters.
327
436
  */
328
- export type FilterQuery<T> = ObjectQuery<T> | NonNullable<ExpandScalar<Primary<T>>> | NonNullable<EntityProps<T> & OperatorMap<T>> | FilterQuery<T>[];
437
+ export type FilterQuery<T> =
438
+ | ObjectQuery<T>
439
+ | NonNullable<ExpandScalar<Primary<T>>>
440
+ | NonNullable<EntityProps<T> & OperatorMap<T>>
441
+ | FilterQuery<T>[];
329
442
  /** Public interface for the entity wrapper, accessible via `wrap(entity)`. Provides helper methods for entity state management. */
330
443
  export interface IWrappedEntity<Entity extends object> {
331
- isInitialized(): boolean;
332
- isManaged(): boolean;
333
- populated(populated?: boolean): void;
334
- populate<Hint extends string = never, Fields extends string = never>(populate: readonly AutoPath<Entity, Hint, PopulatePath.ALL>[] | false, options?: EntityLoaderOptions<Entity, Fields>): Promise<Loaded<Entity, Hint>>;
335
- init<Hint extends string = never, Fields extends string = never, Exclude extends string = never>(options?: FindOneOptions<Entity, Hint, Fields, Exclude>): Promise<Loaded<Entity, Hint, Fields, Exclude> | null>;
336
- toReference(): Ref<Entity> & LoadedReference<Loaded<Entity, AddEager<Entity>>>;
337
- toObject(): EntityDTO<Entity>;
338
- toObject(ignoreFields: never[]): EntityDTO<Entity>;
339
- toObject<Ignored extends EntityKey<Entity>>(ignoreFields: Ignored[]): Omit<EntityDTO<Entity>, Ignored>;
340
- toJSON(...args: any[]): EntityDTO<Entity>;
341
- toPOJO(): EntityDTO<Entity>;
342
- serialize<Naked extends FromEntityType<Entity> = FromEntityType<Entity>, Hint extends string = never, Exclude extends string = never>(options?: SerializeOptions<Naked, Hint, Exclude>): SerializeDTO<Naked, Hint, Exclude>;
343
- setSerializationContext<Hint extends string = never, Fields extends string = never, Exclude extends string = never>(options: LoadHint<Entity, Hint, Fields, Exclude>): void;
344
- assign<Naked extends FromEntityType<Entity> = FromEntityType<Entity>, Convert extends boolean = false, Data extends EntityData<Naked, Convert> | Partial<EntityDTO<Naked>> = EntityData<Naked, Convert> | Partial<EntityDTO<Naked>>>(data: Data & IsSubset<EntityData<Naked, Convert>, Data>, options?: AssignOptions<Convert>): MergeSelected<Entity, Naked, keyof Data & string>;
345
- getSchema(): string | undefined;
346
- setSchema(schema?: string): void;
444
+ isInitialized(): boolean;
445
+ isManaged(): boolean;
446
+ populated(populated?: boolean): void;
447
+ populate<Hint extends string = never, Fields extends string = never>(
448
+ populate: readonly AutoPath<Entity, Hint, PopulatePath.ALL>[] | false,
449
+ options?: EntityLoaderOptions<Entity, Fields>,
450
+ ): Promise<Loaded<Entity, Hint>>;
451
+ init<Hint extends string = never, Fields extends string = never, Exclude extends string = never>(
452
+ options?: FindOneOptions<Entity, Hint, Fields, Exclude>,
453
+ ): Promise<Loaded<Entity, Hint, Fields, Exclude> | null>;
454
+ toReference(): Ref<Entity> & LoadedReference<Loaded<Entity, AddEager<Entity>>>;
455
+ toObject(): EntityDTO<Entity>;
456
+ toObject(ignoreFields: never[]): EntityDTO<Entity>;
457
+ toObject<Ignored extends EntityKey<Entity>>(ignoreFields: Ignored[]): Omit<EntityDTO<Entity>, Ignored>;
458
+ toJSON(...args: any[]): EntityDTO<Entity>;
459
+ toPOJO(): EntityDTO<Entity>;
460
+ serialize<
461
+ Naked extends FromEntityType<Entity> = FromEntityType<Entity>,
462
+ Hint extends string = never,
463
+ Exclude extends string = never,
464
+ >(
465
+ options?: SerializeOptions<Naked, Hint, Exclude>,
466
+ ): SerializeDTO<Naked, Hint, Exclude>;
467
+ setSerializationContext<Hint extends string = never, Fields extends string = never, Exclude extends string = never>(
468
+ options: LoadHint<Entity, Hint, Fields, Exclude>,
469
+ ): void;
470
+ assign<
471
+ Naked extends FromEntityType<Entity> = FromEntityType<Entity>,
472
+ Convert extends boolean = false,
473
+ Data extends EntityData<Naked, Convert> | Partial<EntityDTO<Naked>> =
474
+ | EntityData<Naked, Convert>
475
+ | Partial<EntityDTO<Naked>>,
476
+ >(
477
+ data: Data & IsSubset<EntityData<Naked, Convert>, Data>,
478
+ options?: AssignOptions<Convert>,
479
+ ): MergeSelected<Entity, Naked, keyof Data & string>;
480
+ getSchema(): string | undefined;
481
+ setSchema(schema?: string): void;
347
482
  }
348
483
  /** @internal Extended wrapper interface with internal state used by the ORM runtime. */
349
484
  export interface IWrappedEntityInternal<Entity extends object> extends IWrappedEntity<Entity> {
350
- hasPrimaryKey(): boolean;
351
- getPrimaryKey(convertCustomTypes?: boolean): Primary<Entity> | null;
352
- getPrimaryKeys(convertCustomTypes?: boolean): Primary<Entity>[] | null;
353
- setPrimaryKey(val: Primary<Entity>): void;
354
- getSerializedPrimaryKey(): string & keyof Entity;
355
- __meta: EntityMetadata<Entity>;
356
- __data: Dictionary;
357
- __em?: EntityManager;
358
- __platform: Platform;
359
- __config: Configuration;
360
- __factory: EntityFactory;
361
- __hydrator: IHydrator;
362
- __initialized: boolean;
363
- __originalEntityData?: EntityData<Entity>;
364
- __loadedProperties: Set<string>;
365
- __identifier?: EntityIdentifier | EntityIdentifier[];
366
- __managed: boolean;
367
- __processing: boolean;
368
- __schema?: string;
369
- __populated: boolean;
370
- __onLoadFired: boolean;
371
- __reference?: Ref<Entity>;
372
- __pk?: Primary<Entity>;
373
- __primaryKeys: Primary<Entity>[];
374
- __serializationContext: {
375
- root?: SerializationContext<Entity>;
376
- populate?: PopulateOptions<Entity>[];
377
- fields?: Set<string>;
378
- exclude?: string[];
379
- };
485
+ hasPrimaryKey(): boolean;
486
+ getPrimaryKey(convertCustomTypes?: boolean): Primary<Entity> | null;
487
+ getPrimaryKeys(convertCustomTypes?: boolean): Primary<Entity>[] | null;
488
+ setPrimaryKey(val: Primary<Entity>): void;
489
+ getSerializedPrimaryKey(): string & keyof Entity;
490
+ __meta: EntityMetadata<Entity>;
491
+ __data: Dictionary;
492
+ __em?: EntityManager;
493
+ __platform: Platform;
494
+ __config: Configuration;
495
+ __factory: EntityFactory;
496
+ __hydrator: IHydrator;
497
+ __initialized: boolean;
498
+ __originalEntityData?: EntityData<Entity>;
499
+ __loadedProperties: Set<string>;
500
+ __identifier?: EntityIdentifier | EntityIdentifier[];
501
+ __managed: boolean;
502
+ __processing: boolean;
503
+ __schema?: string;
504
+ __populated: boolean;
505
+ __onLoadFired: boolean;
506
+ __reference?: Ref<Entity>;
507
+ __pk?: Primary<Entity>;
508
+ __primaryKeys: Primary<Entity>[];
509
+ __serializationContext: {
510
+ root?: SerializationContext<Entity>;
511
+ populate?: PopulateOptions<Entity>[];
512
+ fields?: Set<string>;
513
+ exclude?: string[];
514
+ };
380
515
  }
381
516
  /** Loose entity type used in generic contexts. Equivalent to `Partial<T>`. */
382
517
  export type AnyEntity<T = any> = Partial<T>;
383
518
  /** A class (function with prototype) whose instances are of type `T`. */
384
519
  export type EntityClass<T = any> = Function & {
385
- prototype: T;
520
+ prototype: T;
386
521
  };
387
522
  /** Any valid entity name reference: a class, abstract constructor, or EntitySchema. */
388
523
  export type EntityName<T = any> = EntityClass<T> | EntityCtor<T> | EntitySchema<T, any>;
389
524
  /** Resolves the custom repository type for an entity (from `[EntityRepositoryType]`), or falls back to `Fallback`. */
390
- export type GetRepository<Entity extends {
525
+ export type GetRepository<
526
+ Entity extends {
391
527
  [k: PropertyKey]: any;
392
- }, Fallback> = Entity[typeof EntityRepositoryType] extends EntityRepository<any> | undefined ? NonNullable<Entity[typeof EntityRepositoryType]> : Fallback;
393
- type PolymorphicPrimaryInner<T> = T extends object ? Primary<T> extends readonly [infer First, infer Second, ...infer Rest] ? readonly [string, First, Second, ...Rest] | [string, First, Second, ...Rest] : readonly [string, Primary<T>] | [string, Primary<T>] : never;
528
+ },
529
+ Fallback,
530
+ > = Entity[typeof EntityRepositoryType] extends EntityRepository<any> | undefined
531
+ ? NonNullable<Entity[typeof EntityRepositoryType]>
532
+ : Fallback;
533
+ type PolymorphicPrimaryInner<T> = T extends object
534
+ ? Primary<T> extends readonly [infer First, infer Second, ...infer Rest]
535
+ ? readonly [string, First, Second, ...Rest] | [string, First, Second, ...Rest]
536
+ : readonly [string, Primary<T>] | [string, Primary<T>]
537
+ : never;
394
538
  /**
395
539
  * Tuple format for polymorphic FK values: [discriminator, ...pkValues]
396
540
  * Distributes over unions, so `Post | Comment` becomes `['post', number] | ['comment', number]`
@@ -399,52 +543,126 @@ type PolymorphicPrimaryInner<T> = T extends object ? Primary<T> extends readonly
399
543
  export type PolymorphicPrimary<T> = true extends IsUnion<T> ? PolymorphicPrimaryInner<T> : never;
400
544
  /** Allowed value types when assigning to an entity data property: the entity itself, its PK, or a polymorphic PK tuple. */
401
545
  export type EntityDataPropValue<T> = T | Primary<T> | PolymorphicPrimary<T>;
402
- type ExpandEntityProp<T, C extends boolean = false> = T extends Record<string, any> ? {
403
- [K in keyof T as CleanKeys<T, K>]?: EntityDataProp<ExpandProperty<T[K]>, C> | EntityDataPropValue<ExpandProperty<T[K]>> | null;
404
- } | EntityDataPropValue<ExpandProperty<T>> : T;
405
- type ExpandRequiredEntityProp<T, I, C extends boolean> = T extends Record<string, any> ? ExpandRequiredEntityPropObject<T, I, C> | EntityDataPropValue<ExpandProperty<T>> : T;
546
+ type ExpandEntityProp<T, C extends boolean = false> =
547
+ T extends Record<string, any>
548
+ ?
549
+ | {
550
+ [K in keyof T as CleanKeys<T, K>]?:
551
+ | EntityDataProp<ExpandProperty<T[K]>, C>
552
+ | EntityDataPropValue<ExpandProperty<T[K]>>
553
+ | null;
554
+ }
555
+ | EntityDataPropValue<ExpandProperty<T>>
556
+ : T;
557
+ type ExpandRequiredEntityProp<T, I, C extends boolean> =
558
+ T extends Record<string, any> ? ExpandRequiredEntityPropObject<T, I, C> | EntityDataPropValue<ExpandProperty<T>> : T;
406
559
  type ExpandRequiredEntityPropObject<T, I = never, C extends boolean = false> = {
407
- [K in keyof T as RequiredKeys<T, K, I>]: RequiredEntityDataProp<ExpandProperty<T[K]>, T, C> | EntityDataPropValue<ExpandProperty<T[K]>>;
560
+ [K in keyof T as RequiredKeys<T, K, I>]:
561
+ | RequiredEntityDataProp<ExpandProperty<T[K]>, T, C>
562
+ | EntityDataPropValue<ExpandProperty<T[K]>>;
408
563
  } & {
409
- [K in keyof T as OptionalKeys<T, K, I>]?: RequiredEntityDataProp<ExpandProperty<T[K]>, T, C> | EntityDataPropValue<ExpandProperty<T[K]>> | null | undefined;
564
+ [K in keyof T as OptionalKeys<T, K, I>]?:
565
+ | RequiredEntityDataProp<ExpandProperty<T[K]>, T, C>
566
+ | EntityDataPropValue<ExpandProperty<T[K]>>
567
+ | null
568
+ | undefined;
410
569
  };
411
570
  type NonArrayObject = object & {
412
- [Symbol.iterator]?: never;
571
+ [Symbol.iterator]?: never;
413
572
  };
414
573
  /** Resolves the allowed input type for a single entity property in `EntityData`. Handles scalars, references, collections, and nested entities. */
415
- export type EntityDataProp<T, C extends boolean> = T extends Date ? string | Date : T extends Scalar ? T : T extends ScalarReference<infer U> ? EntityDataProp<U, C> : T extends {
416
- __runtime?: infer Runtime;
417
- __raw?: infer Raw;
418
- } ? C extends true ? Raw : Runtime : T extends ReferenceShape<infer U> ? EntityDataNested<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>;
574
+ export type EntityDataProp<T, C extends boolean> = T extends Date
575
+ ? string | Date
576
+ : T extends Scalar
577
+ ? T
578
+ : T extends ScalarReference<infer U>
579
+ ? EntityDataProp<U, C>
580
+ : T extends {
581
+ __runtime?: infer Runtime;
582
+ __raw?: infer Raw;
583
+ }
584
+ ? C extends true
585
+ ? Raw
586
+ : Runtime
587
+ : T extends ReferenceShape<infer U>
588
+ ? EntityDataNested<U, C>
589
+ : T extends CollectionShape<infer U>
590
+ ? U | U[] | EntityDataNested<U & object, C> | EntityDataNested<U & object, C>[]
591
+ : T extends readonly (infer U)[]
592
+ ? U extends NonArrayObject
593
+ ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[]
594
+ : U[] | EntityDataNested<U, C>[]
595
+ : EntityDataNested<T, C>;
419
596
  /** Like `EntityDataProp` but used in `RequiredEntityData` context with required/optional key distinction. */
420
- 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 ScalarReference<infer U> ? RequiredEntityDataProp<U, O, C> : T extends {
421
- __runtime?: infer Runtime;
422
- __raw?: infer Raw;
423
- } ? C extends true ? Raw : Runtime : T extends ReferenceShape<infer U> ? RequiredEntityDataNested<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>;
597
+ export type RequiredEntityDataProp<T, O, C extends boolean> = T extends Date
598
+ ? string | Date
599
+ : Exclude<T, null> extends RequiredNullable.Brand
600
+ ? T | null
601
+ : T extends Scalar
602
+ ? T
603
+ : T extends ScalarReference<infer U>
604
+ ? RequiredEntityDataProp<U, O, C>
605
+ : T extends {
606
+ __runtime?: infer Runtime;
607
+ __raw?: infer Raw;
608
+ }
609
+ ? C extends true
610
+ ? Raw
611
+ : Runtime
612
+ : T extends ReferenceShape<infer U>
613
+ ? RequiredEntityDataNested<U, O, C>
614
+ : T extends CollectionShape<infer U>
615
+ ? U | U[] | RequiredEntityDataNested<U & object, O, C> | RequiredEntityDataNested<U & object, O, C>[]
616
+ : T extends readonly (infer U)[]
617
+ ? U extends NonArrayObject
618
+ ? U | U[] | RequiredEntityDataNested<U, O, C> | RequiredEntityDataNested<U, O, C>[]
619
+ : U[] | RequiredEntityDataNested<U, O, C>[]
620
+ : RequiredEntityDataNested<T, O, C>;
424
621
  /** Nested entity data shape for embedded or related entities within `EntityData`. */
425
- export type EntityDataNested<T, C extends boolean = false> = T extends undefined ? never : T extends any[] ? Readonly<T> : EntityData<T, C> | ExpandEntityProp<T, C>;
622
+ export type EntityDataNested<T, C extends boolean = false> = T extends undefined
623
+ ? never
624
+ : T extends any[]
625
+ ? Readonly<T>
626
+ : EntityData<T, C> | ExpandEntityProp<T, C>;
426
627
  type UnwrapScalarRef<T> = T extends ScalarReference<infer U> ? U : T;
427
- type EntityDataItem<T, C extends boolean> = C extends false ? UnwrapScalarRef<T> | EntityDataProp<T, C> | Raw | null : EntityDataProp<T, C> | Raw | null;
628
+ type EntityDataItem<T, C extends boolean> = C extends false
629
+ ? UnwrapScalarRef<T> | EntityDataProp<T, C> | Raw | null
630
+ : EntityDataProp<T, C> | Raw | null;
428
631
  /** Nested entity data shape used within `RequiredEntityData` for embedded or related entities. */
429
- export type RequiredEntityDataNested<T, O, C extends boolean> = T extends any[] ? Readonly<T> : RequiredEntityData<T, O> | ExpandRequiredEntityProp<T, O, C>;
430
- type ExplicitlyOptionalProps<T> = (T extends {
431
- [OptionalProps]?: infer K;
432
- } ? K : never) | ({
433
- [K in keyof T]: T[K] extends Opt ? K : never;
434
- }[keyof T] & {});
632
+ export type RequiredEntityDataNested<T, O, C extends boolean> = T extends any[]
633
+ ? Readonly<T>
634
+ : RequiredEntityData<T, O> | ExpandRequiredEntityProp<T, O, C>;
635
+ type ExplicitlyOptionalProps<T> =
636
+ | (T extends {
637
+ [OptionalProps]?: infer K;
638
+ }
639
+ ? K
640
+ : never)
641
+ | ({
642
+ [K in keyof T]: T[K] extends Opt ? K : never;
643
+ }[keyof T] & {});
435
644
  type NullableKeys<T, V = null> = {
436
- [K in keyof T]: unknown extends T[K] ? never : V extends T[K] ? K : never;
645
+ [K in keyof T]: unknown extends T[K] ? never : V extends T[K] ? K : never;
437
646
  }[keyof T];
438
647
  type RequiredNullableKeys<T> = {
439
- [K in keyof T]: Exclude<T[K], null> extends RequiredNullable.Brand ? K : never;
648
+ [K in keyof T]: Exclude<T[K], null> extends RequiredNullable.Brand ? K : never;
440
649
  }[keyof T];
441
- type ProbablyOptionalProps<T> = PrimaryProperty<T> | ExplicitlyOptionalProps<T> | Exclude<NonNullable<NullableKeys<T, null | undefined>>, RequiredNullableKeys<T>>;
442
- 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;
650
+ type ProbablyOptionalProps<T> =
651
+ | PrimaryProperty<T>
652
+ | ExplicitlyOptionalProps<T>
653
+ | Exclude<NonNullable<NullableKeys<T, null | undefined>>, RequiredNullableKeys<T>>;
654
+ type IsOptional<T, K extends keyof T, I> = T[K] extends CollectionShape
655
+ ? true
656
+ : ExtractType<T[K]> extends I
657
+ ? true
658
+ : K extends ProbablyOptionalProps<T>
659
+ ? true
660
+ : false;
443
661
  type RequiredKeys<T, K extends keyof T, I> = IsOptional<T, K, I> extends false ? CleanKeys<T, K> : never;
444
662
  type OptionalKeys<T, K extends keyof T, I> = IsOptional<T, K, I> extends false ? never : CleanKeys<T, K>;
445
663
  /** Data shape for creating or updating entities. All properties are optional. Used in `em.create()` and `em.assign()`. */
446
664
  export type EntityData<T, C extends boolean = false> = {
447
- [K in EntityKey<T>]?: EntityDataItem<T[K] & {}, C>;
665
+ [K in EntityKey<T>]?: EntityDataItem<T[K] & {}, C>;
448
666
  };
449
667
  /**
450
668
  * Data shape for `em.create()` with required/optional distinction based on entity metadata.
@@ -452,64 +670,130 @@ export type EntityData<T, C extends boolean = false> = {
452
670
  * `I` excludes additional types from being required (used for inverse side of relations).
453
671
  */
454
672
  export type RequiredEntityData<T, I = never, C extends boolean = false> = {
455
- [K in keyof T as RequiredKeys<T, K, I>]: T[K] | RequiredEntityDataProp<T[K], T, C> | Primary<T[K]> | PolymorphicPrimary<T[K]> | Raw;
673
+ [K in keyof T as RequiredKeys<T, K, I>]:
674
+ | T[K]
675
+ | RequiredEntityDataProp<T[K], T, C>
676
+ | Primary<T[K]>
677
+ | PolymorphicPrimary<T[K]>
678
+ | Raw;
456
679
  } & {
457
- [K in keyof T as OptionalKeys<T, K, I>]?: T[K] | RequiredEntityDataProp<T[K], T, C> | Primary<T[K]> | PolymorphicPrimary<T[K]> | Raw | null;
680
+ [K in keyof T as OptionalKeys<T, K, I>]?:
681
+ | T[K]
682
+ | RequiredEntityDataProp<T[K], T, C>
683
+ | Primary<T[K]>
684
+ | PolymorphicPrimary<T[K]>
685
+ | Raw
686
+ | null;
458
687
  };
459
688
  /** `EntityData<T>` extended with an index signature, allowing arbitrary additional properties. */
460
689
  export type EntityDictionary<T> = EntityData<T> & Record<any, any>;
461
690
  type ExtractEagerProps<T> = T extends {
462
- [EagerProps]?: infer PK;
463
- } ? PK : never;
691
+ [EagerProps]?: infer PK;
692
+ }
693
+ ? PK
694
+ : never;
464
695
  type Relation<T> = {
465
- [P in keyof T as T[P] extends unknown[] | Record<string | number | symbol, unknown> ? P : never]?: T[P];
696
+ [P in keyof T as T[P] extends unknown[] | Record<string | number | symbol, unknown> ? P : never]?: T[P];
466
697
  };
467
698
  /** Identity type that can be used to get around issues with cycles in bidirectional relations. It will disable reflect-metadata inference. */
468
699
  export type Rel<T> = T;
469
700
  /** Alias for `ScalarReference` (see {@apilink Ref}). */
470
701
  export type ScalarRef<T> = ScalarReference<T>;
471
702
  /** Alias for `Reference<T> & { id: number }` (see {@apilink Ref}). */
472
- export type EntityRef<T extends object> = true extends IsUnknown<PrimaryProperty<T>> ? Reference<T> : IsAny<T> extends true ? Reference<T> : {
473
- [K in PrimaryProperty<T> & keyof T]: T[K];
474
- } & Reference<T>;
703
+ export type EntityRef<T extends object> =
704
+ true extends IsUnknown<PrimaryProperty<T>>
705
+ ? Reference<T>
706
+ : IsAny<T> extends true
707
+ ? Reference<T>
708
+ : {
709
+ [K in PrimaryProperty<T> & keyof T]: T[K];
710
+ } & Reference<T>;
475
711
  /**
476
712
  * Ref type represents a `Reference` instance, and adds the primary keys to its prototype automatically, so you can do
477
713
  * `ref.id` instead of `ref.unwrap().id`. It resolves to either `ScalarRef` or `EntityRef`, based on the type argument.
478
714
  */
479
- export type Ref<T> = T extends any ? IsAny<T> extends true ? Reference<T & object> : T extends Scalar ? ScalarReference<T> : EntityRef<T & object> : never;
480
- type ExtractHiddenProps<T> = (T extends {
481
- [HiddenProps]?: infer K;
482
- } ? K : never) | ({
483
- [K in keyof T]: T[K] extends Primitive ? (T[K] extends Hidden ? K : never) : never;
484
- }[keyof T] & {});
715
+ export type Ref<T> = T extends any
716
+ ? IsAny<T> extends true
717
+ ? Reference<T & object>
718
+ : T extends Scalar
719
+ ? ScalarReference<T>
720
+ : EntityRef<T & object>
721
+ : never;
722
+ type ExtractHiddenProps<T> =
723
+ | (T extends {
724
+ [HiddenProps]?: infer K;
725
+ }
726
+ ? K
727
+ : never)
728
+ | ({
729
+ [K in keyof T]: T[K] extends Primitive ? (T[K] extends Hidden ? K : never) : never;
730
+ }[keyof T] & {});
485
731
  type ExcludeHidden<T, K extends keyof T> = K extends ExtractHiddenProps<T> ? never : K;
486
732
  type ExtractConfig<T> = T extends {
487
- [Config]?: infer K;
488
- } ? K & TypeConfig : TypeConfig;
733
+ [Config]?: infer K;
734
+ }
735
+ ? K & TypeConfig
736
+ : TypeConfig;
489
737
  type PreferExplicitConfig<E, I> = IsNever<E, I, E>;
490
- type PrimaryOrObject<T, U, C extends TypeConfig> = PreferExplicitConfig<C, ExtractConfig<T>>['forceObject'] extends true ? {
491
- [K in PrimaryProperty<U> & keyof U]: U[K];
492
- } : Primary<U>;
493
- type DTOWrapper<T, C extends TypeConfig, Flat extends boolean> = Flat extends true ? EntityDTOFlat<T, C> : EntityDTO<T, C>;
738
+ type PrimaryOrObject<T, U, C extends TypeConfig> = PreferExplicitConfig<C, ExtractConfig<T>>['forceObject'] extends true
739
+ ? {
740
+ [K in PrimaryProperty<U> & keyof U]: U[K];
741
+ }
742
+ : Primary<U>;
743
+ type DTOWrapper<T, C extends TypeConfig, Flat extends boolean> = Flat extends true
744
+ ? EntityDTOFlat<T, C>
745
+ : EntityDTO<T, C>;
494
746
  /** Resolves the serialized (DTO) type for a single entity property. Unwraps references, collections, and custom serialized types. */
495
- export type EntityDTOProp<E, T, C extends TypeConfig = never, Flat extends boolean = false> = T extends Scalar ? T : T extends ScalarReference<infer U> ? U : T extends {
496
- __serialized?: infer U;
497
- } ? IsUnknown<U> extends false ? U : T : T extends LoadedReferenceShape<infer U> ? DTOWrapper<U, C, Flat> : T extends ReferenceShape<infer U> ? PrimaryOrObject<E, U, C> : T extends LoadedCollectionShape<infer U> ? DTOWrapper<U & object, C, Flat>[] : T extends CollectionShape<infer U> ? PrimaryOrObject<E, U & object, C>[] : T extends readonly (infer U)[] ? U extends Scalar ? T : EntityDTOProp<E, U, C, Flat>[] : T extends Relation<T> ? DTOWrapper<T, C, Flat> : T;
747
+ export type EntityDTOProp<E, T, C extends TypeConfig = never, Flat extends boolean = false> = T extends Scalar
748
+ ? T
749
+ : T extends ScalarReference<infer U>
750
+ ? U
751
+ : T extends {
752
+ __serialized?: infer U;
753
+ }
754
+ ? IsUnknown<U> extends false
755
+ ? U
756
+ : T
757
+ : T extends LoadedReferenceShape<infer U>
758
+ ? DTOWrapper<U, C, Flat>
759
+ : T extends ReferenceShape<infer U>
760
+ ? PrimaryOrObject<E, U, C>
761
+ : T extends LoadedCollectionShape<infer U>
762
+ ? DTOWrapper<U & object, C, Flat>[]
763
+ : T extends CollectionShape<infer U>
764
+ ? PrimaryOrObject<E, U & object, C>[]
765
+ : T extends readonly (infer U)[]
766
+ ? U extends Scalar
767
+ ? T
768
+ : EntityDTOProp<E, U, C, Flat>[]
769
+ : T extends Relation<T>
770
+ ? DTOWrapper<T, C, Flat>
771
+ : T;
498
772
  type UnwrapLoadedEntity<T> = T extends {
499
- [__loadedType]?: infer U;
500
- } ? NonNullable<U> : T;
773
+ [__loadedType]?: infer U;
774
+ }
775
+ ? NonNullable<U>
776
+ : T;
501
777
  type DTOProbablyOptionalProps<T> = NonNullable<NullableKeys<UnwrapLoadedEntity<T>, undefined>>;
502
- type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollectionShape ? false : K extends PrimaryProperty<UnwrapLoadedEntity<T>> ? false : K extends DTOProbablyOptionalProps<T> ? true : false;
503
- type DTORequiredKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? ExcludeHidden<T, K> & CleanKeys<T, K> : never;
504
- type DTOOptionalKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? never : ExcludeHidden<T, K> & CleanKeys<T, K>;
778
+ type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollectionShape
779
+ ? false
780
+ : K extends PrimaryProperty<UnwrapLoadedEntity<T>>
781
+ ? false
782
+ : K extends DTOProbablyOptionalProps<T>
783
+ ? true
784
+ : false;
785
+ type DTORequiredKeys<T, K extends keyof T> =
786
+ DTOIsOptional<T, K> extends false ? ExcludeHidden<T, K> & CleanKeys<T, K> : never;
787
+ type DTOOptionalKeys<T, K extends keyof T> =
788
+ DTOIsOptional<T, K> extends false ? never : ExcludeHidden<T, K> & CleanKeys<T, K>;
505
789
  /**
506
790
  * Plain object (DTO) representation of an entity as returned by `toObject()` / `toPOJO()`.
507
791
  * Unwraps references to PKs, collections to arrays, and respects hidden properties.
508
792
  */
509
793
  export type EntityDTO<T, C extends TypeConfig = never> = {
510
- [K in keyof T as DTORequiredKeys<T, K>]: EntityDTOProp<T, T[K], C> | AddOptional<T[K]>;
794
+ [K in keyof T as DTORequiredKeys<T, K>]: EntityDTOProp<T, T[K], C> | AddOptional<T[K]>;
511
795
  } & {
512
- [K in keyof T as DTOOptionalKeys<T, K>]?: EntityDTOProp<T, T[K], C> | AddOptional<T[K]>;
796
+ [K in keyof T as DTOOptionalKeys<T, K>]?: EntityDTOProp<T, T[K], C> | AddOptional<T[K]>;
513
797
  };
514
798
  /**
515
799
  * @internal
@@ -519,7 +803,7 @@ export type EntityDTO<T, C extends TypeConfig = never> = {
519
803
  * function parameter type where generic assignability checks are needed.
520
804
  */
521
805
  export type EntityDTOFlat<T, C extends TypeConfig = never> = {
522
- [K in keyof T as ExcludeHidden<T, K> & CleanKeys<T, K>]: EntityDTOProp<T, T[K], C, true> | AddOptional<T[K]>;
806
+ [K in keyof T as ExcludeHidden<T, K> & CleanKeys<T, K>]: EntityDTOProp<T, T[K], C, true> | AddOptional<T[K]>;
523
807
  };
524
808
  /**
525
809
  * @internal
@@ -528,38 +812,81 @@ export type EntityDTOFlat<T, C extends TypeConfig = never> = {
528
812
  */
529
813
  type SerializeTopHints<H extends string> = H extends `${infer Top}.${string}` ? Top : H;
530
814
  type SerializeSubHints<K extends string, H extends string> = H extends `${K}.${infer Rest}` ? Rest : never;
531
- type SerializeSubFields<K extends string, F extends string> = K extends F ? '*' : [F extends `${K & string}.${infer Rest}` ? Rest : never] extends [never] ? '*' : F extends `${K & string}.${infer Rest}` ? Rest : never;
532
- type SerializeFieldsFilter<T, K extends keyof T, F extends string> = K extends Prefix<T, F> | PrimaryProperty<T> ? K : never;
533
- type SerializePropValue<T, K extends keyof T, H extends string, C extends TypeConfig = never> = K & string extends SerializeTopHints<H> ? NonNullable<T[K]> extends CollectionShape<infer U> ? SerializeDTO<U & object, SerializeSubHints<K & string, H>, never, C>[] : SerializeDTO<ExpandProperty<T[K]>, SerializeSubHints<K & string, H>, never, C> | Extract<T[K], null | undefined> : EntityDTOProp<T, T[K], C>;
534
- type SerializePropValueWithFields<T, K extends keyof T, H extends string, C extends TypeConfig, F extends string> = K & string extends SerializeTopHints<H> ? NonNullable<T[K]> extends CollectionShape<infer U> ? SerializeDTO<U & object, SerializeSubHints<K & string, H>, never, C, SerializeSubFields<K & string, F>>[] : SerializeDTO<ExpandProperty<T[K]>, SerializeSubHints<K & string, H>, never, C, SerializeSubFields<K & string, F>> | Extract<T[K], null | undefined> : EntityDTOProp<T, T[K], C>;
815
+ type SerializeSubFields<K extends string, F extends string> = K extends F
816
+ ? '*'
817
+ : [F extends `${K & string}.${infer Rest}` ? Rest : never] extends [never]
818
+ ? '*'
819
+ : F extends `${K & string}.${infer Rest}`
820
+ ? Rest
821
+ : never;
822
+ type SerializeFieldsFilter<T, K extends keyof T, F extends string> = K extends Prefix<T, F> | PrimaryProperty<T>
823
+ ? K
824
+ : never;
825
+ type SerializePropValue<T, K extends keyof T, H extends string, C extends TypeConfig = never> =
826
+ K & string extends SerializeTopHints<H>
827
+ ? NonNullable<T[K]> extends CollectionShape<infer U>
828
+ ? SerializeDTO<U & object, SerializeSubHints<K & string, H>, never, C>[]
829
+ : SerializeDTO<ExpandProperty<T[K]>, SerializeSubHints<K & string, H>, never, C> | Extract<T[K], null | undefined>
830
+ : EntityDTOProp<T, T[K], C>;
831
+ type SerializePropValueWithFields<T, K extends keyof T, H extends string, C extends TypeConfig, F extends string> =
832
+ K & string extends SerializeTopHints<H>
833
+ ? NonNullable<T[K]> extends CollectionShape<infer U>
834
+ ? SerializeDTO<U & object, SerializeSubHints<K & string, H>, never, C, SerializeSubFields<K & string, F>>[]
835
+ :
836
+ | SerializeDTO<
837
+ ExpandProperty<T[K]>,
838
+ SerializeSubHints<K & string, H>,
839
+ never,
840
+ C,
841
+ SerializeSubFields<K & string, F>
842
+ >
843
+ | Extract<T[K], null | undefined>
844
+ : EntityDTOProp<T, T[K], C>;
535
845
  /**
536
846
  * Return type of `serialize()`. Combines Loaded + EntityDTO in a single pass for better performance.
537
847
  * Respects populate hints (`H`), exclude hints (`E`), and fields hints (`F`).
538
848
  */
539
- export type SerializeDTO<T, H extends string = never, E extends string = never, C extends TypeConfig = never, F extends string = '*'> = string extends H ? EntityDTOFlat<T, C> : [F] extends ['*'] ? {
540
- [K in keyof T as ExcludeHidden<T, K> & CleanKeys<T, K> & (IsNever<E> extends true ? K : Exclude<K, E>)]: SerializePropValue<T, K, H, C> | Extract<T[K], null | undefined>;
541
- } : {
542
- [K in keyof T as ExcludeHidden<T, K> & CleanKeys<T, K> & (IsNever<E> extends true ? K : Exclude<K, E>) & SerializeFieldsFilter<T, K, F>]: SerializePropValueWithFields<T, K, H, C, F> | Extract<T[K], null | undefined>;
543
- };
849
+ export type SerializeDTO<
850
+ T,
851
+ H extends string = never,
852
+ E extends string = never,
853
+ C extends TypeConfig = never,
854
+ F extends string = '*',
855
+ > = string extends H
856
+ ? EntityDTOFlat<T, C>
857
+ : [F] extends ['*']
858
+ ? {
859
+ [K in keyof T as ExcludeHidden<T, K> & CleanKeys<T, K> & (IsNever<E> extends true ? K : Exclude<K, E>)]:
860
+ | SerializePropValue<T, K, H, C>
861
+ | Extract<T[K], null | undefined>;
862
+ }
863
+ : {
864
+ [K in keyof T as ExcludeHidden<T, K> &
865
+ CleanKeys<T, K> &
866
+ (IsNever<E> extends true ? K : Exclude<K, E>) &
867
+ SerializeFieldsFilter<T, K, F>]:
868
+ | SerializePropValueWithFields<T, K, H, C, F>
869
+ | Extract<T[K], null | undefined>;
870
+ };
544
871
  type TargetKeys<T> = T extends EntityClass<infer P> ? keyof P : keyof T;
545
872
  type PropertyName<T> = IsUnknown<T> extends false ? TargetKeys<T> : string;
546
873
  /** Table reference object passed to formula callbacks, including alias and schema information. */
547
874
  export type FormulaTable = {
548
- alias: string;
549
- name: string;
550
- schema?: string;
551
- qualifiedName: string;
552
- toString: () => string;
875
+ alias: string;
876
+ name: string;
877
+ schema?: string;
878
+ qualifiedName: string;
879
+ toString: () => string;
553
880
  };
554
881
  /**
555
882
  * Table reference for schema callbacks (indexes, checks, generated columns).
556
883
  * Unlike FormulaTable, this has no alias since schema generation doesn't use query aliases.
557
884
  */
558
885
  export type SchemaTable = {
559
- name: string;
560
- schema?: string;
561
- qualifiedName: string;
562
- toString: () => string;
886
+ name: string;
887
+ schema?: string;
888
+ qualifiedName: string;
889
+ toString: () => string;
563
890
  };
564
891
  /**
565
892
  * Column mapping for formula callbacks. Maps property names to fully-qualified alias.fieldName.
@@ -572,7 +899,7 @@ export type SchemaTable = {
572
899
  * formula: cols => `${cols}.first_name || ' ' || ${cols}.last_name`
573
900
  */
574
901
  export type FormulaColumns<T> = Record<PropertyName<T>, string> & {
575
- toString(): string;
902
+ toString(): string;
576
903
  };
577
904
  /**
578
905
  * Column mapping for schema callbacks (indexes, checks, generated columns).
@@ -581,7 +908,11 @@ export type FormulaColumns<T> = Record<PropertyName<T>, string> & {
581
908
  */
582
909
  export type SchemaColumns<T> = Record<PropertyName<T>, string>;
583
910
  /** Callback for custom index expressions. Receives column mappings, table info, and the index name. */
584
- export type IndexCallback<T> = (columns: Record<PropertyName<T>, string>, table: SchemaTable, indexName: string) => string | Raw;
911
+ export type IndexCallback<T> = (
912
+ columns: Record<PropertyName<T>, string>,
913
+ table: SchemaTable,
914
+ indexName: string,
915
+ ) => string | Raw;
585
916
  /** Callback for computed (formula) properties. Receives column mappings and table info, returns a SQL expression. */
586
917
  export type FormulaCallback<T> = (columns: FormulaColumns<T>, table: FormulaTable) => string | Raw;
587
918
  /** Callback for CHECK constraint expressions. Receives column mappings and table info. */
@@ -590,580 +921,698 @@ export type CheckCallback<T> = (columns: Record<PropertyName<T>, string>, table:
590
921
  export type GeneratedColumnCallback<T> = (columns: Record<PropertyName<T>, string>, table: SchemaTable) => string | Raw;
591
922
  /** Definition of a CHECK constraint on a table or property. */
592
923
  export interface CheckConstraint<T = any> {
593
- name?: string;
594
- property?: string;
595
- expression: string | Raw | CheckCallback<T>;
924
+ name?: string;
925
+ property?: string;
926
+ expression: string | Raw | CheckCallback<T>;
596
927
  }
597
928
  /** Branded string that accepts any string value while preserving autocompletion for known literals. */
598
929
  export type AnyString = string & {};
599
930
  /** Describes a single property (column, relation, or embedded) within an entity's metadata. */
600
931
  export interface EntityProperty<Owner = any, Target = any> {
601
- name: EntityKey<Owner>;
602
- entity: () => EntityName<Owner>;
603
- target: EntityClass<Target>;
604
- type: keyof typeof types | AnyString;
605
- runtimeType: 'number' | 'string' | 'boolean' | 'bigint' | 'Buffer' | 'Date' | 'object' | 'any' | AnyString;
606
- targetMeta?: EntityMetadata<Target>;
607
- columnTypes: string[];
608
- generated?: string | Raw | GeneratedColumnCallback<Owner>;
609
- customType?: Type<any>;
610
- customTypes: (Type<any> | undefined)[];
611
- hasConvertToJSValueSQL: boolean;
612
- hasConvertToDatabaseValueSQL: boolean;
613
- autoincrement?: boolean;
614
- returning?: boolean;
615
- primary?: boolean;
616
- serializedPrimaryKey: boolean;
617
- groups?: string[];
618
- lazy?: boolean;
619
- array?: boolean;
620
- length?: number;
621
- precision?: number;
622
- scale?: number;
623
- kind: ReferenceKind;
624
- ref?: boolean;
625
- fieldNames: string[];
626
- fieldNameRaw?: string;
627
- default?: string | number | boolean | null;
628
- defaultRaw?: string;
629
- formula?: FormulaCallback<Owner>;
630
- filters?: FilterOptions;
631
- prefix?: string | boolean;
632
- prefixMode?: EmbeddedPrefixMode;
633
- embedded?: [EntityKey<Owner>, EntityKey<Owner>];
634
- embeddedPath?: string[];
635
- embeddable: EntityClass<Owner>;
636
- embeddedProps: Dictionary<EntityProperty>;
637
- discriminatorColumn?: string;
638
- discriminator?: string;
639
- polymorphic?: boolean;
640
- polymorphTargets?: EntityMetadata[];
641
- discriminatorMap?: Dictionary<EntityClass<Target>>;
642
- discriminatorValue?: string;
643
- object?: boolean;
644
- index?: boolean | string;
645
- unique?: boolean | string;
646
- nullable?: boolean;
647
- inherited?: boolean;
648
- renamedFrom?: string;
649
- stiMerged?: boolean;
650
- stiFieldNames?: string[];
651
- stiFieldNameMap?: Dictionary<string>;
652
- unsigned?: boolean;
653
- mapToPk?: boolean;
654
- persist?: boolean;
655
- hydrate?: boolean;
656
- hidden?: boolean;
657
- enum?: boolean;
658
- items?: (number | string)[];
659
- nativeEnumName?: string;
660
- version?: boolean;
661
- concurrencyCheck?: boolean;
662
- eager?: boolean;
663
- setter?: boolean;
664
- getter?: boolean;
665
- getterName?: keyof Owner;
666
- accessor?: EntityKey<Owner>;
667
- cascade: Cascade[];
668
- orphanRemoval?: boolean;
669
- onCreate?: (entity: Owner, em: EntityManager) => any;
670
- onUpdate?: (entity: Owner, em: EntityManager) => any;
671
- deleteRule?: 'cascade' | 'no action' | 'set null' | 'set default' | AnyString;
672
- updateRule?: 'cascade' | 'no action' | 'set null' | 'set default' | AnyString;
673
- strategy?: LoadStrategy;
674
- owner: boolean;
675
- inversedBy: EntityKey<Target>;
676
- mappedBy: EntityKey<Target>;
677
- where?: FilterQuery<Target>;
678
- orderBy?: QueryOrderMap<Owner> | QueryOrderMap<Owner>[];
679
- customOrder?: string[] | number[] | boolean[];
680
- fixedOrder?: boolean;
681
- fixedOrderColumn?: string;
682
- pivotTable: string;
683
- pivotEntity: EntityClass<Target>;
684
- joinColumns: string[];
685
- ownColumns: string[];
686
- inverseJoinColumns: string[];
687
- referencedColumnNames: string[];
688
- referencedTableName: string;
689
- referencedPKs: EntityKey<Owner>[];
690
- targetKey?: string;
691
- serializer?: (value: any, options?: SerializeOptions<any>) => any;
692
- serializedName?: string;
693
- comment?: string;
694
- /** mysql only */
695
- extra?: string;
696
- userDefined?: boolean;
697
- optional?: boolean;
698
- ignoreSchemaChanges?: ('type' | 'extra' | 'default')[];
699
- deferMode?: DeferMode;
700
- createForeignKeyConstraint: boolean;
701
- foreignKeyName?: string;
932
+ name: EntityKey<Owner>;
933
+ entity: () => EntityName<Owner>;
934
+ target: EntityClass<Target>;
935
+ type: keyof typeof types | AnyString;
936
+ runtimeType: 'number' | 'string' | 'boolean' | 'bigint' | 'Buffer' | 'Date' | 'object' | 'any' | AnyString;
937
+ targetMeta?: EntityMetadata<Target>;
938
+ columnTypes: string[];
939
+ generated?: string | Raw | GeneratedColumnCallback<Owner>;
940
+ customType?: Type<any>;
941
+ customTypes: (Type<any> | undefined)[];
942
+ hasConvertToJSValueSQL: boolean;
943
+ hasConvertToDatabaseValueSQL: boolean;
944
+ autoincrement?: boolean;
945
+ returning?: boolean;
946
+ primary?: boolean;
947
+ serializedPrimaryKey: boolean;
948
+ groups?: string[];
949
+ lazy?: boolean;
950
+ array?: boolean;
951
+ length?: number;
952
+ precision?: number;
953
+ scale?: number;
954
+ kind: ReferenceKind;
955
+ ref?: boolean;
956
+ fieldNames: string[];
957
+ fieldNameRaw?: string;
958
+ default?: string | number | boolean | null;
959
+ defaultRaw?: string;
960
+ formula?: FormulaCallback<Owner>;
961
+ filters?: FilterOptions;
962
+ prefix?: string | boolean;
963
+ prefixMode?: EmbeddedPrefixMode;
964
+ embedded?: [EntityKey<Owner>, EntityKey<Owner>];
965
+ embeddedPath?: string[];
966
+ embeddable: EntityClass<Owner>;
967
+ embeddedProps: Dictionary<EntityProperty>;
968
+ discriminatorColumn?: string;
969
+ discriminator?: string;
970
+ polymorphic?: boolean;
971
+ polymorphTargets?: EntityMetadata[];
972
+ discriminatorMap?: Dictionary<EntityClass<Target>>;
973
+ discriminatorValue?: string;
974
+ object?: boolean;
975
+ index?: boolean | string;
976
+ unique?: boolean | string;
977
+ nullable?: boolean;
978
+ inherited?: boolean;
979
+ renamedFrom?: string;
980
+ stiMerged?: boolean;
981
+ stiFieldNames?: string[];
982
+ stiFieldNameMap?: Dictionary<string>;
983
+ unsigned?: boolean;
984
+ mapToPk?: boolean;
985
+ persist?: boolean;
986
+ hydrate?: boolean;
987
+ hidden?: boolean;
988
+ enum?: boolean;
989
+ items?: (number | string)[];
990
+ nativeEnumName?: string;
991
+ version?: boolean;
992
+ concurrencyCheck?: boolean;
993
+ eager?: boolean;
994
+ setter?: boolean;
995
+ getter?: boolean;
996
+ getterName?: keyof Owner;
997
+ accessor?: EntityKey<Owner>;
998
+ cascade: Cascade[];
999
+ orphanRemoval?: boolean;
1000
+ onCreate?: (entity: Owner, em: EntityManager) => any;
1001
+ onUpdate?: (entity: Owner, em: EntityManager) => any;
1002
+ deleteRule?: 'cascade' | 'no action' | 'set null' | 'set default' | AnyString;
1003
+ updateRule?: 'cascade' | 'no action' | 'set null' | 'set default' | AnyString;
1004
+ strategy?: LoadStrategy;
1005
+ owner: boolean;
1006
+ inversedBy: EntityKey<Target>;
1007
+ mappedBy: EntityKey<Target>;
1008
+ where?: FilterQuery<Target>;
1009
+ orderBy?: QueryOrderMap<Owner> | QueryOrderMap<Owner>[];
1010
+ customOrder?: string[] | number[] | boolean[];
1011
+ fixedOrder?: boolean;
1012
+ fixedOrderColumn?: string;
1013
+ pivotTable: string;
1014
+ pivotEntity: EntityClass<Target>;
1015
+ joinColumns: string[];
1016
+ ownColumns: string[];
1017
+ inverseJoinColumns: string[];
1018
+ referencedColumnNames: string[];
1019
+ referencedTableName: string;
1020
+ referencedPKs: EntityKey<Owner>[];
1021
+ targetKey?: string;
1022
+ serializer?: (value: any, options?: SerializeOptions<any>) => any;
1023
+ serializedName?: string;
1024
+ comment?: string;
1025
+ /** mysql only */
1026
+ extra?: string;
1027
+ userDefined?: boolean;
1028
+ optional?: boolean;
1029
+ ignoreSchemaChanges?: ('type' | 'extra' | 'default')[];
1030
+ deferMode?: DeferMode;
1031
+ createForeignKeyConstraint: boolean;
1032
+ foreignKeyName?: string;
702
1033
  }
703
1034
  /**
704
1035
  * Runtime metadata for an entity, holding its properties, relations, indexes, hooks, and more.
705
1036
  * Created during metadata discovery and used throughout the ORM lifecycle.
706
1037
  */
707
1038
  export declare class EntityMetadata<Entity = any, Class extends EntityCtor<Entity> = EntityCtor<Entity>> {
708
- private static counter;
709
- readonly _id: number;
710
- readonly propertyOrder: Map<string, number>;
711
- constructor(meta?: Partial<EntityMetadata>);
712
- addProperty(prop: Partial<EntityProperty<Entity>>): void;
713
- removeProperty(name: string, sync?: boolean): void;
714
- getPrimaryProps(flatten?: boolean): EntityProperty<Entity>[];
715
- getPrimaryProp(): EntityProperty<Entity>;
716
- /**
717
- * Creates a mapping from property names to field names.
718
- * @param alias - Optional alias to prefix field names. Can be a string (same for all) or a function (per-property).
719
- * When provided, also adds toString() returning the alias for backwards compatibility with formulas.
720
- * @param toStringAlias - Optional alias to return from toString(). Defaults to `alias` when it's a string.
721
- */
722
- createColumnMappingObject(alias?: string | ((prop: EntityProperty<Entity>) => string), toStringAlias?: string): FormulaColumns<Entity>;
723
- /**
724
- * Creates a column mapping for schema callbacks (indexes, checks, generated columns).
725
- * For TPT entities, only includes properties that belong to the current table (ownProps).
726
- */
727
- createSchemaColumnMappingObject(): SchemaColumns<Entity>;
728
- get tableName(): string;
729
- set tableName(name: string);
730
- get uniqueName(): string;
731
- sync(initIndexes?: boolean, config?: Configuration): void;
732
- private initIndexes;
733
- /** @internal */
734
- clone(): this;
1039
+ private static counter;
1040
+ readonly _id: number;
1041
+ readonly propertyOrder: Map<string, number>;
1042
+ constructor(meta?: Partial<EntityMetadata>);
1043
+ addProperty(prop: Partial<EntityProperty<Entity>>): void;
1044
+ removeProperty(name: string, sync?: boolean): void;
1045
+ getPrimaryProps(flatten?: boolean): EntityProperty<Entity>[];
1046
+ getPrimaryProp(): EntityProperty<Entity>;
1047
+ /**
1048
+ * Creates a mapping from property names to field names.
1049
+ * @param alias - Optional alias to prefix field names. Can be a string (same for all) or a function (per-property).
1050
+ * When provided, also adds toString() returning the alias for backwards compatibility with formulas.
1051
+ * @param toStringAlias - Optional alias to return from toString(). Defaults to `alias` when it's a string.
1052
+ */
1053
+ createColumnMappingObject(
1054
+ alias?: string | ((prop: EntityProperty<Entity>) => string),
1055
+ toStringAlias?: string,
1056
+ ): FormulaColumns<Entity>;
1057
+ /**
1058
+ * Creates a column mapping for schema callbacks (indexes, checks, generated columns).
1059
+ * For TPT entities, only includes properties that belong to the current table (ownProps).
1060
+ */
1061
+ createSchemaColumnMappingObject(): SchemaColumns<Entity>;
1062
+ get tableName(): string;
1063
+ set tableName(name: string);
1064
+ get uniqueName(): string;
1065
+ sync(initIndexes?: boolean, config?: Configuration): void;
1066
+ private initIndexes;
1067
+ /** @internal */
1068
+ clone(): this;
735
1069
  }
736
1070
  /** Minimal column metadata with just a name and database type. */
737
1071
  export interface SimpleColumnMeta {
738
- name: string;
739
- type: string;
1072
+ name: string;
1073
+ type: string;
740
1074
  }
741
1075
  /** Abstract constructor type that matches both abstract and concrete entity classes. */
742
1076
  export type EntityCtor<T = any> = abstract new (...args: any[]) => T;
743
1077
  export interface EntityMetadata<Entity = any, Class extends EntityCtor<Entity> = EntityCtor<Entity>> {
744
- name?: string;
745
- className: string;
746
- tableName: string;
747
- schema?: string;
748
- pivotTable?: boolean;
749
- virtual?: boolean;
750
- /** True if this entity represents a database view (not a virtual entity). Accepts `{ materialized: true }` as input, normalized to `true` during sync. */
751
- view?: boolean | {
1078
+ name?: string;
1079
+ className: string;
1080
+ tableName: string;
1081
+ schema?: string;
1082
+ pivotTable?: boolean;
1083
+ virtual?: boolean;
1084
+ /** True if this entity represents a database view (not a virtual entity). Accepts `{ materialized: true }` as input, normalized to `true` during sync. */
1085
+ view?:
1086
+ | boolean
1087
+ | {
752
1088
  materialized?: boolean;
753
1089
  withData?: boolean;
754
- };
755
- /** True if this is a materialized view (PostgreSQL only). Requires `view: true`. */
756
- materialized?: boolean;
757
- /** For materialized views, whether data is populated on creation. Defaults to true. */
758
- withData?: boolean;
759
- expression?: string | ((em: any, where: ObjectQuery<Entity>, options: FindOptions<Entity, any, any, any>, stream?: boolean) => MaybePromise<Raw | object | string>);
760
- discriminatorColumn?: EntityKey<Entity> | AnyString;
761
- discriminatorValue?: number | string;
762
- discriminatorMap?: Dictionary<EntityClass>;
763
- embeddable: boolean;
764
- constructorParams?: (keyof Entity)[];
765
- forceConstructor: boolean;
766
- extends?: EntityName<Entity>;
767
- collection: string;
768
- path: string;
769
- primaryKeys: EntityKey<Entity>[];
770
- simplePK: boolean;
771
- compositePK: boolean;
772
- versionProperty: EntityKey<Entity>;
773
- concurrencyCheckKeys: Set<EntityKey<Entity>>;
774
- serializedPrimaryKey?: EntityKey<Entity>;
775
- properties: {
776
- [K in EntityKey<Entity>]: EntityProperty<Entity>;
777
- };
778
- props: EntityProperty<Entity>[];
779
- relations: EntityProperty<Entity>[];
780
- bidirectionalRelations: EntityProperty<Entity>[];
781
- referencingProperties: {
782
- meta: EntityMetadata<Entity>;
783
- prop: EntityProperty<Entity>;
784
- }[];
785
- comparableProps: EntityProperty<Entity>[];
786
- trackingProps: EntityProperty<Entity>[];
787
- hydrateProps: EntityProperty<Entity>[];
788
- validateProps: EntityProperty<Entity>[];
789
- uniqueProps: EntityProperty<Entity>[];
790
- getterProps: EntityProperty<Entity>[];
791
- indexes: {
792
- properties?: EntityKey<Entity> | EntityKey<Entity>[];
793
- name?: string;
794
- type?: string;
795
- options?: Dictionary;
796
- expression?: string | IndexCallback<Entity>;
797
- columns?: IndexColumnOptions[];
798
- include?: EntityKey<Entity> | EntityKey<Entity>[];
799
- fillFactor?: number;
800
- invisible?: boolean;
801
- disabled?: boolean;
802
- clustered?: boolean;
803
- }[];
804
- uniques: {
805
- properties?: EntityKey<Entity> | EntityKey<Entity>[];
806
- name?: string;
807
- options?: Dictionary;
808
- expression?: string | IndexCallback<Entity>;
809
- deferMode?: DeferMode | `${DeferMode}`;
810
- columns?: IndexColumnOptions[];
811
- include?: EntityKey<Entity> | EntityKey<Entity>[];
812
- fillFactor?: number;
813
- disabled?: boolean;
814
- }[];
815
- checks: CheckConstraint<Entity>[];
816
- repositoryClass?: string;
817
- repository: () => EntityClass<EntityRepository<any>>;
818
- hooks: {
819
- [K in EventType]?: (keyof Entity | EventSubscriber<Entity>[EventType])[];
820
- };
821
- prototype: Entity;
822
- class: Class;
823
- abstract: boolean;
824
- filters: Dictionary<FilterDef>;
825
- comment?: string;
826
- selfReferencing?: boolean;
827
- hasUniqueProps?: boolean;
828
- readonly?: boolean;
829
- polymorphs?: EntityMetadata[];
830
- root: EntityMetadata<Entity>;
831
- definedProperties: Dictionary;
832
- /** For polymorphic M:N pivot tables, maps discriminator values to entity classes */
833
- polymorphicDiscriminatorMap?: Dictionary<EntityClass>;
834
- /** Inheritance type: 'sti' (Single Table Inheritance) or 'tpt' (Table-Per-Type). Only set on root entities. */
835
- inheritanceType?: 'sti' | 'tpt';
836
- /** For TPT: direct parent entity metadata (the entity this one extends). */
837
- tptParent?: EntityMetadata;
838
- /** For TPT: direct child entities (entities that extend this one). */
839
- tptChildren?: EntityMetadata[];
840
- /** For TPT: all non-abstract descendants, sorted by depth (deepest first). Precomputed during discovery. */
841
- allTPTDescendants?: EntityMetadata[];
842
- /** For TPT: synthetic property representing the join to the parent table (child PK → parent PK). */
843
- tptParentProp?: EntityProperty;
844
- /** For TPT: inverse of tptParentProp, used for joining from parent to child (parent PK → child PK). */
845
- tptInverseProp?: EntityProperty;
846
- /** For TPT: virtual discriminator property name (computed at query time, not persisted). */
847
- tptDiscriminatorColumn?: string;
848
- /** For TPT: properties defined only in THIS entity (not inherited from parent). */
849
- ownProps?: EntityProperty<Entity>[];
850
- hasTriggers?: boolean;
851
- /**
852
- * Default ordering for this entity. Applied when querying this entity directly
853
- * or when it's populated as a relation. Combined with other orderings based on precedence.
854
- */
855
- orderBy?: QueryOrderMap<Entity> | QueryOrderMap<Entity>[];
856
- /** @internal can be used for computed numeric cache keys */
857
- readonly _id: number;
1090
+ };
1091
+ /** True if this is a materialized view (PostgreSQL only). Requires `view: true`. */
1092
+ materialized?: boolean;
1093
+ /** For materialized views, whether data is populated on creation. Defaults to true. */
1094
+ withData?: boolean;
1095
+ expression?:
1096
+ | string
1097
+ | ((
1098
+ em: any,
1099
+ where: ObjectQuery<Entity>,
1100
+ options: FindOptions<Entity, any, any, any>,
1101
+ stream?: boolean,
1102
+ ) => MaybePromise<Raw | object | string>);
1103
+ discriminatorColumn?: EntityKey<Entity> | AnyString;
1104
+ discriminatorValue?: number | string;
1105
+ discriminatorMap?: Dictionary<EntityClass>;
1106
+ embeddable: boolean;
1107
+ constructorParams?: (keyof Entity)[];
1108
+ forceConstructor: boolean;
1109
+ extends?: EntityName<Entity>;
1110
+ collection: string;
1111
+ path: string;
1112
+ primaryKeys: EntityKey<Entity>[];
1113
+ simplePK: boolean;
1114
+ compositePK: boolean;
1115
+ versionProperty: EntityKey<Entity>;
1116
+ concurrencyCheckKeys: Set<EntityKey<Entity>>;
1117
+ serializedPrimaryKey?: EntityKey<Entity>;
1118
+ properties: {
1119
+ [K in EntityKey<Entity>]: EntityProperty<Entity>;
1120
+ };
1121
+ props: EntityProperty<Entity>[];
1122
+ relations: EntityProperty<Entity>[];
1123
+ bidirectionalRelations: EntityProperty<Entity>[];
1124
+ referencingProperties: {
1125
+ meta: EntityMetadata<Entity>;
1126
+ prop: EntityProperty<Entity>;
1127
+ }[];
1128
+ comparableProps: EntityProperty<Entity>[];
1129
+ trackingProps: EntityProperty<Entity>[];
1130
+ hydrateProps: EntityProperty<Entity>[];
1131
+ validateProps: EntityProperty<Entity>[];
1132
+ uniqueProps: EntityProperty<Entity>[];
1133
+ getterProps: EntityProperty<Entity>[];
1134
+ indexes: {
1135
+ properties?: EntityKey<Entity> | EntityKey<Entity>[];
1136
+ name?: string;
1137
+ type?: string;
1138
+ options?: Dictionary;
1139
+ expression?: string | IndexCallback<Entity>;
1140
+ columns?: IndexColumnOptions[];
1141
+ include?: EntityKey<Entity> | EntityKey<Entity>[];
1142
+ fillFactor?: number;
1143
+ invisible?: boolean;
1144
+ disabled?: boolean;
1145
+ clustered?: boolean;
1146
+ }[];
1147
+ uniques: {
1148
+ properties?: EntityKey<Entity> | EntityKey<Entity>[];
1149
+ name?: string;
1150
+ options?: Dictionary;
1151
+ expression?: string | IndexCallback<Entity>;
1152
+ deferMode?: DeferMode | `${DeferMode}`;
1153
+ columns?: IndexColumnOptions[];
1154
+ include?: EntityKey<Entity> | EntityKey<Entity>[];
1155
+ fillFactor?: number;
1156
+ disabled?: boolean;
1157
+ }[];
1158
+ checks: CheckConstraint<Entity>[];
1159
+ repositoryClass?: string;
1160
+ repository: () => EntityClass<EntityRepository<any>>;
1161
+ hooks: {
1162
+ [K in EventType]?: (keyof Entity | EventSubscriber<Entity>[EventType])[];
1163
+ };
1164
+ prototype: Entity;
1165
+ class: Class;
1166
+ abstract: boolean;
1167
+ filters: Dictionary<FilterDef>;
1168
+ comment?: string;
1169
+ selfReferencing?: boolean;
1170
+ hasUniqueProps?: boolean;
1171
+ readonly?: boolean;
1172
+ polymorphs?: EntityMetadata[];
1173
+ root: EntityMetadata<Entity>;
1174
+ definedProperties: Dictionary;
1175
+ /** For polymorphic M:N pivot tables, maps discriminator values to entity classes */
1176
+ polymorphicDiscriminatorMap?: Dictionary<EntityClass>;
1177
+ /** Inheritance type: 'sti' (Single Table Inheritance) or 'tpt' (Table-Per-Type). Only set on root entities. */
1178
+ inheritanceType?: 'sti' | 'tpt';
1179
+ /** For TPT: direct parent entity metadata (the entity this one extends). */
1180
+ tptParent?: EntityMetadata;
1181
+ /** For TPT: direct child entities (entities that extend this one). */
1182
+ tptChildren?: EntityMetadata[];
1183
+ /** For TPT: all non-abstract descendants, sorted by depth (deepest first). Precomputed during discovery. */
1184
+ allTPTDescendants?: EntityMetadata[];
1185
+ /** For TPT: synthetic property representing the join to the parent table (child PK → parent PK). */
1186
+ tptParentProp?: EntityProperty;
1187
+ /** For TPT: inverse of tptParentProp, used for joining from parent to child (parent PK → child PK). */
1188
+ tptInverseProp?: EntityProperty;
1189
+ /** For TPT: virtual discriminator property name (computed at query time, not persisted). */
1190
+ tptDiscriminatorColumn?: string;
1191
+ /** For TPT: properties defined only in THIS entity (not inherited from parent). */
1192
+ ownProps?: EntityProperty<Entity>[];
1193
+ hasTriggers?: boolean;
1194
+ /**
1195
+ * Default ordering for this entity. Applied when querying this entity directly
1196
+ * or when it's populated as a relation. Combined with other orderings based on precedence.
1197
+ */
1198
+ orderBy?: QueryOrderMap<Entity> | QueryOrderMap<Entity>[];
1199
+ /** @internal can be used for computed numeric cache keys */
1200
+ readonly _id: number;
858
1201
  }
859
1202
  /** Options for `ISchemaGenerator.create()`. */
860
1203
  export interface CreateSchemaOptions {
861
- wrap?: boolean;
862
- schema?: string;
1204
+ wrap?: boolean;
1205
+ schema?: string;
863
1206
  }
864
1207
  /** Options for `ISchemaGenerator.clear()` to truncate/clear database tables. */
865
1208
  export interface ClearDatabaseOptions {
866
- schema?: string;
867
- truncate?: boolean;
868
- clearIdentityMap?: boolean;
1209
+ schema?: string;
1210
+ truncate?: boolean;
1211
+ clearIdentityMap?: boolean;
869
1212
  }
870
1213
  /** Options for `ISchemaGenerator.ensureDatabase()` which creates and optionally clears the database. */
871
1214
  export interface EnsureDatabaseOptions extends CreateSchemaOptions, ClearDatabaseOptions {
872
- clear?: boolean;
873
- create?: boolean;
874
- forceCheck?: boolean;
1215
+ clear?: boolean;
1216
+ create?: boolean;
1217
+ forceCheck?: boolean;
875
1218
  }
876
1219
  /** Options for `ISchemaGenerator.drop()`. */
877
1220
  export interface DropSchemaOptions {
878
- wrap?: boolean;
879
- dropMigrationsTable?: boolean;
880
- dropForeignKeys?: boolean;
881
- dropDb?: boolean;
882
- schema?: string;
1221
+ wrap?: boolean;
1222
+ dropMigrationsTable?: boolean;
1223
+ dropForeignKeys?: boolean;
1224
+ dropDb?: boolean;
1225
+ schema?: string;
883
1226
  }
884
1227
  /** Options for `ISchemaGenerator.update()` to apply incremental schema changes. */
885
1228
  export interface UpdateSchemaOptions<DatabaseSchema = unknown> {
886
- wrap?: boolean;
887
- safe?: boolean;
888
- dropDb?: boolean;
889
- dropTables?: boolean;
890
- schema?: string;
891
- fromSchema?: DatabaseSchema;
1229
+ wrap?: boolean;
1230
+ safe?: boolean;
1231
+ dropDb?: boolean;
1232
+ dropTables?: boolean;
1233
+ schema?: string;
1234
+ fromSchema?: DatabaseSchema;
892
1235
  }
893
1236
  /** Options for `ISchemaGenerator.refresh()` which drops and recreates the schema. */
894
1237
  export interface RefreshDatabaseOptions extends CreateSchemaOptions {
895
- ensureIndexes?: boolean;
896
- dropDb?: boolean;
897
- createSchema?: boolean;
1238
+ ensureIndexes?: boolean;
1239
+ dropDb?: boolean;
1240
+ createSchema?: boolean;
898
1241
  }
899
1242
  /** Interface for the schema generator, responsible for creating, updating, and dropping database schemas. */
900
1243
  export interface ISchemaGenerator {
901
- create(options?: CreateSchemaOptions): Promise<void>;
902
- update(options?: UpdateSchemaOptions): Promise<void>;
903
- drop(options?: DropSchemaOptions): Promise<void>;
904
- refresh(options?: RefreshDatabaseOptions): Promise<void>;
905
- clear(options?: ClearDatabaseOptions): Promise<void>;
906
- execute(sql: string, options?: {
907
- wrap?: boolean;
908
- }): Promise<void>;
909
- getCreateSchemaSQL(options?: CreateSchemaOptions): Promise<string>;
910
- getDropSchemaSQL(options?: Omit<DropSchemaOptions, 'dropDb'>): Promise<string>;
911
- getUpdateSchemaSQL(options?: UpdateSchemaOptions): Promise<string>;
912
- getUpdateSchemaMigrationSQL(options?: UpdateSchemaOptions): Promise<{
913
- up: string;
914
- down: string;
915
- }>;
916
- ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
917
- createDatabase(name?: string): Promise<void>;
918
- dropDatabase(name?: string): Promise<void>;
919
- ensureIndexes(): Promise<void>;
1244
+ create(options?: CreateSchemaOptions): Promise<void>;
1245
+ update(options?: UpdateSchemaOptions): Promise<void>;
1246
+ drop(options?: DropSchemaOptions): Promise<void>;
1247
+ refresh(options?: RefreshDatabaseOptions): Promise<void>;
1248
+ clear(options?: ClearDatabaseOptions): Promise<void>;
1249
+ execute(
1250
+ sql: string,
1251
+ options?: {
1252
+ wrap?: boolean;
1253
+ },
1254
+ ): Promise<void>;
1255
+ getCreateSchemaSQL(options?: CreateSchemaOptions): Promise<string>;
1256
+ getDropSchemaSQL(options?: Omit<DropSchemaOptions, 'dropDb'>): Promise<string>;
1257
+ getUpdateSchemaSQL(options?: UpdateSchemaOptions): Promise<string>;
1258
+ getUpdateSchemaMigrationSQL(options?: UpdateSchemaOptions): Promise<{
1259
+ up: string;
1260
+ down: string;
1261
+ }>;
1262
+ ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
1263
+ createDatabase(name?: string): Promise<void>;
1264
+ dropDatabase(name?: string): Promise<void>;
1265
+ ensureIndexes(): Promise<void>;
920
1266
  }
921
1267
  /** Custom resolver for import paths in the entity generator. Returns a path/name pair or undefined to use the default. */
922
- export type ImportsResolver = (alias: string, basePath: string, extension: '.js' | '', originFileName: string) => {
923
- path: string;
924
- name: string;
925
- } | undefined;
1268
+ export type ImportsResolver = (
1269
+ alias: string,
1270
+ basePath: string,
1271
+ extension: '.js' | '',
1272
+ originFileName: string,
1273
+ ) =>
1274
+ | {
1275
+ path: string;
1276
+ name: string;
1277
+ }
1278
+ | undefined;
926
1279
  /** Options for the entity generator (`IEntityGenerator.generate()`). Controls output format, filtering, and style. */
927
1280
  export interface GenerateOptions {
928
- path?: string;
929
- save?: boolean;
930
- schema?: string;
931
- takeTables?: (RegExp | string)[];
932
- skipTables?: (RegExp | string)[];
933
- skipColumns?: Dictionary<(RegExp | string)[]>;
934
- forceUndefined?: boolean;
935
- undefinedDefaults?: boolean;
936
- bidirectionalRelations?: boolean;
937
- identifiedReferences?: boolean;
938
- entityDefinition?: 'decorators' | 'defineEntity' | 'entitySchema';
939
- decorators?: 'es' | 'legacy';
940
- inferEntityType?: boolean;
941
- enumMode?: 'ts-enum' | 'union-type' | 'dictionary';
942
- esmImport?: boolean;
943
- scalarTypeInDecorator?: boolean;
944
- scalarPropertiesForRelations?: 'always' | 'never' | 'smart';
945
- fileName?: (className: string) => string;
946
- onImport?: ImportsResolver;
947
- extraImports?: (basePath: string, originFileName: string) => string[] | undefined;
948
- onlyPurePivotTables?: boolean;
949
- outputPurePivotTables?: boolean;
950
- readOnlyPivotTables?: boolean;
951
- customBaseEntityName?: string;
952
- useCoreBaseEntity?: boolean;
953
- coreImportsPrefix?: string;
954
- onInitialMetadata?: MetadataProcessor;
955
- onProcessedMetadata?: MetadataProcessor;
1281
+ path?: string;
1282
+ save?: boolean;
1283
+ schema?: string;
1284
+ takeTables?: (RegExp | string)[];
1285
+ skipTables?: (RegExp | string)[];
1286
+ skipColumns?: Dictionary<(RegExp | string)[]>;
1287
+ forceUndefined?: boolean;
1288
+ undefinedDefaults?: boolean;
1289
+ bidirectionalRelations?: boolean;
1290
+ identifiedReferences?: boolean;
1291
+ entityDefinition?: 'decorators' | 'defineEntity' | 'entitySchema';
1292
+ decorators?: 'es' | 'legacy';
1293
+ inferEntityType?: boolean;
1294
+ enumMode?: 'ts-enum' | 'union-type' | 'dictionary';
1295
+ esmImport?: boolean;
1296
+ scalarTypeInDecorator?: boolean;
1297
+ scalarPropertiesForRelations?: 'always' | 'never' | 'smart';
1298
+ fileName?: (className: string) => string;
1299
+ onImport?: ImportsResolver;
1300
+ extraImports?: (basePath: string, originFileName: string) => string[] | undefined;
1301
+ onlyPurePivotTables?: boolean;
1302
+ outputPurePivotTables?: boolean;
1303
+ readOnlyPivotTables?: boolean;
1304
+ customBaseEntityName?: string;
1305
+ useCoreBaseEntity?: boolean;
1306
+ coreImportsPrefix?: string;
1307
+ onInitialMetadata?: MetadataProcessor;
1308
+ onProcessedMetadata?: MetadataProcessor;
956
1309
  }
957
1310
  /** Interface for the entity generator, which reverse-engineers database schema into entity source files. */
958
1311
  export interface IEntityGenerator {
959
- generate(options?: GenerateOptions): Promise<string[]>;
1312
+ generate(options?: GenerateOptions): Promise<string[]>;
960
1313
  }
961
1314
  /** Basic migration descriptor with a name and optional file path. */
962
1315
  export type MigrationInfo = {
963
- name: string;
964
- path?: string;
1316
+ name: string;
1317
+ path?: string;
965
1318
  };
966
1319
  /** Options for controlling which migrations to run (range, specific list, or transaction). */
967
1320
  export type MigrateOptions = {
968
- from?: string | number;
969
- to?: string | number;
970
- migrations?: string[];
971
- transaction?: Transaction;
1321
+ from?: string | number;
1322
+ to?: string | number;
1323
+ migrations?: string[];
1324
+ transaction?: Transaction;
972
1325
  };
973
1326
  /** Result of creating a new migration file, including the generated code and schema diff. */
974
1327
  export type MigrationResult = {
975
- fileName: string;
976
- code: string;
977
- diff: MigrationDiff;
1328
+ fileName: string;
1329
+ code: string;
1330
+ diff: MigrationDiff;
978
1331
  };
979
1332
  /** A row from the migrations tracking table, representing an executed migration. */
980
1333
  export type MigrationRow = {
981
- id: number;
982
- name: string;
983
- executed_at: Date;
1334
+ id: number;
1335
+ name: string;
1336
+ executed_at: Date;
984
1337
  };
985
1338
  /**
986
1339
  * @internal
987
1340
  */
988
1341
  export interface IMigrationRunner {
989
- run(migration: Migration, method: 'up' | 'down'): Promise<void>;
990
- setMasterMigration(trx: Transaction): void;
991
- unsetMasterMigration(): void;
1342
+ run(migration: Migration, method: 'up' | 'down'): Promise<void>;
1343
+ setMasterMigration(trx: Transaction): void;
1344
+ unsetMasterMigration(): void;
992
1345
  }
993
1346
  /**
994
1347
  * @internal
995
1348
  */
996
1349
  export interface IMigratorStorage {
997
- executed(): Promise<string[]>;
998
- logMigration(params: Dictionary): Promise<void>;
999
- unlogMigration(params: Dictionary): Promise<void>;
1000
- getExecutedMigrations(): Promise<MigrationRow[]>;
1001
- ensureTable?(): Promise<void>;
1002
- setMasterMigration(trx: Transaction): void;
1003
- unsetMasterMigration(): void;
1004
- getMigrationName(name: string): string;
1005
- getTableName?(): {
1006
- schemaName?: string;
1007
- tableName: string;
1008
- };
1350
+ executed(): Promise<string[]>;
1351
+ logMigration(params: Dictionary): Promise<void>;
1352
+ unlogMigration(params: Dictionary): Promise<void>;
1353
+ getExecutedMigrations(): Promise<MigrationRow[]>;
1354
+ ensureTable?(): Promise<void>;
1355
+ setMasterMigration(trx: Transaction): void;
1356
+ unsetMasterMigration(): void;
1357
+ getMigrationName(name: string): string;
1358
+ getTableName?(): {
1359
+ schemaName?: string;
1360
+ tableName: string;
1361
+ };
1009
1362
  }
1010
1363
  /** Interface for the migrator, responsible for creating and executing database migrations. */
1011
1364
  export interface IMigrator {
1012
- /**
1013
- * Checks current schema for changes, generates new migration if there are any.
1014
- */
1015
- create(path?: string, blank?: boolean, initial?: boolean, name?: string): Promise<MigrationResult>;
1016
- /**
1017
- * Checks current schema for changes.
1018
- */
1019
- checkSchema(): Promise<boolean>;
1020
- /**
1021
- * Creates initial migration. This generates the schema based on metadata, and checks whether all the tables
1022
- * are already present. If yes, it will also automatically log the migration as executed.
1023
- * Initial migration can be created only if the schema is already aligned with the metadata, or when no schema
1024
- * is present - in such case regular migration would have the same effect.
1025
- */
1026
- createInitial(path?: string): Promise<MigrationResult>;
1027
- /**
1028
- * Returns list of already executed migrations.
1029
- */
1030
- getExecuted(): Promise<MigrationRow[]>;
1031
- /**
1032
- * Returns list of pending (not yet executed) migrations found in the migration directory.
1033
- */
1034
- getPending(): Promise<MigrationInfo[]>;
1035
- /**
1036
- * Executes specified migrations. Without parameter it will migrate up to the latest version.
1037
- */
1038
- up(options?: string | string[] | MigrateOptions): Promise<MigrationInfo[]>;
1039
- /**
1040
- * Executes down migrations to the given point. Without parameter it will migrate one version down.
1041
- */
1042
- down(options?: string | string[] | Omit<MigrateOptions, 'from'>): Promise<MigrationInfo[]>;
1043
- /**
1044
- * Registers event handler.
1045
- */
1046
- on(event: MigratorEvent, listener: (event: MigrationInfo) => MaybePromise<void>): IMigrator;
1047
- /**
1048
- * Removes event handler.
1049
- */
1050
- off(event: MigratorEvent, listener: (event: MigrationInfo) => MaybePromise<void>): IMigrator;
1051
- /**
1052
- * @internal
1053
- */
1054
- getStorage(): IMigratorStorage;
1365
+ /**
1366
+ * Checks current schema for changes, generates new migration if there are any.
1367
+ */
1368
+ create(path?: string, blank?: boolean, initial?: boolean, name?: string): Promise<MigrationResult>;
1369
+ /**
1370
+ * Checks current schema for changes.
1371
+ */
1372
+ checkSchema(): Promise<boolean>;
1373
+ /**
1374
+ * Creates initial migration. This generates the schema based on metadata, and checks whether all the tables
1375
+ * are already present. If yes, it will also automatically log the migration as executed.
1376
+ * Initial migration can be created only if the schema is already aligned with the metadata, or when no schema
1377
+ * is present - in such case regular migration would have the same effect.
1378
+ */
1379
+ createInitial(path?: string): Promise<MigrationResult>;
1380
+ /**
1381
+ * Returns list of already executed migrations.
1382
+ */
1383
+ getExecuted(): Promise<MigrationRow[]>;
1384
+ /**
1385
+ * Returns list of pending (not yet executed) migrations found in the migration directory.
1386
+ */
1387
+ getPending(): Promise<MigrationInfo[]>;
1388
+ /**
1389
+ * Executes specified migrations. Without parameter it will migrate up to the latest version.
1390
+ */
1391
+ up(options?: string | string[] | MigrateOptions): Promise<MigrationInfo[]>;
1392
+ /**
1393
+ * Executes down migrations to the given point. Without parameter it will migrate one version down.
1394
+ */
1395
+ down(options?: string | string[] | Omit<MigrateOptions, 'from'>): Promise<MigrationInfo[]>;
1396
+ /**
1397
+ * Registers event handler.
1398
+ */
1399
+ on(event: MigratorEvent, listener: (event: MigrationInfo) => MaybePromise<void>): IMigrator;
1400
+ /**
1401
+ * Removes event handler.
1402
+ */
1403
+ off(event: MigratorEvent, listener: (event: MigrationInfo) => MaybePromise<void>): IMigrator;
1404
+ /**
1405
+ * @internal
1406
+ */
1407
+ getStorage(): IMigratorStorage;
1055
1408
  }
1056
1409
  /** Events emitted by the migrator during migration execution. */
1057
1410
  export type MigratorEvent = 'migrating' | 'migrated' | 'reverting' | 'reverted';
1058
1411
  /** The up and down SQL statements representing a schema diff for a migration. */
1059
1412
  export interface MigrationDiff {
1060
- up: string[];
1061
- down: string[];
1413
+ up: string[];
1414
+ down: string[];
1062
1415
  }
1063
1416
  /** Interface for generating migration file contents from schema diffs. */
1064
1417
  export interface IMigrationGenerator {
1065
- /**
1066
- * Generates the full contents of migration file. Uses `generateMigrationFile` to get the file contents.
1067
- */
1068
- generate(diff: MigrationDiff, path?: string, name?: string): Promise<[string, string]>;
1069
- /**
1070
- * Creates single migration statement. By default adds `this.addSql(sql);` to the code.
1071
- */
1072
- createStatement(sql: string, padLeft: number): string;
1073
- /**
1074
- * Returns the file contents of given migration.
1075
- */
1076
- generateMigrationFile(className: string, diff: MigrationDiff): MaybePromise<string>;
1418
+ /**
1419
+ * Generates the full contents of migration file. Uses `generateMigrationFile` to get the file contents.
1420
+ */
1421
+ generate(diff: MigrationDiff, path?: string, name?: string): Promise<[string, string]>;
1422
+ /**
1423
+ * Creates single migration statement. By default adds `this.addSql(sql);` to the code.
1424
+ */
1425
+ createStatement(sql: string, padLeft: number): string;
1426
+ /**
1427
+ * Returns the file contents of given migration.
1428
+ */
1429
+ generateMigrationFile(className: string, diff: MigrationDiff): MaybePromise<string>;
1077
1430
  }
1078
1431
  /** Interface that all migration classes must implement. */
1079
1432
  export interface Migration {
1080
- up(): Promise<void> | void;
1081
- down(): Promise<void> | void;
1082
- isTransactional(): boolean;
1083
- reset(): void;
1084
- setTransactionContext(ctx: Transaction): void;
1085
- getQueries?(): any[];
1433
+ up(): Promise<void> | void;
1434
+ down(): Promise<void> | void;
1435
+ isTransactional(): boolean;
1436
+ reset(): void;
1437
+ setTransactionContext(ctx: Transaction): void;
1438
+ getQueries?(): any[];
1086
1439
  }
1087
1440
  /** A named migration class reference, used for inline migration registration. */
1088
1441
  export interface MigrationObject {
1089
- name: string;
1090
- class: Constructor<Migration>;
1442
+ name: string;
1443
+ class: Constructor<Migration>;
1091
1444
  }
1092
1445
  type EntityFromInput<T> = T extends readonly EntityName<infer U>[] ? U : T extends EntityName<infer U> ? U : never;
1093
1446
  type FilterDefResolved<T extends object = any> = {
1094
- name: string;
1095
- 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>>);
1096
- default?: boolean;
1097
- entity?: EntityName<T> | EntityName<T>[];
1098
- args?: boolean;
1099
- strict?: boolean;
1447
+ name: string;
1448
+ cond:
1449
+ | FilterQuery<T>
1450
+ | ((
1451
+ args: Dictionary,
1452
+ type: 'read' | 'update' | 'delete',
1453
+ em: any,
1454
+ options?: FindOptions<T, any, any, any> | FindOneOptions<T, any, any, any>,
1455
+ entityName?: string,
1456
+ ) => MaybePromise<FilterQuery<T>>);
1457
+ default?: boolean;
1458
+ entity?: EntityName<T> | EntityName<T>[];
1459
+ args?: boolean;
1460
+ strict?: boolean;
1100
1461
  };
1101
1462
  /** Definition of a query filter that can be registered globally or per-entity via `@Filter()`. */
1102
1463
  export type FilterDef<T extends EntityName | readonly EntityName[] = any> = FilterDefResolved<EntityFromInput<T>> & {
1103
- entity?: T;
1464
+ entity?: T;
1104
1465
  };
1105
1466
  /** Type for the `populate` option in find methods. An array of relation paths to eagerly load, or `false` to disable. */
1106
1467
  export type Populate<T, P extends string = never> = readonly AutoPath<T, P, `${PopulatePath}`>[] | false;
1107
1468
  /** Parsed populate hint for a single relation, including strategy and nested children. */
1108
1469
  export type PopulateOptions<T> = {
1109
- field: EntityKey<T>;
1110
- strategy?: LoadStrategy;
1111
- all?: boolean;
1112
- filter?: boolean;
1113
- joinType?: 'inner join' | 'left join';
1114
- children?: PopulateOptions<T[keyof T]>[];
1115
- /** When true, ignores `mapToPk` on the property and returns full entity data instead of just PKs. */
1116
- dataOnly?: boolean;
1470
+ field: EntityKey<T>;
1471
+ strategy?: LoadStrategy;
1472
+ all?: boolean;
1473
+ filter?: boolean;
1474
+ joinType?: 'inner join' | 'left join';
1475
+ children?: PopulateOptions<T[keyof T]>[];
1476
+ /** When true, ignores `mapToPk` on the property and returns full entity data instead of just PKs. */
1477
+ dataOnly?: boolean;
1117
1478
  };
1118
1479
  /** Inline options that can be appended to populate hint strings (e.g., strategy, join type). */
1119
1480
  export type PopulateHintOptions = {
1120
- strategy?: LoadStrategy.JOINED | LoadStrategy.SELECT_IN | 'joined' | 'select-in';
1121
- joinType?: 'inner join' | 'left join';
1481
+ strategy?: LoadStrategy.JOINED | LoadStrategy.SELECT_IN | 'joined' | 'select-in';
1482
+ joinType?: 'inner join' | 'left join';
1122
1483
  };
1123
- 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;
1484
+ type ExtractType<T> =
1485
+ T extends CollectionShape<infer U>
1486
+ ? U
1487
+ : T extends ReferenceShape<infer U>
1488
+ ? U
1489
+ : T extends Ref<infer U>
1490
+ ? U
1491
+ : T extends readonly (infer U)[]
1492
+ ? U
1493
+ : T;
1124
1494
  type ExtractStringKeys<T> = {
1125
- [K in keyof T]-?: CleanKeys<T, K>;
1495
+ [K in keyof T]-?: CleanKeys<T, K>;
1126
1496
  }[keyof T] & {};
1127
1497
  /**
1128
1498
  * Extracts string keys from an entity type, handling Collection/Reference wrappers.
1129
1499
  * Simplified to just check `T extends object` since ExtractType handles the unwrapping.
1130
1500
  */
1131
1501
  type StringKeys<T, E extends string = never> = T extends object ? ExtractStringKeys<ExtractType<T>> | E : never;
1132
- type GetStringKey<T, K extends StringKeys<T, string>, E extends string> = K extends keyof T ? ExtractType<T[K]> : K extends E ? keyof T : never;
1502
+ type GetStringKey<T, K extends StringKeys<T, string>, E extends string> = K extends keyof T
1503
+ ? ExtractType<T[K]>
1504
+ : K extends E
1505
+ ? keyof T
1506
+ : never;
1133
1507
  type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1134
- type RelationKeys<T> = T extends object ? {
1135
- [K in keyof T]-?: CleanKeys<T, K, true>;
1136
- }[keyof T] & {} : never;
1508
+ type RelationKeys<T> = T extends object
1509
+ ? {
1510
+ [K in keyof T]-?: CleanKeys<T, K, true>;
1511
+ }[keyof T] & {}
1512
+ : never;
1137
1513
  /**
1138
1514
  * Autocomplete-friendly type for dot-separated relation paths (e.g., `'author.books'`).
1139
1515
  * Validates each segment against entity keys and provides IDE suggestions. Depth-limited to prevent infinite recursion.
1140
1516
  */
1141
- 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> | `${RelationKeys<O>}:ref` : never : never;
1517
+ export type AutoPath<
1518
+ O,
1519
+ P extends string | boolean,
1520
+ E extends string = never,
1521
+ D extends Prev[number] = 9,
1522
+ > = P extends boolean
1523
+ ? P
1524
+ : [D] extends [never]
1525
+ ? never
1526
+ : P extends any
1527
+ ? P extends string
1528
+ ? P extends `${infer A}.${infer B}`
1529
+ ? A extends StringKeys<O, E>
1530
+ ? `${A}.${AutoPath<NonNullable<GetStringKey<O, A, E>>, B, E, Prev[D]>}`
1531
+ : never
1532
+ : P extends StringKeys<O, E>
1533
+ ?
1534
+ | (NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>> extends unknown
1535
+ ? Exclude<P, `${string}.`>
1536
+ : never)
1537
+ | (StringKeys<NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>>, E> extends never
1538
+ ? never
1539
+ : `${P & string}.`)
1540
+ : StringKeys<O, E> | `${RelationKeys<O>}:ref`
1541
+ : never
1542
+ : never;
1142
1543
  /** Unwraps an array type to its element type; non-arrays pass through unchanged. */
1143
1544
  export type UnboxArray<T> = T extends any[] ? ArrayElement<T> : T;
1144
1545
  /** Extracts the element type from an array type. */
1145
1546
  export type ArrayElement<ArrayType extends unknown[]> = ArrayType extends (infer ElementType)[] ? ElementType : never;
1146
1547
  /** Unwraps a property type from its wrapper (Reference, Collection, or array) to the inner entity type. */
1147
- 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>;
1148
- 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;
1548
+ export type ExpandProperty<T> =
1549
+ T extends ReferenceShape<infer U>
1550
+ ? NonNullable<U>
1551
+ : T extends CollectionShape<infer U>
1552
+ ? NonNullable<U>
1553
+ : T extends (infer U)[]
1554
+ ? NonNullable<U>
1555
+ : NonNullable<T>;
1556
+ type LoadedLoadable<T, E extends object> = T extends CollectionShape
1557
+ ? LoadedCollection<E>
1558
+ : T extends ScalarReference<infer U>
1559
+ ? LoadedScalarReference<U>
1560
+ : T extends ReferenceShape
1561
+ ? T & LoadedReference<E>
1562
+ : T extends Scalar
1563
+ ? T
1564
+ : T extends (infer U)[]
1565
+ ? U extends Scalar
1566
+ ? T
1567
+ : E[]
1568
+ : E;
1149
1569
  type IsTrue<T> = IsNever<T> extends true ? false : T extends boolean ? (T extends true ? true : false) : false;
1150
1570
  type StringLiteral<T> = T extends string ? (string extends T ? never : T) : never;
1151
1571
  type Prefix<T, K> = K extends `${infer S}.${string}` ? S : K extends '*' ? keyof T : K;
1152
1572
  type IsPrefixedExclude<T, K extends keyof T, E extends string> = K extends E ? never : K;
1153
1573
  /** Checks whether a key `K` is included in the populate/fields hints. Used to filter entity keys in `Loaded`/`Selected`. */
1154
- 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 : '*' extends L ? K : K extends Prefix<T, L> ? K : K extends PrimaryProperty<T> ? K : never;
1155
- type Suffix<Key, Hint extends string, All = true | '*'> = Hint extends `${infer Pref}.${infer Suf}` ? Pref extends Key ? Suf : never : Hint extends All ? Hint : never;
1574
+ export type IsPrefixed<T, K extends keyof T, L extends string, E extends string = never> =
1575
+ IsNever<E> extends false
1576
+ ? IsPrefixedExclude<T, K, E>
1577
+ : K extends symbol
1578
+ ? never
1579
+ : IsTrue<L> extends true
1580
+ ? T[K] & {} extends LoadableShape
1581
+ ? K
1582
+ : never
1583
+ : IsNever<StringLiteral<L>> extends true
1584
+ ? never
1585
+ : '*' extends L
1586
+ ? K
1587
+ : K extends Prefix<T, L>
1588
+ ? K
1589
+ : K extends PrimaryProperty<T>
1590
+ ? K
1591
+ : never;
1592
+ type Suffix<Key, Hint extends string, All = true | '*'> = Hint extends `${infer Pref}.${infer Suf}`
1593
+ ? Pref extends Key
1594
+ ? Suf
1595
+ : never
1596
+ : Hint extends All
1597
+ ? Hint
1598
+ : never;
1156
1599
  /** Validates that `U` is a subset of `T`. Returns `{}` if valid, or a mapped type with `never` values to cause a type error. */
1157
- export type IsSubset<T, U> = keyof U extends keyof T ? {} : string extends keyof U ? {} : {
1158
- [K in keyof U as K extends keyof T ? never : CleanKeys<U, K>]: never;
1159
- };
1600
+ export type IsSubset<T, U> = keyof U extends keyof T
1601
+ ? {}
1602
+ : string extends keyof U
1603
+ ? {}
1604
+ : {
1605
+ [K in keyof U as K extends keyof T ? never : CleanKeys<U, K>]: never;
1606
+ };
1160
1607
  /**
1161
1608
  * Fast check if T is a Loaded type by looking for the marker symbol.
1162
1609
  * This is much cheaper than matching against the full Loaded structure.
1163
1610
  */
1164
1611
  type IsLoadedType<T> = T extends {
1165
- [__loadedType]?: any;
1166
- } ? true : false;
1612
+ [__loadedType]?: any;
1613
+ }
1614
+ ? true
1615
+ : false;
1167
1616
  /**
1168
1617
  * Optimized MergeSelected using intersection instead of extraction.
1169
1618
  * When T is already Loaded, we intersect with a new Loaded type for the selected fields.
@@ -1176,10 +1625,20 @@ export type MergeSelected<T, U, F extends string> = IsLoadedType<T> extends true
1176
1625
  * This avoids the expensive pattern matching needed to extract hints from Loaded types.
1177
1626
  * Used for `em.populate` and `em.refresh`.
1178
1627
  */
1179
- 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>;
1628
+ export type MergeLoaded<T, U, P extends string, F extends string, E extends string, R extends boolean = false> =
1629
+ IsLoadedType<T> extends true ? T & Loaded<U, P, F, E> : Loaded<T, P, F, E>;
1180
1630
  /** Extracts the nullability modifiers (`null`, `undefined`, or both) from a type `T`. */
1181
- export type AddOptional<T> = undefined | null extends T ? null | undefined : null extends T ? null : undefined extends T ? undefined : never;
1182
- type LoadedProp<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedLoadable<T, Loaded<ExtractType<T>, L, F, E>>;
1631
+ export type AddOptional<T> = undefined | null extends T
1632
+ ? null | undefined
1633
+ : null extends T
1634
+ ? null
1635
+ : undefined extends T
1636
+ ? undefined
1637
+ : never;
1638
+ type LoadedProp<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedLoadable<
1639
+ T,
1640
+ Loaded<ExtractType<T>, L, F, E>
1641
+ >;
1183
1642
  /** Extracts the eager-loaded property names declared via `[EagerProps]` as a string union. */
1184
1643
  export type AddEager<T> = ExtractEagerProps<T> & string;
1185
1644
  /** Combines an explicit populate hint `L` with the entity's eagerly loaded properties. */
@@ -1189,100 +1648,141 @@ export type ExpandHint<T, L extends string> = L | AddEager<T>;
1189
1648
  * Used as the return type when `fields` option is specified in find methods.
1190
1649
  */
1191
1650
  export type Selected<T, L extends string = never, F extends string = '*'> = {
1192
- [K in keyof T as IsPrefixed<T, K, L | F | AddEager<T>> | FunctionKeys<T, K>]: T[K] extends Function ? T[K] : NonNullable<T[K]> extends Scalar ? T[K] : LoadedProp<NonNullable<T[K]>, Suffix<K, L, true>, Suffix<K, F, true>> | AddOptional<T[K]>;
1651
+ [K in keyof T as IsPrefixed<T, K, L | F | AddEager<T>> | FunctionKeys<T, K>]: T[K] extends Function
1652
+ ? T[K]
1653
+ : NonNullable<T[K]> extends Scalar
1654
+ ? T[K]
1655
+ : LoadedProp<NonNullable<T[K]>, Suffix<K, L, true>, Suffix<K, F, true>> | AddOptional<T[K]>;
1193
1656
  } & {
1194
- [__selectedType]?: T;
1195
- [__fieldsHint]?: (hint: F) => void;
1196
- };
1197
- type LoadedEntityType<T> = {
1198
- [__loadedType]?: T;
1199
- } | {
1200
- [__selectedType]?: T;
1657
+ [__selectedType]?: T;
1658
+ [__fieldsHint]?: (hint: F) => void;
1201
1659
  };
1660
+ type LoadedEntityType<T> =
1661
+ | {
1662
+ [__loadedType]?: T;
1663
+ }
1664
+ | {
1665
+ [__selectedType]?: T;
1666
+ };
1202
1667
  /** Accepts either a plain entity type or a `Loaded`/`Selected` wrapped version. */
1203
1668
  export type EntityType<T> = T | LoadedEntityType<T>;
1204
1669
  /** Extracts the base entity type from a `Loaded`/`Selected` wrapper, or returns `T` as-is. */
1205
1670
  export type FromEntityType<T> = T extends LoadedEntityType<infer U> ? U : T;
1206
1671
  /** Extracts the fields hint (`F`) from a `Loaded`/`Selected` type, or returns `'*'` (all fields) for unwrapped entities. */
1207
1672
  export type ExtractFieldsHint<T> = T extends {
1208
- [__fieldsHint]?: (hint: infer F extends string) => void;
1209
- } ? F : '*';
1210
- type LoadedInternal<T, L extends string = never, F extends string = '*', E extends string = never> = [F] extends ['*'] ? IsNever<E> extends true ? T & {
1211
- [K in keyof T as IsPrefixed<T, K, ExpandHint<T, L>>]: LoadedProp<NonNullable<T[K]>, Suffix<K, L>, Suffix<K, F>, Suffix<K, E>> | AddOptional<T[K]>;
1212
- } : {
1213
- [K in keyof T as IsPrefixed<T, K, ExpandHint<T, L>, E>]: LoadedProp<NonNullable<T[K]>, Suffix<K, L>, Suffix<K, F>, Suffix<K, E>> | AddOptional<T[K]>;
1214
- } : Selected<T, L, F>;
1673
+ [__fieldsHint]?: (hint: infer F extends string) => void;
1674
+ }
1675
+ ? F
1676
+ : '*';
1677
+ type LoadedInternal<T, L extends string = never, F extends string = '*', E extends string = never> = [F] extends ['*']
1678
+ ? IsNever<E> extends true
1679
+ ? T & {
1680
+ [K in keyof T as IsPrefixed<T, K, ExpandHint<T, L>>]:
1681
+ | LoadedProp<NonNullable<T[K]>, Suffix<K, L>, Suffix<K, F>, Suffix<K, E>>
1682
+ | AddOptional<T[K]>;
1683
+ }
1684
+ : {
1685
+ [K in keyof T as IsPrefixed<T, K, ExpandHint<T, L>, E>]:
1686
+ | LoadedProp<NonNullable<T[K]>, Suffix<K, L>, Suffix<K, F>, Suffix<K, E>>
1687
+ | AddOptional<T[K]>;
1688
+ }
1689
+ : Selected<T, L, F>;
1215
1690
  /**
1216
1691
  * Represents entity with its loaded relations (`populate` hint) and selected properties (`fields` hint).
1217
1692
  * The __loadHint marker uses contravariance to ensure Loaded<A, 'b'> is NOT assignable to Loaded<A, 'b.c'>.
1218
1693
  */
1219
- export type Loaded<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedInternal<T, L, F, E> & {
1220
- [__loadedType]?: T;
1221
- [__loadHint]?: (hint: Prefixes<L>) => void;
1694
+ export type Loaded<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedInternal<
1695
+ T,
1696
+ L,
1697
+ F,
1698
+ E
1699
+ > & {
1700
+ [__loadedType]?: T;
1701
+ [__loadHint]?: (hint: Prefixes<L>) => void;
1222
1702
  };
1223
1703
  /** A `Reference<T>` that is guaranteed to be loaded, providing synchronous access via `$` and `get()`. */
1224
1704
  export interface LoadedReference<T> extends Reference<NonNullable<T>> {
1225
- $: NonNullable<T>;
1226
- get(): NonNullable<T>;
1705
+ $: NonNullable<T>;
1706
+ get(): NonNullable<T>;
1227
1707
  }
1228
1708
  /** A `ScalarReference<T>` that is guaranteed to be loaded, providing synchronous access via `$` and `get()`. */
1229
1709
  export interface LoadedScalarReference<T> extends ScalarReference<T> {
1230
- $: T;
1231
- get(): T;
1710
+ $: T;
1711
+ get(): T;
1232
1712
  }
1233
1713
  /** A `Collection<T>` that is guaranteed to be loaded, providing synchronous access via `$`, `get()`, and `getItems()`. */
1234
1714
  export interface LoadedCollection<T extends object> extends Collection<T> {
1235
- $: Collection<T>;
1236
- get(): Collection<T>;
1237
- getItems(check?: boolean): T[];
1715
+ $: Collection<T>;
1716
+ get(): Collection<T>;
1717
+ getItems(check?: boolean): T[];
1238
1718
  }
1239
1719
  /** Alias for `Loaded<T, P>`. Represents a newly created entity with all specified relations populated. */
1240
1720
  export type New<T, P extends string = string> = Loaded<T, P>;
1241
1721
  /** Interface for SQL/code syntax highlighters used in logging output. */
1242
1722
  export interface Highlighter {
1243
- highlight(text: string): string;
1723
+ highlight(text: string): string;
1244
1724
  }
1245
1725
  /** Interface for the metadata storage, which holds `EntityMetadata` for all discovered entities. */
1246
1726
  export interface IMetadataStorage {
1247
- getAll(): Map<EntityName, EntityMetadata>;
1248
- get<T = any>(entity: EntityName<T>, init?: boolean, validate?: boolean): EntityMetadata<T>;
1249
- find<T = any>(entity: EntityName<T>): EntityMetadata<T> | undefined;
1250
- has<T>(entity: EntityName<T>): boolean;
1251
- set<T>(entity: EntityName<T>, meta: EntityMetadata): EntityMetadata;
1252
- reset<T>(entity: EntityName<T>): void;
1727
+ getAll(): Map<EntityName, EntityMetadata>;
1728
+ get<T = any>(entity: EntityName<T>, init?: boolean, validate?: boolean): EntityMetadata<T>;
1729
+ find<T = any>(entity: EntityName<T>): EntityMetadata<T> | undefined;
1730
+ has<T>(entity: EntityName<T>): boolean;
1731
+ set<T>(entity: EntityName<T>, meta: EntityMetadata): EntityMetadata;
1732
+ reset<T>(entity: EntityName<T>): void;
1253
1733
  }
1254
1734
  /** Interface for entity hydrators, which populate entity instances from raw database data. */
1255
1735
  export interface IHydrator {
1256
- /**
1257
- * Hydrates the whole entity. This process handles custom type conversions, creating missing Collection instances,
1258
- * mapping FKs to entity instances, as well as merging those entities.
1259
- */
1260
- 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;
1261
- /**
1262
- * Hydrates primary keys only
1263
- */
1264
- hydrateReference<T extends object>(entity: T, meta: EntityMetadata<T>, data: EntityData<T>, factory: EntityFactory, convertCustomTypes?: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean): void;
1265
- isRunning(): boolean;
1736
+ /**
1737
+ * Hydrates the whole entity. This process handles custom type conversions, creating missing Collection instances,
1738
+ * mapping FKs to entity instances, as well as merging those entities.
1739
+ */
1740
+ hydrate<T extends object>(
1741
+ entity: T,
1742
+ meta: EntityMetadata<T>,
1743
+ data: EntityData<T>,
1744
+ factory: EntityFactory,
1745
+ type: 'full' | 'reference',
1746
+ newEntity?: boolean,
1747
+ convertCustomTypes?: boolean,
1748
+ schema?: string,
1749
+ parentSchema?: string,
1750
+ normalizeAccessors?: boolean,
1751
+ ): void;
1752
+ /**
1753
+ * Hydrates primary keys only
1754
+ */
1755
+ hydrateReference<T extends object>(
1756
+ entity: T,
1757
+ meta: EntityMetadata<T>,
1758
+ data: EntityData<T>,
1759
+ factory: EntityFactory,
1760
+ convertCustomTypes?: boolean,
1761
+ schema?: string,
1762
+ parentSchema?: string,
1763
+ normalizeAccessors?: boolean,
1764
+ ): void;
1765
+ isRunning(): boolean;
1266
1766
  }
1267
1767
  /** Constructor signature for hydrator implementations. */
1268
1768
  export interface HydratorConstructor {
1269
- new (metadata: MetadataStorage, platform: Platform, config: Configuration): IHydrator;
1769
+ new (metadata: MetadataStorage, platform: Platform, config: Configuration): IHydrator;
1270
1770
  }
1271
1771
  /** Interface for the seed manager, which runs database seeders. */
1272
1772
  export interface ISeedManager {
1273
- seed(...classNames: Constructor<Seeder>[]): Promise<void>;
1274
- /** @internal */
1275
- seedString(...classNames: string[]): Promise<void>;
1276
- create(className: string): Promise<string>;
1773
+ seed(...classNames: Constructor<Seeder>[]): Promise<void>;
1774
+ /** @internal */
1775
+ seedString(...classNames: string[]): Promise<void>;
1776
+ create(className: string): Promise<string>;
1277
1777
  }
1278
1778
  /** Interface that all seeder classes must implement. The `run` method receives an EntityManager. */
1279
1779
  export interface Seeder<T extends Dictionary = Dictionary> {
1280
- run(em: EntityManager, context?: T): void | Promise<void>;
1780
+ run(em: EntityManager, context?: T): void | Promise<void>;
1281
1781
  }
1282
1782
  /** A named seeder class reference, used for inline seeder registration. */
1283
1783
  export interface SeederObject {
1284
- name: string;
1285
- class: Constructor<Seeder>;
1784
+ name: string;
1785
+ class: Constructor<Seeder>;
1286
1786
  }
1287
1787
  /** Discriminator for read vs write database connections in read-replica setups. */
1288
1788
  export type ConnectionType = 'read' | 'write';
@@ -1294,17 +1794,30 @@ export type MaybeReturnType<T> = T extends (...args: any[]) => infer R ? R : T;
1294
1794
  * Extended `EntitySchema` interface that carries additional type-level metadata (entity name, properties, table name).
1295
1795
  * Returned by `defineEntity()` to provide strong type inference without explicit generics.
1296
1796
  */
1297
- 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> {
1298
- readonly name: TName;
1299
- readonly properties: TProperties;
1300
- readonly tableName: TTableName;
1301
- /** @internal Direct entity type access - avoids expensive pattern matching */
1302
- readonly '~entity': TEntity;
1797
+ export interface EntitySchemaWithMeta<
1798
+ TName extends string = string,
1799
+ TTableName extends string = string,
1800
+ TEntity = any,
1801
+ TBase = never,
1802
+ TProperties extends Record<string, any> = Record<string, any>,
1803
+ TClass extends EntityCtor = EntityCtor<TEntity>,
1804
+ > extends EntitySchema<TEntity, TBase, TClass> {
1805
+ readonly name: TName;
1806
+ readonly properties: TProperties;
1807
+ readonly tableName: TTableName;
1808
+ /** @internal Direct entity type access - avoids expensive pattern matching */
1809
+ readonly '~entity': TEntity;
1303
1810
  }
1304
1811
  /**
1305
1812
  * Extracts the entity type from an `EntitySchema`, `EntitySchemaWithMeta`, or entity class.
1306
1813
  * Uses a fast-path direct property access when available, falling back to generic inference.
1307
1814
  */
1308
1815
  export type InferEntity<Schema> = Schema extends {
1309
- '~entity': infer E;
1310
- } ? E : Schema extends EntitySchema<infer Entity> ? Entity : Schema extends EntityClass<infer Entity> ? Entity : Schema;
1816
+ '~entity': infer E;
1817
+ }
1818
+ ? E
1819
+ : Schema extends EntitySchema<infer Entity>
1820
+ ? Entity
1821
+ : Schema extends EntityClass<infer Entity>
1822
+ ? Entity
1823
+ : Schema;