@mikro-orm/core 7.0.0-dev.29 → 7.0.0-dev.291

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 +67 -60
  2. package/EntityManager.js +275 -257
  3. package/MikroORM.d.ts +44 -35
  4. package/MikroORM.js +109 -142
  5. package/README.md +2 -0
  6. package/cache/FileCacheAdapter.d.ts +1 -2
  7. package/cache/FileCacheAdapter.js +18 -11
  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 +75 -23
  17. package/entity/BaseEntity.d.ts +63 -4
  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.js +17 -17
  22. package/entity/EntityFactory.d.ts +7 -1
  23. package/entity/EntityFactory.js +87 -55
  24. package/entity/EntityHelper.d.ts +2 -2
  25. package/entity/EntityHelper.js +50 -17
  26. package/entity/EntityLoader.d.ts +11 -10
  27. package/entity/EntityLoader.js +213 -82
  28. package/entity/EntityRepository.d.ts +28 -8
  29. package/entity/EntityRepository.js +8 -2
  30. package/entity/PolymorphicRef.d.ts +12 -0
  31. package/entity/PolymorphicRef.js +18 -0
  32. package/entity/Reference.d.ts +1 -5
  33. package/entity/Reference.js +15 -11
  34. package/entity/WrappedEntity.d.ts +3 -8
  35. package/entity/WrappedEntity.js +2 -7
  36. package/entity/defineEntity.d.ts +526 -310
  37. package/entity/defineEntity.js +134 -290
  38. package/entity/index.d.ts +2 -2
  39. package/entity/index.js +2 -2
  40. package/entity/utils.d.ts +6 -1
  41. package/entity/utils.js +34 -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 +79 -34
  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 +782 -325
  68. package/metadata/MetadataProvider.d.ts +11 -2
  69. package/metadata/MetadataProvider.js +66 -2
  70. package/metadata/MetadataStorage.d.ts +13 -11
  71. package/metadata/MetadataStorage.js +72 -39
  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 +577 -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 +22 -11
  92. package/platforms/ExceptionConverter.js +1 -1
  93. package/platforms/Platform.d.ts +10 -15
  94. package/platforms/Platform.js +21 -44
  95. package/serialization/EntitySerializer.d.ts +6 -3
  96. package/serialization/EntitySerializer.js +46 -26
  97. package/serialization/EntityTransformer.js +33 -21
  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.js +1 -1
  103. package/types/BlobType.d.ts +0 -1
  104. package/types/BlobType.js +0 -3
  105. package/types/BooleanType.d.ts +1 -0
  106. package/types/BooleanType.js +3 -0
  107. package/types/DecimalType.js +2 -2
  108. package/types/DoubleType.js +1 -1
  109. package/types/EnumArrayType.js +1 -2
  110. package/types/JsonType.d.ts +1 -1
  111. package/types/JsonType.js +7 -2
  112. package/types/TinyIntType.js +1 -1
  113. package/types/Type.d.ts +2 -4
  114. package/types/Type.js +3 -3
  115. package/types/Uint8ArrayType.d.ts +0 -1
  116. package/types/Uint8ArrayType.js +1 -4
  117. package/types/index.d.ts +1 -1
  118. package/typings.d.ts +412 -155
  119. package/typings.js +99 -44
  120. package/unit-of-work/ChangeSet.d.ts +4 -6
  121. package/unit-of-work/ChangeSet.js +4 -5
  122. package/unit-of-work/ChangeSetComputer.d.ts +3 -8
  123. package/unit-of-work/ChangeSetComputer.js +41 -20
  124. package/unit-of-work/ChangeSetPersister.d.ts +13 -12
  125. package/unit-of-work/ChangeSetPersister.js +94 -36
  126. package/unit-of-work/CommitOrderCalculator.d.ts +12 -10
  127. package/unit-of-work/CommitOrderCalculator.js +13 -13
  128. package/unit-of-work/IdentityMap.d.ts +12 -0
  129. package/unit-of-work/IdentityMap.js +39 -1
  130. package/unit-of-work/UnitOfWork.d.ts +27 -3
  131. package/unit-of-work/UnitOfWork.js +248 -90
  132. package/utils/AbstractMigrator.d.ts +101 -0
  133. package/utils/AbstractMigrator.js +305 -0
  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 -211
  139. package/utils/Configuration.js +153 -194
  140. package/utils/ConfigurationLoader.d.ts +1 -52
  141. package/utils/ConfigurationLoader.js +1 -330
  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 +154 -56
  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 +9 -6
  155. package/utils/Utils.d.ts +15 -126
  156. package/utils/Utils.js +80 -382
  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 +34 -0
  161. package/utils/fs-utils.js +196 -0
  162. package/utils/index.d.ts +1 -3
  163. package/utils/index.js +1 -3
  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,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 { ARRAY_OPERATORS, JSON_KEY_OPERATORS, GroupOperator, PlainObject, QueryOperator, ReferenceKind } from '../enums.js';
2
+ import { GroupOperator, PlainObject, QueryOperator, ReferenceKind } from '../enums.js';
10
3
  import { helper } from '../entity/wrap.js';
11
- export const ObjectBindingPattern = Symbol('ObjectBindingPattern');
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 9 */
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 6 */
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.291';
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 3 */
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 `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.
360
279
  */
361
- static tokenize(func) {
362
- if (Array.isArray(func)) {
363
- return func;
364
- }
365
- /* v8 ignore next 5 */
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
- catch {
370
- return [];
286
+ const start = source.indexOf('(', i);
287
+ if (start === -1) {
288
+ return undefined;
371
289
  }
372
- }
373
- /**
374
- * Returns array of functions argument names. Uses `esprima` for source code analysis.
375
- */
376
- static getParamNames(func, methodName) {
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 (inside === 1 && token.type === 'Punctuator' && token.value === '(') {
389
- inside = 2;
390
- currentBlockStart = i;
391
- continue;
296
+ if (source[end] === ')') {
297
+ depth--;
392
298
  }
393
- if (inside === 2 && token.type === 'Punctuator' && token.value === ')') {
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
- 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);
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 && key.constructor.name.toLowerCase() === 'objectid') {
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]] || data[meta.serializedPrimaryKey] || null;
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
- // TODO v7: remove support for `primaryKeys: string[]`
488
- static getPrimaryKeyValues(entity, primaryKeys, allowScalar = false, convertCustomTypes = false) {
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?.properties[pk].targetMeta;
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 7 */
643
- return process.argv[0].endsWith('ts-node') // running via ts-node directly
644
- || !!process.env.MIKRO_ORM_CLI_ALWAYS_ALLOW_TS // forced explicitly or enabled via `registerTypeScriptSupport()`
645
- || !!process.env.TS_JEST // check if ts-jest is used (works only with v27.0.4+)
646
- || !!process.env.VITEST // check if vitest is used
647
- || !!process.versions.bun // check if bun is used
648
- || process.argv.slice(1).some(arg => arg.match(/\.([mc]?ts|tsx)$/)) // executing `.ts` file
649
- || 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 => {
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(/\[object (\w+)]/)[1];
560
+ const type = objectType.match(/^\[object (.+)]$/)[1];
702
561
  if (type === 'Uint8Array') {
703
562
  return 'Buffer';
704
563
  }
705
- return ['Date', 'Buffer', 'RegExp'].includes(type) ? type : type.toLowerCase();
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
- static fileURLToPath(url) {
732
- // expose `fileURLToPath` on Utils so that it can be properly mocked in tests
733
- return fileURLToPath(url);
734
- }
735
- /**
736
- * Resolves and normalizes a series of path parts relative to each preceding part.
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
- let path = parts.join('/').replace(/\\/g, '/').replace(/\/$/, '');
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 [].concat.apply([], arrays);
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
- try {
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 5 */
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 start */
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 tryRequire({ module, from, allowError, warning }) {
1065
- allowError ??= `Cannot find module '${module}'`;
1066
- from ??= process.cwd();
787
+ static async tryImport({ module, warning }) {
1067
788
  try {
1068
- return Utils.requireFrom(module, from);
789
+ return await import(module);
1069
790
  }
1070
791
  catch (err) {
1071
- if (err.message.includes(allowError)) {
1072
- // eslint-disable-next-line no-console
1073
- 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
+ }
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
  }