@mikro-orm/core 7.0.0-rc.3 → 7.0.1-dev.0

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 (94) hide show
  1. package/EntityManager.d.ts +2 -15
  2. package/EntityManager.js +155 -152
  3. package/MikroORM.d.ts +4 -6
  4. package/MikroORM.js +20 -20
  5. package/README.md +5 -4
  6. package/cache/FileCacheAdapter.d.ts +1 -5
  7. package/cache/FileCacheAdapter.js +22 -22
  8. package/cache/GeneratedCacheAdapter.d.ts +1 -1
  9. package/cache/GeneratedCacheAdapter.js +6 -6
  10. package/cache/MemoryCacheAdapter.d.ts +1 -2
  11. package/cache/MemoryCacheAdapter.js +8 -8
  12. package/cache/index.d.ts +1 -1
  13. package/cache/index.js +0 -1
  14. package/connections/Connection.d.ts +1 -0
  15. package/connections/Connection.js +27 -11
  16. package/drivers/DatabaseDriver.d.ts +0 -2
  17. package/drivers/DatabaseDriver.js +2 -4
  18. package/entity/Collection.d.ts +1 -9
  19. package/entity/Collection.js +95 -105
  20. package/entity/EntityFactory.d.ts +1 -8
  21. package/entity/EntityFactory.js +48 -48
  22. package/entity/EntityLoader.d.ts +1 -3
  23. package/entity/EntityLoader.js +36 -39
  24. package/entity/Reference.d.ts +1 -2
  25. package/entity/Reference.js +11 -11
  26. package/entity/WrappedEntity.d.ts +4 -2
  27. package/entity/defineEntity.d.ts +18 -73
  28. package/enums.d.ts +2 -1
  29. package/enums.js +1 -0
  30. package/errors.d.ts +11 -11
  31. package/errors.js +3 -13
  32. package/events/EventManager.d.ts +1 -4
  33. package/events/EventManager.js +25 -22
  34. package/events/index.d.ts +1 -1
  35. package/events/index.js +0 -1
  36. package/exceptions.js +8 -6
  37. package/hydration/ObjectHydrator.d.ts +1 -2
  38. package/hydration/ObjectHydrator.js +16 -16
  39. package/logging/DefaultLogger.js +3 -2
  40. package/logging/Logger.d.ts +2 -1
  41. package/logging/colors.js +1 -1
  42. package/logging/index.d.ts +1 -1
  43. package/logging/index.js +0 -1
  44. package/metadata/EntitySchema.d.ts +1 -1
  45. package/metadata/MetadataDiscovery.d.ts +1 -9
  46. package/metadata/MetadataDiscovery.js +162 -149
  47. package/metadata/MetadataStorage.d.ts +1 -5
  48. package/metadata/MetadataStorage.js +36 -36
  49. package/metadata/discover-entities.js +1 -1
  50. package/metadata/index.d.ts +1 -1
  51. package/metadata/index.js +0 -1
  52. package/naming-strategy/AbstractNamingStrategy.js +1 -1
  53. package/naming-strategy/EntityCaseNamingStrategy.js +1 -1
  54. package/naming-strategy/index.d.ts +1 -1
  55. package/naming-strategy/index.js +0 -1
  56. package/package.json +1 -1
  57. package/platforms/Platform.d.ts +23 -1
  58. package/platforms/Platform.js +57 -4
  59. package/serialization/EntitySerializer.js +1 -1
  60. package/serialization/EntityTransformer.js +4 -1
  61. package/serialization/SerializationContext.d.ts +4 -8
  62. package/serialization/SerializationContext.js +20 -15
  63. package/types/UuidType.d.ts +2 -0
  64. package/types/UuidType.js +14 -2
  65. package/types/index.d.ts +2 -1
  66. package/typings.d.ts +12 -1
  67. package/unit-of-work/ChangeSetComputer.d.ts +1 -6
  68. package/unit-of-work/ChangeSetComputer.js +21 -21
  69. package/unit-of-work/ChangeSetPersister.d.ts +1 -9
  70. package/unit-of-work/ChangeSetPersister.js +52 -52
  71. package/unit-of-work/CommitOrderCalculator.d.ts +1 -4
  72. package/unit-of-work/CommitOrderCalculator.js +13 -13
  73. package/unit-of-work/IdentityMap.d.ts +2 -5
  74. package/unit-of-work/IdentityMap.js +18 -18
  75. package/unit-of-work/UnitOfWork.d.ts +5 -19
  76. package/unit-of-work/UnitOfWork.js +182 -174
  77. package/utils/AbstractMigrator.d.ts +1 -1
  78. package/utils/AbstractMigrator.js +7 -7
  79. package/utils/Configuration.d.ts +90 -189
  80. package/utils/Configuration.js +94 -78
  81. package/utils/Cursor.d.ts +3 -3
  82. package/utils/Cursor.js +4 -4
  83. package/utils/EntityComparator.d.ts +8 -15
  84. package/utils/EntityComparator.js +49 -49
  85. package/utils/QueryHelper.d.ts +16 -1
  86. package/utils/QueryHelper.js +70 -24
  87. package/utils/RawQueryFragment.d.ts +4 -4
  88. package/utils/TransactionManager.js +1 -2
  89. package/utils/Utils.d.ts +1 -1
  90. package/utils/Utils.js +5 -4
  91. package/utils/clone.js +5 -0
  92. package/utils/fs-utils.d.ts +3 -17
  93. package/utils/fs-utils.js +1 -1
  94. package/utils/upsert-utils.js +1 -1
@@ -508,48 +508,35 @@ export declare class OneToManyOptionsBuilderOnlyMappedBy<Value extends object> e
508
508
  type EntityTarget = {
509
509
  '~entity': any;
510
510
  } | EntityClass;
511
- declare const propertyBuilders: {
512
- bigint: <Mode extends "bigint" | "number" | "string" = "bigint">(mode?: Mode) => UniversalPropertyOptionsBuilder<(Mode extends "bigint" ? bigint : Mode extends "number" ? number : string) & {}, EmptyOptions, IncludeKeysForProperty>;
513
- array: <T = string>(toJsValue?: (i: string) => T, toDbValue?: (i: T) => string) => UniversalPropertyOptionsBuilder<T[], EmptyOptions, IncludeKeysForProperty>;
514
- decimal: <Mode extends "number" | "string" = "string">(mode?: Mode) => UniversalPropertyOptionsBuilder<NonNullable<Mode extends "number" ? number : string>, EmptyOptions, IncludeKeysForProperty>;
511
+ declare const propertyBuilders: PropertyBuilders;
512
+ type PropertyBuildersOverrideKeys = 'bigint' | 'array' | 'decimal' | 'json' | 'datetime' | 'time' | 'enum';
513
+ export type PropertyBuilders = {
514
+ [K in Exclude<keyof typeof types, PropertyBuildersOverrideKeys>]: () => UniversalPropertyOptionsBuilder<InferPropertyValueType<(typeof types)[K]>, EmptyOptions, IncludeKeysForProperty>;
515
+ } & {
516
+ bigint: <Mode extends 'bigint' | 'number' | 'string' = 'bigint'>(mode?: Mode) => UniversalPropertyOptionsBuilder<InferPropertyValueType<typeof types.bigint<Mode>>, EmptyOptions, IncludeKeysForProperty>;
517
+ array: <T = string>(toJsValue?: (i: string) => T, toDbValue?: (i: T) => string) => UniversalPropertyOptionsBuilder<InferPropertyValueType<typeof types.array<T>>, EmptyOptions, IncludeKeysForProperty>;
518
+ decimal: <Mode extends 'number' | 'string' = 'string'>(mode?: Mode) => UniversalPropertyOptionsBuilder<InferPropertyValueType<typeof types.decimal<Mode>>, EmptyOptions, IncludeKeysForProperty>;
515
519
  json: <T>() => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
516
520
  formula: <T>(formula: string | FormulaCallback<any>) => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
517
- datetime: (length?: number) => UniversalPropertyOptionsBuilder<Date, EmptyOptions, IncludeKeysForProperty>;
518
- time: (length?: number) => UniversalPropertyOptionsBuilder<any, EmptyOptions, IncludeKeysForProperty>;
521
+ datetime: (length?: number) => UniversalPropertyOptionsBuilder<InferPropertyValueType<typeof types.datetime>, EmptyOptions, IncludeKeysForProperty>;
522
+ time: (length?: number) => UniversalPropertyOptionsBuilder<InferPropertyValueType<typeof types.time>, EmptyOptions, IncludeKeysForProperty>;
519
523
  type: <T extends PropertyValueType>(type: T) => UniversalPropertyOptionsBuilder<InferPropertyValueType<T>, EmptyOptions, IncludeKeysForProperty>;
520
524
  enum: <const T extends (number | string)[] | (() => Dictionary)>(items?: T) => UniversalPropertyOptionsBuilder<T extends () => Dictionary ? ValueOf<ReturnType<T>> : T extends (infer Value)[] ? Value : T, EmptyOptions, IncludeKeysForEnumOptions>;
521
525
  embedded: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
522
- kind: "embedded";
526
+ kind: 'embedded';
523
527
  }>;
524
528
  manyToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
525
- kind: "m:n";
529
+ kind: 'm:n';
526
530
  }>;
527
531
  manyToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
528
- kind: "m:1";
532
+ kind: 'm:1';
529
533
  }>;
530
534
  oneToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
531
- kind: "1:m";
535
+ kind: '1:m';
532
536
  }>;
533
537
  oneToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
534
- kind: "1:1";
538
+ kind: '1:1';
535
539
  }>;
536
- date: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
537
- blob: () => UniversalPropertyOptionsBuilder<NonNullable<Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike> | null>, EmptyOptions, IncludeKeysForProperty>;
538
- uint8array: () => UniversalPropertyOptionsBuilder<Uint8Array<ArrayBufferLike>, EmptyOptions, IncludeKeysForProperty>;
539
- enumArray: () => UniversalPropertyOptionsBuilder<(string | number)[], EmptyOptions, IncludeKeysForProperty>;
540
- integer: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
541
- smallint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
542
- tinyint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
543
- mediumint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
544
- float: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
545
- double: () => UniversalPropertyOptionsBuilder<NonNullable<string | number>, EmptyOptions, IncludeKeysForProperty>;
546
- boolean: () => UniversalPropertyOptionsBuilder<NonNullable<boolean | null | undefined>, EmptyOptions, IncludeKeysForProperty>;
547
- character: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
548
- string: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
549
- uuid: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
550
- text: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
551
- interval: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
552
- unknown: () => UniversalPropertyOptionsBuilder<{}, EmptyOptions, IncludeKeysForProperty>;
553
540
  };
554
541
  /** Own keys + base entity keys (when TBase is not `never`). Guards against `keyof never = string | number | symbol`. */
555
542
  type AllKeys<TProperties, TBase> = keyof TProperties | (IsNever<TBase> extends true ? never : keyof TBase);
@@ -559,7 +546,7 @@ export interface EntityMetadataWithProperties<TName extends string, TTableName e
559
546
  extends?: {
560
547
  '~entity': TBase;
561
548
  } | EntityCtor<TBase>;
562
- properties: TProperties | ((properties: typeof propertyBuilders) => TProperties);
549
+ properties: TProperties | ((properties: PropertyBuilders) => TProperties);
563
550
  primaryKeys?: TPK & InferPrimaryKey<TProperties>[];
564
551
  hooks?: DefineEntityHooks;
565
552
  repository?: () => TRepository;
@@ -595,53 +582,11 @@ export declare function defineEntity<const TEntity = any, const TProperties exte
595
582
  className?: TClassName;
596
583
  tableName?: TTableName;
597
584
  extends?: TBase;
598
- properties: TProperties | ((properties: typeof propertyBuilders) => TProperties);
585
+ properties: TProperties | ((properties: PropertyBuilders) => TProperties);
599
586
  hooks?: DefineEntityHooks<TEntity>;
600
587
  }): EntitySchemaWithMeta<TClassName, TTableName, TEntity, TBase, TProperties, TClass>;
601
588
  export declare namespace defineEntity {
602
- var properties: {
603
- bigint: <Mode extends "bigint" | "number" | "string" = "bigint">(mode?: Mode) => UniversalPropertyOptionsBuilder<(Mode extends "bigint" ? bigint : Mode extends "number" ? number : string) & {}, EmptyOptions, IncludeKeysForProperty>;
604
- array: <T = string>(toJsValue?: (i: string) => T, toDbValue?: (i: T) => string) => UniversalPropertyOptionsBuilder<T[], EmptyOptions, IncludeKeysForProperty>;
605
- decimal: <Mode extends "number" | "string" = "string">(mode?: Mode) => UniversalPropertyOptionsBuilder<NonNullable<Mode extends "number" ? number : string>, EmptyOptions, IncludeKeysForProperty>;
606
- json: <T>() => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
607
- formula: <T>(formula: string | FormulaCallback<any>) => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
608
- datetime: (length?: number) => UniversalPropertyOptionsBuilder<Date, EmptyOptions, IncludeKeysForProperty>;
609
- time: (length?: number) => UniversalPropertyOptionsBuilder<any, EmptyOptions, IncludeKeysForProperty>;
610
- type: <T extends PropertyValueType>(type: T) => UniversalPropertyOptionsBuilder<InferPropertyValueType<T>, EmptyOptions, IncludeKeysForProperty>;
611
- enum: <const T extends (number | string)[] | (() => Dictionary)>(items?: T) => UniversalPropertyOptionsBuilder<T extends () => Dictionary ? ValueOf<ReturnType<T>> : T extends (infer Value)[] ? Value : T, EmptyOptions, IncludeKeysForEnumOptions>;
612
- embedded: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
613
- kind: "embedded";
614
- }>;
615
- manyToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
616
- kind: "m:n";
617
- }>;
618
- manyToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
619
- kind: "m:1";
620
- }>;
621
- oneToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
622
- kind: "1:m";
623
- }>;
624
- oneToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
625
- kind: "1:1";
626
- }>;
627
- date: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
628
- blob: () => UniversalPropertyOptionsBuilder<NonNullable<Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike> | null>, EmptyOptions, IncludeKeysForProperty>;
629
- uint8array: () => UniversalPropertyOptionsBuilder<Uint8Array<ArrayBufferLike>, EmptyOptions, IncludeKeysForProperty>;
630
- enumArray: () => UniversalPropertyOptionsBuilder<(string | number)[], EmptyOptions, IncludeKeysForProperty>;
631
- integer: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
632
- smallint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
633
- tinyint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
634
- mediumint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
635
- float: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
636
- double: () => UniversalPropertyOptionsBuilder<NonNullable<string | number>, EmptyOptions, IncludeKeysForProperty>;
637
- boolean: () => UniversalPropertyOptionsBuilder<NonNullable<boolean | null | undefined>, EmptyOptions, IncludeKeysForProperty>;
638
- character: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
639
- string: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
640
- uuid: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
641
- text: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
642
- interval: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
643
- unknown: () => UniversalPropertyOptionsBuilder<{}, EmptyOptions, IncludeKeysForProperty>;
644
- };
589
+ var properties: PropertyBuilders;
645
590
  }
646
591
  export { propertyBuilders as p };
647
592
  type EntityHookValue<T, K extends keyof EventSubscriber<T>> = (keyof T | NonNullable<EventSubscriber<T>[K]>)[];
package/enums.d.ts CHANGED
@@ -45,7 +45,8 @@ export declare enum QueryOperator {
45
45
  $size = "size",// collection operators, sql only
46
46
  $hasKey = "?",// postgres only, json
47
47
  $hasKeys = "?&",// postgres only, json
48
- $hasSomeKeys = "?|"
48
+ $hasSomeKeys = "?|",// postgres only, json
49
+ $elemMatch = "elemMatch"
49
50
  }
50
51
  export declare const ARRAY_OPERATORS: string[];
51
52
  export declare const JSON_KEY_OPERATORS: string[];
package/enums.js CHANGED
@@ -48,6 +48,7 @@ export var QueryOperator;
48
48
  QueryOperator["$hasKey"] = "?";
49
49
  QueryOperator["$hasKeys"] = "?&";
50
50
  QueryOperator["$hasSomeKeys"] = "?|";
51
+ QueryOperator["$elemMatch"] = "elemMatch";
51
52
  })(QueryOperator || (QueryOperator = {}));
52
53
  export const ARRAY_OPERATORS = ['$eq', '$gt', '$gte', '$lt', '$lte', '$ne', '$overlap', '$contains', '$contained'];
53
54
  export const JSON_KEY_OPERATORS = ['$hasKey', '$hasKeys', '$hasSomeKeys'];
package/errors.d.ts CHANGED
@@ -56,17 +56,17 @@ export declare class MetadataError<T extends AnyEntity = AnyEntity> extends Vali
56
56
  static duplicateFieldName(entityName: EntityName, names: [string, string][]): MetadataError;
57
57
  static multipleDecorators(entityName: string, propertyName: string): MetadataError;
58
58
  static missingMetadata(entity: string): MetadataError;
59
- static invalidPrimaryKey(meta: EntityMetadata, prop: EntityProperty, requiredName: string): MetadataError<Partial<any>>;
60
- static invalidManyToManyWithPivotEntity(meta1: EntityMetadata, prop1: EntityProperty, meta2: EntityMetadata, prop2: EntityProperty): MetadataError<Partial<any>>;
61
- static targetIsAbstract(meta: EntityMetadata, prop: EntityProperty): MetadataError<Partial<any>>;
62
- static nonPersistentCompositeProp(meta: EntityMetadata, prop: EntityProperty): MetadataError<Partial<any>>;
63
- static propertyTargetsEntityType(meta: EntityMetadata, prop: EntityProperty, target: EntityMetadata): MetadataError<Partial<any>>;
64
- static fromMissingOption(meta: EntityMetadata, prop: EntityProperty, option: string): MetadataError<Partial<any>>;
65
- static targetKeyOnManyToMany(meta: EntityMetadata, prop: EntityProperty): MetadataError<Partial<any>>;
66
- static targetKeyNotUnique(meta: EntityMetadata, prop: EntityProperty, target?: EntityMetadata): MetadataError<Partial<any>>;
67
- static targetKeyNotFound(meta: EntityMetadata, prop: EntityProperty, target?: EntityMetadata): MetadataError<Partial<any>>;
68
- static incompatiblePolymorphicTargets(meta: EntityMetadata, prop: EntityProperty, target1: EntityMetadata, target2: EntityMetadata, reason: string): MetadataError<Partial<any>>;
69
- static dangerousPropertyName(meta: EntityMetadata, prop: EntityProperty): MetadataError<Partial<any>>;
59
+ static invalidPrimaryKey(meta: EntityMetadata, prop: EntityProperty, requiredName: string): MetadataError;
60
+ static invalidManyToManyWithPivotEntity(meta1: EntityMetadata, prop1: EntityProperty, meta2: EntityMetadata, prop2: EntityProperty): MetadataError;
61
+ static targetIsAbstract(meta: EntityMetadata, prop: EntityProperty): MetadataError;
62
+ static nonPersistentCompositeProp(meta: EntityMetadata, prop: EntityProperty): MetadataError;
63
+ static propertyTargetsEntityType(meta: EntityMetadata, prop: EntityProperty, target: EntityMetadata): MetadataError;
64
+ static fromMissingOption(meta: EntityMetadata, prop: EntityProperty, option: string): MetadataError;
65
+ static targetKeyOnManyToMany(meta: EntityMetadata, prop: EntityProperty): MetadataError;
66
+ static targetKeyNotUnique(meta: EntityMetadata, prop: EntityProperty, target?: EntityMetadata): MetadataError;
67
+ static targetKeyNotFound(meta: EntityMetadata, prop: EntityProperty, target?: EntityMetadata): MetadataError;
68
+ static incompatiblePolymorphicTargets(meta: EntityMetadata, prop: EntityProperty, target1: EntityMetadata, target2: EntityMetadata, reason: string): MetadataError;
69
+ static dangerousPropertyName(meta: EntityMetadata, prop: EntityProperty): MetadataError;
70
70
  static viewEntityWithoutExpression(meta: EntityMetadata): MetadataError;
71
71
  static mixedInheritanceStrategies(root: EntityMetadata, child: EntityMetadata): MetadataError;
72
72
  static tptNotSupportedByDriver(meta: EntityMetadata): MetadataError;
package/errors.js CHANGED
@@ -34,19 +34,12 @@ export class ValidationError extends Error {
34
34
  return new ValidationError(`Entity ${entity.constructor.name} is not managed. An entity is managed if its fetched from the database or registered as new through EntityManager.persist()`);
35
35
  }
36
36
  static notEntity(owner, prop, data) {
37
- const type = Object.prototype.toString
38
- .call(data)
39
- .match(/\[object (\w+)]/)[1]
40
- .toLowerCase();
37
+ const type = /\[object (\w+)]/.exec(Object.prototype.toString.call(data))[1].toLowerCase();
41
38
  return new ValidationError(`Entity of type ${prop.type} expected for property ${owner.constructor.name}.${prop.name}, ${inspect(data)} of type ${type} given. If you are using Object.assign(entity, data), use em.assign(entity, data) instead.`);
42
39
  }
43
40
  static notDiscoveredEntity(data, meta, action = 'persist') {
44
41
  /* v8 ignore next */
45
- const type = meta?.className ??
46
- Object.prototype.toString
47
- .call(data)
48
- .match(/\[object (\w+)]/)[1]
49
- .toLowerCase();
42
+ const type = meta?.className ?? /\[object (\w+)]/.exec(Object.prototype.toString.call(data))[1].toLowerCase();
50
43
  let err = `Trying to ${action} not discovered entity of type ${type}.`;
51
44
  if (meta) {
52
45
  err += ` Entity with this name was discovered, but not the prototype you are passing to the ORM. If using EntitySchema, be sure to point to the implementation via \`class\`.`;
@@ -63,10 +56,7 @@ export class ValidationError extends Error {
63
56
  return new ValidationError(`Invalid enum array items provided in ${entityName}: ${inspect(invalid)}`);
64
57
  }
65
58
  static invalidType(type, value, mode) {
66
- const valueType = Object.prototype.toString
67
- .call(value)
68
- .match(/\[object (\w+)]/)[1]
69
- .toLowerCase();
59
+ const valueType = /\[object (\w+)]/.exec(Object.prototype.toString.call(value))[1].toLowerCase();
70
60
  if (value instanceof Date) {
71
61
  value = value.toISOString();
72
62
  }
@@ -2,10 +2,7 @@ import type { EntityMetadata } from '../typings.js';
2
2
  import type { EventArgs, EventSubscriber, FlushEventArgs, TransactionEventArgs } from './EventSubscriber.js';
3
3
  import { EventType, type TransactionEventType } from '../enums.js';
4
4
  export declare class EventManager {
5
- private readonly listeners;
6
- private readonly entities;
7
- private readonly cache;
8
- private readonly subscribers;
5
+ #private;
9
6
  constructor(subscribers: Iterable<EventSubscriber>);
10
7
  registerSubscriber(subscriber: EventSubscriber): void;
11
8
  getSubscribers(): Set<EventSubscriber>;
@@ -1,31 +1,31 @@
1
1
  import { Utils } from '../utils/Utils.js';
2
2
  import { EventType, EventTypeMap } from '../enums.js';
3
3
  export class EventManager {
4
- listeners = {};
5
- entities = new Map();
6
- cache = new Map();
7
- subscribers = new Set();
4
+ #listeners = {};
5
+ #entities = new Map();
6
+ #cache = new Map();
7
+ #subscribers = new Set();
8
8
  constructor(subscribers) {
9
9
  for (const subscriber of subscribers) {
10
10
  this.registerSubscriber(subscriber);
11
11
  }
12
12
  }
13
13
  registerSubscriber(subscriber) {
14
- if (this.subscribers.has(subscriber)) {
14
+ if (this.#subscribers.has(subscriber)) {
15
15
  return;
16
16
  }
17
- this.subscribers.add(subscriber);
18
- this.entities.set(subscriber, this.getSubscribedEntities(subscriber));
19
- this.cache.clear();
17
+ this.#subscribers.add(subscriber);
18
+ this.#entities.set(subscriber, this.getSubscribedEntities(subscriber));
19
+ this.#cache.clear();
20
20
  Utils.keys(EventType)
21
21
  .filter(event => event in subscriber)
22
22
  .forEach(event => {
23
- this.listeners[event] ??= new Set();
24
- this.listeners[event].add(subscriber);
23
+ this.#listeners[event] ??= new Set();
24
+ this.#listeners[event].add(subscriber);
25
25
  });
26
26
  }
27
27
  getSubscribers() {
28
- return this.subscribers;
28
+ return this.#subscribers;
29
29
  }
30
30
  dispatchEvent(event, args, meta) {
31
31
  const listeners = [];
@@ -38,39 +38,42 @@ export class EventManager {
38
38
  const handler = typeof hook === 'function' ? hook : (entity[hook] ?? prototypeHook);
39
39
  return handler.bind(entity);
40
40
  }));
41
- for (const listener of this.listeners[event] ?? new Set()) {
42
- const entities = this.entities.get(listener);
41
+ for (const listener of this.#listeners[event] ?? new Set()) {
42
+ const entities = this.#entities.get(listener);
43
43
  if (entities.size === 0 || !entity || entities.has(entity.constructor.name)) {
44
44
  listeners.push(listener[event].bind(listener));
45
45
  }
46
46
  }
47
47
  if (event === EventType.onInit) {
48
- return listeners.forEach(listener => listener(args));
48
+ for (const listener of listeners) {
49
+ void listener(args);
50
+ }
51
+ return;
49
52
  }
50
53
  return Utils.runSerial(listeners, listener => listener(args));
51
54
  }
52
55
  hasListeners(event, meta) {
53
56
  const cacheKey = meta._id + EventTypeMap[event];
54
- if (this.cache.has(cacheKey)) {
55
- return this.cache.get(cacheKey);
57
+ if (this.#cache.has(cacheKey)) {
58
+ return this.#cache.get(cacheKey);
56
59
  }
57
60
  const hasHooks = meta.hooks[event]?.length;
58
61
  if (hasHooks) {
59
- this.cache.set(cacheKey, true);
62
+ this.#cache.set(cacheKey, true);
60
63
  return true;
61
64
  }
62
- for (const listener of this.listeners[event] ?? new Set()) {
63
- const entities = this.entities.get(listener);
65
+ for (const listener of this.#listeners[event] ?? new Set()) {
66
+ const entities = this.#entities.get(listener);
64
67
  if (entities.size === 0 || entities.has(meta.className)) {
65
- this.cache.set(cacheKey, true);
68
+ this.#cache.set(cacheKey, true);
66
69
  return true;
67
70
  }
68
71
  }
69
- this.cache.set(cacheKey, false);
72
+ this.#cache.set(cacheKey, false);
70
73
  return false;
71
74
  }
72
75
  clone() {
73
- return new EventManager(this.subscribers);
76
+ return new EventManager(this.#subscribers);
74
77
  }
75
78
  getSubscribedEntities(listener) {
76
79
  if (!listener.getSubscribedEntities) {
package/events/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from './EventSubscriber.js';
1
+ export type * from './EventSubscriber.js';
2
2
  export * from './EventManager.js';
3
3
  export * from './TransactionEventBroadcaster.js';
package/events/index.js CHANGED
@@ -1,3 +1,2 @@
1
- export * from './EventSubscriber.js';
2
1
  export * from './EventManager.js';
3
2
  export * from './TransactionEventBroadcaster.js';
package/exceptions.js CHANGED
@@ -12,12 +12,14 @@ export class DriverException extends Error {
12
12
  Object.getOwnPropertyNames(previous).forEach(k => (this[k] = previous[k]));
13
13
  this.name = this.constructor.name;
14
14
  Error.captureStackTrace(this, this.constructor);
15
- this.stack +=
16
- '\n\n' +
17
- previous
18
- .stack.split('\n')
19
- .filter(l => l.trim().startsWith('at '))
20
- .join('\n');
15
+ if (previous.stack) {
16
+ this.stack +=
17
+ '\n\n' +
18
+ previous.stack
19
+ .split('\n')
20
+ .filter(l => l.trim().startsWith('at '))
21
+ .join('\n');
22
+ }
21
23
  }
22
24
  }
23
25
  /**
@@ -3,8 +3,7 @@ import { Hydrator } from './Hydrator.js';
3
3
  import type { EntityFactory } from '../entity/EntityFactory.js';
4
4
  type EntityHydrator<T extends object> = (entity: T, data: EntityData<T>, factory: EntityFactory, newEntity: boolean, convertCustomTypes: boolean, schema?: string, parentSchema?: string, normalizeAccessors?: boolean) => void;
5
5
  export declare class ObjectHydrator extends Hydrator {
6
- private readonly hydrators;
7
- private tmpIndex;
6
+ #private;
8
7
  /**
9
8
  * @inheritDoc
10
9
  */
@@ -7,13 +7,13 @@ import { ReferenceKind } from '../enums.js';
7
7
  import { Raw } from '../utils/RawQueryFragment.js';
8
8
  import { ValidationError } from '../errors.js';
9
9
  export class ObjectHydrator extends Hydrator {
10
- hydrators = {
10
+ #hydrators = {
11
11
  'full~true': new Map(),
12
12
  'full~false': new Map(),
13
13
  'reference~true': new Map(),
14
14
  'reference~false': new Map(),
15
15
  };
16
- tmpIndex = 0;
16
+ #tmpIndex = 0;
17
17
  /**
18
18
  * @inheritDoc
19
19
  */
@@ -41,7 +41,7 @@ export class ObjectHydrator extends Hydrator {
41
41
  */
42
42
  getEntityHydrator(meta, type, normalizeAccessors = false) {
43
43
  const key = `${type}~${normalizeAccessors}`;
44
- const exists = this.hydrators[key].get(meta.class);
44
+ const exists = this.#hydrators[key].get(meta.class);
45
45
  if (exists) {
46
46
  return exists;
47
47
  }
@@ -67,11 +67,11 @@ export class ObjectHydrator extends Hydrator {
67
67
  const entityKey = path.map(k => this.wrap(k)).join('');
68
68
  const tz = this.platform.getTimezone();
69
69
  const convertorKey = path
70
- .filter(k => !k.match(/\[idx_\d+]/))
70
+ .filter(k => !/\[idx_\d+]/.exec(k))
71
71
  .map(k => this.safeKey(k))
72
72
  .join('_');
73
73
  const ret = [];
74
- const idx = this.tmpIndex++;
74
+ const idx = this.#tmpIndex++;
75
75
  const nullVal = this.config.get('forceUndefined') ? 'undefined' : 'null';
76
76
  if (prop.getter && !prop.setter && prop.persist === false) {
77
77
  return [];
@@ -150,7 +150,7 @@ export class ObjectHydrator extends Hydrator {
150
150
  const keyOption = prop.targetKey ? `, key: '${prop.targetKey}'` : '';
151
151
  if (prop.polymorphic) {
152
152
  // For polymorphic: target class from discriminator map, PK from data.id
153
- const discriminatorMapKey = this.safeKey(`discriminatorMap_${prop.name}_${this.tmpIndex++}`);
153
+ const discriminatorMapKey = this.safeKey(`discriminatorMap_${prop.name}_${this.#tmpIndex++}`);
154
154
  context.set(discriminatorMapKey, prop.discriminatorMap);
155
155
  ret.push(` const targetClass = ${discriminatorMapKey}[data${dataKey}.discriminator];`);
156
156
  ret.push(` if (!targetClass) throw new ValidationError(\`Unknown discriminator value '\${data${dataKey}.discriminator}' for polymorphic relation '${prop.name}'. Valid values: \${Object.keys(${discriminatorMapKey}).join(', ')}\`);`);
@@ -163,7 +163,7 @@ export class ObjectHydrator extends Hydrator {
163
163
  }
164
164
  else {
165
165
  // For regular: fixed target class, PK is the data itself
166
- const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
166
+ const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.#tmpIndex++}`);
167
167
  context.set(targetKey, prop.targetMeta.class);
168
168
  if (prop.ref) {
169
169
  ret.push(` entity${entityKey} = Reference.create(factory.createReference(${targetKey}, data${dataKey}, { merge: true, convertCustomTypes, normalizeAccessors, schema${keyOption} }));`);
@@ -179,7 +179,7 @@ export class ObjectHydrator extends Hydrator {
179
179
  hydrateTargetExpr = `data${dataKey}.constructor`;
180
180
  }
181
181
  else {
182
- const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
182
+ const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.#tmpIndex++}`);
183
183
  context.set(targetKey, prop.targetMeta.class);
184
184
  hydrateTargetExpr = targetKey;
185
185
  }
@@ -238,7 +238,7 @@ export class ObjectHydrator extends Hydrator {
238
238
  };
239
239
  const registerEmbeddedPrototype = (prop, path) => {
240
240
  const convertorKey = path
241
- .filter(k => !k.match(/\[idx_\d+]/))
241
+ .filter(k => !/\[idx_\d+]/.exec(k))
242
242
  .map(k => this.safeKey(k))
243
243
  .join('_');
244
244
  if (prop.targetMeta?.polymorphs) {
@@ -287,7 +287,7 @@ export class ObjectHydrator extends Hydrator {
287
287
  else {
288
288
  ret.push(` const embeddedData = {`);
289
289
  for (const childProp of Object.values(prop.embeddedProps)) {
290
- const key = childProp.embedded[1].match(/^\w+$/) ? childProp.embedded[1] : `'${childProp.embedded[1]}'`;
290
+ const key = /^\w+$/.exec(childProp.embedded[1]) ? childProp.embedded[1] : `'${childProp.embedded[1]}'`;
291
291
  ret.push(` ${key}: data${this.wrap(childProp.name)},`);
292
292
  }
293
293
  ret.push(` };`);
@@ -323,7 +323,7 @@ export class ObjectHydrator extends Hydrator {
323
323
  });
324
324
  }
325
325
  else {
326
- const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
326
+ const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.#tmpIndex++}`);
327
327
  context.set(targetKey, prop.targetMeta.class);
328
328
  ret.push(` if (entity${entityKey} == null) {`);
329
329
  ret.push(` entity${entityKey} = factory.createEmbeddable(${targetKey}, embeddedData, { newEntity, convertCustomTypes, normalizeAccessors });`);
@@ -352,7 +352,7 @@ export class ObjectHydrator extends Hydrator {
352
352
  const hydrateEmbeddedArray = (prop, path, dataKey) => {
353
353
  const entityKey = path.map(k => this.wrap(k)).join('');
354
354
  const ret = [];
355
- const idx = this.tmpIndex++;
355
+ const idx = this.#tmpIndex++;
356
356
  registerEmbeddedPrototype(prop, path);
357
357
  parseObjectEmbeddable(prop, dataKey, ret);
358
358
  ret.push(` if (Array.isArray(data${dataKey})) {`);
@@ -402,7 +402,7 @@ export class ObjectHydrator extends Hydrator {
402
402
  `${lines.join('\n')}\n}`;
403
403
  const fnKey = `hydrator-${meta.uniqueName}-${type}-${normalizeAccessors}`;
404
404
  const hydrator = Utils.createFunction(context, code, this.config.get('compiledFunctions'), fnKey);
405
- this.hydrators[key].set(meta.class, hydrator);
405
+ this.#hydrators[key].set(meta.class, hydrator);
406
406
  return hydrator;
407
407
  }
408
408
  createCollectionItemMapper(prop, context) {
@@ -415,7 +415,7 @@ export class ObjectHydrator extends Hydrator {
415
415
  lines.push(` value = { ...value, ['${prop2.name}']: Reference.wrapReference(entity, { ref: ${prop2.ref} }) };`);
416
416
  lines.push(` }`);
417
417
  }
418
- const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.tmpIndex++}`);
418
+ const targetKey = this.safeKey(`${prop.targetMeta.tableName}_${this.#tmpIndex++}`);
419
419
  context.set(targetKey, prop.targetMeta.class);
420
420
  lines.push(` if (isPrimaryKey(value, ${meta.compositePK})) return factory.createReference(${targetKey}, value, { convertCustomTypes, schema, normalizeAccessors, merge: true });`);
421
421
  lines.push(` if (value && value.__entity) return value;`);
@@ -424,10 +424,10 @@ export class ObjectHydrator extends Hydrator {
424
424
  return lines;
425
425
  }
426
426
  wrap(key) {
427
- if (key.match(/^\[.*]$/)) {
427
+ if (/^\[.*]$/.exec(key)) {
428
428
  return key;
429
429
  }
430
- return key.match(/^\w+$/) ? `.${key}` : `['${key}']`;
430
+ return /^\w+$/.exec(key) ? `.${key}` : `['${key}']`;
431
431
  }
432
432
  safeKey(key) {
433
433
  return key.replace(/\W/g, '_');
@@ -68,7 +68,8 @@ export class DefaultLogger {
68
68
  * @inheritDoc
69
69
  */
70
70
  logQuery(context) {
71
- if (!this.isEnabled('query', context)) {
71
+ const namespace = context.namespace ?? 'query';
72
+ if (!this.isEnabled(namespace, context)) {
72
73
  return;
73
74
  }
74
75
  /* v8 ignore next */
@@ -86,7 +87,7 @@ export class DefaultLogger {
86
87
  if (this.usesReplicas && context.connection) {
87
88
  msg += colors.cyan(` (via ${context.connection.type} connection '${context.connection.name}')`);
88
89
  }
89
- return this.log('query', msg, context);
90
+ return this.log(namespace, msg, context);
90
91
  }
91
92
  static create(options) {
92
93
  return new DefaultLogger(options);
@@ -22,10 +22,11 @@ export interface Logger {
22
22
  setDebugMode(debugMode: boolean | LoggerNamespace[]): void;
23
23
  isEnabled(namespace: LoggerNamespace, context?: LogContext): boolean;
24
24
  }
25
- export type LoggerNamespace = 'query' | 'query-params' | 'schema' | 'discovery' | 'info' | 'deprecated';
25
+ export type LoggerNamespace = 'query' | 'query-params' | 'schema' | 'discovery' | 'info' | 'deprecated' | 'slow-query';
26
26
  export interface LogContext extends Dictionary {
27
27
  query?: string;
28
28
  label?: string;
29
+ namespace?: LoggerNamespace;
29
30
  params?: readonly unknown[];
30
31
  took?: number;
31
32
  results?: number;
package/logging/colors.js CHANGED
@@ -2,7 +2,7 @@ import { getEnv } from '../utils/env-vars.js';
2
2
  const bool = (k) => ['true', 't', '1'].includes(getEnv(k)?.toLowerCase() ?? '');
3
3
  const boolIfDefined = (k) => (getEnv(k) != null ? bool(k) : true);
4
4
  const enabled = () => !bool('NO_COLOR') && !bool('MIKRO_ORM_NO_COLOR') && boolIfDefined('FORCE_COLOR') && boolIfDefined('MIKRO_ORM_COLORS');
5
- const wrap = (fn) => (text) => (enabled() ? fn(text) : text);
5
+ const wrap = (fn) => (text) => enabled() ? fn(text) : text;
6
6
  /** @internal */
7
7
  export const colors = {
8
8
  red: wrap((text) => `\x1B[31m${text}\x1B[39m`),
@@ -1,5 +1,5 @@
1
1
  export * from './colors.js';
2
- export * from './Logger.js';
2
+ export type * from './Logger.js';
3
3
  export * from './DefaultLogger.js';
4
4
  export * from './SimpleLogger.js';
5
5
  export * from './inspect.js';
package/logging/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  export * from './colors.js';
2
- export * from './Logger.js';
3
2
  export * from './DefaultLogger.js';
4
3
  export * from './SimpleLogger.js';
5
4
  export * from './inspect.js';
@@ -47,7 +47,7 @@ export declare class EntitySchema<Entity = any, Base = never, Class extends Enti
47
47
  * When schema links the entity class via `class` option, this registry allows the lookup from opposite side,
48
48
  * so we can use the class in `entities` option just like the EntitySchema instance.
49
49
  */
50
- static REGISTRY: Map<Partial<any>, EntitySchema<any, never, EntityCtor<any>>>;
50
+ static REGISTRY: Map<AnyEntity, EntitySchema>;
51
51
  /** @internal Type-level marker for fast entity type inference */
52
52
  readonly '~entity': Entity;
53
53
  private readonly _meta;
@@ -4,15 +4,7 @@ import { MetadataStorage } from './MetadataStorage.js';
4
4
  import { EntitySchema } from './EntitySchema.js';
5
5
  import type { Platform } from '../platforms/Platform.js';
6
6
  export declare class MetadataDiscovery {
7
- private readonly metadata;
8
- private readonly platform;
9
- private readonly config;
10
- private readonly namingStrategy;
11
- private readonly metadataProvider;
12
- private readonly logger;
13
- private readonly schemaHelper;
14
- private readonly validator;
15
- private readonly discovered;
7
+ #private;
16
8
  constructor(metadata: MetadataStorage, platform: Platform, config: Configuration);
17
9
  discover(preferTs?: boolean): Promise<MetadataStorage>;
18
10
  discoverSync(): MetadataStorage;