@mikro-orm/core 7.0.0-dev.7 → 7.0.0-dev.71

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 (161) hide show
  1. package/EntityManager.d.ts +85 -42
  2. package/EntityManager.js +282 -194
  3. package/MikroORM.d.ts +11 -29
  4. package/MikroORM.js +33 -127
  5. package/README.md +3 -2
  6. package/cache/FileCacheAdapter.js +1 -2
  7. package/connections/Connection.d.ts +11 -7
  8. package/connections/Connection.js +16 -14
  9. package/drivers/DatabaseDriver.d.ts +11 -5
  10. package/drivers/DatabaseDriver.js +13 -4
  11. package/drivers/IDatabaseDriver.d.ts +27 -5
  12. package/entity/BaseEntity.d.ts +0 -1
  13. package/entity/BaseEntity.js +0 -3
  14. package/entity/Collection.d.ts +98 -30
  15. package/entity/Collection.js +432 -93
  16. package/entity/EntityAssigner.d.ts +1 -1
  17. package/entity/EntityAssigner.js +9 -1
  18. package/entity/EntityFactory.d.ts +7 -0
  19. package/entity/EntityFactory.js +63 -40
  20. package/entity/EntityHelper.js +26 -9
  21. package/entity/EntityLoader.d.ts +5 -4
  22. package/entity/EntityLoader.js +69 -36
  23. package/entity/EntityRepository.d.ts +1 -1
  24. package/entity/EntityValidator.js +4 -4
  25. package/entity/Reference.d.ts +9 -7
  26. package/entity/Reference.js +32 -5
  27. package/entity/WrappedEntity.d.ts +0 -2
  28. package/entity/WrappedEntity.js +1 -5
  29. package/entity/defineEntity.d.ts +549 -0
  30. package/entity/defineEntity.js +529 -0
  31. package/entity/index.d.ts +2 -1
  32. package/entity/index.js +2 -1
  33. package/entity/utils.d.ts +7 -0
  34. package/entity/utils.js +15 -3
  35. package/enums.d.ts +20 -5
  36. package/enums.js +13 -0
  37. package/errors.d.ts +6 -1
  38. package/errors.js +14 -4
  39. package/events/EventSubscriber.d.ts +3 -1
  40. package/hydration/ObjectHydrator.d.ts +4 -4
  41. package/hydration/ObjectHydrator.js +35 -24
  42. package/index.d.ts +2 -2
  43. package/index.js +1 -2
  44. package/logging/DefaultLogger.d.ts +1 -1
  45. package/logging/SimpleLogger.d.ts +1 -1
  46. package/metadata/EntitySchema.d.ts +9 -13
  47. package/metadata/EntitySchema.js +44 -26
  48. package/metadata/MetadataDiscovery.d.ts +6 -7
  49. package/metadata/MetadataDiscovery.js +161 -162
  50. package/metadata/MetadataProvider.d.ts +2 -2
  51. package/metadata/MetadataProvider.js +15 -0
  52. package/metadata/MetadataStorage.d.ts +0 -4
  53. package/metadata/MetadataStorage.js +6 -10
  54. package/metadata/MetadataValidator.d.ts +0 -7
  55. package/metadata/MetadataValidator.js +4 -13
  56. package/metadata/discover-entities.d.ts +5 -0
  57. package/metadata/discover-entities.js +39 -0
  58. package/metadata/index.d.ts +1 -1
  59. package/metadata/index.js +1 -1
  60. package/metadata/types.d.ts +480 -0
  61. package/metadata/types.js +1 -0
  62. package/naming-strategy/AbstractNamingStrategy.d.ts +5 -1
  63. package/naming-strategy/AbstractNamingStrategy.js +7 -1
  64. package/naming-strategy/NamingStrategy.d.ts +11 -1
  65. package/package.json +11 -10
  66. package/platforms/Platform.d.ts +6 -10
  67. package/platforms/Platform.js +6 -22
  68. package/serialization/EntitySerializer.d.ts +2 -0
  69. package/serialization/EntitySerializer.js +29 -11
  70. package/serialization/EntityTransformer.js +22 -12
  71. package/serialization/SerializationContext.js +14 -11
  72. package/types/ArrayType.d.ts +1 -1
  73. package/types/ArrayType.js +1 -2
  74. package/types/BigIntType.d.ts +8 -6
  75. package/types/BlobType.d.ts +0 -1
  76. package/types/BlobType.js +0 -3
  77. package/types/BooleanType.d.ts +2 -1
  78. package/types/BooleanType.js +3 -0
  79. package/types/DecimalType.d.ts +6 -4
  80. package/types/DecimalType.js +1 -1
  81. package/types/DoubleType.js +1 -1
  82. package/types/JsonType.d.ts +1 -1
  83. package/types/JsonType.js +7 -2
  84. package/types/Type.d.ts +2 -1
  85. package/types/Type.js +1 -1
  86. package/types/Uint8ArrayType.d.ts +0 -1
  87. package/types/Uint8ArrayType.js +0 -3
  88. package/types/index.d.ts +1 -1
  89. package/typings.d.ts +112 -77
  90. package/typings.js +32 -32
  91. package/unit-of-work/ChangeSetComputer.js +8 -3
  92. package/unit-of-work/ChangeSetPersister.d.ts +4 -2
  93. package/unit-of-work/ChangeSetPersister.js +37 -16
  94. package/unit-of-work/UnitOfWork.d.ts +8 -1
  95. package/unit-of-work/UnitOfWork.js +111 -54
  96. package/utils/AbstractSchemaGenerator.d.ts +5 -5
  97. package/utils/AbstractSchemaGenerator.js +10 -8
  98. package/utils/Configuration.d.ts +200 -191
  99. package/utils/Configuration.js +141 -152
  100. package/utils/ConfigurationLoader.d.ts +3 -44
  101. package/utils/ConfigurationLoader.js +26 -239
  102. package/utils/Cursor.d.ts +3 -3
  103. package/utils/Cursor.js +3 -0
  104. package/utils/DataloaderUtils.d.ts +15 -5
  105. package/utils/DataloaderUtils.js +53 -7
  106. package/utils/EntityComparator.d.ts +8 -4
  107. package/utils/EntityComparator.js +107 -60
  108. package/utils/QueryHelper.d.ts +9 -1
  109. package/utils/QueryHelper.js +69 -8
  110. package/utils/RawQueryFragment.d.ts +36 -4
  111. package/utils/RawQueryFragment.js +34 -13
  112. package/utils/TransactionManager.d.ts +65 -0
  113. package/utils/TransactionManager.js +223 -0
  114. package/utils/Utils.d.ts +17 -84
  115. package/utils/Utils.js +132 -252
  116. package/utils/index.d.ts +1 -0
  117. package/utils/index.js +1 -0
  118. package/utils/upsert-utils.d.ts +7 -2
  119. package/utils/upsert-utils.js +52 -1
  120. package/decorators/Check.d.ts +0 -3
  121. package/decorators/Check.js +0 -13
  122. package/decorators/CreateRequestContext.d.ts +0 -3
  123. package/decorators/CreateRequestContext.js +0 -32
  124. package/decorators/Embeddable.d.ts +0 -8
  125. package/decorators/Embeddable.js +0 -11
  126. package/decorators/Embedded.d.ts +0 -18
  127. package/decorators/Embedded.js +0 -18
  128. package/decorators/Entity.d.ts +0 -18
  129. package/decorators/Entity.js +0 -12
  130. package/decorators/Enum.d.ts +0 -9
  131. package/decorators/Enum.js +0 -16
  132. package/decorators/Filter.d.ts +0 -2
  133. package/decorators/Filter.js +0 -8
  134. package/decorators/Formula.d.ts +0 -4
  135. package/decorators/Formula.js +0 -15
  136. package/decorators/Indexed.d.ts +0 -19
  137. package/decorators/Indexed.js +0 -20
  138. package/decorators/ManyToMany.d.ts +0 -40
  139. package/decorators/ManyToMany.js +0 -14
  140. package/decorators/ManyToOne.d.ts +0 -30
  141. package/decorators/ManyToOne.js +0 -14
  142. package/decorators/OneToMany.d.ts +0 -28
  143. package/decorators/OneToMany.js +0 -17
  144. package/decorators/OneToOne.d.ts +0 -24
  145. package/decorators/OneToOne.js +0 -7
  146. package/decorators/PrimaryKey.d.ts +0 -8
  147. package/decorators/PrimaryKey.js +0 -20
  148. package/decorators/Property.d.ts +0 -250
  149. package/decorators/Property.js +0 -32
  150. package/decorators/Transactional.d.ts +0 -13
  151. package/decorators/Transactional.js +0 -28
  152. package/decorators/hooks.d.ts +0 -16
  153. package/decorators/hooks.js +0 -47
  154. package/decorators/index.d.ts +0 -17
  155. package/decorators/index.js +0 -17
  156. package/entity/ArrayCollection.d.ts +0 -116
  157. package/entity/ArrayCollection.js +0 -402
  158. package/metadata/ReflectMetadataProvider.d.ts +0 -8
  159. package/metadata/ReflectMetadataProvider.js +0 -44
  160. package/utils/resolveContextProvider.d.ts +0 -10
  161. package/utils/resolveContextProvider.js +0 -28
package/utils/Utils.js CHANGED
@@ -1,15 +1,10 @@
1
1
  import { createRequire } from 'node:module';
2
- import globby from 'globby';
3
2
  import { extname, isAbsolute, join, normalize, relative, resolve } from 'node:path';
4
- import { platform } from 'node:os';
5
3
  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';
4
+ import { existsSync, globSync, statSync, mkdirSync, readFileSync } from 'node:fs';
9
5
  import { clone } from './clone.js';
10
- import { ARRAY_OPERATORS, JSON_KEY_OPERATORS, GroupOperator, PlainObject, QueryOperator, ReferenceKind } from '../enums.js';
6
+ import { GroupOperator, PlainObject, QueryOperator, ReferenceKind } from '../enums.js';
11
7
  import { helper } from '../entity/wrap.js';
12
- export const ObjectBindingPattern = Symbol('ObjectBindingPattern');
13
8
  function compareConstructors(a, b) {
14
9
  if (a.constructor === b.constructor) {
15
10
  return true;
@@ -134,50 +129,12 @@ export class Utils {
134
129
  static PK_SEPARATOR = '~~~';
135
130
  /* v8 ignore next */
136
131
  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
- }
143
132
  /**
144
133
  * Checks if the argument is instance of `Object`. Returns false for arrays.
145
134
  */
146
135
  static isObject(o) {
147
136
  return !!o && typeof o === 'object' && !Array.isArray(o);
148
137
  }
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
138
  /**
182
139
  * Removes `undefined` properties (recursively) so they are not saved as nulls
183
140
  */
@@ -225,18 +182,6 @@ export class Utils {
225
182
  }
226
183
  return false;
227
184
  }
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
185
  /**
241
186
  * Checks if arguments are deeply (but not strictly) equal.
242
187
  */
@@ -295,30 +240,6 @@ export class Utils {
295
240
  }
296
241
  return Utils._merge(target, sources, ignoreUndefined);
297
242
  }
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
243
  /**
323
244
  * Creates deep copy of given object.
324
245
  */
@@ -359,53 +280,37 @@ export class Utils {
359
280
  }
360
281
  }
361
282
  /**
362
- * Returns array of functions argument names. Uses `esprima` for source code analysis.
283
+ * Returns array of functions argument names. Uses basic regex for source code analysis, might not work with advanced syntax.
363
284
  */
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 });
285
+ static getConstructorParams(func) {
286
+ const source = func.toString();
287
+ const i = source.indexOf('constructor');
288
+ if (i === -1) {
289
+ return undefined;
371
290
  }
372
- catch {
373
- return [];
291
+ const start = source.indexOf('(', i);
292
+ if (start === -1) {
293
+ return undefined;
374
294
  }
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;
295
+ let depth = 0;
296
+ let end = start;
297
+ for (; end < source.length; end++) {
298
+ if (source[end] === '(') {
299
+ depth++;
390
300
  }
391
- if (inside === 1 && token.type === 'Punctuator' && token.value === '(') {
392
- inside = 2;
393
- currentBlockStart = i;
394
- continue;
301
+ if (source[end] === ')') {
302
+ depth--;
395
303
  }
396
- if (inside === 2 && token.type === 'Punctuator' && token.value === ')') {
304
+ if (depth === 0) {
397
305
  break;
398
306
  }
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
307
  }
408
- return ret;
308
+ const raw = source.slice(start + 1, end);
309
+ return raw
310
+ .split(',')
311
+ .map(s => s.trim().replace(/=.*$/, '').trim())
312
+ .filter(Boolean)
313
+ .map(raw => raw.startsWith('{') && raw.endsWith('}') ? '' : raw);
409
314
  }
410
315
  /**
411
316
  * Checks whether the argument looks like primary key (string, number or ObjectId).
@@ -418,7 +323,7 @@ export class Utils {
418
323
  return true;
419
324
  }
420
325
  if (Utils.isObject(key)) {
421
- if (key.constructor && key.constructor.name.toLowerCase() === 'objectid') {
326
+ if (key.constructor?.name === 'ObjectId') {
422
327
  return true;
423
328
  }
424
329
  if (!Utils.isPlainObject(key) && !Utils.isEntity(key, true)) {
@@ -435,7 +340,11 @@ export class Utils {
435
340
  return data;
436
341
  }
437
342
  if (Utils.isEntity(data, true)) {
438
- return helper(data).getPrimaryKey();
343
+ const wrapped = helper(data);
344
+ if (wrapped.__meta.compositePK) {
345
+ return wrapped.getPrimaryKeys();
346
+ }
347
+ return wrapped.getPrimaryKey();
439
348
  }
440
349
  if (strict && meta && Utils.getObjectKeysSize(data) !== meta.primaryKeys.length) {
441
350
  return null;
@@ -444,7 +353,7 @@ export class Utils {
444
353
  if (meta.compositePK) {
445
354
  return this.getCompositeKeyValue(data, meta);
446
355
  }
447
- return data[meta.primaryKeys[0]] || data[meta.serializedPrimaryKey] || null;
356
+ return data[meta.primaryKeys[0]] ?? data[meta.serializedPrimaryKey] ?? null;
448
357
  }
449
358
  return null;
450
359
  }
@@ -483,7 +392,7 @@ export class Utils {
483
392
  static splitPrimaryKeys(key) {
484
393
  return key.split(this.PK_SEPARATOR);
485
394
  }
486
- static getPrimaryKeyValues(entity, primaryKeys, allowScalar = false, convertCustomTypes = false) {
395
+ static getPrimaryKeyValues(entity, meta, allowScalar = false, convertCustomTypes = false) {
487
396
  /* v8 ignore next 3 */
488
397
  if (entity == null) {
489
398
  return entity;
@@ -494,15 +403,28 @@ export class Utils {
494
403
  }
495
404
  return val;
496
405
  }
497
- const pk = Utils.isEntity(entity, true)
498
- ? helper(entity).getPrimaryKey(convertCustomTypes)
499
- : primaryKeys.reduce((o, pk) => { o[pk] = entity[pk]; return o; }, {});
500
- if (primaryKeys.length > 1) {
406
+ let pk;
407
+ if (Utils.isEntity(entity, true)) {
408
+ pk = helper(entity).getPrimaryKey(convertCustomTypes);
409
+ }
410
+ else {
411
+ pk = meta.primaryKeys.reduce((o, pk) => {
412
+ const targetMeta = meta.properties[pk].targetMeta;
413
+ if (targetMeta && Utils.isPlainObject(entity[pk])) {
414
+ o[pk] = Utils.getPrimaryKeyValues(entity[pk], targetMeta, allowScalar, convertCustomTypes);
415
+ }
416
+ else {
417
+ o[pk] = entity[pk];
418
+ }
419
+ return o;
420
+ }, {});
421
+ }
422
+ if (meta.primaryKeys.length > 1) {
501
423
  return toArray(pk);
502
424
  }
503
425
  if (allowScalar) {
504
426
  if (Utils.isPlainObject(pk)) {
505
- return pk[primaryKeys[0]];
427
+ return pk[(meta.primaryKeys)[0]];
506
428
  }
507
429
  return pk;
508
430
  }
@@ -546,7 +468,7 @@ export class Utils {
546
468
  return o;
547
469
  }, {});
548
470
  }
549
- static getOrderedPrimaryKeys(id, meta, platform, convertCustomTypes = false) {
471
+ static getOrderedPrimaryKeys(id, meta, platform, convertCustomTypes = false, allowScalar = false) {
550
472
  const data = (Utils.isPrimaryKey(id) ? { [meta.primaryKeys[0]]: id } : id);
551
473
  const pks = meta.primaryKeys.map((pk, idx) => {
552
474
  const prop = meta.properties[pk];
@@ -556,11 +478,14 @@ export class Utils {
556
478
  value = prop.customType.convertToJSValue(value, platform);
557
479
  }
558
480
  if (prop.kind !== ReferenceKind.SCALAR && prop.targetMeta) {
559
- const value2 = this.getOrderedPrimaryKeys(value, prop.targetMeta, platform, convertCustomTypes);
481
+ const value2 = this.getOrderedPrimaryKeys(value, prop.targetMeta, platform, convertCustomTypes, allowScalar);
560
482
  value = value2.length > 1 ? value2 : value2[0];
561
483
  }
562
484
  return value;
563
485
  });
486
+ if (allowScalar && pks.length === 1) {
487
+ return pks[0];
488
+ }
564
489
  // we need to flatten the PKs as composite PKs can be build from another composite PKs
565
490
  // and this method is used to get the PK hash in identity map, that expects flat array
566
491
  return Utils.flatten(pks);
@@ -583,12 +508,6 @@ export class Utils {
583
508
  static isScalarReference(data, allowReference = false) {
584
509
  return typeof data === 'object' && data?.__scalarReference;
585
510
  }
586
- /**
587
- * Checks whether the argument is ObjectId instance
588
- */
589
- static isObjectID(key) {
590
- return Utils.isObject(key) && key.constructor && key.constructor.name.toLowerCase() === 'objectid';
591
- }
592
511
  /**
593
512
  * Checks whether the argument is empty (array without items, object without keys or falsy value).
594
513
  */
@@ -625,44 +544,12 @@ export class Utils {
625
544
  || !!process.env.TS_JEST // check if ts-jest is used (works only with v27.0.4+)
626
545
  || !!process.env.VITEST // check if vitest is used
627
546
  || !!process.versions.bun // check if bun is used
628
- || process.argv.slice(1).some(arg => arg.includes('ts-node')) // registering ts-node runner
629
- || process.execArgv.some(arg => arg === 'ts-node/esm'); // check for ts-node/esm module loader
630
- }
631
- /**
632
- * Uses some dark magic to get source path to caller where decorator is used.
633
- * Analyses stack trace of error created inside the function call.
634
- */
635
- static lookupPathFromDecorator(name, stack) {
636
- // use some dark magic to get source path to caller
637
- stack = stack || new Error().stack.split('\n');
638
- // In some situations (e.g. swc 1.3.4+), the presence of a source map can obscure the call to
639
- // __decorate(), replacing it with the constructor name. To support these cases we look for
640
- // Reflect.decorate() as well. Also when babel is used, we need to check
641
- // the `_applyDecoratedDescriptor` method instead.
642
- let line = stack.findIndex(line => line.match(/__decorate|Reflect\.decorate|_applyDecoratedDescriptor/));
643
- // bun does not have those lines at all, only the DecorateProperty/DecorateConstructor,
644
- // but those are also present in node, so we need to check this only if they weren't found.
645
- if (line === -1) {
646
- // here we handle bun which stack is different from nodejs so we search for reflect-metadata
647
- const reflectLine = stack.findIndex(line => Utils.normalizePath(line).includes('node_modules/reflect-metadata/Reflect.js'));
648
- if (reflectLine === -1 || reflectLine + 2 >= stack.length || !stack[reflectLine + 1].includes('bun:wrap')) {
649
- return name;
650
- }
651
- line = reflectLine + 2;
652
- }
653
- if (stack[line].includes('Reflect.decorate')) {
654
- line++;
655
- }
656
- if (Utils.normalizePath(stack[line]).includes('node_modules/tslib/tslib')) {
657
- line++;
658
- }
659
- try {
660
- const re = stack[line].match(/\(.+\)/i) ? /\((.*):\d+:\d+\)/ : /at\s*(.*):\d+:\d+$/;
661
- return Utils.normalizePath(stack[line].match(re)[1]);
662
- }
663
- catch {
664
- return name;
665
- }
547
+ || process.argv.slice(1).some(arg => arg.match(/\.([mc]?ts|tsx)$/)) // executing `.ts` file
548
+ || process.execArgv.some(arg => {
549
+ return arg.includes('ts-node') // check for ts-node loader
550
+ || arg.includes('@swc-node/register') // check for swc-node/register loader
551
+ || arg.includes('node_modules/tsx/'); // check for tsx loader
552
+ });
666
553
  }
667
554
  /**
668
555
  * Gets the type of the argument.
@@ -673,11 +560,11 @@ export class Utils {
673
560
  return simple;
674
561
  }
675
562
  const objectType = Object.prototype.toString.call(value);
676
- const type = objectType.match(/\[object (\w+)]/)[1];
563
+ const type = objectType.match(/^\[object (.+)]$/)[1];
677
564
  if (type === 'Uint8Array') {
678
565
  return 'Buffer';
679
566
  }
680
- return ['Date', 'Buffer', 'RegExp'].includes(type) ? type : type.toLowerCase();
567
+ return type;
681
568
  }
682
569
  /**
683
570
  * Checks whether the value is POJO (e.g. `{ foo: 'bar' }`, and not instance of `Foo`)
@@ -761,8 +648,14 @@ export class Utils {
761
648
  }
762
649
  return Utils.normalizePath(path);
763
650
  }
651
+ // FNV-1a 64-bit
764
652
  static hash(data, length) {
765
- const hash = createHash('md5').update(data).digest('hex');
653
+ let h1 = 0xcbf29ce484222325n;
654
+ for (let i = 0; i < data.length; i++) {
655
+ h1 ^= BigInt(data.charCodeAt(i));
656
+ h1 = (h1 * 0x100000001b3n) & 0xffffffffffffffffn;
657
+ }
658
+ const hash = h1.toString(16).padStart(16, '0');
766
659
  if (length) {
767
660
  return hash.substring(0, length);
768
661
  }
@@ -794,12 +687,32 @@ export class Utils {
794
687
  static randomInt(min, max) {
795
688
  return Math.round(Math.random() * (max - min)) + min;
796
689
  }
797
- static async pathExists(path, options = {}) {
798
- if (globby.hasMagic(path)) {
799
- const found = await globby(path, options);
690
+ static glob(input, cwd) {
691
+ if (Array.isArray(input)) {
692
+ return input.flatMap(paths => this.glob(paths, cwd));
693
+ }
694
+ const hasGlobChars = /[*?[\]]/.test(input);
695
+ if (!hasGlobChars) {
696
+ try {
697
+ const s = statSync(cwd ? Utils.normalizePath(cwd, input) : input);
698
+ if (s.isDirectory()) {
699
+ const files = globSync(join(input, '**'), { cwd, withFileTypes: true });
700
+ return files.filter(f => f.isFile()).map(f => join(f.parentPath, f.name));
701
+ }
702
+ }
703
+ catch {
704
+ // ignore
705
+ }
706
+ }
707
+ const files = globSync(input, { cwd, withFileTypes: true });
708
+ return files.filter(f => f.isFile()).map(f => join(f.parentPath, f.name));
709
+ }
710
+ static pathExists(path) {
711
+ if (/[*?[\]]/.test(path)) {
712
+ const found = globSync(path);
800
713
  return found.length > 0;
801
714
  }
802
- return this.pathExistsSync(path);
715
+ return existsSync(path);
803
716
  }
804
717
  /**
805
718
  * Extracts all possible values of a TS enum. Works with both string and numeric enums.
@@ -826,15 +739,6 @@ export class Utils {
826
739
  }
827
740
  return key in GroupOperator || key in QueryOperator;
828
741
  }
829
- static isGroupOperator(key) {
830
- return key in GroupOperator;
831
- }
832
- static isArrayOperator(key) {
833
- return ARRAY_OPERATORS.includes(key);
834
- }
835
- static isJsonKeyOperator(key) {
836
- return JSON_KEY_OPERATORS.includes(key);
837
- }
838
742
  static hasNestedKey(object, key) {
839
743
  if (!object) {
840
744
  return false;
@@ -847,11 +751,6 @@ export class Utils {
847
751
  }
848
752
  return false;
849
753
  }
850
- static getGlobalStorage(namespace) {
851
- const key = `mikro-orm-${namespace}`;
852
- globalThis[key] = globalThis[key] || {};
853
- return globalThis[key];
854
- }
855
754
  /**
856
755
  * Require a module from a specific location
857
756
  * @param id The module to require
@@ -863,31 +762,31 @@ export class Utils {
863
762
  }
864
763
  return createRequire(resolve(from))(id);
865
764
  }
866
- static async dynamicImport(id) {
867
- /* v8 ignore next 7 */
868
- if (platform() === 'win32') {
869
- try {
870
- id = pathToFileURL(id).toString();
871
- }
872
- catch {
873
- // ignore
874
- }
765
+ /**
766
+ * Resolve path to a module.
767
+ * @param id The module to require
768
+ * @param [from] Location to start the node resolution
769
+ */
770
+ static resolveModulePath(id, from = process.cwd()) {
771
+ if (!extname(from)) {
772
+ from = join(from, '__fake.js');
875
773
  }
876
- /* v8 ignore next */
877
- return this.dynamicImportProvider(id);
774
+ const path = Utils.normalizePath(createRequire(resolve(from)).resolve(id));
775
+ const parts = path.split('/');
776
+ const idx = parts.lastIndexOf(id) + 1;
777
+ parts.splice(idx, parts.length - idx);
778
+ return parts.join('/');
878
779
  }
879
- /* v8 ignore next 3 */
880
- static setDynamicImportProvider(provider) {
881
- this.dynamicImportProvider = provider;
780
+ static async dynamicImport(id) {
781
+ /* v8 ignore next */
782
+ const specifier = id.startsWith('file://') ? id : pathToFileURL(id).href;
783
+ return this.dynamicImportProvider(specifier);
882
784
  }
883
785
  static ensureDir(path) {
884
786
  if (!existsSync(path)) {
885
787
  mkdirSync(path, { recursive: true });
886
788
  }
887
789
  }
888
- static pathExistsSync(path) {
889
- return existsSync(path);
890
- }
891
790
  static readJSONSync(path) {
892
791
  const file = readFileSync(path);
893
792
  return JSON.parse(file.toString());
@@ -899,8 +798,13 @@ export class Utils {
899
798
  /* v8 ignore next 5 */
900
799
  }
901
800
  catch {
902
- // this works in production build where we do not have the `src` folder
903
- return this.requireFrom('../package.json', import.meta.dirname).version;
801
+ try {
802
+ // this works in production build where we do not have the `src` folder
803
+ return this.requireFrom('../package.json', import.meta.dirname).version;
804
+ }
805
+ catch {
806
+ return 'N/A';
807
+ }
904
808
  }
905
809
  }
906
810
  static createFunction(context, code) {
@@ -940,14 +844,6 @@ export class Utils {
940
844
  throw e;
941
845
  }
942
846
  }
943
- /**
944
- * @see https://github.com/mikro-orm/mikro-orm/issues/840
945
- */
946
- static propertyDecoratorReturnValue() {
947
- if (process.env.BABEL_DECORATORS_COMPAT) {
948
- return {};
949
- }
950
- }
951
847
  static unwrapProperty(entity, meta, prop, payload = false) {
952
848
  let p = prop;
953
849
  const path = [];
@@ -1035,8 +931,10 @@ export class Utils {
1035
931
  }
1036
932
  catch (err) {
1037
933
  if (err.message.includes(allowError)) {
1038
- // eslint-disable-next-line no-console
1039
- console.warn(warning);
934
+ if (warning) {
935
+ // eslint-disable-next-line no-console
936
+ console.warn(warning);
937
+ }
1040
938
  return undefined;
1041
939
  }
1042
940
  throw err;
@@ -1044,36 +942,18 @@ export class Utils {
1044
942
  }
1045
943
  static async tryImport({ module, warning }) {
1046
944
  try {
1047
- return await this.dynamicImport(module);
945
+ return await import(module);
1048
946
  }
1049
947
  catch (err) {
1050
- // eslint-disable-next-line no-console
1051
- console.warn(warning);
1052
- return undefined;
1053
- }
1054
- }
1055
- static stripRelativePath(str) {
1056
- return str.replace(/^(?:\.\.\/|\.\/)+/, '/');
1057
- }
1058
- /**
1059
- * simple process.argv parser, supports only properties with long names, prefixed with `--`
1060
- */
1061
- static parseArgs() {
1062
- let lastKey;
1063
- return process.argv.slice(2).reduce((args, arg) => {
1064
- if (arg.includes('=')) {
1065
- const [key, value] = arg.split('=');
1066
- args[key.substring(2)] = value;
1067
- }
1068
- else if (lastKey) {
1069
- args[lastKey] = arg;
1070
- lastKey = undefined;
1071
- }
1072
- else if (arg.startsWith('--')) {
1073
- lastKey = arg.substring(2);
948
+ if (err.code === 'ERR_MODULE_NOT_FOUND') {
949
+ if (warning) {
950
+ // eslint-disable-next-line no-console
951
+ console.warn(warning);
952
+ }
953
+ return undefined;
1074
954
  }
1075
- return args;
1076
- }, {});
955
+ throw err;
956
+ }
1077
957
  }
1078
958
  static xor(a, b) {
1079
959
  return (a || b) && !(a && b);
package/utils/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './DataloaderUtils.js';
5
5
  export * from './Utils.js';
6
6
  export * from './RequestContext.js';
7
7
  export * from './TransactionContext.js';
8
+ export * from './TransactionManager.js';
8
9
  export * from './QueryHelper.js';
9
10
  export * from './NullHighlighter.js';
10
11
  export * from './EntityComparator.js';
package/utils/index.js CHANGED
@@ -5,6 +5,7 @@ export * from './DataloaderUtils.js';
5
5
  export * from './Utils.js';
6
6
  export * from './RequestContext.js';
7
7
  export * from './TransactionContext.js';
8
+ export * from './TransactionManager.js';
8
9
  export * from './QueryHelper.js';
9
10
  export * from './NullHighlighter.js';
10
11
  export * from './EntityComparator.js';
@@ -1,7 +1,12 @@
1
- import type { EntityData, EntityMetadata } from '../typings.js';
1
+ import type { EntityData, EntityMetadata, FilterQuery } from '../typings.js';
2
2
  import type { UpsertOptions } from '../drivers/IDatabaseDriver.js';
3
- import type { RawQueryFragment } from '../utils/RawQueryFragment.js';
3
+ import { type RawQueryFragment } from '../utils/RawQueryFragment.js';
4
4
  /** @internal */
5
5
  export declare function getOnConflictFields<T>(meta: EntityMetadata<T> | undefined, data: EntityData<T>, uniqueFields: (keyof T)[] | RawQueryFragment, options: UpsertOptions<T>): (keyof T)[];
6
6
  /** @internal */
7
7
  export declare function getOnConflictReturningFields<T, P extends string>(meta: EntityMetadata<T> | undefined, data: EntityData<T>, uniqueFields: (keyof T)[] | RawQueryFragment, options: UpsertOptions<T, P>): (keyof T)[] | '*';
8
+ /** @internal */
9
+ export declare function getWhereCondition<T extends object>(meta: EntityMetadata<T>, onConflictFields: (keyof T)[] | RawQueryFragment | undefined, data: EntityData<T>, where: FilterQuery<T>): {
10
+ where: FilterQuery<T>;
11
+ propIndex: number | false;
12
+ };