@mikro-orm/core 7.0.4 → 7.0.5-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/EntityManager.d.ts +583 -884
  2. package/EntityManager.js +1895 -1922
  3. package/MikroORM.d.ts +74 -103
  4. package/MikroORM.js +179 -178
  5. package/README.md +1 -1
  6. package/cache/CacheAdapter.d.ts +36 -36
  7. package/cache/FileCacheAdapter.d.ts +24 -30
  8. package/cache/FileCacheAdapter.js +78 -80
  9. package/cache/GeneratedCacheAdapter.d.ts +20 -18
  10. package/cache/GeneratedCacheAdapter.js +30 -30
  11. package/cache/MemoryCacheAdapter.d.ts +20 -18
  12. package/cache/MemoryCacheAdapter.js +36 -35
  13. package/cache/NullCacheAdapter.d.ts +16 -16
  14. package/cache/NullCacheAdapter.js +24 -24
  15. package/connections/Connection.d.ts +84 -95
  16. package/connections/Connection.js +168 -165
  17. package/drivers/DatabaseDriver.d.ts +80 -186
  18. package/drivers/DatabaseDriver.js +443 -450
  19. package/drivers/IDatabaseDriver.d.ts +301 -440
  20. package/entity/BaseEntity.d.ts +83 -120
  21. package/entity/BaseEntity.js +43 -43
  22. package/entity/Collection.d.ts +179 -212
  23. package/entity/Collection.js +721 -727
  24. package/entity/EntityAssigner.d.ts +77 -88
  25. package/entity/EntityAssigner.js +230 -231
  26. package/entity/EntityFactory.d.ts +54 -66
  27. package/entity/EntityFactory.js +383 -425
  28. package/entity/EntityHelper.d.ts +22 -34
  29. package/entity/EntityHelper.js +267 -280
  30. package/entity/EntityIdentifier.d.ts +4 -4
  31. package/entity/EntityIdentifier.js +10 -10
  32. package/entity/EntityLoader.d.ts +72 -98
  33. package/entity/EntityLoader.js +723 -753
  34. package/entity/EntityRepository.d.ts +201 -316
  35. package/entity/EntityRepository.js +213 -213
  36. package/entity/PolymorphicRef.d.ts +5 -5
  37. package/entity/PolymorphicRef.js +10 -10
  38. package/entity/Reference.d.ts +82 -126
  39. package/entity/Reference.js +274 -278
  40. package/entity/WrappedEntity.d.ts +72 -115
  41. package/entity/WrappedEntity.js +166 -168
  42. package/entity/defineEntity.d.ts +636 -1315
  43. package/entity/defineEntity.js +518 -527
  44. package/entity/utils.d.ts +3 -13
  45. package/entity/utils.js +73 -71
  46. package/entity/validators.js +43 -43
  47. package/entity/wrap.js +8 -8
  48. package/enums.d.ts +253 -258
  49. package/enums.js +252 -251
  50. package/errors.d.ts +72 -114
  51. package/errors.js +253 -350
  52. package/events/EventManager.d.ts +14 -26
  53. package/events/EventManager.js +77 -79
  54. package/events/EventSubscriber.d.ts +29 -29
  55. package/events/TransactionEventBroadcaster.d.ts +8 -15
  56. package/events/TransactionEventBroadcaster.js +14 -14
  57. package/exceptions.d.ts +40 -23
  58. package/exceptions.js +52 -35
  59. package/hydration/Hydrator.d.ts +17 -42
  60. package/hydration/Hydrator.js +43 -43
  61. package/hydration/ObjectHydrator.d.ts +17 -50
  62. package/hydration/ObjectHydrator.js +416 -481
  63. package/index.d.ts +2 -116
  64. package/index.js +1 -10
  65. package/logging/DefaultLogger.d.ts +32 -34
  66. package/logging/DefaultLogger.js +86 -86
  67. package/logging/Logger.d.ts +41 -41
  68. package/logging/SimpleLogger.d.ts +11 -13
  69. package/logging/SimpleLogger.js +22 -22
  70. package/logging/colors.d.ts +6 -6
  71. package/logging/colors.js +10 -11
  72. package/logging/inspect.js +7 -7
  73. package/metadata/EntitySchema.d.ts +127 -211
  74. package/metadata/EntitySchema.js +398 -397
  75. package/metadata/MetadataDiscovery.d.ts +114 -114
  76. package/metadata/MetadataDiscovery.js +1870 -1951
  77. package/metadata/MetadataProvider.d.ts +21 -24
  78. package/metadata/MetadataProvider.js +84 -82
  79. package/metadata/MetadataStorage.d.ts +32 -38
  80. package/metadata/MetadataStorage.js +118 -118
  81. package/metadata/MetadataValidator.d.ts +39 -39
  82. package/metadata/MetadataValidator.js +338 -381
  83. package/metadata/discover-entities.d.ts +2 -5
  84. package/metadata/discover-entities.js +37 -35
  85. package/metadata/types.d.ts +531 -615
  86. package/naming-strategy/AbstractNamingStrategy.d.ts +39 -54
  87. package/naming-strategy/AbstractNamingStrategy.js +85 -90
  88. package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
  89. package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
  90. package/naming-strategy/MongoNamingStrategy.d.ts +6 -6
  91. package/naming-strategy/MongoNamingStrategy.js +18 -18
  92. package/naming-strategy/NamingStrategy.d.ts +99 -109
  93. package/naming-strategy/UnderscoreNamingStrategy.d.ts +7 -7
  94. package/naming-strategy/UnderscoreNamingStrategy.js +21 -21
  95. package/not-supported.js +4 -7
  96. package/package.json +1 -1
  97. package/platforms/ExceptionConverter.d.ts +1 -1
  98. package/platforms/ExceptionConverter.js +4 -4
  99. package/platforms/Platform.d.ts +301 -310
  100. package/platforms/Platform.js +640 -663
  101. package/serialization/EntitySerializer.d.ts +26 -49
  102. package/serialization/EntitySerializer.js +218 -224
  103. package/serialization/EntityTransformer.d.ts +6 -10
  104. package/serialization/EntityTransformer.js +217 -219
  105. package/serialization/SerializationContext.d.ts +23 -27
  106. package/serialization/SerializationContext.js +105 -105
  107. package/types/ArrayType.d.ts +8 -8
  108. package/types/ArrayType.js +33 -33
  109. package/types/BigIntType.d.ts +10 -17
  110. package/types/BigIntType.js +37 -37
  111. package/types/BlobType.d.ts +3 -3
  112. package/types/BlobType.js +13 -13
  113. package/types/BooleanType.d.ts +4 -4
  114. package/types/BooleanType.js +12 -12
  115. package/types/CharacterType.d.ts +2 -2
  116. package/types/CharacterType.js +6 -6
  117. package/types/DateTimeType.d.ts +5 -5
  118. package/types/DateTimeType.js +15 -15
  119. package/types/DateType.d.ts +5 -5
  120. package/types/DateType.js +15 -15
  121. package/types/DecimalType.d.ts +7 -7
  122. package/types/DecimalType.js +26 -26
  123. package/types/DoubleType.d.ts +3 -3
  124. package/types/DoubleType.js +12 -12
  125. package/types/EnumArrayType.d.ts +5 -5
  126. package/types/EnumArrayType.js +24 -24
  127. package/types/EnumType.d.ts +3 -3
  128. package/types/EnumType.js +11 -11
  129. package/types/FloatType.d.ts +3 -3
  130. package/types/FloatType.js +9 -9
  131. package/types/IntegerType.d.ts +3 -3
  132. package/types/IntegerType.js +9 -9
  133. package/types/IntervalType.d.ts +4 -4
  134. package/types/IntervalType.js +12 -12
  135. package/types/JsonType.d.ts +8 -8
  136. package/types/JsonType.js +32 -32
  137. package/types/MediumIntType.d.ts +1 -1
  138. package/types/MediumIntType.js +3 -3
  139. package/types/SmallIntType.d.ts +3 -3
  140. package/types/SmallIntType.js +9 -9
  141. package/types/StringType.d.ts +4 -4
  142. package/types/StringType.js +12 -12
  143. package/types/TextType.d.ts +3 -3
  144. package/types/TextType.js +9 -9
  145. package/types/TimeType.d.ts +5 -5
  146. package/types/TimeType.js +17 -17
  147. package/types/TinyIntType.d.ts +3 -3
  148. package/types/TinyIntType.js +10 -10
  149. package/types/Type.d.ts +79 -83
  150. package/types/Type.js +82 -82
  151. package/types/Uint8ArrayType.d.ts +4 -4
  152. package/types/Uint8ArrayType.js +21 -21
  153. package/types/UnknownType.d.ts +4 -4
  154. package/types/UnknownType.js +12 -12
  155. package/types/UuidType.d.ts +5 -5
  156. package/types/UuidType.js +19 -19
  157. package/types/index.d.ts +49 -75
  158. package/types/index.js +26 -52
  159. package/typings.d.ts +737 -1250
  160. package/typings.js +231 -244
  161. package/unit-of-work/ChangeSet.d.ts +26 -26
  162. package/unit-of-work/ChangeSet.js +56 -56
  163. package/unit-of-work/ChangeSetComputer.d.ts +12 -12
  164. package/unit-of-work/ChangeSetComputer.js +170 -178
  165. package/unit-of-work/ChangeSetPersister.d.ts +44 -63
  166. package/unit-of-work/ChangeSetPersister.js +421 -442
  167. package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
  168. package/unit-of-work/CommitOrderCalculator.js +88 -89
  169. package/unit-of-work/IdentityMap.d.ts +31 -31
  170. package/unit-of-work/IdentityMap.js +105 -105
  171. package/unit-of-work/UnitOfWork.d.ts +141 -181
  172. package/unit-of-work/UnitOfWork.js +1183 -1200
  173. package/utils/AbstractMigrator.d.ts +91 -111
  174. package/utils/AbstractMigrator.js +275 -275
  175. package/utils/AbstractSchemaGenerator.d.ts +34 -43
  176. package/utils/AbstractSchemaGenerator.js +122 -121
  177. package/utils/AsyncContext.d.ts +3 -3
  178. package/utils/AsyncContext.js +35 -34
  179. package/utils/Configuration.d.ts +808 -852
  180. package/utils/Configuration.js +344 -359
  181. package/utils/Cursor.d.ts +22 -40
  182. package/utils/Cursor.js +127 -135
  183. package/utils/DataloaderUtils.d.ts +43 -58
  184. package/utils/DataloaderUtils.js +198 -203
  185. package/utils/EntityComparator.d.ts +81 -98
  186. package/utils/EntityComparator.js +732 -828
  187. package/utils/NullHighlighter.d.ts +1 -1
  188. package/utils/NullHighlighter.js +3 -3
  189. package/utils/QueryHelper.d.ts +51 -79
  190. package/utils/QueryHelper.js +361 -372
  191. package/utils/RawQueryFragment.d.ts +34 -50
  192. package/utils/RawQueryFragment.js +105 -107
  193. package/utils/RequestContext.d.ts +32 -32
  194. package/utils/RequestContext.js +53 -52
  195. package/utils/TransactionContext.d.ts +16 -16
  196. package/utils/TransactionContext.js +27 -27
  197. package/utils/TransactionManager.d.ts +58 -58
  198. package/utils/TransactionManager.js +197 -199
  199. package/utils/Utils.d.ts +145 -204
  200. package/utils/Utils.js +812 -812
  201. package/utils/clone.js +113 -104
  202. package/utils/env-vars.js +88 -90
  203. package/utils/fs-utils.d.ts +15 -15
  204. package/utils/fs-utils.js +181 -180
  205. package/utils/upsert-utils.d.ts +5 -20
  206. package/utils/upsert-utils.js +116 -114
@@ -1,303 +1,303 @@
1
1
  import { Utils } from './Utils.js';
2
2
  export class AbstractMigrator {
3
- em;
4
- runner;
5
- storage;
6
- generator;
7
- driver;
8
- config;
9
- options;
10
- absolutePath;
11
- initialized = false;
12
- #listeners = new Map();
13
- constructor(em) {
14
- this.em = em;
15
- this.driver = this.em.getDriver();
16
- this.config = this.em.config;
17
- this.options = this.config.get('migrations');
18
- this.initServices();
19
- this.registerDefaultListeners();
20
- }
21
- /**
22
- * @inheritDoc
23
- */
24
- on(eventName, listener) {
25
- if (!this.#listeners.has(eventName)) {
26
- this.#listeners.set(eventName, new Set());
3
+ em;
4
+ runner;
5
+ storage;
6
+ generator;
7
+ driver;
8
+ config;
9
+ options;
10
+ absolutePath;
11
+ initialized = false;
12
+ #listeners = new Map();
13
+ constructor(em) {
14
+ this.em = em;
15
+ this.driver = this.em.getDriver();
16
+ this.config = this.em.config;
17
+ this.options = this.config.get('migrations');
18
+ this.initServices();
19
+ this.registerDefaultListeners();
27
20
  }
28
- this.#listeners.get(eventName).add(listener);
29
- return this;
30
- }
31
- /**
32
- * @inheritDoc
33
- */
34
- off(eventName, listener) {
35
- this.#listeners.get(eventName)?.delete(listener);
36
- return this;
37
- }
38
- /**
39
- * @inheritDoc
40
- */
41
- async getExecuted() {
42
- await this.init();
43
- return this.storage.getExecutedMigrations();
44
- }
45
- /**
46
- * @inheritDoc
47
- */
48
- async getPending() {
49
- await this.init();
50
- const all = await this.discoverMigrations();
51
- const executed = new Set(await this.storage.executed());
52
- return all.filter(m => !executed.has(m.name)).map(m => ({ name: m.name, path: m.path }));
53
- }
54
- /**
55
- * @inheritDoc
56
- */
57
- async up(options) {
58
- return this.runMigrations('up', options);
59
- }
60
- /**
61
- * @inheritDoc
62
- */
63
- async down(options) {
64
- return this.runMigrations('down', options);
65
- }
66
- async init() {
67
- if (this.initialized) {
68
- return;
69
- }
70
- this.initialized = true;
71
- if (!this.options.migrationsList) {
72
- const { fs } = await import('@mikro-orm/core/fs-utils');
73
- this.detectSourceFolder(fs);
74
- /* v8 ignore next */
75
- const key =
76
- this.config.get('preferTs', Utils.detectTypeScriptSupport()) && this.options.pathTs ? 'pathTs' : 'path';
77
- this.absolutePath = fs.absolutePath(this.options[key], this.config.get('baseDir'));
78
- fs.ensureDir(this.absolutePath);
21
+ /**
22
+ * @inheritDoc
23
+ */
24
+ on(eventName, listener) {
25
+ if (!this.#listeners.has(eventName)) {
26
+ this.#listeners.set(eventName, new Set());
27
+ }
28
+ this.#listeners.get(eventName).add(listener);
29
+ return this;
79
30
  }
80
- }
81
- initServices() {
82
- this.runner = this.createRunner();
83
- this.storage = this.createStorage();
84
- if (this.options.generator) {
85
- this.generator = new this.options.generator(this.driver, this.config.getNamingStrategy(), this.options);
86
- } else {
87
- this.generator = this.getDefaultGenerator();
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ off(eventName, listener) {
35
+ this.#listeners.get(eventName)?.delete(listener);
36
+ return this;
88
37
  }
89
- }
90
- resolve(params) {
91
- const createMigrationHandler = async method => {
92
- const { fs } = await import('@mikro-orm/core/fs-utils');
93
- const migration = await fs.dynamicImport(params.path);
94
- const MigrationClass = Object.values(migration).find(
95
- cls => typeof cls === 'function' && typeof cls.constructor === 'function',
96
- );
97
- const instance = new MigrationClass(this.driver, this.config);
98
- await this.runner.run(instance, method);
99
- };
100
- return {
101
- name: this.storage.getMigrationName(params.name),
102
- path: params.path,
103
- up: () => createMigrationHandler('up'),
104
- down: () => createMigrationHandler('down'),
105
- };
106
- }
107
- initialize(MigrationClass, name) {
108
- const instance = new MigrationClass(this.driver, this.config);
109
- return {
110
- name: this.storage.getMigrationName(name),
111
- up: () => this.runner.run(instance, 'up'),
112
- down: () => this.runner.run(instance, 'down'),
113
- };
114
- }
115
- /**
116
- * Checks if `src` folder exists, it so, tries to adjust the migrations and seeders paths automatically to use it.
117
- * If there is a `dist` or `build` folder, it will be used for the JS variant (`path` option), while the `src` folder will be
118
- * used for the TS variant (`pathTs` option).
119
- *
120
- * If the default folder exists (e.g. `/migrations`), the config will respect that, so this auto-detection should not
121
- * break existing projects, only help with the new ones.
122
- */
123
- detectSourceFolder(fs) {
124
- const baseDir = this.config.get('baseDir');
125
- const defaultPath = './migrations';
126
- if (!fs.pathExists(baseDir + '/src')) {
127
- this.options.path ??= defaultPath;
128
- return;
38
+ /**
39
+ * @inheritDoc
40
+ */
41
+ async getExecuted() {
42
+ await this.init();
43
+ return this.storage.getExecutedMigrations();
129
44
  }
130
- const exists = fs.pathExists(`${baseDir}/${defaultPath}`);
131
- const distDir = fs.pathExists(baseDir + '/dist');
132
- const buildDir = fs.pathExists(baseDir + '/build');
133
- // if neither `dist` nor `build` exist, we use the `src` folder as it might be a JS project without building, but with `src` folder
134
- /* v8 ignore next */
135
- const path = distDir ? './dist' : buildDir ? './build' : './src';
136
- // only if the user did not provide any values and if the default path does not exist
137
- if (!this.options.path && !this.options.pathTs && !exists) {
138
- this.options.path = `${path}/migrations`;
139
- this.options.pathTs = './src/migrations';
45
+ /**
46
+ * @inheritDoc
47
+ */
48
+ async getPending() {
49
+ await this.init();
50
+ const all = await this.discoverMigrations();
51
+ const executed = new Set(await this.storage.executed());
52
+ return all.filter(m => !executed.has(m.name)).map(m => ({ name: m.name, path: m.path }));
140
53
  }
141
- }
142
- registerDefaultListeners() {
143
- /* v8 ignore else */
144
- if (!this.options.silent) {
145
- const logger = this.config.getLogger();
146
- this.on('migrating', event => logger.log('migrator', `Processing '${event.name}'`, { enabled: true }));
147
- this.on('migrated', event => logger.log('migrator', `Applied '${event.name}'`, { enabled: true }));
148
- this.on('reverting', event => logger.log('migrator', `Processing '${event.name}'`, { enabled: true }));
149
- this.on('reverted', event => logger.log('migrator', `Reverted '${event.name}'`, { enabled: true }));
54
+ /**
55
+ * @inheritDoc
56
+ */
57
+ async up(options) {
58
+ return this.runMigrations('up', options);
150
59
  }
151
- }
152
- async emit(event, data) {
153
- for (const listener of this.#listeners.get(event) ?? []) {
154
- await listener(data);
60
+ /**
61
+ * @inheritDoc
62
+ */
63
+ async down(options) {
64
+ return this.runMigrations('down', options);
155
65
  }
156
- }
157
- async discoverMigrations() {
158
- if (this.options.migrationsList) {
159
- return this.options.migrationsList.map(migration => {
160
- if (typeof migration === 'function') {
161
- return this.initialize(migration, migration.name);
66
+ async init() {
67
+ if (this.initialized) {
68
+ return;
69
+ }
70
+ this.initialized = true;
71
+ if (!this.options.migrationsList) {
72
+ const { fs } = await import('@mikro-orm/core/fs-utils');
73
+ this.detectSourceFolder(fs);
74
+ /* v8 ignore next */
75
+ const key = this.config.get('preferTs', Utils.detectTypeScriptSupport()) && this.options.pathTs ? 'pathTs' : 'path';
76
+ this.absolutePath = fs.absolutePath(this.options[key], this.config.get('baseDir'));
77
+ fs.ensureDir(this.absolutePath);
162
78
  }
163
- return this.initialize(migration.class, migration.name);
164
- });
165
79
  }
166
- const { fs } = await import('@mikro-orm/core/fs-utils');
167
- const pattern = fs.normalizePath(this.absolutePath, this.options.glob);
168
- const files = fs.glob(pattern).sort();
169
- return files.map(filePath =>
170
- this.resolve({
171
- name: filePath.replace(/\\/g, '/').split('/').pop(),
172
- path: filePath,
173
- }),
174
- );
175
- }
176
- async executeMigrations(method, options = {}) {
177
- const all = await this.discoverMigrations();
178
- const executed = await this.storage.executed();
179
- const executedSet = new Set(executed);
180
- let toRun;
181
- if (method === 'up') {
182
- toRun = this.filterUp(all, executedSet, options);
183
- } else {
184
- toRun = this.filterDown(all, executed, options);
80
+ initServices() {
81
+ this.runner = this.createRunner();
82
+ this.storage = this.createStorage();
83
+ if (this.options.generator) {
84
+ this.generator = new this.options.generator(this.driver, this.config.getNamingStrategy(), this.options);
85
+ }
86
+ else {
87
+ this.generator = this.getDefaultGenerator();
88
+ }
185
89
  }
186
- const result = [];
187
- const eventBefore = method === 'up' ? 'migrating' : 'reverting';
188
- const eventAfter = method === 'up' ? 'migrated' : 'reverted';
189
- for (const migration of toRun) {
190
- const event = { name: migration.name, path: migration.path };
191
- await this.emit(eventBefore, event);
192
- await migration[method]();
193
- if (method === 'up') {
194
- await this.storage.logMigration({ name: migration.name });
195
- } else {
196
- await this.storage.unlogMigration({ name: migration.name });
197
- }
198
- await this.emit(eventAfter, event);
199
- result.push(event);
90
+ resolve(params) {
91
+ const createMigrationHandler = async (method) => {
92
+ const { fs } = await import('@mikro-orm/core/fs-utils');
93
+ const migration = await fs.dynamicImport(params.path);
94
+ const MigrationClass = Object.values(migration).find(cls => typeof cls === 'function' && typeof cls.constructor === 'function');
95
+ const instance = new MigrationClass(this.driver, this.config);
96
+ await this.runner.run(instance, method);
97
+ };
98
+ return {
99
+ name: this.storage.getMigrationName(params.name),
100
+ path: params.path,
101
+ up: () => createMigrationHandler('up'),
102
+ down: () => createMigrationHandler('down'),
103
+ };
200
104
  }
201
- return result;
202
- }
203
- filterUp(all, executed, options) {
204
- let pending = all.filter(m => !executed.has(m.name));
205
- if (options.migrations) {
206
- const set = new Set(options.migrations);
207
- return pending.filter(m => set.has(m.name));
105
+ initialize(MigrationClass, name) {
106
+ const instance = new MigrationClass(this.driver, this.config);
107
+ return {
108
+ name: this.storage.getMigrationName(name),
109
+ up: () => this.runner.run(instance, 'up'),
110
+ down: () => this.runner.run(instance, 'down'),
111
+ };
208
112
  }
209
- if (options.from) {
210
- const idx = all.findIndex(m => m.name === options.from);
211
- if (idx >= 0) {
212
- const names = new Set(all.slice(idx + 1).map(m => m.name));
213
- pending = pending.filter(m => names.has(m.name));
214
- }
113
+ /**
114
+ * Checks if `src` folder exists, it so, tries to adjust the migrations and seeders paths automatically to use it.
115
+ * If there is a `dist` or `build` folder, it will be used for the JS variant (`path` option), while the `src` folder will be
116
+ * used for the TS variant (`pathTs` option).
117
+ *
118
+ * If the default folder exists (e.g. `/migrations`), the config will respect that, so this auto-detection should not
119
+ * break existing projects, only help with the new ones.
120
+ */
121
+ detectSourceFolder(fs) {
122
+ const baseDir = this.config.get('baseDir');
123
+ const defaultPath = './migrations';
124
+ if (!fs.pathExists(baseDir + '/src')) {
125
+ this.options.path ??= defaultPath;
126
+ return;
127
+ }
128
+ const exists = fs.pathExists(`${baseDir}/${defaultPath}`);
129
+ const distDir = fs.pathExists(baseDir + '/dist');
130
+ const buildDir = fs.pathExists(baseDir + '/build');
131
+ // if neither `dist` nor `build` exist, we use the `src` folder as it might be a JS project without building, but with `src` folder
132
+ /* v8 ignore next */
133
+ const path = distDir ? './dist' : buildDir ? './build' : './src';
134
+ // only if the user did not provide any values and if the default path does not exist
135
+ if (!this.options.path && !this.options.pathTs && !exists) {
136
+ this.options.path = `${path}/migrations`;
137
+ this.options.pathTs = './src/migrations';
138
+ }
215
139
  }
216
- if (options.to && typeof options.to === 'string') {
217
- const idx = all.findIndex(m => m.name === options.to);
218
- if (idx >= 0) {
219
- const names = new Set(all.slice(0, idx + 1).map(m => m.name));
220
- pending = pending.filter(m => names.has(m.name));
221
- }
140
+ registerDefaultListeners() {
141
+ /* v8 ignore else */
142
+ if (!this.options.silent) {
143
+ const logger = this.config.getLogger();
144
+ this.on('migrating', event => logger.log('migrator', `Processing '${event.name}'`, { enabled: true }));
145
+ this.on('migrated', event => logger.log('migrator', `Applied '${event.name}'`, { enabled: true }));
146
+ this.on('reverting', event => logger.log('migrator', `Processing '${event.name}'`, { enabled: true }));
147
+ this.on('reverted', event => logger.log('migrator', `Reverted '${event.name}'`, { enabled: true }));
148
+ }
222
149
  }
223
- return pending;
224
- }
225
- filterDown(all, executed, options) {
226
- const migrationMap = new Map(all.map(m => [m.name, m]));
227
- const executedReversed = [...executed].reverse();
228
- if (options.migrations) {
229
- const set = new Set(options.migrations);
230
- return executedReversed
231
- .filter(name => set.has(name))
232
- .map(name => migrationMap.get(name))
233
- .filter(Boolean);
150
+ async emit(event, data) {
151
+ for (const listener of this.#listeners.get(event) ?? []) {
152
+ await listener(data);
153
+ }
234
154
  }
235
- if (options.to === 0) {
236
- return executedReversed.map(name => migrationMap.get(name)).filter(Boolean);
155
+ async discoverMigrations() {
156
+ if (this.options.migrationsList) {
157
+ return this.options.migrationsList.map(migration => {
158
+ if (typeof migration === 'function') {
159
+ return this.initialize(migration, migration.name);
160
+ }
161
+ return this.initialize(migration.class, migration.name);
162
+ });
163
+ }
164
+ const { fs } = await import('@mikro-orm/core/fs-utils');
165
+ const pattern = fs.normalizePath(this.absolutePath, this.options.glob);
166
+ const files = fs.glob(pattern).sort();
167
+ return files.map(filePath => this.resolve({
168
+ name: filePath.replace(/\\/g, '/').split('/').pop(),
169
+ path: filePath,
170
+ }));
237
171
  }
238
- if (options.to) {
239
- const result = [];
240
- for (const name of executedReversed) {
241
- if (name === String(options.to)) {
242
- break;
172
+ async executeMigrations(method, options = {}) {
173
+ const all = await this.discoverMigrations();
174
+ const executed = await this.storage.executed();
175
+ const executedSet = new Set(executed);
176
+ let toRun;
177
+ if (method === 'up') {
178
+ toRun = this.filterUp(all, executedSet, options);
243
179
  }
244
- const m = migrationMap.get(name);
245
- if (m) {
246
- result.push(m);
180
+ else {
181
+ toRun = this.filterDown(all, executed, options);
247
182
  }
248
- }
249
- return result;
250
- }
251
- // Default: revert last 1
252
- if (executedReversed.length > 0) {
253
- const m = migrationMap.get(executedReversed[0]);
254
- return m ? [m] : [];
255
- }
256
- return [];
257
- }
258
- getMigrationFilename(name) {
259
- name = name.replace(/\.[jt]s$/, '');
260
- return /^\d{14}$/.exec(name) ? this.options.fileName(name) : name;
261
- }
262
- prefix(options) {
263
- if (typeof options === 'string' || Array.isArray(options)) {
264
- return { migrations: Utils.asArray(options).map(name => this.getMigrationFilename(name)) };
265
- }
266
- if (!options) {
267
- return {};
183
+ const result = [];
184
+ const eventBefore = method === 'up' ? 'migrating' : 'reverting';
185
+ const eventAfter = method === 'up' ? 'migrated' : 'reverted';
186
+ for (const migration of toRun) {
187
+ const event = { name: migration.name, path: migration.path };
188
+ await this.emit(eventBefore, event);
189
+ await migration[method]();
190
+ if (method === 'up') {
191
+ await this.storage.logMigration({ name: migration.name });
192
+ }
193
+ else {
194
+ await this.storage.unlogMigration({ name: migration.name });
195
+ }
196
+ await this.emit(eventAfter, event);
197
+ result.push(event);
198
+ }
199
+ return result;
268
200
  }
269
- const result = {};
270
- if (options.migrations) {
271
- result.migrations = options.migrations.map(name => this.getMigrationFilename(name));
201
+ filterUp(all, executed, options) {
202
+ let pending = all.filter(m => !executed.has(m.name));
203
+ if (options.migrations) {
204
+ const set = new Set(options.migrations);
205
+ return pending.filter(m => set.has(m.name));
206
+ }
207
+ if (options.from) {
208
+ const idx = all.findIndex(m => m.name === options.from);
209
+ if (idx >= 0) {
210
+ const names = new Set(all.slice(idx + 1).map(m => m.name));
211
+ pending = pending.filter(m => names.has(m.name));
212
+ }
213
+ }
214
+ if (options.to && typeof options.to === 'string') {
215
+ const idx = all.findIndex(m => m.name === options.to);
216
+ if (idx >= 0) {
217
+ const names = new Set(all.slice(0, idx + 1).map(m => m.name));
218
+ pending = pending.filter(m => names.has(m.name));
219
+ }
220
+ }
221
+ return pending;
272
222
  }
273
- if (options.from) {
274
- result.from = this.getMigrationFilename(String(options.from));
223
+ filterDown(all, executed, options) {
224
+ const migrationMap = new Map(all.map(m => [m.name, m]));
225
+ const executedReversed = [...executed].reverse();
226
+ if (options.migrations) {
227
+ const set = new Set(options.migrations);
228
+ return executedReversed
229
+ .filter(name => set.has(name))
230
+ .map(name => migrationMap.get(name))
231
+ .filter(Boolean);
232
+ }
233
+ if (options.to === 0) {
234
+ return executedReversed.map(name => migrationMap.get(name)).filter(Boolean);
235
+ }
236
+ if (options.to) {
237
+ const result = [];
238
+ for (const name of executedReversed) {
239
+ if (name === String(options.to)) {
240
+ break;
241
+ }
242
+ const m = migrationMap.get(name);
243
+ if (m) {
244
+ result.push(m);
245
+ }
246
+ }
247
+ return result;
248
+ }
249
+ // Default: revert last 1
250
+ if (executedReversed.length > 0) {
251
+ const m = migrationMap.get(executedReversed[0]);
252
+ return m ? [m] : [];
253
+ }
254
+ return [];
275
255
  }
276
- if (options.to && options.to !== 0) {
277
- result.to = this.getMigrationFilename(String(options.to));
278
- } else if (options.to === 0) {
279
- result.to = 0;
256
+ getMigrationFilename(name) {
257
+ name = name.replace(/\.[jt]s$/, '');
258
+ return /^\d{14}$/.exec(name) ? this.options.fileName(name) : name;
280
259
  }
281
- return result;
282
- }
283
- async runMigrations(method, options) {
284
- await this.init();
285
- if (!this.options.transactional || !this.options.allOrNothing) {
286
- return this.executeMigrations(method, this.prefix(options));
260
+ prefix(options) {
261
+ if (typeof options === 'string' || Array.isArray(options)) {
262
+ return { migrations: Utils.asArray(options).map(name => this.getMigrationFilename(name)) };
263
+ }
264
+ if (!options) {
265
+ return {};
266
+ }
267
+ const result = {};
268
+ if (options.migrations) {
269
+ result.migrations = options.migrations.map(name => this.getMigrationFilename(name));
270
+ }
271
+ if (options.from) {
272
+ result.from = this.getMigrationFilename(String(options.from));
273
+ }
274
+ if (options.to && options.to !== 0) {
275
+ result.to = this.getMigrationFilename(String(options.to));
276
+ }
277
+ else if (options.to === 0) {
278
+ result.to = 0;
279
+ }
280
+ return result;
287
281
  }
288
- if (Utils.isObject(options) && options.transaction) {
289
- return this.runInTransaction(options.transaction, method, options);
282
+ async runMigrations(method, options) {
283
+ await this.init();
284
+ if (!this.options.transactional || !this.options.allOrNothing) {
285
+ return this.executeMigrations(method, this.prefix(options));
286
+ }
287
+ if (Utils.isObject(options) && options.transaction) {
288
+ return this.runInTransaction(options.transaction, method, options);
289
+ }
290
+ return this.driver.getConnection().transactional(trx => this.runInTransaction(trx, method, options));
290
291
  }
291
- return this.driver.getConnection().transactional(trx => this.runInTransaction(trx, method, options));
292
- }
293
- async runInTransaction(trx, method, options) {
294
- this.runner.setMasterMigration(trx);
295
- this.storage.setMasterMigration(trx);
296
- try {
297
- return await this.executeMigrations(method, this.prefix(options));
298
- } finally {
299
- this.runner.unsetMasterMigration();
300
- this.storage.unsetMasterMigration();
292
+ async runInTransaction(trx, method, options) {
293
+ this.runner.setMasterMigration(trx);
294
+ this.storage.setMasterMigration(trx);
295
+ try {
296
+ return await this.executeMigrations(method, this.prefix(options));
297
+ }
298
+ finally {
299
+ this.runner.unsetMasterMigration();
300
+ this.storage.unsetMasterMigration();
301
+ }
301
302
  }
302
- }
303
303
  }