@mikro-orm/core 7.0.4 → 7.0.5-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.
- package/EntityManager.d.ts +583 -884
- package/EntityManager.js +1895 -1922
- package/MikroORM.d.ts +74 -103
- package/MikroORM.js +179 -178
- package/README.md +1 -1
- package/cache/CacheAdapter.d.ts +36 -36
- package/cache/FileCacheAdapter.d.ts +24 -30
- package/cache/FileCacheAdapter.js +78 -80
- package/cache/GeneratedCacheAdapter.d.ts +20 -18
- package/cache/GeneratedCacheAdapter.js +30 -30
- package/cache/MemoryCacheAdapter.d.ts +20 -18
- package/cache/MemoryCacheAdapter.js +36 -35
- package/cache/NullCacheAdapter.d.ts +16 -16
- package/cache/NullCacheAdapter.js +24 -24
- package/connections/Connection.d.ts +84 -95
- package/connections/Connection.js +168 -165
- package/drivers/DatabaseDriver.d.ts +80 -186
- package/drivers/DatabaseDriver.js +443 -450
- package/drivers/IDatabaseDriver.d.ts +301 -440
- package/entity/BaseEntity.d.ts +83 -120
- package/entity/BaseEntity.js +43 -43
- package/entity/Collection.d.ts +179 -212
- package/entity/Collection.js +721 -727
- package/entity/EntityAssigner.d.ts +77 -88
- package/entity/EntityAssigner.js +230 -231
- package/entity/EntityFactory.d.ts +54 -66
- package/entity/EntityFactory.js +383 -425
- package/entity/EntityHelper.d.ts +22 -34
- package/entity/EntityHelper.js +267 -280
- package/entity/EntityIdentifier.d.ts +4 -4
- package/entity/EntityIdentifier.js +10 -10
- package/entity/EntityLoader.d.ts +72 -98
- package/entity/EntityLoader.js +723 -753
- package/entity/EntityRepository.d.ts +201 -316
- package/entity/EntityRepository.js +213 -213
- package/entity/PolymorphicRef.d.ts +5 -5
- package/entity/PolymorphicRef.js +10 -10
- package/entity/Reference.d.ts +82 -126
- package/entity/Reference.js +274 -278
- package/entity/WrappedEntity.d.ts +72 -115
- package/entity/WrappedEntity.js +166 -168
- package/entity/defineEntity.d.ts +636 -1315
- package/entity/defineEntity.js +518 -527
- package/entity/utils.d.ts +3 -13
- package/entity/utils.js +73 -71
- package/entity/validators.js +43 -43
- package/entity/wrap.js +8 -8
- package/enums.d.ts +253 -258
- package/enums.js +252 -251
- package/errors.d.ts +72 -114
- package/errors.js +253 -350
- package/events/EventManager.d.ts +14 -26
- package/events/EventManager.js +77 -79
- package/events/EventSubscriber.d.ts +29 -29
- package/events/TransactionEventBroadcaster.d.ts +8 -15
- package/events/TransactionEventBroadcaster.js +14 -14
- package/exceptions.d.ts +40 -23
- package/exceptions.js +52 -35
- package/hydration/Hydrator.d.ts +17 -42
- package/hydration/Hydrator.js +43 -43
- package/hydration/ObjectHydrator.d.ts +17 -50
- package/hydration/ObjectHydrator.js +416 -481
- package/index.d.ts +2 -116
- package/index.js +1 -10
- package/logging/DefaultLogger.d.ts +32 -34
- package/logging/DefaultLogger.js +86 -86
- package/logging/Logger.d.ts +41 -41
- package/logging/SimpleLogger.d.ts +11 -13
- package/logging/SimpleLogger.js +22 -22
- package/logging/colors.d.ts +6 -6
- package/logging/colors.js +10 -11
- package/logging/inspect.js +7 -7
- package/metadata/EntitySchema.d.ts +127 -211
- package/metadata/EntitySchema.js +398 -397
- package/metadata/MetadataDiscovery.d.ts +114 -114
- package/metadata/MetadataDiscovery.js +1870 -1951
- package/metadata/MetadataProvider.d.ts +21 -24
- package/metadata/MetadataProvider.js +84 -82
- package/metadata/MetadataStorage.d.ts +32 -38
- package/metadata/MetadataStorage.js +118 -118
- package/metadata/MetadataValidator.d.ts +39 -39
- package/metadata/MetadataValidator.js +338 -381
- package/metadata/discover-entities.d.ts +2 -5
- package/metadata/discover-entities.js +37 -35
- package/metadata/types.d.ts +531 -615
- package/naming-strategy/AbstractNamingStrategy.d.ts +39 -54
- package/naming-strategy/AbstractNamingStrategy.js +85 -90
- package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
- package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
- package/naming-strategy/MongoNamingStrategy.d.ts +6 -6
- package/naming-strategy/MongoNamingStrategy.js +18 -18
- package/naming-strategy/NamingStrategy.d.ts +99 -109
- package/naming-strategy/UnderscoreNamingStrategy.d.ts +7 -7
- package/naming-strategy/UnderscoreNamingStrategy.js +21 -21
- package/not-supported.js +4 -7
- package/package.json +1 -1
- package/platforms/ExceptionConverter.d.ts +1 -1
- package/platforms/ExceptionConverter.js +4 -4
- package/platforms/Platform.d.ts +301 -310
- package/platforms/Platform.js +640 -663
- package/serialization/EntitySerializer.d.ts +26 -49
- package/serialization/EntitySerializer.js +218 -224
- package/serialization/EntityTransformer.d.ts +6 -10
- package/serialization/EntityTransformer.js +217 -219
- package/serialization/SerializationContext.d.ts +23 -27
- package/serialization/SerializationContext.js +105 -105
- package/types/ArrayType.d.ts +8 -8
- package/types/ArrayType.js +33 -33
- package/types/BigIntType.d.ts +10 -17
- package/types/BigIntType.js +37 -37
- package/types/BlobType.d.ts +3 -3
- package/types/BlobType.js +13 -13
- package/types/BooleanType.d.ts +4 -4
- package/types/BooleanType.js +12 -12
- package/types/CharacterType.d.ts +2 -2
- package/types/CharacterType.js +6 -6
- package/types/DateTimeType.d.ts +5 -5
- package/types/DateTimeType.js +15 -15
- package/types/DateType.d.ts +5 -5
- package/types/DateType.js +15 -15
- package/types/DecimalType.d.ts +7 -7
- package/types/DecimalType.js +26 -26
- package/types/DoubleType.d.ts +3 -3
- package/types/DoubleType.js +12 -12
- package/types/EnumArrayType.d.ts +5 -5
- package/types/EnumArrayType.js +24 -24
- package/types/EnumType.d.ts +3 -3
- package/types/EnumType.js +11 -11
- package/types/FloatType.d.ts +3 -3
- package/types/FloatType.js +9 -9
- package/types/IntegerType.d.ts +3 -3
- package/types/IntegerType.js +9 -9
- package/types/IntervalType.d.ts +4 -4
- package/types/IntervalType.js +12 -12
- package/types/JsonType.d.ts +8 -8
- package/types/JsonType.js +32 -32
- package/types/MediumIntType.d.ts +1 -1
- package/types/MediumIntType.js +3 -3
- package/types/SmallIntType.d.ts +3 -3
- package/types/SmallIntType.js +9 -9
- package/types/StringType.d.ts +4 -4
- package/types/StringType.js +12 -12
- package/types/TextType.d.ts +3 -3
- package/types/TextType.js +9 -9
- package/types/TimeType.d.ts +5 -5
- package/types/TimeType.js +17 -17
- package/types/TinyIntType.d.ts +3 -3
- package/types/TinyIntType.js +10 -10
- package/types/Type.d.ts +79 -83
- package/types/Type.js +82 -82
- package/types/Uint8ArrayType.d.ts +4 -4
- package/types/Uint8ArrayType.js +21 -21
- package/types/UnknownType.d.ts +4 -4
- package/types/UnknownType.js +12 -12
- package/types/UuidType.d.ts +5 -5
- package/types/UuidType.js +19 -19
- package/types/index.d.ts +49 -75
- package/types/index.js +26 -52
- package/typings.d.ts +737 -1250
- package/typings.js +231 -244
- package/unit-of-work/ChangeSet.d.ts +26 -26
- package/unit-of-work/ChangeSet.js +56 -56
- package/unit-of-work/ChangeSetComputer.d.ts +12 -12
- package/unit-of-work/ChangeSetComputer.js +170 -178
- package/unit-of-work/ChangeSetPersister.d.ts +44 -63
- package/unit-of-work/ChangeSetPersister.js +421 -442
- package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
- package/unit-of-work/CommitOrderCalculator.js +88 -89
- package/unit-of-work/IdentityMap.d.ts +31 -31
- package/unit-of-work/IdentityMap.js +105 -105
- package/unit-of-work/UnitOfWork.d.ts +141 -181
- package/unit-of-work/UnitOfWork.js +1183 -1200
- package/utils/AbstractMigrator.d.ts +91 -111
- package/utils/AbstractMigrator.js +275 -275
- package/utils/AbstractSchemaGenerator.d.ts +34 -43
- package/utils/AbstractSchemaGenerator.js +122 -121
- package/utils/AsyncContext.d.ts +3 -3
- package/utils/AsyncContext.js +35 -34
- package/utils/Configuration.d.ts +808 -852
- package/utils/Configuration.js +344 -359
- package/utils/Cursor.d.ts +22 -40
- package/utils/Cursor.js +127 -135
- package/utils/DataloaderUtils.d.ts +43 -58
- package/utils/DataloaderUtils.js +198 -203
- package/utils/EntityComparator.d.ts +81 -98
- package/utils/EntityComparator.js +732 -828
- package/utils/NullHighlighter.d.ts +1 -1
- package/utils/NullHighlighter.js +3 -3
- package/utils/QueryHelper.d.ts +51 -79
- package/utils/QueryHelper.js +361 -372
- package/utils/RawQueryFragment.d.ts +34 -50
- package/utils/RawQueryFragment.js +105 -107
- package/utils/RequestContext.d.ts +32 -32
- package/utils/RequestContext.js +53 -52
- package/utils/TransactionContext.d.ts +16 -16
- package/utils/TransactionContext.js +27 -27
- package/utils/TransactionManager.d.ts +58 -58
- package/utils/TransactionManager.js +197 -199
- package/utils/Utils.d.ts +145 -204
- package/utils/Utils.js +812 -812
- package/utils/clone.js +113 -104
- package/utils/env-vars.js +88 -90
- package/utils/fs-utils.d.ts +15 -15
- package/utils/fs-utils.js +181 -180
- package/utils/upsert-utils.d.ts +5 -20
- package/utils/upsert-utils.js +116 -114
package/utils/Cursor.d.ts
CHANGED
|
@@ -48,44 +48,26 @@ import { type QueryOrder } from '../enums.js';
|
|
|
48
48
|
* }
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
51
|
-
export declare class Cursor<
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*/
|
|
74
|
-
from(entity: Entity | Loaded<Entity, Hint, Fields, Excludes>): string;
|
|
75
|
-
[Symbol.iterator](): IterableIterator<Loaded<Entity, Hint, Fields, Excludes>>;
|
|
76
|
-
get length(): number;
|
|
77
|
-
/**
|
|
78
|
-
* Computes the cursor value for given entity and order definition.
|
|
79
|
-
*/
|
|
80
|
-
static for<Entity extends object>(
|
|
81
|
-
meta: EntityMetadata<Entity>,
|
|
82
|
-
entity: FilterObject<Entity>,
|
|
83
|
-
orderBy: OrderDefinition<Entity>,
|
|
84
|
-
): string;
|
|
85
|
-
static encode(value: unknown[]): string;
|
|
86
|
-
static decode(value: string): unknown[];
|
|
87
|
-
static getDefinition<Entity extends object>(
|
|
88
|
-
meta: EntityMetadata<Entity>,
|
|
89
|
-
orderBy: OrderDefinition<Entity>,
|
|
90
|
-
): [EntityKey, QueryOrder][];
|
|
51
|
+
export declare class Cursor<Entity extends object, Hint extends string = never, Fields extends string = never, Excludes extends string = never, IncludeCount extends boolean = true> {
|
|
52
|
+
#private;
|
|
53
|
+
readonly items: Loaded<Entity, Hint, Fields, Excludes>[];
|
|
54
|
+
readonly totalCount: IncludeCount extends true ? number : undefined;
|
|
55
|
+
readonly hasPrevPage: boolean;
|
|
56
|
+
readonly hasNextPage: boolean;
|
|
57
|
+
constructor(items: Loaded<Entity, Hint, Fields, Excludes>[], totalCount: IncludeCount extends true ? number : undefined, options: FindByCursorOptions<Entity, Hint, Fields, Excludes, IncludeCount>, meta: EntityMetadata<Entity>);
|
|
58
|
+
get startCursor(): string | null;
|
|
59
|
+
get endCursor(): string | null;
|
|
60
|
+
/**
|
|
61
|
+
* Computes the cursor value for a given entity.
|
|
62
|
+
*/
|
|
63
|
+
from(entity: Entity | Loaded<Entity, Hint, Fields, Excludes>): string;
|
|
64
|
+
[Symbol.iterator](): IterableIterator<Loaded<Entity, Hint, Fields, Excludes>>;
|
|
65
|
+
get length(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Computes the cursor value for given entity and order definition.
|
|
68
|
+
*/
|
|
69
|
+
static for<Entity extends object>(meta: EntityMetadata<Entity>, entity: FilterObject<Entity>, orderBy: OrderDefinition<Entity>): string;
|
|
70
|
+
static encode(value: unknown[]): string;
|
|
71
|
+
static decode(value: string): unknown[];
|
|
72
|
+
static getDefinition<Entity extends object>(meta: EntityMetadata<Entity>, orderBy: OrderDefinition<Entity>): [EntityKey, QueryOrder][];
|
|
91
73
|
}
|
package/utils/Cursor.js
CHANGED
|
@@ -53,144 +53,136 @@ import { inspect } from '../logging/inspect.js';
|
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
55
|
export class Cursor {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
this.#definition = Cursor.getDefinition(meta, orderBy);
|
|
78
|
-
}
|
|
79
|
-
get startCursor() {
|
|
80
|
-
if (this.items.length === 0) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
return this.from(this.items[0]);
|
|
84
|
-
}
|
|
85
|
-
get endCursor() {
|
|
86
|
-
if (this.items.length === 0) {
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
return this.from(this.items[this.items.length - 1]);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Computes the cursor value for a given entity.
|
|
93
|
-
*/
|
|
94
|
-
from(entity) {
|
|
95
|
-
const processEntity = (entity, prop, direction, object = false) => {
|
|
96
|
-
if (Utils.isPlainObject(direction)) {
|
|
97
|
-
const unwrapped = Reference.unwrapReference(entity[prop]);
|
|
98
|
-
// Check if the relation is loaded - for nested properties, undefined means not populated
|
|
99
|
-
if (Utils.isEntity(unwrapped) && !helper(unwrapped).isInitialized()) {
|
|
100
|
-
throw CursorError.entityNotPopulated(entity, prop);
|
|
56
|
+
items;
|
|
57
|
+
totalCount;
|
|
58
|
+
hasPrevPage;
|
|
59
|
+
hasNextPage;
|
|
60
|
+
#definition;
|
|
61
|
+
constructor(items, totalCount, options, meta) {
|
|
62
|
+
this.items = items;
|
|
63
|
+
this.totalCount = totalCount;
|
|
64
|
+
const { first, last, before, after, orderBy, overfetch } = options;
|
|
65
|
+
const limit = first ?? last;
|
|
66
|
+
const isLast = !first && !!last;
|
|
67
|
+
const hasMorePages = !!overfetch && limit != null && items.length > limit;
|
|
68
|
+
this.hasPrevPage = isLast ? hasMorePages : !!after;
|
|
69
|
+
this.hasNextPage = isLast ? !!before : hasMorePages;
|
|
70
|
+
if (hasMorePages) {
|
|
71
|
+
if (isLast) {
|
|
72
|
+
items.shift();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
items.pop();
|
|
76
|
+
}
|
|
101
77
|
}
|
|
102
|
-
|
|
103
|
-
Object.assign(o, processEntity(unwrapped, key, direction[key], true));
|
|
104
|
-
return o;
|
|
105
|
-
}, {});
|
|
106
|
-
}
|
|
107
|
-
let value = entity[prop];
|
|
108
|
-
// Allow null/undefined values in cursor - they will be handled in createCursorCondition
|
|
109
|
-
// undefined can occur with forceUndefined config option which converts null to undefined
|
|
110
|
-
if (value == null) {
|
|
111
|
-
return object ? { [prop]: null } : null;
|
|
112
|
-
}
|
|
113
|
-
if (Utils.isEntity(value, true)) {
|
|
114
|
-
value = helper(value).getPrimaryKey();
|
|
115
|
-
}
|
|
116
|
-
if (Utils.isScalarReference(value)) {
|
|
117
|
-
value = value.unwrap();
|
|
118
|
-
}
|
|
119
|
-
if (object) {
|
|
120
|
-
return { [prop]: value };
|
|
121
|
-
}
|
|
122
|
-
return value;
|
|
123
|
-
};
|
|
124
|
-
const value = this.#definition.map(([key, direction]) => processEntity(entity, key, direction));
|
|
125
|
-
return Cursor.encode(value);
|
|
126
|
-
}
|
|
127
|
-
*[Symbol.iterator]() {
|
|
128
|
-
for (const item of this.items) {
|
|
129
|
-
yield item;
|
|
78
|
+
this.#definition = Cursor.getDefinition(meta, orderBy);
|
|
130
79
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Computes the cursor value for given entity and order definition.
|
|
137
|
-
*/
|
|
138
|
-
static for(meta, entity, orderBy) {
|
|
139
|
-
const definition = this.getDefinition(meta, orderBy);
|
|
140
|
-
return Cursor.encode(
|
|
141
|
-
definition.map(([key]) => {
|
|
142
|
-
const value = entity[key];
|
|
143
|
-
if (value === undefined) {
|
|
144
|
-
throw CursorError.missingValue(meta.className, key);
|
|
80
|
+
get startCursor() {
|
|
81
|
+
if (this.items.length === 0) {
|
|
82
|
+
return null;
|
|
145
83
|
}
|
|
146
|
-
return
|
|
147
|
-
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return Buffer.from(JSON.stringify(value)).toString('base64url');
|
|
152
|
-
}
|
|
153
|
-
static decode(value) {
|
|
154
|
-
return JSON.parse(Buffer.from(value, 'base64url').toString('utf8')).map(value => {
|
|
155
|
-
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}/.exec(value)) {
|
|
156
|
-
return new Date(value);
|
|
157
|
-
}
|
|
158
|
-
return value;
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
static getDefinition(meta, orderBy) {
|
|
162
|
-
return Utils.asArray(orderBy).flatMap(order => {
|
|
163
|
-
const ret = [];
|
|
164
|
-
for (const key of Utils.getObjectQueryKeys(order)) {
|
|
165
|
-
if (Raw.isKnownFragmentSymbol(key)) {
|
|
166
|
-
ret.push([key, order[key]]);
|
|
167
|
-
continue;
|
|
84
|
+
return this.from(this.items[0]);
|
|
85
|
+
}
|
|
86
|
+
get endCursor() {
|
|
87
|
+
if (this.items.length === 0) {
|
|
88
|
+
return null;
|
|
168
89
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
90
|
+
return this.from(this.items[this.items.length - 1]);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Computes the cursor value for a given entity.
|
|
94
|
+
*/
|
|
95
|
+
from(entity) {
|
|
96
|
+
const processEntity = (entity, prop, direction, object = false) => {
|
|
97
|
+
if (Utils.isPlainObject(direction)) {
|
|
98
|
+
const unwrapped = Reference.unwrapReference(entity[prop]);
|
|
99
|
+
// Check if the relation is loaded - for nested properties, undefined means not populated
|
|
100
|
+
if (Utils.isEntity(unwrapped) && !helper(unwrapped).isInitialized()) {
|
|
101
|
+
throw CursorError.entityNotPopulated(entity, prop);
|
|
102
|
+
}
|
|
103
|
+
return Utils.keys(direction).reduce((o, key) => {
|
|
104
|
+
Object.assign(o, processEntity(unwrapped, key, direction[key], true));
|
|
105
|
+
return o;
|
|
106
|
+
}, {});
|
|
107
|
+
}
|
|
108
|
+
let value = entity[prop];
|
|
109
|
+
// Allow null/undefined values in cursor - they will be handled in createCursorCondition
|
|
110
|
+
// undefined can occur with forceUndefined config option which converts null to undefined
|
|
111
|
+
if (value == null) {
|
|
112
|
+
return object ? { [prop]: null } : null;
|
|
113
|
+
}
|
|
114
|
+
if (Utils.isEntity(value, true)) {
|
|
115
|
+
value = helper(value).getPrimaryKey();
|
|
116
|
+
}
|
|
117
|
+
if (Utils.isScalarReference(value)) {
|
|
118
|
+
value = value.unwrap();
|
|
119
|
+
}
|
|
120
|
+
if (object) {
|
|
121
|
+
return { [prop]: value };
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
};
|
|
125
|
+
const value = this.#definition.map(([key, direction]) => processEntity(entity, key, direction));
|
|
126
|
+
return Cursor.encode(value);
|
|
127
|
+
}
|
|
128
|
+
*[Symbol.iterator]() {
|
|
129
|
+
for (const item of this.items) {
|
|
130
|
+
yield item;
|
|
179
131
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
132
|
+
}
|
|
133
|
+
get length() {
|
|
134
|
+
return this.items.length;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Computes the cursor value for given entity and order definition.
|
|
138
|
+
*/
|
|
139
|
+
static for(meta, entity, orderBy) {
|
|
140
|
+
const definition = this.getDefinition(meta, orderBy);
|
|
141
|
+
return Cursor.encode(definition.map(([key]) => {
|
|
142
|
+
const value = entity[key];
|
|
143
|
+
if (value === undefined) {
|
|
144
|
+
throw CursorError.missingValue(meta.className, key);
|
|
145
|
+
}
|
|
146
|
+
return value;
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
static encode(value) {
|
|
150
|
+
return Buffer.from(JSON.stringify(value)).toString('base64url');
|
|
151
|
+
}
|
|
152
|
+
static decode(value) {
|
|
153
|
+
return JSON.parse(Buffer.from(value, 'base64url').toString('utf8')).map((value) => {
|
|
154
|
+
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}/.exec(value)) {
|
|
155
|
+
return new Date(value);
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
static getDefinition(meta, orderBy) {
|
|
161
|
+
return Utils.asArray(orderBy).flatMap(order => {
|
|
162
|
+
const ret = [];
|
|
163
|
+
for (const key of Utils.getObjectQueryKeys(order)) {
|
|
164
|
+
if (Raw.isKnownFragmentSymbol(key)) {
|
|
165
|
+
ret.push([key, order[key]]);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const prop = meta.properties[key];
|
|
169
|
+
/* v8 ignore next */
|
|
170
|
+
if (!prop ||
|
|
171
|
+
!([ReferenceKind.SCALAR, ReferenceKind.EMBEDDED, ReferenceKind.MANY_TO_ONE].includes(prop.kind) ||
|
|
172
|
+
(prop.kind === ReferenceKind.ONE_TO_ONE && prop.owner))) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
ret.push([prop.name, order[prop.name]]);
|
|
176
|
+
}
|
|
177
|
+
return ret;
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** @ignore */
|
|
181
|
+
/* v8 ignore next */
|
|
182
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
183
|
+
const type = this.items[0]?.constructor.name;
|
|
184
|
+
const { items, startCursor, endCursor, hasPrevPage, hasNextPage, totalCount, length } = this;
|
|
185
|
+
const options = inspect({ startCursor, endCursor, totalCount, hasPrevPage, hasNextPage, items, length }, { depth: 0 });
|
|
186
|
+
return `Cursor${type ? `<${type}>` : ''} ${options.replace('items: [Array]', 'items: [...]')}`;
|
|
187
|
+
}
|
|
196
188
|
}
|
|
@@ -4,63 +4,48 @@ import { type EntityManager } from '../EntityManager.js';
|
|
|
4
4
|
import { type LoadReferenceOptions } from '../entity/Reference.js';
|
|
5
5
|
type BatchLoadFn<K, V> = (keys: readonly K[]) => PromiseLike<ArrayLike<V | Error>>;
|
|
6
6
|
export declare class DataloaderUtils {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
static getColBatchLoadFn(
|
|
51
|
-
em: EntityManager,
|
|
52
|
-
): BatchLoadFn<[Collection<any>, Omit<InitCollectionOptions<any, any>, 'dataloader'>?], any>;
|
|
53
|
-
/**
|
|
54
|
-
* Returns the M:N collection dataloader batchLoadFn, which aggregates collections by entity,
|
|
55
|
-
* makes one query per entity and maps each input collection to the corresponding result.
|
|
56
|
-
*/
|
|
57
|
-
static getManyToManyColBatchLoadFn(
|
|
58
|
-
em: EntityManager,
|
|
59
|
-
): BatchLoadFn<[Collection<any>, Omit<InitCollectionOptions<any, any>, 'dataloader'>?], any>;
|
|
60
|
-
static getDataLoader(): Promise<
|
|
61
|
-
Constructor<{
|
|
62
|
-
load: (...args: unknown[]) => Promise<unknown>;
|
|
63
|
-
}>
|
|
64
|
-
>;
|
|
7
|
+
private static DataLoader?;
|
|
8
|
+
/**
|
|
9
|
+
* Groups identified references by entity and returns a Map with the
|
|
10
|
+
* class name as the index and the corresponding primary keys as the value.
|
|
11
|
+
*/
|
|
12
|
+
static groupPrimaryKeysByEntityAndOpts(refsWithOpts: readonly [Ref<any>, Omit<LoadReferenceOptions<any, any>, 'dataloader'>?][]): Map<string, Set<Primary<any>>>;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the reference dataloader batchLoadFn, which aggregates references by entity,
|
|
15
|
+
* makes one query per entity and maps each input reference to the corresponding result.
|
|
16
|
+
*/
|
|
17
|
+
static getRefBatchLoadFn(em: EntityManager): BatchLoadFn<[Ref<any>, Omit<LoadReferenceOptions<any, any>, 'dataloader'>?], any>;
|
|
18
|
+
/**
|
|
19
|
+
* Groups collections by entity and returns a Map whose keys are the entity names and whose values are filter Maps
|
|
20
|
+
* which we can use to narrow down the find query to return just the items of the collections that have been dataloaded.
|
|
21
|
+
* The entries of the filter Map will be used as the values of an $or operator so we end up with a query per entity.
|
|
22
|
+
*/
|
|
23
|
+
static groupInversedOrMappedKeysByEntityAndOpts(collsWithOpts: readonly [Collection<any>, Omit<InitCollectionOptions<any, any>, 'dataloader'>?][]): Map<string, Map<string, Set<Primary<any>>>>;
|
|
24
|
+
/**
|
|
25
|
+
* Turn the entity+options map into actual queries.
|
|
26
|
+
* The keys are the entity names + a stringified version of the options and the values are filter Maps which will be used as the values of an $or operator so we end up with a query per entity+opts.
|
|
27
|
+
* We must populate the inverse side of the relationship in order to be able to later retrieve the PK(s) from its item(s).
|
|
28
|
+
* Together with the query the promises will also return the key which can be used to narrow down the results pertaining to a certain set of options.
|
|
29
|
+
*/
|
|
30
|
+
static entitiesAndOptsMapToQueries(entitiesAndOptsMap: Map<string, Map<string, Set<Primary<any>>>>, em: EntityManager): Promise<[string, any[]]>[];
|
|
31
|
+
/**
|
|
32
|
+
* Creates a filter which returns the results pertaining to a certain collection.
|
|
33
|
+
* First checks if the Entity type matches, then retrieves the inverse side of the relationship
|
|
34
|
+
* where the filtering will be done in order to match the target collection.
|
|
35
|
+
*/
|
|
36
|
+
static getColFilter<T, S extends T>(collection: Collection<any>): (result: T) => result is S;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the 1:M collection dataloader batchLoadFn, which aggregates collections by entity,
|
|
39
|
+
* makes one query per entity and maps each input collection to the corresponding result.
|
|
40
|
+
*/
|
|
41
|
+
static getColBatchLoadFn(em: EntityManager): BatchLoadFn<[Collection<any>, Omit<InitCollectionOptions<any, any>, 'dataloader'>?], any>;
|
|
42
|
+
/**
|
|
43
|
+
* Returns the M:N collection dataloader batchLoadFn, which aggregates collections by entity,
|
|
44
|
+
* makes one query per entity and maps each input collection to the corresponding result.
|
|
45
|
+
*/
|
|
46
|
+
static getManyToManyColBatchLoadFn(em: EntityManager): BatchLoadFn<[Collection<any>, Omit<InitCollectionOptions<any, any>, 'dataloader'>?], any>;
|
|
47
|
+
static getDataLoader(): Promise<Constructor<{
|
|
48
|
+
load: (...args: unknown[]) => Promise<unknown>;
|
|
49
|
+
}>>;
|
|
65
50
|
}
|
|
66
51
|
export {};
|