@mikro-orm/core 7.0.0-rc.2 → 7.0.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.
- package/EntityManager.d.ts +4 -16
- package/EntityManager.js +248 -181
- package/MikroORM.d.ts +4 -6
- package/MikroORM.js +24 -24
- package/README.md +5 -4
- package/cache/FileCacheAdapter.d.ts +1 -5
- package/cache/FileCacheAdapter.js +22 -24
- package/cache/GeneratedCacheAdapter.d.ts +1 -1
- package/cache/GeneratedCacheAdapter.js +6 -6
- package/cache/MemoryCacheAdapter.d.ts +1 -2
- package/cache/MemoryCacheAdapter.js +8 -8
- package/cache/index.d.ts +1 -1
- package/cache/index.js +0 -1
- package/connections/Connection.d.ts +1 -0
- package/connections/Connection.js +43 -14
- package/drivers/DatabaseDriver.d.ts +0 -2
- package/drivers/DatabaseDriver.js +28 -12
- package/drivers/IDatabaseDriver.d.ts +43 -0
- package/entity/Collection.d.ts +1 -9
- package/entity/Collection.js +124 -108
- package/entity/EntityAssigner.js +23 -11
- package/entity/EntityFactory.d.ts +1 -8
- package/entity/EntityFactory.js +79 -59
- package/entity/EntityHelper.js +25 -16
- package/entity/EntityLoader.d.ts +1 -3
- package/entity/EntityLoader.js +90 -60
- package/entity/Reference.d.ts +2 -3
- package/entity/Reference.js +48 -19
- package/entity/WrappedEntity.d.ts +4 -2
- package/entity/WrappedEntity.js +5 -1
- package/entity/defineEntity.d.ts +42 -85
- package/entity/utils.js +28 -26
- package/entity/validators.js +2 -1
- package/enums.d.ts +2 -1
- package/enums.js +13 -17
- package/errors.d.ts +11 -11
- package/errors.js +8 -8
- package/events/EventManager.d.ts +1 -4
- package/events/EventManager.js +26 -23
- package/events/index.d.ts +1 -1
- package/events/index.js +0 -1
- package/exceptions.js +9 -2
- package/hydration/ObjectHydrator.d.ts +1 -2
- package/hydration/ObjectHydrator.js +41 -27
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/logging/DefaultLogger.js +6 -7
- package/logging/Logger.d.ts +2 -1
- package/logging/colors.js +2 -5
- package/logging/index.d.ts +1 -1
- package/logging/index.js +0 -1
- package/metadata/EntitySchema.d.ts +3 -3
- package/metadata/EntitySchema.js +12 -2
- package/metadata/MetadataDiscovery.d.ts +1 -9
- package/metadata/MetadataDiscovery.js +251 -179
- package/metadata/MetadataProvider.js +26 -1
- package/metadata/MetadataStorage.d.ts +1 -5
- package/metadata/MetadataStorage.js +37 -39
- package/metadata/MetadataValidator.js +20 -5
- package/metadata/discover-entities.js +1 -1
- package/metadata/index.d.ts +1 -1
- package/metadata/index.js +0 -1
- package/metadata/types.d.ts +2 -2
- package/naming-strategy/AbstractNamingStrategy.js +6 -3
- package/naming-strategy/EntityCaseNamingStrategy.js +1 -1
- package/naming-strategy/index.d.ts +1 -1
- package/naming-strategy/index.js +0 -1
- package/not-supported.js +5 -1
- package/package.json +38 -38
- package/platforms/Platform.d.ts +24 -1
- package/platforms/Platform.js +106 -27
- package/serialization/EntitySerializer.js +8 -4
- package/serialization/EntityTransformer.js +4 -1
- package/serialization/SerializationContext.d.ts +4 -8
- package/serialization/SerializationContext.js +21 -16
- package/types/UuidType.d.ts +2 -0
- package/types/UuidType.js +14 -2
- package/types/index.d.ts +2 -1
- package/typings.d.ts +35 -24
- package/typings.js +9 -9
- package/unit-of-work/ChangeSet.js +4 -4
- package/unit-of-work/ChangeSetComputer.d.ts +1 -6
- package/unit-of-work/ChangeSetComputer.js +29 -27
- package/unit-of-work/ChangeSetPersister.d.ts +1 -9
- package/unit-of-work/ChangeSetPersister.js +63 -58
- package/unit-of-work/CommitOrderCalculator.d.ts +1 -4
- package/unit-of-work/CommitOrderCalculator.js +17 -15
- package/unit-of-work/IdentityMap.d.ts +2 -5
- package/unit-of-work/IdentityMap.js +18 -18
- package/unit-of-work/UnitOfWork.d.ts +12 -20
- package/unit-of-work/UnitOfWork.js +228 -191
- package/utils/AbstractMigrator.d.ts +2 -2
- package/utils/AbstractMigrator.js +10 -12
- package/utils/AbstractSchemaGenerator.js +2 -1
- package/utils/AsyncContext.js +1 -1
- package/utils/Configuration.d.ts +90 -189
- package/utils/Configuration.js +97 -77
- package/utils/Cursor.d.ts +3 -3
- package/utils/Cursor.js +8 -6
- package/utils/DataloaderUtils.js +15 -12
- package/utils/EntityComparator.d.ts +8 -15
- package/utils/EntityComparator.js +100 -92
- package/utils/QueryHelper.d.ts +16 -1
- package/utils/QueryHelper.js +108 -50
- package/utils/RawQueryFragment.d.ts +4 -4
- package/utils/RawQueryFragment.js +3 -2
- package/utils/TransactionManager.js +3 -3
- package/utils/Utils.d.ts +2 -2
- package/utils/Utils.js +39 -32
- package/utils/clone.js +5 -0
- package/utils/env-vars.js +6 -5
- package/utils/fs-utils.d.ts +3 -17
- package/utils/fs-utils.js +2 -5
- package/utils/upsert-utils.js +7 -4
package/entity/defineEntity.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { EntityManager } from '../EntityManager.js';
|
|
2
2
|
import type { ColumnType, PropertyOptions, ReferenceOptions, EnumOptions, EmbeddedOptions, ManyToOneOptions, OneToManyOptions, OneToOneOptions, ManyToManyOptions } from '../metadata/types.js';
|
|
3
|
-
import type { AnyString, GeneratedColumnCallback, Constructor, CheckCallback, FilterQuery, EntityName, Dictionary, EntityMetadata, PrimaryKeyProp, EntityRepositoryType, Hidden, Opt, Primary, EntityClass, EntitySchemaWithMeta, InferEntity, MaybeReturnType, Ref, IndexCallback, FormulaCallback, EntityCtor, IsNever } from '../typings.js';
|
|
3
|
+
import type { AnyString, GeneratedColumnCallback, Constructor, CheckCallback, FilterQuery, EntityName, Dictionary, EntityMetadata, PrimaryKeyProp, EntityRepositoryType, Hidden, Opt, Primary, EntityClass, EntitySchemaWithMeta, InferEntity, MaybeReturnType, Ref, IndexCallback, FormulaCallback, EntityCtor, IsNever, IWrappedEntity, DefineConfig, Config } from '../typings.js';
|
|
4
4
|
import type { Raw } from '../utils/RawQueryFragment.js';
|
|
5
5
|
import type { ScalarReference } from './Reference.js';
|
|
6
6
|
import type { SerializeOptions } from '../serialization/EntitySerializer.js';
|
|
@@ -96,7 +96,7 @@ export interface PropertyChain<Value, Options> {
|
|
|
96
96
|
serializer(serializer: (value: Value, options?: SerializeOptions<any>) => any): PropertyChain<Value, Options>;
|
|
97
97
|
serializedName(serializedName: string): PropertyChain<Value, Options>;
|
|
98
98
|
groups(...groups: string[]): PropertyChain<Value, Options>;
|
|
99
|
-
customOrder(...customOrder:
|
|
99
|
+
customOrder(...customOrder: string[] | number[] | boolean[]): PropertyChain<Value, Options>;
|
|
100
100
|
extra(extra: string): PropertyChain<Value, Options>;
|
|
101
101
|
ignoreSchemaChanges(...ignoreSchemaChanges: ('type' | 'extra' | 'default')[]): PropertyChain<Value, Options>;
|
|
102
102
|
index(index?: boolean | string): PropertyChain<Value, Options>;
|
|
@@ -409,7 +409,7 @@ export declare class UniversalPropertyOptionsBuilder<Value, Options, IncludeKeys
|
|
|
409
409
|
/**
|
|
410
410
|
* Specify a custom order based on the values. (SQL only)
|
|
411
411
|
*/
|
|
412
|
-
customOrder(...customOrder:
|
|
412
|
+
customOrder(...customOrder: string[] | number[] | boolean[]): Pick<UniversalPropertyOptionsBuilder<Value, Options, IncludeKeys>, IncludeKeys>;
|
|
413
413
|
/**
|
|
414
414
|
* Specify comment of column for {@link https://mikro-orm.io/docs/schema-generator Schema Generator}. (SQL only)
|
|
415
415
|
*/
|
|
@@ -501,68 +501,56 @@ export declare class OneToManyOptionsBuilderOnlyMappedBy<Value extends object> e
|
|
|
501
501
|
kind: '1:m';
|
|
502
502
|
}, IncludeKeysForOneToManyOptions> {
|
|
503
503
|
/** Point to the owning side property name. */
|
|
504
|
-
mappedBy(mappedBy:
|
|
504
|
+
mappedBy(mappedBy: keyof Value | ((e: Value) => any)): Pick<UniversalPropertyOptionsBuilder<Value, EmptyOptions & {
|
|
505
505
|
kind: '1:m';
|
|
506
506
|
}, IncludeKeysForOneToManyOptions>, IncludeKeysForOneToManyOptions>;
|
|
507
507
|
}
|
|
508
508
|
type EntityTarget = {
|
|
509
509
|
'~entity': any;
|
|
510
510
|
} | EntityClass;
|
|
511
|
-
declare const propertyBuilders:
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
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<
|
|
518
|
-
time: (length?: number) => UniversalPropertyOptionsBuilder<
|
|
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:
|
|
526
|
+
kind: 'embedded';
|
|
523
527
|
}>;
|
|
524
528
|
manyToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
|
|
525
|
-
kind:
|
|
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:
|
|
532
|
+
kind: 'm:1';
|
|
529
533
|
}>;
|
|
530
534
|
oneToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
|
|
531
|
-
kind:
|
|
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:
|
|
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);
|
|
556
|
-
export interface EntityMetadataWithProperties<TName extends string, TTableName extends string, TProperties extends Record<string, any>, TPK extends (keyof TProperties)[] | undefined = undefined, TBase = never, TRepository = never> extends Omit<Partial<EntityMetadata<InferEntityFromProperties<TProperties, TPK, TBase, TRepository>>>, 'properties' | 'extends' | 'primaryKeys' | 'hooks' | 'discriminatorColumn' | 'versionProperty' | 'concurrencyCheckKeys' | 'serializedPrimaryKey' | 'indexes' | 'uniques' | 'repository' | 'orderBy'> {
|
|
543
|
+
export interface EntityMetadataWithProperties<TName extends string, TTableName extends string, TProperties extends Record<string, any>, TPK extends (keyof TProperties)[] | undefined = undefined, TBase = never, TRepository = never, TForceObject extends boolean = false> extends Omit<Partial<EntityMetadata<InferEntityFromProperties<TProperties, TPK, TBase, TRepository>>>, 'properties' | 'extends' | 'primaryKeys' | 'hooks' | 'discriminatorColumn' | 'versionProperty' | 'concurrencyCheckKeys' | 'serializedPrimaryKey' | 'indexes' | 'uniques' | 'repository' | 'orderBy'> {
|
|
557
544
|
name: TName;
|
|
558
545
|
tableName?: TTableName;
|
|
559
546
|
extends?: {
|
|
560
547
|
'~entity': TBase;
|
|
561
548
|
} | EntityCtor<TBase>;
|
|
562
|
-
properties: TProperties | ((properties:
|
|
549
|
+
properties: TProperties | ((properties: PropertyBuilders) => TProperties);
|
|
563
550
|
primaryKeys?: TPK & InferPrimaryKey<TProperties>[];
|
|
564
551
|
hooks?: DefineEntityHooks;
|
|
565
552
|
repository?: () => TRepository;
|
|
553
|
+
forceObject?: TForceObject;
|
|
566
554
|
inheritance?: 'tpt';
|
|
567
555
|
orderBy?: {
|
|
568
556
|
[K in Extract<AllKeys<TProperties, TBase>, string>]?: QueryOrderKeysFlat;
|
|
@@ -588,59 +576,17 @@ export interface EntityMetadataWithProperties<TName extends string, TTableName e
|
|
|
588
576
|
deferMode?: DeferMode | `${DeferMode}`;
|
|
589
577
|
}[];
|
|
590
578
|
}
|
|
591
|
-
export declare function defineEntity<const TName extends string, const TTableName extends string, const TProperties extends Record<string, any>, const TPK extends (keyof TProperties)[] | undefined = undefined, const TBase = never, const TRepository = never>(meta: EntityMetadataWithProperties<TName, TTableName, TProperties, TPK, TBase, TRepository>): EntitySchemaWithMeta<TName, TTableName, InferEntityFromProperties<TProperties, TPK, TBase, TRepository>, TBase, TProperties>;
|
|
579
|
+
export declare function defineEntity<const TName extends string, const TTableName extends string, const TProperties extends Record<string, any>, const TPK extends (keyof TProperties)[] | undefined = undefined, const TBase = never, const TRepository = never, const TForceObject extends boolean = false>(meta: EntityMetadataWithProperties<TName, TTableName, TProperties, TPK, TBase, TRepository, TForceObject>): EntitySchemaWithMeta<TName, TTableName, InferEntityFromProperties<TProperties, TPK, TBase, TRepository, TForceObject>, TBase, TProperties>;
|
|
592
580
|
export declare function defineEntity<const TEntity = any, const TProperties extends Record<string, any> = Record<string, any>, const TClassName extends string = string, const TTableName extends string = string, const TBase = never, const TClass extends EntityCtor = EntityCtor<TEntity>>(meta: Omit<Partial<EntityMetadata<TEntity>>, 'properties' | 'extends' | 'className' | 'tableName' | 'hooks'> & {
|
|
593
581
|
class: TClass;
|
|
594
582
|
className?: TClassName;
|
|
595
583
|
tableName?: TTableName;
|
|
596
584
|
extends?: TBase;
|
|
597
|
-
properties: TProperties | ((properties:
|
|
585
|
+
properties: TProperties | ((properties: PropertyBuilders) => TProperties);
|
|
598
586
|
hooks?: DefineEntityHooks<TEntity>;
|
|
599
587
|
}): EntitySchemaWithMeta<TClassName, TTableName, TEntity, TBase, TProperties, TClass>;
|
|
600
588
|
export declare namespace defineEntity {
|
|
601
|
-
var properties:
|
|
602
|
-
bigint: <Mode extends "bigint" | "number" | "string" = "bigint">(mode?: Mode) => UniversalPropertyOptionsBuilder<(Mode extends "bigint" ? bigint : Mode extends "number" ? number : string) & {}, EmptyOptions, IncludeKeysForProperty>;
|
|
603
|
-
array: <T = string>(toJsValue?: (i: string) => T, toDbValue?: (i: T) => string) => UniversalPropertyOptionsBuilder<T[], EmptyOptions, IncludeKeysForProperty>;
|
|
604
|
-
decimal: <Mode extends "number" | "string" = "string">(mode?: Mode) => UniversalPropertyOptionsBuilder<NonNullable<Mode extends "number" ? number : string>, EmptyOptions, IncludeKeysForProperty>;
|
|
605
|
-
json: <T>() => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
|
|
606
|
-
formula: <T>(formula: string | FormulaCallback<any>) => UniversalPropertyOptionsBuilder<T, EmptyOptions, IncludeKeysForProperty>;
|
|
607
|
-
datetime: (length?: number) => UniversalPropertyOptionsBuilder<Date, EmptyOptions, IncludeKeysForProperty>;
|
|
608
|
-
time: (length?: number) => UniversalPropertyOptionsBuilder<any, EmptyOptions, IncludeKeysForProperty>;
|
|
609
|
-
type: <T extends PropertyValueType>(type: T) => UniversalPropertyOptionsBuilder<InferPropertyValueType<T>, EmptyOptions, IncludeKeysForProperty>;
|
|
610
|
-
enum: <const T extends (number | string)[] | (() => Dictionary)>(items?: T) => UniversalPropertyOptionsBuilder<T extends () => Dictionary ? ValueOf<ReturnType<T>> : T extends (infer Value)[] ? Value : T, EmptyOptions, IncludeKeysForEnumOptions>;
|
|
611
|
-
embedded: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
|
|
612
|
-
kind: "embedded";
|
|
613
|
-
}>;
|
|
614
|
-
manyToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
|
|
615
|
-
kind: "m:n";
|
|
616
|
-
}>;
|
|
617
|
-
manyToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
|
|
618
|
-
kind: "m:1";
|
|
619
|
-
}>;
|
|
620
|
-
oneToMany: <Target extends EntityTarget>(target: Target) => PropertyChain<InferEntity<Target>, EmptyOptions & {
|
|
621
|
-
kind: "1:m";
|
|
622
|
-
}>;
|
|
623
|
-
oneToOne: <Target extends EntityTarget | EntityTarget[]>(target: Target) => PropertyChain<InferEntity<Target extends (infer T)[] ? T : Target>, EmptyOptions & {
|
|
624
|
-
kind: "1:1";
|
|
625
|
-
}>;
|
|
626
|
-
date: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
627
|
-
blob: () => UniversalPropertyOptionsBuilder<NonNullable<Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike> | null>, EmptyOptions, IncludeKeysForProperty>;
|
|
628
|
-
uint8array: () => UniversalPropertyOptionsBuilder<Uint8Array<ArrayBufferLike>, EmptyOptions, IncludeKeysForProperty>;
|
|
629
|
-
enumArray: () => UniversalPropertyOptionsBuilder<(string | number)[], EmptyOptions, IncludeKeysForProperty>;
|
|
630
|
-
integer: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
|
|
631
|
-
smallint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
|
|
632
|
-
tinyint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
|
|
633
|
-
mediumint: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
|
|
634
|
-
float: () => UniversalPropertyOptionsBuilder<number, EmptyOptions, IncludeKeysForProperty>;
|
|
635
|
-
double: () => UniversalPropertyOptionsBuilder<NonNullable<string | number>, EmptyOptions, IncludeKeysForProperty>;
|
|
636
|
-
boolean: () => UniversalPropertyOptionsBuilder<NonNullable<boolean | null | undefined>, EmptyOptions, IncludeKeysForProperty>;
|
|
637
|
-
character: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
638
|
-
string: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
639
|
-
uuid: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
640
|
-
text: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
641
|
-
interval: () => UniversalPropertyOptionsBuilder<string, EmptyOptions, IncludeKeysForProperty>;
|
|
642
|
-
unknown: () => UniversalPropertyOptionsBuilder<{}, EmptyOptions, IncludeKeysForProperty>;
|
|
643
|
-
};
|
|
589
|
+
var properties: PropertyBuilders;
|
|
644
590
|
}
|
|
645
591
|
export { propertyBuilders as p };
|
|
646
592
|
type EntityHookValue<T, K extends keyof EventSubscriber<T>> = (keyof T | NonNullable<EventSubscriber<T>[K]>)[];
|
|
@@ -658,23 +604,34 @@ export interface DefineEntityHooks<T = any> {
|
|
|
658
604
|
}
|
|
659
605
|
type PropertyValueType = PropertyOptions<any>['type'];
|
|
660
606
|
type InferPropertyValueType<T extends PropertyValueType> = T extends string ? InferTypeByString<T> : T extends NumberConstructor ? number : T extends StringConstructor ? string : T extends BooleanConstructor ? boolean : T extends DateConstructor ? Date : T extends ArrayConstructor ? string[] : T extends Constructor<infer TType> ? TType extends Type<infer TValue, any> ? NonNullable<TValue> : TType : T extends Type<infer TValue, any> ? NonNullable<TValue> : any;
|
|
661
|
-
type InferTypeByString<T extends string> = T extends keyof typeof types ? InferJSType<typeof types[T]> : InferColumnType<T>;
|
|
607
|
+
type InferTypeByString<T extends string> = T extends keyof typeof types ? InferJSType<(typeof types)[T]> : InferColumnType<T>;
|
|
662
608
|
type InferJSType<T> = T extends typeof Type<infer TValue, any> ? NonNullable<TValue> : never;
|
|
663
609
|
type InferColumnType<T extends string> = T extends 'int' | 'int4' | 'integer' | 'bigint' | 'int8' | 'int2' | 'tinyint' | 'smallint' | 'mediumint' ? number : T extends 'double' | 'double precision' | 'real' | 'float8' | 'decimal' | 'numeric' | 'float' | 'float4' ? number : T extends 'datetime' | 'time' | 'time with time zone' | 'timestamp' | 'timestamp with time zone' | 'timetz' | 'timestamptz' | 'date' | 'interval' ? Date : T extends 'ObjectId' | 'objectId' | 'character varying' | 'varchar' | 'char' | 'character' | 'uuid' | 'text' | 'tinytext' | 'mediumtext' | 'longtext' | 'enum' ? string : T extends 'boolean' | 'bool' | 'bit' ? boolean : T extends 'blob' | 'tinyblob' | 'mediumblob' | 'longblob' | 'bytea' ? Buffer : T extends 'point' | 'line' | 'lseg' | 'box' | 'circle' | 'path' | 'polygon' | 'geometry' ? number[] : T extends 'tsvector' | 'tsquery' ? string[] : T extends 'json' | 'jsonb' ? any : any;
|
|
664
|
-
|
|
610
|
+
type BaseEntityMethodKeys = 'toObject' | 'toPOJO' | 'serialize' | 'assign' | 'populate' | 'init' | 'toReference';
|
|
611
|
+
export type InferEntityFromProperties<Properties extends Record<string, any>, PK extends (keyof Properties)[] | undefined = undefined, Base = never, Repository = never, ForceObject extends boolean = false> = (IsNever<Base> extends true ? {} : Base extends {
|
|
612
|
+
toObject(...args: any[]): any;
|
|
613
|
+
} ? Pick<IWrappedEntity<{
|
|
665
614
|
-readonly [K in keyof Properties]: InferBuilderValue<MaybeReturnType<Properties[K]>>;
|
|
666
615
|
} & {
|
|
667
616
|
[PrimaryKeyProp]?: InferCombinedPrimaryKey<Properties, PK, Base>;
|
|
668
617
|
} & (IsNever<Repository> extends true ? {} : {
|
|
669
618
|
[EntityRepositoryType]?: Repository extends Constructor<infer R> ? R : Repository;
|
|
670
|
-
}) &
|
|
619
|
+
}) & Omit<Base, typeof PrimaryKeyProp>>, BaseEntityMethodKeys> : {}) & {
|
|
620
|
+
-readonly [K in keyof Properties]: InferBuilderValue<MaybeReturnType<Properties[K]>>;
|
|
621
|
+
} & {
|
|
622
|
+
[PrimaryKeyProp]?: InferCombinedPrimaryKey<Properties, PK, Base>;
|
|
623
|
+
} & (IsNever<Repository> extends true ? {} : {
|
|
624
|
+
[EntityRepositoryType]?: Repository extends Constructor<infer R> ? R : Repository;
|
|
625
|
+
}) & (IsNever<Base> extends true ? {} : Omit<Base, typeof PrimaryKeyProp>) & (ForceObject extends true ? {
|
|
626
|
+
[Config]?: DefineConfig<{
|
|
627
|
+
forceObject: true;
|
|
628
|
+
}>;
|
|
629
|
+
} : {});
|
|
671
630
|
type InferCombinedPrimaryKey<Properties extends Record<string, any>, PK, Base> = PK extends undefined ? CombinePrimaryKeys<InferPrimaryKey<Properties>, ExtractBasePrimaryKey<Base>> : PK;
|
|
672
631
|
type ExtractBasePrimaryKey<Base> = Base extends {
|
|
673
632
|
[PrimaryKeyProp]?: infer BasePK;
|
|
674
633
|
} ? BasePK : never;
|
|
675
|
-
type CombinePrimaryKeys<ChildPK, BasePK> = [
|
|
676
|
-
ChildPK
|
|
677
|
-
] extends [never] ? BasePK : [BasePK] extends [never] ? IsUnion<ChildPK> extends true ? ChildPK[] : ChildPK : ChildPK | BasePK;
|
|
634
|
+
type CombinePrimaryKeys<ChildPK, BasePK> = [ChildPK] extends [never] ? BasePK : [BasePK] extends [never] ? IsUnion<ChildPK> extends true ? ChildPK[] : ChildPK : ChildPK | BasePK;
|
|
678
635
|
export type InferPrimaryKey<Properties extends Record<string, any>> = {
|
|
679
636
|
[K in keyof Properties]: MaybeReturnType<Properties[K]> extends {
|
|
680
637
|
'~options': {
|
package/entity/utils.js
CHANGED
|
@@ -17,15 +17,17 @@ function expandNestedPopulate(parentProp, parts, strategy, all) {
|
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
19
19
|
export function expandDotPaths(meta, populate, normalized = false) {
|
|
20
|
-
const ret = normalized
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
const ret = normalized
|
|
21
|
+
? populate
|
|
22
|
+
: Utils.asArray(populate).map(field => {
|
|
23
|
+
if (typeof field === 'string') {
|
|
24
|
+
return { field };
|
|
25
|
+
}
|
|
26
|
+
/* v8 ignore next */
|
|
27
|
+
return typeof field === 'boolean' || field.field === PopulatePath.ALL
|
|
28
|
+
? { all: !!field, field: meta.primaryKeys[0] }
|
|
29
|
+
: field;
|
|
30
|
+
});
|
|
29
31
|
for (const p of ret) {
|
|
30
32
|
if (!p.field.includes('.')) {
|
|
31
33
|
continue;
|
|
@@ -35,8 +37,8 @@ export function expandDotPaths(meta, populate, normalized = false) {
|
|
|
35
37
|
p.children ??= [];
|
|
36
38
|
const prop = meta.properties[p.field];
|
|
37
39
|
if (parts[0] === PopulatePath.ALL) {
|
|
38
|
-
prop
|
|
39
|
-
.filter(prop => prop.lazy || prop.kind !== ReferenceKind.SCALAR)
|
|
40
|
+
prop
|
|
41
|
+
.targetMeta.props.filter(prop => prop.lazy || prop.kind !== ReferenceKind.SCALAR)
|
|
40
42
|
.forEach(prop => p.children.push({ field: prop.name, strategy: p.strategy }));
|
|
41
43
|
}
|
|
42
44
|
else if (prop.kind === ReferenceKind.EMBEDDED) {
|
|
@@ -67,6 +69,21 @@ export function getLoadingStrategy(strategy, kind) {
|
|
|
67
69
|
}
|
|
68
70
|
return strategy;
|
|
69
71
|
}
|
|
72
|
+
function findPopulateEntry(populate, parts) {
|
|
73
|
+
let current = populate;
|
|
74
|
+
for (let i = 0; i < parts.length; i++) {
|
|
75
|
+
const entry = current.find(p => p.field.split(':')[0] === parts[i]);
|
|
76
|
+
if (!entry) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
if (i === parts.length - 1) {
|
|
80
|
+
return entry;
|
|
81
|
+
}
|
|
82
|
+
current = (entry.children ?? []);
|
|
83
|
+
}
|
|
84
|
+
/* v8 ignore next */
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
70
87
|
/**
|
|
71
88
|
* Applies per-relation overrides from `populateHints` to the normalized populate tree.
|
|
72
89
|
* @internal
|
|
@@ -85,18 +102,3 @@ export function applyPopulateHints(populate, hints) {
|
|
|
85
102
|
}
|
|
86
103
|
}
|
|
87
104
|
}
|
|
88
|
-
function findPopulateEntry(populate, parts) {
|
|
89
|
-
let current = populate;
|
|
90
|
-
for (let i = 0; i < parts.length; i++) {
|
|
91
|
-
const entry = current.find(p => p.field.split(':')[0] === parts[i]);
|
|
92
|
-
if (!entry) {
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
if (i === parts.length - 1) {
|
|
96
|
-
return entry;
|
|
97
|
-
}
|
|
98
|
-
current = (entry.children ?? []);
|
|
99
|
-
}
|
|
100
|
-
/* v8 ignore next */
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
package/entity/validators.js
CHANGED
|
@@ -52,7 +52,8 @@ export function validateParams(params, type = 'search condition', field) {
|
|
|
52
52
|
}
|
|
53
53
|
/** @internal */
|
|
54
54
|
export function validatePrimaryKey(entity, meta) {
|
|
55
|
-
const pkExists = meta.primaryKeys.every(pk => entity[pk] != null) ||
|
|
55
|
+
const pkExists = meta.primaryKeys.every(pk => entity[pk] != null) ||
|
|
56
|
+
(meta.serializedPrimaryKey && entity[meta.serializedPrimaryKey] != null);
|
|
56
57
|
if (!entity || !pkExists) {
|
|
57
58
|
throw ValidationError.fromMergeWithoutPK(meta);
|
|
58
59
|
}
|
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,23 +48,10 @@ export var QueryOperator;
|
|
|
48
48
|
QueryOperator["$hasKey"] = "?";
|
|
49
49
|
QueryOperator["$hasKeys"] = "?&";
|
|
50
50
|
QueryOperator["$hasSomeKeys"] = "?|";
|
|
51
|
+
QueryOperator["$elemMatch"] = "elemMatch";
|
|
51
52
|
})(QueryOperator || (QueryOperator = {}));
|
|
52
|
-
export const ARRAY_OPERATORS = [
|
|
53
|
-
|
|
54
|
-
'$gt',
|
|
55
|
-
'$gte',
|
|
56
|
-
'$lt',
|
|
57
|
-
'$lte',
|
|
58
|
-
'$ne',
|
|
59
|
-
'$overlap',
|
|
60
|
-
'$contains',
|
|
61
|
-
'$contained',
|
|
62
|
-
];
|
|
63
|
-
export const JSON_KEY_OPERATORS = [
|
|
64
|
-
'$hasKey',
|
|
65
|
-
'$hasKeys',
|
|
66
|
-
'$hasSomeKeys',
|
|
67
|
-
];
|
|
53
|
+
export const ARRAY_OPERATORS = ['$eq', '$gt', '$gte', '$lt', '$lte', '$ne', '$overlap', '$contains', '$contained'];
|
|
54
|
+
export const JSON_KEY_OPERATORS = ['$hasKey', '$hasKeys', '$hasSomeKeys'];
|
|
68
55
|
export var QueryOrder;
|
|
69
56
|
(function (QueryOrder) {
|
|
70
57
|
QueryOrder["ASC"] = "ASC";
|
|
@@ -100,7 +87,16 @@ export var QueryFlag;
|
|
|
100
87
|
QueryFlag["IDENTITY_INSERT"] = "IDENTITY_INSERT";
|
|
101
88
|
QueryFlag["OUTPUT_TABLE"] = "OUTPUT_TABLE";
|
|
102
89
|
})(QueryFlag || (QueryFlag = {}));
|
|
103
|
-
export const SCALAR_TYPES = new Set([
|
|
90
|
+
export const SCALAR_TYPES = new Set([
|
|
91
|
+
'string',
|
|
92
|
+
'number',
|
|
93
|
+
'boolean',
|
|
94
|
+
'bigint',
|
|
95
|
+
'Uint8Array',
|
|
96
|
+
'Date',
|
|
97
|
+
'Buffer',
|
|
98
|
+
'RegExp',
|
|
99
|
+
]);
|
|
104
100
|
export var ReferenceKind;
|
|
105
101
|
(function (ReferenceKind) {
|
|
106
102
|
ReferenceKind["SCALAR"] = "scalar";
|
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
|
|
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
|
|
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,12 +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.call(data)
|
|
37
|
+
const type = /\[object (\w+)]/.exec(Object.prototype.toString.call(data))[1].toLowerCase();
|
|
38
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.`);
|
|
39
39
|
}
|
|
40
40
|
static notDiscoveredEntity(data, meta, action = 'persist') {
|
|
41
41
|
/* v8 ignore next */
|
|
42
|
-
const type = meta?.className ?? Object.prototype.toString.call(data)
|
|
42
|
+
const type = meta?.className ?? /\[object (\w+)]/.exec(Object.prototype.toString.call(data))[1].toLowerCase();
|
|
43
43
|
let err = `Trying to ${action} not discovered entity of type ${type}.`;
|
|
44
44
|
if (meta) {
|
|
45
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\`.`;
|
|
@@ -56,7 +56,7 @@ export class ValidationError extends Error {
|
|
|
56
56
|
return new ValidationError(`Invalid enum array items provided in ${entityName}: ${inspect(invalid)}`);
|
|
57
57
|
}
|
|
58
58
|
static invalidType(type, value, mode) {
|
|
59
|
-
const valueType = Object.prototype.toString.call(value)
|
|
59
|
+
const valueType = /\[object (\w+)]/.exec(Object.prototype.toString.call(value))[1].toLowerCase();
|
|
60
60
|
if (value instanceof Date) {
|
|
61
61
|
value = value.toISOString();
|
|
62
62
|
}
|
|
@@ -69,8 +69,8 @@ export class ValidationError extends Error {
|
|
|
69
69
|
static cannotModifyInverseCollection(owner, property) {
|
|
70
70
|
const inverseCollection = `${owner.constructor.name}.${property.name}`;
|
|
71
71
|
const ownerCollection = `${property.type}.${property.mappedBy}`;
|
|
72
|
-
const error = `You cannot modify inverse side of M:N collection ${inverseCollection} when the owning side is not initialized. `
|
|
73
|
-
|
|
72
|
+
const error = `You cannot modify inverse side of M:N collection ${inverseCollection} when the owning side is not initialized. ` +
|
|
73
|
+
`Consider working with the owning side instead (${ownerCollection}).`;
|
|
74
74
|
return new ValidationError(error, owner);
|
|
75
75
|
}
|
|
76
76
|
static cannotModifyReadonlyCollection(owner, property) {
|
|
@@ -79,7 +79,7 @@ export class ValidationError extends Error {
|
|
|
79
79
|
static cannotRemoveFromCollectionWithoutOrphanRemoval(owner, property) {
|
|
80
80
|
const options = [
|
|
81
81
|
' - add `orphanRemoval: true` to the collection options',
|
|
82
|
-
|
|
82
|
+
" - add `deleteRule: 'cascade'` to the owning side options",
|
|
83
83
|
' - add `nullable: true` to the owning side options',
|
|
84
84
|
].join('\n');
|
|
85
85
|
return new ValidationError(`Removing items from collection ${owner.constructor.name}.${property.name} without \`orphanRemoval: true\` would break non-null constraint on the owning side. You have several options: \n${options}`, owner);
|
|
@@ -91,7 +91,7 @@ export class ValidationError extends Error {
|
|
|
91
91
|
return new ValidationError('You cannot call em.flush() from inside lifecycle hook handlers');
|
|
92
92
|
}
|
|
93
93
|
static cannotUseGlobalContext() {
|
|
94
|
-
return new ValidationError(
|
|
94
|
+
return new ValidationError("Using global EntityManager instance methods for context specific actions is disallowed. If you need to work with the global instance's identity map, use `allowGlobalContext` configuration option or `fork()` instead.");
|
|
95
95
|
}
|
|
96
96
|
static cannotUseOperatorsInsideEmbeddables(entityName, propName, payload) {
|
|
97
97
|
return new ValidationError(`Using operators inside embeddables is not allowed, move the operator above. (property: ${Utils.className(entityName)}.${propName}, payload: ${inspect(payload)})`);
|
|
@@ -164,7 +164,7 @@ export class MetadataError extends ValidationError {
|
|
|
164
164
|
return new MetadataError(`Entity ${meta.className} has wrong ${type} definition: '${prop}' does not exist. You need to use property name, not column name.`);
|
|
165
165
|
}
|
|
166
166
|
static multipleVersionFields(meta, fields) {
|
|
167
|
-
return new MetadataError(`Entity ${meta.className} has multiple version properties defined: '${fields.join('
|
|
167
|
+
return new MetadataError(`Entity ${meta.className} has multiple version properties defined: '${fields.join("', '")}'. Only one version property is allowed per entity.`);
|
|
168
168
|
}
|
|
169
169
|
static invalidVersionFieldType(meta) {
|
|
170
170
|
const prop = meta.properties[meta.versionProperty];
|
package/events/EventManager.d.ts
CHANGED
|
@@ -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
|
|
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>;
|
package/events/EventManager.js
CHANGED
|
@@ -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
|
|
14
|
+
if (this.#subscribers.has(subscriber)) {
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
this
|
|
18
|
-
this
|
|
19
|
-
this
|
|
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
|
|
24
|
-
this
|
|
23
|
+
this.#listeners[event] ??= new Set();
|
|
24
|
+
this.#listeners[event].add(subscriber);
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
getSubscribers() {
|
|
28
|
-
return this
|
|
28
|
+
return this.#subscribers;
|
|
29
29
|
}
|
|
30
30
|
dispatchEvent(event, args, meta) {
|
|
31
31
|
const listeners = [];
|
|
@@ -35,42 +35,45 @@ export class EventManager {
|
|
|
35
35
|
const hooks = (meta?.hooks[event] || []);
|
|
36
36
|
listeners.push(...hooks.map(hook => {
|
|
37
37
|
const prototypeHook = meta?.prototype[hook];
|
|
38
|
-
const handler = typeof hook === 'function' ? hook : entity[hook] ?? prototypeHook;
|
|
38
|
+
const handler = typeof hook === 'function' ? hook : (entity[hook] ?? prototypeHook);
|
|
39
39
|
return handler.bind(entity);
|
|
40
40
|
}));
|
|
41
|
-
for (const listener of this
|
|
42
|
-
const entities = this
|
|
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
|
-
|
|
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
|
|
55
|
-
return this
|
|
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
|
|
62
|
+
this.#cache.set(cacheKey, true);
|
|
60
63
|
return true;
|
|
61
64
|
}
|
|
62
|
-
for (const listener of this
|
|
63
|
-
const entities = this
|
|
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
|
|
68
|
+
this.#cache.set(cacheKey, true);
|
|
66
69
|
return true;
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
|
-
this
|
|
72
|
+
this.#cache.set(cacheKey, false);
|
|
70
73
|
return false;
|
|
71
74
|
}
|
|
72
75
|
clone() {
|
|
73
|
-
return new EventManager(this
|
|
76
|
+
return new EventManager(this.#subscribers);
|
|
74
77
|
}
|
|
75
78
|
getSubscribedEntities(listener) {
|
|
76
79
|
if (!listener.getSubscribedEntities) {
|
package/events/index.d.ts
CHANGED
package/events/index.js
CHANGED
package/exceptions.js
CHANGED
|
@@ -9,10 +9,17 @@ export class DriverException extends Error {
|
|
|
9
9
|
errmsg;
|
|
10
10
|
constructor(previous) {
|
|
11
11
|
super(previous.message);
|
|
12
|
-
Object.getOwnPropertyNames(previous).forEach(k => this[k] = previous[k]);
|
|
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
|
-
|
|
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
|
+
}
|
|
16
23
|
}
|
|
17
24
|
}
|
|
18
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
|
|
7
|
-
private tmpIndex;
|
|
6
|
+
#private;
|
|
8
7
|
/**
|
|
9
8
|
* @inheritDoc
|
|
10
9
|
*/
|