@mikro-orm/core 7.0.0-dev.23 → 7.0.0-dev.231

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