@mikro-orm/core 7.0.0-dev.30 → 7.0.0-dev.300
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 +68 -60
- package/EntityManager.js +290 -259
- package/MikroORM.d.ts +44 -35
- package/MikroORM.js +109 -142
- package/README.md +2 -0
- package/cache/FileCacheAdapter.d.ts +1 -2
- package/cache/FileCacheAdapter.js +18 -11
- package/cache/GeneratedCacheAdapter.d.ts +0 -1
- package/cache/GeneratedCacheAdapter.js +0 -2
- package/cache/index.d.ts +0 -1
- package/cache/index.js +0 -1
- package/connections/Connection.d.ts +12 -5
- package/connections/Connection.js +21 -12
- package/drivers/DatabaseDriver.d.ts +25 -16
- package/drivers/DatabaseDriver.js +119 -36
- package/drivers/IDatabaseDriver.d.ts +118 -23
- package/entity/BaseEntity.d.ts +63 -4
- package/entity/BaseEntity.js +0 -3
- package/entity/Collection.d.ts +101 -29
- package/entity/Collection.js +436 -104
- package/entity/EntityAssigner.js +17 -17
- package/entity/EntityFactory.d.ts +7 -1
- package/entity/EntityFactory.js +87 -55
- package/entity/EntityHelper.d.ts +2 -2
- package/entity/EntityHelper.js +57 -19
- package/entity/EntityLoader.d.ts +11 -10
- package/entity/EntityLoader.js +213 -82
- package/entity/EntityRepository.d.ts +28 -8
- package/entity/EntityRepository.js +8 -2
- package/entity/PolymorphicRef.d.ts +12 -0
- package/entity/PolymorphicRef.js +18 -0
- package/entity/Reference.d.ts +1 -5
- package/entity/Reference.js +15 -11
- package/entity/WrappedEntity.d.ts +3 -8
- package/entity/WrappedEntity.js +2 -7
- package/entity/defineEntity.d.ts +526 -310
- package/entity/defineEntity.js +134 -290
- package/entity/index.d.ts +2 -2
- package/entity/index.js +2 -2
- package/entity/utils.d.ts +6 -1
- package/entity/utils.js +34 -1
- package/entity/validators.d.ts +11 -0
- package/entity/validators.js +65 -0
- package/enums.d.ts +8 -6
- package/enums.js +2 -1
- package/errors.d.ts +20 -10
- package/errors.js +55 -23
- package/events/EventManager.d.ts +2 -1
- package/events/EventManager.js +19 -11
- package/hydration/Hydrator.js +1 -2
- package/hydration/ObjectHydrator.d.ts +4 -4
- package/hydration/ObjectHydrator.js +79 -34
- package/index.d.ts +2 -2
- package/index.js +1 -2
- package/logging/DefaultLogger.d.ts +1 -1
- package/logging/DefaultLogger.js +1 -0
- package/logging/SimpleLogger.d.ts +1 -1
- package/logging/colors.d.ts +1 -1
- package/logging/colors.js +7 -6
- package/logging/index.d.ts +1 -0
- package/logging/index.js +1 -0
- package/logging/inspect.d.ts +2 -0
- package/logging/inspect.js +11 -0
- package/metadata/EntitySchema.d.ts +47 -23
- package/metadata/EntitySchema.js +92 -33
- package/metadata/MetadataDiscovery.d.ts +64 -9
- package/metadata/MetadataDiscovery.js +782 -325
- package/metadata/MetadataProvider.d.ts +11 -2
- package/metadata/MetadataProvider.js +66 -2
- package/metadata/MetadataStorage.d.ts +13 -11
- package/metadata/MetadataStorage.js +72 -39
- package/metadata/MetadataValidator.d.ts +32 -9
- package/metadata/MetadataValidator.js +196 -41
- package/metadata/discover-entities.d.ts +5 -0
- package/metadata/discover-entities.js +40 -0
- package/metadata/index.d.ts +1 -1
- package/metadata/index.js +1 -1
- package/metadata/types.d.ts +577 -0
- package/metadata/types.js +1 -0
- package/naming-strategy/AbstractNamingStrategy.d.ts +16 -4
- package/naming-strategy/AbstractNamingStrategy.js +20 -2
- package/naming-strategy/EntityCaseNamingStrategy.d.ts +3 -3
- package/naming-strategy/EntityCaseNamingStrategy.js +6 -5
- package/naming-strategy/MongoNamingStrategy.d.ts +3 -3
- package/naming-strategy/MongoNamingStrategy.js +6 -6
- package/naming-strategy/NamingStrategy.d.ts +28 -4
- package/naming-strategy/UnderscoreNamingStrategy.d.ts +3 -3
- package/naming-strategy/UnderscoreNamingStrategy.js +6 -6
- package/not-supported.d.ts +2 -0
- package/not-supported.js +4 -0
- package/package.json +22 -11
- package/platforms/ExceptionConverter.js +1 -1
- package/platforms/Platform.d.ts +11 -15
- package/platforms/Platform.js +24 -44
- package/serialization/EntitySerializer.d.ts +6 -3
- package/serialization/EntitySerializer.js +46 -26
- package/serialization/EntityTransformer.js +33 -21
- package/serialization/SerializationContext.d.ts +6 -6
- package/serialization/SerializationContext.js +3 -3
- package/types/ArrayType.d.ts +1 -1
- package/types/ArrayType.js +2 -3
- package/types/BigIntType.js +1 -1
- package/types/BlobType.d.ts +0 -1
- package/types/BlobType.js +0 -3
- package/types/BooleanType.d.ts +1 -0
- package/types/BooleanType.js +3 -0
- package/types/DecimalType.js +2 -2
- package/types/DoubleType.js +1 -1
- package/types/EnumArrayType.js +1 -2
- package/types/JsonType.d.ts +1 -1
- package/types/JsonType.js +7 -2
- package/types/TinyIntType.js +1 -1
- package/types/Type.d.ts +2 -4
- package/types/Type.js +3 -3
- package/types/Uint8ArrayType.d.ts +0 -1
- package/types/Uint8ArrayType.js +1 -4
- package/types/index.d.ts +1 -1
- package/typings.d.ts +412 -155
- package/typings.js +99 -44
- package/unit-of-work/ChangeSet.d.ts +4 -6
- package/unit-of-work/ChangeSet.js +4 -5
- package/unit-of-work/ChangeSetComputer.d.ts +3 -8
- package/unit-of-work/ChangeSetComputer.js +41 -20
- package/unit-of-work/ChangeSetPersister.d.ts +13 -12
- package/unit-of-work/ChangeSetPersister.js +94 -36
- package/unit-of-work/CommitOrderCalculator.d.ts +12 -10
- package/unit-of-work/CommitOrderCalculator.js +13 -13
- package/unit-of-work/IdentityMap.d.ts +12 -0
- package/unit-of-work/IdentityMap.js +39 -1
- package/unit-of-work/UnitOfWork.d.ts +27 -3
- package/unit-of-work/UnitOfWork.js +248 -90
- package/utils/AbstractMigrator.d.ts +101 -0
- package/utils/AbstractMigrator.js +305 -0
- package/utils/AbstractSchemaGenerator.d.ts +5 -5
- package/utils/AbstractSchemaGenerator.js +28 -17
- package/utils/AsyncContext.d.ts +6 -0
- package/utils/AsyncContext.js +42 -0
- package/utils/Configuration.d.ts +795 -211
- package/utils/Configuration.js +153 -194
- package/utils/ConfigurationLoader.d.ts +1 -52
- package/utils/ConfigurationLoader.js +1 -330
- package/utils/Cursor.d.ts +0 -3
- package/utils/Cursor.js +24 -11
- package/utils/DataloaderUtils.d.ts +10 -5
- package/utils/DataloaderUtils.js +29 -12
- package/utils/EntityComparator.d.ts +16 -9
- package/utils/EntityComparator.js +154 -56
- package/utils/QueryHelper.d.ts +18 -6
- package/utils/QueryHelper.js +76 -23
- package/utils/RawQueryFragment.d.ts +28 -34
- package/utils/RawQueryFragment.js +35 -71
- package/utils/RequestContext.js +2 -2
- package/utils/TransactionContext.js +2 -2
- package/utils/TransactionManager.js +9 -6
- package/utils/Utils.d.ts +15 -126
- package/utils/Utils.js +80 -382
- package/utils/clone.js +8 -23
- package/utils/env-vars.d.ts +7 -0
- package/utils/env-vars.js +97 -0
- package/utils/fs-utils.d.ts +34 -0
- package/utils/fs-utils.js +196 -0
- package/utils/index.d.ts +1 -3
- package/utils/index.js +1 -3
- package/utils/upsert-utils.d.ts +9 -4
- package/utils/upsert-utils.js +46 -3
- package/decorators/Check.d.ts +0 -3
- package/decorators/Check.js +0 -13
- package/decorators/CreateRequestContext.d.ts +0 -3
- package/decorators/CreateRequestContext.js +0 -32
- package/decorators/Embeddable.d.ts +0 -8
- package/decorators/Embeddable.js +0 -11
- package/decorators/Embedded.d.ts +0 -12
- package/decorators/Embedded.js +0 -18
- package/decorators/Entity.d.ts +0 -33
- package/decorators/Entity.js +0 -12
- package/decorators/Enum.d.ts +0 -9
- package/decorators/Enum.js +0 -16
- package/decorators/Filter.d.ts +0 -2
- package/decorators/Filter.js +0 -8
- package/decorators/Formula.d.ts +0 -4
- package/decorators/Formula.js +0 -15
- package/decorators/Indexed.d.ts +0 -19
- package/decorators/Indexed.js +0 -20
- package/decorators/ManyToMany.d.ts +0 -42
- package/decorators/ManyToMany.js +0 -14
- package/decorators/ManyToOne.d.ts +0 -34
- package/decorators/ManyToOne.js +0 -14
- package/decorators/OneToMany.d.ts +0 -28
- package/decorators/OneToMany.js +0 -17
- package/decorators/OneToOne.d.ts +0 -28
- package/decorators/OneToOne.js +0 -7
- package/decorators/PrimaryKey.d.ts +0 -8
- package/decorators/PrimaryKey.js +0 -20
- package/decorators/Property.d.ts +0 -250
- package/decorators/Property.js +0 -32
- package/decorators/Transactional.d.ts +0 -14
- package/decorators/Transactional.js +0 -28
- package/decorators/hooks.d.ts +0 -16
- package/decorators/hooks.js +0 -47
- package/decorators/index.d.ts +0 -17
- package/decorators/index.js +0 -17
- package/entity/ArrayCollection.d.ts +0 -118
- package/entity/ArrayCollection.js +0 -407
- package/entity/EntityValidator.d.ts +0 -19
- package/entity/EntityValidator.js +0 -150
- package/metadata/ReflectMetadataProvider.d.ts +0 -8
- package/metadata/ReflectMetadataProvider.js +0 -44
- package/utils/resolveContextProvider.d.ts +0 -10
- package/utils/resolveContextProvider.js +0 -28
package/utils/Utils.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
|
-
import { glob, isDynamicPattern } from 'tinyglobby';
|
|
3
|
-
import { extname, isAbsolute, join, normalize, relative, resolve } from 'node:path';
|
|
4
|
-
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
6
|
-
import { createHash } from 'node:crypto';
|
|
7
|
-
import { tokenize } from 'esprima';
|
|
8
1
|
import { clone } from './clone.js';
|
|
9
|
-
import {
|
|
2
|
+
import { GroupOperator, PlainObject, QueryOperator, ReferenceKind } from '../enums.js';
|
|
10
3
|
import { helper } from '../entity/wrap.js';
|
|
11
|
-
|
|
4
|
+
import { Raw } from './RawQueryFragment.js';
|
|
12
5
|
function compareConstructors(a, b) {
|
|
13
6
|
if (a.constructor === b.constructor) {
|
|
14
7
|
return true;
|
|
@@ -40,9 +33,8 @@ export function compareObjects(a, b) {
|
|
|
40
33
|
}
|
|
41
34
|
return timeA === timeB;
|
|
42
35
|
}
|
|
43
|
-
/* v8 ignore next
|
|
36
|
+
/* v8 ignore next */
|
|
44
37
|
if ((typeof a === 'function' && typeof b === 'function') ||
|
|
45
|
-
(typeof a === 'object' && a.client && ['Ref', 'Raw'].includes(a.constructor.name) && typeof b === 'object' && b.client && ['Ref', 'Raw'].includes(b.constructor.name)) || // knex qb
|
|
46
38
|
(a instanceof RegExp && b instanceof RegExp) ||
|
|
47
39
|
(a instanceof String && b instanceof String) ||
|
|
48
40
|
(a instanceof Number && b instanceof Number)) {
|
|
@@ -118,7 +110,7 @@ export function equals(a, b) {
|
|
|
118
110
|
const equalsFn = equals;
|
|
119
111
|
export function parseJsonSafe(value) {
|
|
120
112
|
if (typeof value === 'string') {
|
|
121
|
-
/* v8 ignore next
|
|
113
|
+
/* v8 ignore next */
|
|
122
114
|
try {
|
|
123
115
|
return JSON.parse(value);
|
|
124
116
|
}
|
|
@@ -131,50 +123,13 @@ export function parseJsonSafe(value) {
|
|
|
131
123
|
}
|
|
132
124
|
export class Utils {
|
|
133
125
|
static PK_SEPARATOR = '~~~';
|
|
134
|
-
|
|
135
|
-
* Checks if the argument is not undefined
|
|
136
|
-
*/
|
|
137
|
-
static isDefined(data) {
|
|
138
|
-
return typeof data !== 'undefined';
|
|
139
|
-
}
|
|
126
|
+
static #ORM_VERSION = '7.0.0-dev.300';
|
|
140
127
|
/**
|
|
141
128
|
* Checks if the argument is instance of `Object`. Returns false for arrays.
|
|
142
129
|
*/
|
|
143
130
|
static isObject(o) {
|
|
144
131
|
return !!o && typeof o === 'object' && !Array.isArray(o);
|
|
145
132
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Relation decorators allow using two signatures
|
|
148
|
-
* - using first parameter as options object
|
|
149
|
-
* - using all parameters
|
|
150
|
-
*
|
|
151
|
-
* This function validates those two ways are not mixed and returns the final options object.
|
|
152
|
-
* If the second way is used, we always consider the last parameter as options object.
|
|
153
|
-
* @internal
|
|
154
|
-
*/
|
|
155
|
-
static processDecoratorParameters(params) {
|
|
156
|
-
const keys = Object.keys(params);
|
|
157
|
-
const values = Object.values(params);
|
|
158
|
-
if (!Utils.isPlainObject(values[0])) {
|
|
159
|
-
const lastKey = keys[keys.length - 1];
|
|
160
|
-
const last = params[lastKey];
|
|
161
|
-
delete params[lastKey];
|
|
162
|
-
return { ...last, ...params };
|
|
163
|
-
}
|
|
164
|
-
// validate only first parameter is used if its an option object
|
|
165
|
-
const empty = (v) => v == null || (Utils.isPlainObject(v) && !Utils.hasObjectKeys(v));
|
|
166
|
-
if (values.slice(1).some(v => !empty(v))) {
|
|
167
|
-
throw new Error('Mixing first decorator parameter as options object with other parameters is forbidden. ' +
|
|
168
|
-
'If you want to use the options parameter at first position, provide all options inside it.');
|
|
169
|
-
}
|
|
170
|
-
return values[0];
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Checks if the argument is instance of `Object`, but not one of the blacklisted types. Returns false for arrays.
|
|
174
|
-
*/
|
|
175
|
-
static isNotObject(o, not) {
|
|
176
|
-
return this.isObject(o) && !not.some(cls => o instanceof cls);
|
|
177
|
-
}
|
|
178
133
|
/**
|
|
179
134
|
* Removes `undefined` properties (recursively) so they are not saved as nulls
|
|
180
135
|
*/
|
|
@@ -222,18 +177,6 @@ export class Utils {
|
|
|
222
177
|
}
|
|
223
178
|
return false;
|
|
224
179
|
}
|
|
225
|
-
/**
|
|
226
|
-
* Checks if the argument is string
|
|
227
|
-
*/
|
|
228
|
-
static isString(s) {
|
|
229
|
-
return typeof s === 'string';
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Checks if the argument is number
|
|
233
|
-
*/
|
|
234
|
-
static isNumber(s) {
|
|
235
|
-
return typeof s === 'number';
|
|
236
|
-
}
|
|
237
180
|
/**
|
|
238
181
|
* Checks if arguments are deeply (but not strictly) equal.
|
|
239
182
|
*/
|
|
@@ -279,7 +222,7 @@ export class Utils {
|
|
|
279
222
|
target[key] = Utils.copy(value);
|
|
280
223
|
continue;
|
|
281
224
|
}
|
|
282
|
-
/* v8 ignore next
|
|
225
|
+
/* v8 ignore next */
|
|
283
226
|
if (!(key in target)) {
|
|
284
227
|
Object.assign(target, { [key]: {} });
|
|
285
228
|
}
|
|
@@ -292,30 +235,6 @@ export class Utils {
|
|
|
292
235
|
}
|
|
293
236
|
return Utils._merge(target, sources, ignoreUndefined);
|
|
294
237
|
}
|
|
295
|
-
static getRootEntity(metadata, meta) {
|
|
296
|
-
const base = meta.extends && metadata.find(Utils.className(meta.extends));
|
|
297
|
-
if (!base || base === meta) { // make sure we do not fall into infinite loop
|
|
298
|
-
return meta;
|
|
299
|
-
}
|
|
300
|
-
const root = Utils.getRootEntity(metadata, base);
|
|
301
|
-
if (root.discriminatorColumn) {
|
|
302
|
-
return root;
|
|
303
|
-
}
|
|
304
|
-
return meta;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Computes difference between two objects, ignoring items missing in `b`.
|
|
308
|
-
*/
|
|
309
|
-
static diff(a, b) {
|
|
310
|
-
const ret = {};
|
|
311
|
-
for (const k of Object.keys(b)) {
|
|
312
|
-
if (Utils.equals(a[k], b[k])) {
|
|
313
|
-
continue;
|
|
314
|
-
}
|
|
315
|
-
ret[k] = b[k];
|
|
316
|
-
}
|
|
317
|
-
return ret;
|
|
318
|
-
}
|
|
319
238
|
/**
|
|
320
239
|
* Creates deep copy of given object.
|
|
321
240
|
*/
|
|
@@ -356,53 +275,37 @@ export class Utils {
|
|
|
356
275
|
}
|
|
357
276
|
}
|
|
358
277
|
/**
|
|
359
|
-
* Returns array of functions argument names. Uses
|
|
278
|
+
* Returns array of functions argument names. Uses basic regex for source code analysis, might not work with advanced syntax.
|
|
360
279
|
*/
|
|
361
|
-
static
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
try {
|
|
367
|
-
return tokenize(func.toString(), { tolerant: true });
|
|
280
|
+
static getConstructorParams(func) {
|
|
281
|
+
const source = func.toString();
|
|
282
|
+
const i = source.indexOf('constructor');
|
|
283
|
+
if (i === -1) {
|
|
284
|
+
return undefined;
|
|
368
285
|
}
|
|
369
|
-
|
|
370
|
-
|
|
286
|
+
const start = source.indexOf('(', i);
|
|
287
|
+
if (start === -1) {
|
|
288
|
+
return undefined;
|
|
371
289
|
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const ret = [];
|
|
378
|
-
const tokens = this.tokenize(func);
|
|
379
|
-
let inside = 0;
|
|
380
|
-
let currentBlockStart = 0;
|
|
381
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
382
|
-
const token = tokens[i];
|
|
383
|
-
if (token.type === 'Identifier' && token.value === methodName) {
|
|
384
|
-
inside = 1;
|
|
385
|
-
currentBlockStart = i;
|
|
386
|
-
continue;
|
|
290
|
+
let depth = 0;
|
|
291
|
+
let end = start;
|
|
292
|
+
for (; end < source.length; end++) {
|
|
293
|
+
if (source[end] === '(') {
|
|
294
|
+
depth++;
|
|
387
295
|
}
|
|
388
|
-
if (
|
|
389
|
-
|
|
390
|
-
currentBlockStart = i;
|
|
391
|
-
continue;
|
|
296
|
+
if (source[end] === ')') {
|
|
297
|
+
depth--;
|
|
392
298
|
}
|
|
393
|
-
if (
|
|
299
|
+
if (depth === 0) {
|
|
394
300
|
break;
|
|
395
301
|
}
|
|
396
|
-
if (inside === 2 && token.type === 'Punctuator' && token.value === '{' && i === currentBlockStart + 1) {
|
|
397
|
-
ret.push(ObjectBindingPattern);
|
|
398
|
-
i = tokens.findIndex((t, idx) => idx > i + 2 && t.type === 'Punctuator' && t.value === '}');
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
if (inside === 2 && token.type === 'Identifier') {
|
|
402
|
-
ret.push(token.value);
|
|
403
|
-
}
|
|
404
302
|
}
|
|
405
|
-
|
|
303
|
+
const raw = source.slice(start + 1, end);
|
|
304
|
+
return raw
|
|
305
|
+
.split(',')
|
|
306
|
+
.map(s => s.trim().replace(/=.*$/, '').trim())
|
|
307
|
+
.filter(Boolean)
|
|
308
|
+
.map(raw => raw.startsWith('{') && raw.endsWith('}') ? '' : raw);
|
|
406
309
|
}
|
|
407
310
|
/**
|
|
408
311
|
* Checks whether the argument looks like primary key (string, number or ObjectId).
|
|
@@ -415,7 +318,7 @@ export class Utils {
|
|
|
415
318
|
return true;
|
|
416
319
|
}
|
|
417
320
|
if (Utils.isObject(key)) {
|
|
418
|
-
if (key.constructor
|
|
321
|
+
if (key.constructor?.name === 'ObjectId') {
|
|
419
322
|
return true;
|
|
420
323
|
}
|
|
421
324
|
if (!Utils.isPlainObject(key) && !Utils.isEntity(key, true)) {
|
|
@@ -445,7 +348,7 @@ export class Utils {
|
|
|
445
348
|
if (meta.compositePK) {
|
|
446
349
|
return this.getCompositeKeyValue(data, meta);
|
|
447
350
|
}
|
|
448
|
-
return data[meta.primaryKeys[0]]
|
|
351
|
+
return data[meta.primaryKeys[0]] ?? data[meta.serializedPrimaryKey] ?? null;
|
|
449
352
|
}
|
|
450
353
|
return null;
|
|
451
354
|
}
|
|
@@ -484,9 +387,8 @@ export class Utils {
|
|
|
484
387
|
static splitPrimaryKeys(key) {
|
|
485
388
|
return key.split(this.PK_SEPARATOR);
|
|
486
389
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
/* v8 ignore next 3 */
|
|
390
|
+
static getPrimaryKeyValues(entity, meta, allowScalar = false, convertCustomTypes = false) {
|
|
391
|
+
/* v8 ignore next */
|
|
490
392
|
if (entity == null) {
|
|
491
393
|
return entity;
|
|
492
394
|
}
|
|
@@ -496,15 +398,13 @@ export class Utils {
|
|
|
496
398
|
}
|
|
497
399
|
return val;
|
|
498
400
|
}
|
|
499
|
-
const meta = Array.isArray(primaryKeys) ? undefined : primaryKeys;
|
|
500
|
-
primaryKeys = Array.isArray(primaryKeys) ? primaryKeys : meta.primaryKeys;
|
|
501
401
|
let pk;
|
|
502
402
|
if (Utils.isEntity(entity, true)) {
|
|
503
403
|
pk = helper(entity).getPrimaryKey(convertCustomTypes);
|
|
504
404
|
}
|
|
505
405
|
else {
|
|
506
|
-
pk = primaryKeys.reduce((o, pk) => {
|
|
507
|
-
const targetMeta = meta
|
|
406
|
+
pk = meta.primaryKeys.reduce((o, pk) => {
|
|
407
|
+
const targetMeta = meta.properties[pk].targetMeta;
|
|
508
408
|
if (targetMeta && Utils.isPlainObject(entity[pk])) {
|
|
509
409
|
o[pk] = Utils.getPrimaryKeyValues(entity[pk], targetMeta, allowScalar, convertCustomTypes);
|
|
510
410
|
}
|
|
@@ -514,12 +414,12 @@ export class Utils {
|
|
|
514
414
|
return o;
|
|
515
415
|
}, {});
|
|
516
416
|
}
|
|
517
|
-
if (primaryKeys.length > 1) {
|
|
417
|
+
if (meta.primaryKeys.length > 1) {
|
|
518
418
|
return toArray(pk);
|
|
519
419
|
}
|
|
520
420
|
if (allowScalar) {
|
|
521
421
|
if (Utils.isPlainObject(pk)) {
|
|
522
|
-
return pk[primaryKeys[0]];
|
|
422
|
+
return pk[(meta.primaryKeys)[0]];
|
|
523
423
|
}
|
|
524
424
|
return pk;
|
|
525
425
|
}
|
|
@@ -603,12 +503,6 @@ export class Utils {
|
|
|
603
503
|
static isScalarReference(data, allowReference = false) {
|
|
604
504
|
return typeof data === 'object' && data?.__scalarReference;
|
|
605
505
|
}
|
|
606
|
-
/**
|
|
607
|
-
* Checks whether the argument is ObjectId instance
|
|
608
|
-
*/
|
|
609
|
-
static isObjectID(key) {
|
|
610
|
-
return Utils.isObject(key) && key.constructor && key.constructor.name.toLowerCase() === 'objectid';
|
|
611
|
-
}
|
|
612
506
|
/**
|
|
613
507
|
* Checks whether the argument is empty (array without items, object without keys or falsy value).
|
|
614
508
|
*/
|
|
@@ -639,56 +533,21 @@ export class Utils {
|
|
|
639
533
|
* Tries to detect TypeScript support.
|
|
640
534
|
*/
|
|
641
535
|
static detectTypeScriptSupport() {
|
|
642
|
-
/* v8 ignore next
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|| !!process.env
|
|
647
|
-
|| !!process.
|
|
648
|
-
|| process.
|
|
649
|
-
|| process.
|
|
536
|
+
/* v8 ignore next */
|
|
537
|
+
const process = globalThis.process ?? {};
|
|
538
|
+
/* v8 ignore next */
|
|
539
|
+
return process.argv?.[0]?.endsWith('ts-node') // running via ts-node directly
|
|
540
|
+
|| !!process.env?.MIKRO_ORM_CLI_ALWAYS_ALLOW_TS // forced explicitly or enabled via `registerTypeScriptSupport()`
|
|
541
|
+
|| !!process.env?.TS_JEST // check if ts-jest is used
|
|
542
|
+
|| !!process.env?.VITEST // check if vitest is used
|
|
543
|
+
|| !!process.versions?.bun // check if bun is used
|
|
544
|
+
|| process.argv?.slice(1).some(arg => arg.match(/\.([mc]?ts|tsx)$/)) // executing `.ts` file
|
|
545
|
+
|| process.execArgv?.some(arg => {
|
|
650
546
|
return arg.includes('ts-node') // check for ts-node loader
|
|
651
547
|
|| arg.includes('@swc-node/register') // check for swc-node/register loader
|
|
652
548
|
|| arg.includes('node_modules/tsx/'); // check for tsx loader
|
|
653
549
|
});
|
|
654
550
|
}
|
|
655
|
-
/**
|
|
656
|
-
* Uses some dark magic to get source path to caller where decorator is used.
|
|
657
|
-
* Analyses stack trace of error created inside the function call.
|
|
658
|
-
*/
|
|
659
|
-
static lookupPathFromDecorator(name, stack) {
|
|
660
|
-
// use some dark magic to get source path to caller
|
|
661
|
-
stack = stack || new Error().stack.split('\n');
|
|
662
|
-
// In some situations (e.g. swc 1.3.4+), the presence of a source map can obscure the call to
|
|
663
|
-
// __decorate(), replacing it with the constructor name. To support these cases we look for
|
|
664
|
-
// Reflect.decorate() as well. Also when babel is used, we need to check
|
|
665
|
-
// the `_applyDecoratedDescriptor` method instead.
|
|
666
|
-
let line = stack.findIndex(line => line.match(/__decorate|Reflect\.decorate|_applyDecoratedDescriptor/));
|
|
667
|
-
// bun does not have those lines at all, only the DecorateProperty/DecorateConstructor,
|
|
668
|
-
// but those are also present in node, so we need to check this only if they weren't found.
|
|
669
|
-
if (line === -1) {
|
|
670
|
-
// here we handle bun which stack is different from nodejs so we search for reflect-metadata
|
|
671
|
-
// Different bun versions might have different stack traces. The "last index" works for both 1.2.6 and 1.2.7.
|
|
672
|
-
const reflectLine = stack.findLastIndex(line => Utils.normalizePath(line).includes('node_modules/reflect-metadata/Reflect.js'));
|
|
673
|
-
if (reflectLine === -1 || reflectLine + 2 >= stack.length || !stack[reflectLine + 1].includes('bun:wrap')) {
|
|
674
|
-
return name;
|
|
675
|
-
}
|
|
676
|
-
line = reflectLine + 2;
|
|
677
|
-
}
|
|
678
|
-
if (stack[line].includes('Reflect.decorate')) {
|
|
679
|
-
line++;
|
|
680
|
-
}
|
|
681
|
-
if (Utils.normalizePath(stack[line]).includes('node_modules/tslib/tslib')) {
|
|
682
|
-
line++;
|
|
683
|
-
}
|
|
684
|
-
try {
|
|
685
|
-
const re = stack[line].match(/\(.+\)/i) ? /\((.*):\d+:\d+\)/ : /at\s*(.*):\d+:\d+$/;
|
|
686
|
-
return Utils.normalizePath(stack[line].match(re)[1]);
|
|
687
|
-
}
|
|
688
|
-
catch {
|
|
689
|
-
return name;
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
551
|
/**
|
|
693
552
|
* Gets the type of the argument.
|
|
694
553
|
*/
|
|
@@ -698,11 +557,11 @@ export class Utils {
|
|
|
698
557
|
return simple;
|
|
699
558
|
}
|
|
700
559
|
const objectType = Object.prototype.toString.call(value);
|
|
701
|
-
const type = objectType.match(
|
|
560
|
+
const type = objectType.match(/^\[object (.+)]$/)[1];
|
|
702
561
|
if (type === 'Uint8Array') {
|
|
703
562
|
return 'Buffer';
|
|
704
563
|
}
|
|
705
|
-
return
|
|
564
|
+
return type;
|
|
706
565
|
}
|
|
707
566
|
/**
|
|
708
567
|
* Checks whether the value is POJO (e.g. `{ foo: 'bar' }`, and not instance of `Foo`)
|
|
@@ -728,67 +587,14 @@ export class Utils {
|
|
|
728
587
|
static isCollection(item) {
|
|
729
588
|
return item?.__collection;
|
|
730
589
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
* If any part is a `file:` URL, it is converted to a local path. If any part is an
|
|
738
|
-
* absolute path, it replaces preceding paths (similar to `path.resolve` in NodeJS).
|
|
739
|
-
* Trailing directory separators are removed, and all directory separators are converted
|
|
740
|
-
* to POSIX-style separators (`/`).
|
|
741
|
-
*/
|
|
742
|
-
static normalizePath(...parts) {
|
|
743
|
-
let start = 0;
|
|
744
|
-
for (let i = 0; i < parts.length; i++) {
|
|
745
|
-
const part = parts[i];
|
|
746
|
-
if (isAbsolute(part)) {
|
|
747
|
-
start = i;
|
|
748
|
-
}
|
|
749
|
-
else if (part.startsWith('file:')) {
|
|
750
|
-
start = i;
|
|
751
|
-
parts[i] = Utils.fileURLToPath(part);
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
if (start > 0) {
|
|
755
|
-
parts = parts.slice(start);
|
|
590
|
+
// FNV-1a 64-bit
|
|
591
|
+
static hash(data, length) {
|
|
592
|
+
let h1 = 0xcbf29ce484222325n;
|
|
593
|
+
for (let i = 0; i < data.length; i++) {
|
|
594
|
+
h1 ^= BigInt(data.charCodeAt(i));
|
|
595
|
+
h1 = (h1 * 0x100000001b3n) & 0xffffffffffffffffn;
|
|
756
596
|
}
|
|
757
|
-
|
|
758
|
-
path = normalize(path).replace(/\\/g, '/');
|
|
759
|
-
return (path.match(/^[/.]|[a-zA-Z]:/) || path.startsWith('!')) ? path : './' + path;
|
|
760
|
-
}
|
|
761
|
-
/**
|
|
762
|
-
* Determines the relative path between two paths. If either path is a `file:` URL,
|
|
763
|
-
* it is converted to a local path.
|
|
764
|
-
*/
|
|
765
|
-
static relativePath(path, relativeTo) {
|
|
766
|
-
if (!path) {
|
|
767
|
-
return path;
|
|
768
|
-
}
|
|
769
|
-
path = Utils.normalizePath(path);
|
|
770
|
-
if (path.startsWith('.')) {
|
|
771
|
-
return path;
|
|
772
|
-
}
|
|
773
|
-
path = relative(Utils.normalizePath(relativeTo), path);
|
|
774
|
-
return Utils.normalizePath(path);
|
|
775
|
-
}
|
|
776
|
-
/**
|
|
777
|
-
* Computes the absolute path to for the given path relative to the provided base directory.
|
|
778
|
-
* If either `path` or `baseDir` are `file:` URLs, they are converted to local paths.
|
|
779
|
-
*/
|
|
780
|
-
static absolutePath(path, baseDir = process.cwd()) {
|
|
781
|
-
if (!path) {
|
|
782
|
-
return Utils.normalizePath(baseDir);
|
|
783
|
-
}
|
|
784
|
-
if (!isAbsolute(path) && !path.startsWith('file://')) {
|
|
785
|
-
path = baseDir + '/' + path;
|
|
786
|
-
}
|
|
787
|
-
return Utils.normalizePath(path);
|
|
788
|
-
}
|
|
789
|
-
static hash(data, length, algorithm) {
|
|
790
|
-
const hashAlgorithm = algorithm || 'sha256';
|
|
791
|
-
const hash = createHash(hashAlgorithm).update(data).digest('hex');
|
|
597
|
+
const hash = h1.toString(16).padStart(16, '0');
|
|
792
598
|
if (length) {
|
|
793
599
|
return hash.substring(0, length);
|
|
794
600
|
}
|
|
@@ -820,13 +626,6 @@ export class Utils {
|
|
|
820
626
|
static randomInt(min, max) {
|
|
821
627
|
return Math.round(Math.random() * (max - min)) + min;
|
|
822
628
|
}
|
|
823
|
-
static async pathExists(path, options = {}) {
|
|
824
|
-
if (isDynamicPattern(path)) {
|
|
825
|
-
const found = await glob(path, options);
|
|
826
|
-
return found.length > 0;
|
|
827
|
-
}
|
|
828
|
-
return this.pathExistsSync(path);
|
|
829
|
-
}
|
|
830
629
|
/**
|
|
831
630
|
* Extracts all possible values of a TS enum. Works with both string and numeric enums.
|
|
832
631
|
*/
|
|
@@ -843,8 +642,8 @@ export class Utils {
|
|
|
843
642
|
}
|
|
844
643
|
return values;
|
|
845
644
|
}
|
|
846
|
-
static flatten(arrays) {
|
|
847
|
-
return
|
|
645
|
+
static flatten(arrays, deep) {
|
|
646
|
+
return arrays.flatMap(v => deep && Array.isArray(v) ? this.flatten(v, true) : v);
|
|
848
647
|
}
|
|
849
648
|
static isOperator(key, includeGroupOperators = true) {
|
|
850
649
|
if (!includeGroupOperators) {
|
|
@@ -852,15 +651,6 @@ export class Utils {
|
|
|
852
651
|
}
|
|
853
652
|
return key in GroupOperator || key in QueryOperator;
|
|
854
653
|
}
|
|
855
|
-
static isGroupOperator(key) {
|
|
856
|
-
return key in GroupOperator;
|
|
857
|
-
}
|
|
858
|
-
static isArrayOperator(key) {
|
|
859
|
-
return ARRAY_OPERATORS.includes(key);
|
|
860
|
-
}
|
|
861
|
-
static isJsonKeyOperator(key) {
|
|
862
|
-
return JSON_KEY_OPERATORS.includes(key);
|
|
863
|
-
}
|
|
864
654
|
static hasNestedKey(object, key) {
|
|
865
655
|
if (!object) {
|
|
866
656
|
return false;
|
|
@@ -873,74 +663,16 @@ export class Utils {
|
|
|
873
663
|
}
|
|
874
664
|
return false;
|
|
875
665
|
}
|
|
876
|
-
static getGlobalStorage(namespace) {
|
|
877
|
-
const key = `mikro-orm-${namespace}`;
|
|
878
|
-
globalThis[key] = globalThis[key] || {};
|
|
879
|
-
return globalThis[key];
|
|
880
|
-
}
|
|
881
|
-
/**
|
|
882
|
-
* Require a module from a specific location
|
|
883
|
-
* @param id The module to require
|
|
884
|
-
* @param [from] Location to start the node resolution
|
|
885
|
-
*/
|
|
886
|
-
static requireFrom(id, from = process.cwd()) {
|
|
887
|
-
if (!extname(from)) {
|
|
888
|
-
from = join(from, '__fake.js');
|
|
889
|
-
}
|
|
890
|
-
return createRequire(resolve(from))(id);
|
|
891
|
-
}
|
|
892
|
-
/**
|
|
893
|
-
* Resolve path to a module.
|
|
894
|
-
* @param id The module to require
|
|
895
|
-
* @param [from] Location to start the node resolution
|
|
896
|
-
*/
|
|
897
|
-
static resolveModulePath(id, from = process.cwd()) {
|
|
898
|
-
if (!extname(from)) {
|
|
899
|
-
from = join(from, '__fake.js');
|
|
900
|
-
}
|
|
901
|
-
const path = Utils.normalizePath(createRequire(resolve(from)).resolve(id));
|
|
902
|
-
const parts = path.split('/');
|
|
903
|
-
const idx = parts.lastIndexOf(id) + 1;
|
|
904
|
-
parts.splice(idx, parts.length - idx);
|
|
905
|
-
return parts.join('/');
|
|
906
|
-
}
|
|
907
|
-
static async dynamicImport(id) {
|
|
908
|
-
/* v8 ignore next */
|
|
909
|
-
const specifier = id.startsWith('file://') ? id : pathToFileURL(id).href;
|
|
910
|
-
return import(specifier);
|
|
911
|
-
}
|
|
912
|
-
static ensureDir(path) {
|
|
913
|
-
if (!existsSync(path)) {
|
|
914
|
-
mkdirSync(path, { recursive: true });
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
static pathExistsSync(path) {
|
|
918
|
-
return existsSync(path);
|
|
919
|
-
}
|
|
920
|
-
static readJSONSync(path) {
|
|
921
|
-
const file = readFileSync(path);
|
|
922
|
-
return JSON.parse(file.toString());
|
|
923
|
-
}
|
|
924
666
|
static getORMVersion() {
|
|
925
|
-
|
|
926
|
-
// this works during development where we have `src` folder
|
|
927
|
-
return this.requireFrom('../../package.json', import.meta.dirname).version;
|
|
928
|
-
/* v8 ignore next 5 */
|
|
929
|
-
}
|
|
930
|
-
catch {
|
|
931
|
-
try {
|
|
932
|
-
// this works in production build where we do not have the `src` folder
|
|
933
|
-
return this.requireFrom('../package.json', import.meta.dirname).version;
|
|
934
|
-
}
|
|
935
|
-
catch {
|
|
936
|
-
return 'N/A';
|
|
937
|
-
}
|
|
938
|
-
}
|
|
667
|
+
return this.#ORM_VERSION;
|
|
939
668
|
}
|
|
940
|
-
static createFunction(context, code) {
|
|
669
|
+
static createFunction(context, code, compiledFunctions, key) {
|
|
670
|
+
if (key && compiledFunctions?.[key]) {
|
|
671
|
+
return compiledFunctions[key](...context.values());
|
|
672
|
+
}
|
|
941
673
|
try {
|
|
942
674
|
return new Function(...context.keys(), `'use strict';\n` + code)(...context.values());
|
|
943
|
-
/* v8 ignore next
|
|
675
|
+
/* v8 ignore next */
|
|
944
676
|
}
|
|
945
677
|
catch (e) {
|
|
946
678
|
// eslint-disable-next-line no-console
|
|
@@ -953,7 +685,7 @@ export class Utils {
|
|
|
953
685
|
return fn(...args);
|
|
954
686
|
}
|
|
955
687
|
catch (e) {
|
|
956
|
-
/* v8 ignore
|
|
688
|
+
/* v8 ignore next */
|
|
957
689
|
if ([SyntaxError, TypeError, EvalError, ReferenceError].some(t => e instanceof t)) {
|
|
958
690
|
const position = e.stack.match(/<anonymous>:(\d+):(\d+)/);
|
|
959
691
|
let code = fn.toString();
|
|
@@ -970,18 +702,9 @@ export class Utils {
|
|
|
970
702
|
// eslint-disable-next-line no-console
|
|
971
703
|
console.error(`JIT runtime error: ${e.message}\n\n${code}`);
|
|
972
704
|
}
|
|
973
|
-
/* v8 ignore stop */
|
|
974
705
|
throw e;
|
|
975
706
|
}
|
|
976
707
|
}
|
|
977
|
-
/**
|
|
978
|
-
* @see https://github.com/mikro-orm/mikro-orm/issues/840
|
|
979
|
-
*/
|
|
980
|
-
static propertyDecoratorReturnValue() {
|
|
981
|
-
if (process.env.BABEL_DECORATORS_COMPAT) {
|
|
982
|
-
return {};
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
708
|
static unwrapProperty(entity, meta, prop, payload = false) {
|
|
986
709
|
let p = prop;
|
|
987
710
|
const path = [];
|
|
@@ -1061,54 +784,21 @@ export class Utils {
|
|
|
1061
784
|
}
|
|
1062
785
|
}
|
|
1063
786
|
}
|
|
1064
|
-
static
|
|
1065
|
-
allowError ??= `Cannot find module '${module}'`;
|
|
1066
|
-
from ??= process.cwd();
|
|
787
|
+
static async tryImport({ module, warning }) {
|
|
1067
788
|
try {
|
|
1068
|
-
return
|
|
789
|
+
return await import(module);
|
|
1069
790
|
}
|
|
1070
791
|
catch (err) {
|
|
1071
|
-
if (err.
|
|
1072
|
-
|
|
1073
|
-
|
|
792
|
+
if (err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
793
|
+
if (warning) {
|
|
794
|
+
// eslint-disable-next-line no-console
|
|
795
|
+
console.warn(warning);
|
|
796
|
+
}
|
|
1074
797
|
return undefined;
|
|
1075
798
|
}
|
|
1076
799
|
throw err;
|
|
1077
800
|
}
|
|
1078
801
|
}
|
|
1079
|
-
static async tryImport({ module, warning }) {
|
|
1080
|
-
try {
|
|
1081
|
-
return await this.dynamicImport(module);
|
|
1082
|
-
}
|
|
1083
|
-
catch (err) {
|
|
1084
|
-
// eslint-disable-next-line no-console
|
|
1085
|
-
console.warn(warning);
|
|
1086
|
-
return undefined;
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
static stripRelativePath(str) {
|
|
1090
|
-
return str.replace(/^(?:\.\.\/|\.\/)+/, '/');
|
|
1091
|
-
}
|
|
1092
|
-
/**
|
|
1093
|
-
* simple process.argv parser, supports only properties with long names, prefixed with `--`
|
|
1094
|
-
*/
|
|
1095
|
-
static parseArgs() {
|
|
1096
|
-
let lastKey;
|
|
1097
|
-
return process.argv.slice(2).reduce((args, arg) => {
|
|
1098
|
-
if (arg.includes('=')) {
|
|
1099
|
-
const [key, value] = arg.split('=');
|
|
1100
|
-
args[key.substring(2)] = value;
|
|
1101
|
-
}
|
|
1102
|
-
else if (lastKey) {
|
|
1103
|
-
args[lastKey] = arg;
|
|
1104
|
-
lastKey = undefined;
|
|
1105
|
-
}
|
|
1106
|
-
else if (arg.startsWith('--')) {
|
|
1107
|
-
lastKey = arg.substring(2);
|
|
1108
|
-
}
|
|
1109
|
-
return args;
|
|
1110
|
-
}, {});
|
|
1111
|
-
}
|
|
1112
802
|
static xor(a, b) {
|
|
1113
803
|
return (a || b) && !(a && b);
|
|
1114
804
|
}
|
|
@@ -1137,4 +827,12 @@ export class Utils {
|
|
|
1137
827
|
return o;
|
|
1138
828
|
}, {});
|
|
1139
829
|
}
|
|
830
|
+
static getObjectQueryKeys(obj) {
|
|
831
|
+
return Reflect.ownKeys(obj).filter(key => {
|
|
832
|
+
if (!Object.prototype.propertyIsEnumerable.call(obj, key)) {
|
|
833
|
+
return false;
|
|
834
|
+
}
|
|
835
|
+
return typeof key === 'string' || Raw.isKnownFragmentSymbol(key);
|
|
836
|
+
});
|
|
837
|
+
}
|
|
1140
838
|
}
|