@mikro-orm/core 7.0.0-dev.194 → 7.0.0-dev.195

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.
package/errors.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { inspect } from './logging/inspect.js';
2
- import { Utils } from '@mikro-orm/core';
2
+ import { Utils } from './utils/Utils.js';
3
3
  export class ValidationError extends Error {
4
4
  entity;
5
5
  constructor(message, entity) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mikro-orm/core",
3
3
  "type": "module",
4
- "version": "7.0.0-dev.194",
4
+ "version": "7.0.0-dev.195",
5
5
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
6
6
  "exports": {
7
7
  "./package.json": "./package.json",
package/typings.d.ts CHANGED
@@ -65,6 +65,31 @@ type CollectionShape<T = any> = {
65
65
  type LoadedCollectionShape<T = any> = CollectionShape<T> & {
66
66
  $: any;
67
67
  };
68
+ /**
69
+ * Structural type for matching Reference without triggering full class evaluation.
70
+ * Using `T extends ReferenceShape` instead of `T extends Reference<any>` avoids
71
+ * forcing TypeScript to evaluate Reference's methods, preventing instantiation overhead
72
+ * (~800 → ~15 instantiations).
73
+ *
74
+ * Usage:
75
+ * - Matching only: `T extends ReferenceShape`
76
+ * - With inference: `T extends ReferenceShape<infer U>`
77
+ */
78
+ type ReferenceShape<T = any> = {
79
+ unwrap(): T;
80
+ };
81
+ /**
82
+ * Structural type for matching LoadedReference (Reference with `$` property).
83
+ */
84
+ type LoadedReferenceShape<T = any> = ReferenceShape<T> & {
85
+ $: T;
86
+ };
87
+ /**
88
+ * Structural type for matching any loadable relation (Collection, Reference, or array).
89
+ * Using this instead of `Loadable<any>` in conditional type checks prevents
90
+ * TypeScript from evaluating the full Collection/Reference interfaces.
91
+ */
92
+ type LoadableShape = CollectionShape | ReferenceShape | readonly any[];
68
93
  export type UnionKeys<T> = T extends any ? keyof T : never;
69
94
  export type UnionPropertyType<T, K extends PropertyKey> = T extends any ? K extends keyof T ? T[K] : never : never;
70
95
  export type MergeUnion<T> = [T] extends [object] ? T extends Scalar ? T : {
@@ -111,7 +136,16 @@ export type CleanTypeConfig<T> = Compute<Pick<T, Extract<keyof T, keyof TypeConf
111
136
  export interface TypeConfig {
112
137
  forceObject?: boolean;
113
138
  }
114
- export type UnwrapPrimary<T> = T extends Scalar ? T : T extends Reference<infer U> ? Primary<U> : Primary<T>;
139
+ declare const __selectedType: unique symbol;
140
+ declare const __loadedType: unique symbol;
141
+ declare const __loadHint: unique symbol;
142
+ /**
143
+ * Expands a populate hint into all its prefixes.
144
+ * e.g., Prefixes<'a.b.c'> = 'a' | 'a.b' | 'a.b.c'
145
+ * This reflects that loading 'a.b.c' means 'a' and 'a.b' are also loaded.
146
+ */
147
+ type Prefixes<S extends string> = S extends `${infer H}.${infer T}` ? H | `${H}.${Prefixes<T>}` : S;
148
+ export type UnwrapPrimary<T> = T extends Scalar ? T : T extends ReferenceShape<infer U> ? Primary<U> : Primary<T>;
115
149
  type PrimaryPropToType<T, Keys extends (keyof T)[]> = {
116
150
  [Index in keyof Keys]: UnwrapPrimary<T[Keys[Index]]>;
117
151
  };
@@ -186,7 +220,7 @@ export type FilterValue<T> = OperatorMap<FilterItemValue<T>> | FilterItemValue<T
186
220
  type FilterObjectProp<T, K extends PropertyKey> = K extends keyof MergeUnion<T> ? MergeUnion<T>[K] : K extends keyof T ? T[K] : never;
187
221
  type ExpandQueryMerged<T> = [T] extends [object] ? [T] extends [Scalar] ? never : FilterQuery<MergeUnion<T>> : FilterValue<T>;
188
222
  export type FilterObject<T> = {
189
- -readonly [K in EntityKey<T> | EntityKey<MergeUnion<T>>]?: ExpandQuery<ExpandProperty<FilterObjectProp<T, K>>> | ExpandQueryMerged<ExpandProperty<FilterObjectProp<T, K>>> | FilterValue<ExpandProperty<FilterObjectProp<T, K>>> | null;
223
+ -readonly [K in EntityKey<T>]?: ExpandQuery<ExpandProperty<FilterObjectProp<T, K>>> | ExpandQueryMerged<ExpandProperty<FilterObjectProp<T, K>>> | FilterValue<ExpandProperty<FilterObjectProp<T, K>>> | null;
190
224
  };
191
225
  export type ExpandQuery<T> = T extends object ? T extends Scalar ? never : FilterQuery<T> : FilterValue<T>;
192
226
  export type EntityProps<T> = {
@@ -269,11 +303,11 @@ type NonArrayObject = object & {
269
303
  export type EntityDataProp<T, C extends boolean> = T extends Date ? string | Date : T extends Scalar ? T : T extends {
270
304
  __runtime?: infer Runtime;
271
305
  __raw?: infer Raw;
272
- } ? (C extends true ? Raw : Runtime) : T extends Reference<infer U> ? EntityDataNested<U, C> : T extends ScalarReference<infer U> ? EntityDataProp<U, C> : T extends CollectionShape<infer U> ? U | U[] | EntityDataNested<U & object, C> | EntityDataNested<U & object, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[] : U[] | EntityDataNested<U, C>[] : EntityDataNested<T, C>;
306
+ } ? (C extends true ? Raw : Runtime) : T extends ReferenceShape<infer U> ? EntityDataNested<U, C> : T extends ScalarReference<infer U> ? EntityDataProp<U, C> : T extends CollectionShape<infer U> ? U | U[] | EntityDataNested<U & object, C> | EntityDataNested<U & object, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | EntityDataNested<U, C> | EntityDataNested<U, C>[] : U[] | EntityDataNested<U, C>[] : EntityDataNested<T, C>;
273
307
  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 {
274
308
  __runtime?: infer Runtime;
275
309
  __raw?: infer Raw;
276
- } ? (C extends true ? Raw : Runtime) : T extends Reference<infer U> ? RequiredEntityDataNested<U, O, C> : T extends ScalarReference<infer U> ? RequiredEntityDataProp<U, O, C> : T extends 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>;
310
+ } ? (C extends true ? Raw : Runtime) : T extends ReferenceShape<infer U> ? RequiredEntityDataNested<U, O, C> : T extends ScalarReference<infer U> ? RequiredEntityDataProp<U, O, C> : T extends CollectionShape<infer U> ? U | U[] | RequiredEntityDataNested<U & object, O, C> | RequiredEntityDataNested<U & object, O, C>[] : T extends readonly (infer U)[] ? U extends NonArrayObject ? U | U[] | RequiredEntityDataNested<U, O, C> | RequiredEntityDataNested<U, O, C>[] : U[] | RequiredEntityDataNested<U, O, C>[] : RequiredEntityDataNested<T, O, C>;
277
311
  export type EntityDataNested<T, C extends boolean = false> = T extends undefined ? never : T extends any[] ? Readonly<T> : EntityData<T, C> | ExpandEntityProp<T, C>;
278
312
  type EntityDataItem<T, C extends boolean> = C extends false ? T | EntityDataProp<T, C> | null : EntityDataProp<T, C> | null;
279
313
  export type RequiredEntityDataNested<T, O, C extends boolean> = T extends any[] ? Readonly<T> : RequiredEntityData<T, O> | ExpandRequiredEntityProp<T, O, C>;
@@ -335,9 +369,12 @@ type PrimaryOrObject<T, U, C extends TypeConfig> = PreferExplicitConfig<C, Extra
335
369
  } : Primary<U>;
336
370
  export type EntityDTOProp<E, T, C extends TypeConfig = never> = T extends Scalar ? T : T extends {
337
371
  __serialized?: infer U;
338
- } ? (IsUnknown<U> extends false ? U : T) : T extends LoadedReference<infer U> ? EntityDTO<U, C> : T extends Reference<infer U> ? PrimaryOrObject<E, U, C> : T extends ScalarReference<infer U> ? U : T extends LoadedCollectionShape<infer U> ? EntityDTO<U & object, C>[] : T extends CollectionShape<infer U> ? PrimaryOrObject<E, U & object, C>[] : T extends readonly (infer U)[] ? U extends Scalar ? T : EntityDTOProp<E, U, C>[] : T extends Relation<T> ? EntityDTO<T, C> : T;
339
- type DTOProbablyOptionalProps<T> = NonNullable<NullableKeys<T, undefined>>;
340
- type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollection<any> ? false : K extends PrimaryProperty<T> ? false : K extends DTOProbablyOptionalProps<T> ? true : false;
372
+ } ? (IsUnknown<U> extends false ? U : T) : T extends LoadedReferenceShape<infer U> ? EntityDTO<U, C> : T extends ReferenceShape<infer U> ? PrimaryOrObject<E, U, C> : T extends ScalarReference<infer U> ? U : T extends LoadedCollectionShape<infer U> ? EntityDTO<U & object, C>[] : T extends CollectionShape<infer U> ? PrimaryOrObject<E, U & object, C>[] : T extends readonly (infer U)[] ? U extends Scalar ? T : EntityDTOProp<E, U, C>[] : T extends Relation<T> ? EntityDTO<T, C> : T;
373
+ type UnwrapLoadedEntity<T> = T extends {
374
+ [__loadedType]?: infer U;
375
+ } ? NonNullable<U> : T;
376
+ type DTOProbablyOptionalProps<T> = NonNullable<NullableKeys<UnwrapLoadedEntity<T>, undefined>>;
377
+ type DTOIsOptional<T, K extends keyof T> = T[K] extends LoadedCollectionShape ? false : K extends PrimaryProperty<UnwrapLoadedEntity<T>> ? false : K extends DTOProbablyOptionalProps<T> ? true : false;
341
378
  type DTORequiredKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? ExcludeHidden<T, K> & CleanKeys<T, K> : never;
342
379
  type DTOOptionalKeys<T, K extends keyof T> = DTOIsOptional<T, K> extends false ? never : ExcludeHidden<T, K> & CleanKeys<T, K>;
343
380
  export type EntityDTO<T, C extends TypeConfig = never> = {
@@ -793,33 +830,34 @@ export type PopulateOptions<T> = {
793
830
  /** When true, ignores `mapToPk` on the property and returns full entity data instead of just PKs. */
794
831
  dataOnly?: boolean;
795
832
  };
796
- type Loadable<T extends object> = Collection<T, any> | Reference<T> | Ref<T> | readonly T[];
797
- type ExtractType<T> = T extends CollectionShape<infer U> ? U : T extends Reference<infer U> ? U : T extends Ref<infer U> ? U : T extends readonly (infer U)[] ? U : T;
833
+ 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;
798
834
  type ExtractStringKeys<T> = {
799
835
  [K in keyof T]-?: CleanKeys<T, K>;
800
836
  }[keyof T] & {};
801
- type StringKeys<T, E extends string = never> = T extends CollectionShape ? ExtractStringKeys<ExtractType<T>> | E : T extends Reference<any> ? ExtractStringKeys<ExtractType<T>> | E : T extends object ? ExtractStringKeys<ExtractType<T>> | E : never;
837
+ /**
838
+ * Extracts string keys from an entity type, handling Collection/Reference wrappers.
839
+ * Simplified to just check `T extends object` since ExtractType handles the unwrapping.
840
+ */
841
+ type StringKeys<T, E extends string = never> = T extends object ? ExtractStringKeys<ExtractType<T>> | E : never;
802
842
  type GetStringKey<T, K extends StringKeys<T, string>, E extends string> = K extends keyof T ? ExtractType<T[K]> : (K extends E ? keyof T : never);
803
843
  type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
804
844
  type CollectionKeys<T> = T extends object ? {
805
845
  [K in keyof T]-?: T[K] extends CollectionShape ? IsAny<T[K]> extends true ? never : K & string : never;
806
846
  }[keyof T] & {} : never;
807
- export type AutoPath<O, P extends string | boolean, E extends string = never, D extends Prev[number] = 9> = P extends boolean ? P : [D] extends [never] ? never : P extends any ? P extends string ? (P & `${string}.` extends never ? P : P & `${string}.`) extends infer Q ? Q extends `${infer A}.${infer B}` ? A extends StringKeys<O, E> ? `${A}.${AutoPath<NonNullable<GetStringKey<O, A, E>>, B, E, Prev[D]>}` : never : Q extends StringKeys<O, E> ? (NonNullable<GetStringKey<O, Q, E>> extends unknown ? Exclude<P, `${string}.`> : never) | (StringKeys<NonNullable<GetStringKey<O, Q, E>>, E> extends never ? never : `${Q & string}.`) : StringKeys<O, E> | `${CollectionKeys<O>}:ref` : never : never : never;
847
+ export type AutoPath<O, P extends string | boolean, E extends string = never, D extends Prev[number] = 9> = P extends boolean ? P : [D] extends [never] ? never : P extends any ? P extends string ? P extends `${infer A}.${infer B}` ? A extends StringKeys<O, E> ? `${A}.${AutoPath<NonNullable<GetStringKey<O, A, E>>, B, E, Prev[D]>}` : never : P extends StringKeys<O, E> ? (NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>> extends unknown ? Exclude<P, `${string}.`> : never) | (StringKeys<NonNullable<GetStringKey<O, P & StringKeys<O, E>, E>>, E> extends never ? never : `${P & string}.`) : StringKeys<O, E> | `${CollectionKeys<O>}:ref` : never : never;
808
848
  export type UnboxArray<T> = T extends any[] ? ArrayElement<T> : T;
809
849
  export type ArrayElement<ArrayType extends unknown[]> = ArrayType extends (infer ElementType)[] ? ElementType : never;
810
- export type ExpandProperty<T> = T extends Reference<infer U> ? NonNullable<U> : T extends CollectionShape<infer U> ? NonNullable<U> : T extends (infer U)[] ? NonNullable<U> : NonNullable<T>;
811
- type LoadedLoadable<T, E extends object> = T extends CollectionShape ? LoadedCollection<E> : T extends Reference<any> ? T & LoadedReference<E> : T extends ScalarReference<infer U> ? LoadedScalarReference<U> : T extends Scalar ? T : T extends (infer U)[] ? U extends Scalar ? T : E[] : E;
850
+ 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>;
851
+ 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;
812
852
  type IsTrue<T> = IsNever<T> extends true ? false : T extends boolean ? T extends true ? true : false : false;
813
853
  type StringLiteral<T> = T extends string ? string extends T ? never : T : never;
814
854
  type Prefix<T, K> = K extends `${infer S}.${string}` ? S : (K extends '*' ? keyof T : K);
815
855
  type IsPrefixedExclude<T, K extends keyof T, E extends string> = K extends E ? never : K;
816
- export type IsPrefixed<T, K extends keyof T, L extends string, E extends string = never> = IsNever<E> extends false ? IsPrefixedExclude<T, K, E> : K extends symbol ? never : IsTrue<L> extends true ? (T[K] & {} extends Loadable<any> ? K : never) : IsNever<StringLiteral<L>> extends true ? never : K extends Prefix<T, L> ? K : K extends PrimaryProperty<T> ? K : never;
856
+ export type IsPrefixed<T, K extends keyof T, L extends string, E extends string = never> = IsNever<E> extends false ? IsPrefixedExclude<T, K, E> : K extends symbol ? never : IsTrue<L> extends true ? (T[K] & {} extends LoadableShape ? K : never) : IsNever<StringLiteral<L>> extends true ? never : L extends '*' ? K : K extends Prefix<T, L> ? K : K extends PrimaryProperty<T> ? K : never;
817
857
  type Suffix<Key, Hint extends string, All = true | '*'> = Hint extends `${infer Pref}.${infer Suf}` ? (Pref extends Key ? Suf : never) : Hint extends All ? Hint : never;
818
858
  export type IsSubset<T, U> = keyof U extends keyof T ? {} : string extends keyof U ? {} : {
819
859
  [K in keyof U as K extends keyof T ? never : CleanKeys<U, K>]: never;
820
860
  };
821
- declare const __selectedType: unique symbol;
822
- declare const __loadedType: unique symbol;
823
861
  /**
824
862
  * Fast check if T is a Loaded type by looking for the marker symbol.
825
863
  * This is much cheaper than matching against the full Loaded structure.
@@ -867,9 +905,11 @@ type LoadedInternal<T, L extends string = never, F extends string = '*', E exten
867
905
  } : Selected<T, L, F>;
868
906
  /**
869
907
  * Represents entity with its loaded relations (`populate` hint) and selected properties (`fields` hint).
908
+ * The __loadHint marker uses contravariance to ensure Loaded<A, 'b'> is NOT assignable to Loaded<A, 'b.c'>.
870
909
  */
871
910
  export type Loaded<T, L extends string = never, F extends string = '*', E extends string = never> = LoadedInternal<T, L, F, E> & {
872
911
  [__loadedType]?: T;
912
+ [__loadHint]?: (hint: Prefixes<L>) => void;
873
913
  };
874
914
  export interface LoadedReference<T> extends Reference<NonNullable<T>> {
875
915
  $: NonNullable<T>;
package/utils/Utils.js CHANGED
@@ -123,7 +123,7 @@ export function parseJsonSafe(value) {
123
123
  }
124
124
  export class Utils {
125
125
  static PK_SEPARATOR = '~~~';
126
- static #ORM_VERSION = '7.0.0-dev.194';
126
+ static #ORM_VERSION = '7.0.0-dev.195';
127
127
  /**
128
128
  * Checks if the argument is instance of `Object`. Returns false for arrays.
129
129
  */