@mikro-orm/core 7.0.4-dev.8 → 7.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/EntityManager.d.ts +884 -583
- package/EntityManager.js +1922 -1895
- package/MikroORM.d.ts +103 -74
- package/MikroORM.js +178 -179
- package/README.md +1 -1
- package/cache/CacheAdapter.d.ts +36 -36
- package/cache/FileCacheAdapter.d.ts +30 -24
- package/cache/FileCacheAdapter.js +80 -78
- package/cache/GeneratedCacheAdapter.d.ts +18 -20
- package/cache/GeneratedCacheAdapter.js +30 -30
- package/cache/MemoryCacheAdapter.d.ts +18 -20
- package/cache/MemoryCacheAdapter.js +35 -36
- package/cache/NullCacheAdapter.d.ts +16 -16
- package/cache/NullCacheAdapter.js +24 -24
- package/connections/Connection.d.ts +95 -84
- package/connections/Connection.js +165 -168
- package/drivers/DatabaseDriver.d.ts +186 -80
- package/drivers/DatabaseDriver.js +450 -443
- package/drivers/IDatabaseDriver.d.ts +440 -301
- package/entity/BaseEntity.d.ts +120 -83
- package/entity/BaseEntity.js +43 -43
- package/entity/Collection.d.ts +212 -179
- package/entity/Collection.js +727 -721
- package/entity/EntityAssigner.d.ts +88 -77
- package/entity/EntityAssigner.js +231 -230
- package/entity/EntityFactory.d.ts +66 -54
- package/entity/EntityFactory.js +425 -383
- package/entity/EntityHelper.d.ts +34 -22
- package/entity/EntityHelper.js +280 -267
- package/entity/EntityIdentifier.d.ts +4 -4
- package/entity/EntityIdentifier.js +10 -10
- package/entity/EntityLoader.d.ts +98 -72
- package/entity/EntityLoader.js +753 -723
- package/entity/EntityRepository.d.ts +316 -201
- package/entity/EntityRepository.js +213 -213
- package/entity/PolymorphicRef.d.ts +5 -5
- package/entity/PolymorphicRef.js +10 -10
- package/entity/Reference.d.ts +126 -82
- package/entity/Reference.js +278 -274
- package/entity/WrappedEntity.d.ts +115 -72
- package/entity/WrappedEntity.js +168 -166
- package/entity/defineEntity.d.ts +1315 -636
- package/entity/defineEntity.js +527 -518
- package/entity/utils.d.ts +13 -3
- package/entity/utils.js +71 -73
- package/entity/validators.js +43 -43
- package/entity/wrap.js +8 -8
- package/enums.d.ts +258 -253
- package/enums.js +251 -252
- package/errors.d.ts +114 -72
- package/errors.js +350 -253
- package/events/EventManager.d.ts +26 -14
- package/events/EventManager.js +79 -77
- package/events/EventSubscriber.d.ts +29 -29
- package/events/TransactionEventBroadcaster.d.ts +15 -8
- package/events/TransactionEventBroadcaster.js +14 -14
- package/exceptions.d.ts +23 -40
- package/exceptions.js +35 -52
- package/hydration/Hydrator.d.ts +42 -17
- package/hydration/Hydrator.js +43 -43
- package/hydration/ObjectHydrator.d.ts +50 -17
- package/hydration/ObjectHydrator.js +481 -416
- package/index.d.ts +116 -2
- package/index.js +10 -1
- package/logging/DefaultLogger.d.ts +34 -32
- package/logging/DefaultLogger.js +86 -86
- package/logging/Logger.d.ts +41 -41
- package/logging/SimpleLogger.d.ts +13 -11
- package/logging/SimpleLogger.js +22 -22
- package/logging/colors.d.ts +6 -6
- package/logging/colors.js +11 -10
- package/logging/inspect.js +7 -7
- package/metadata/EntitySchema.d.ts +211 -127
- package/metadata/EntitySchema.js +397 -398
- package/metadata/MetadataDiscovery.d.ts +114 -114
- package/metadata/MetadataDiscovery.js +1951 -1863
- package/metadata/MetadataProvider.d.ts +24 -21
- package/metadata/MetadataProvider.js +82 -84
- package/metadata/MetadataStorage.d.ts +38 -32
- package/metadata/MetadataStorage.js +118 -118
- package/metadata/MetadataValidator.d.ts +39 -39
- package/metadata/MetadataValidator.js +381 -338
- package/metadata/discover-entities.d.ts +5 -2
- package/metadata/discover-entities.js +35 -27
- package/metadata/types.d.ts +615 -531
- package/naming-strategy/AbstractNamingStrategy.d.ts +54 -39
- package/naming-strategy/AbstractNamingStrategy.js +90 -85
- package/naming-strategy/EntityCaseNamingStrategy.d.ts +6 -6
- package/naming-strategy/EntityCaseNamingStrategy.js +22 -22
- package/naming-strategy/MongoNamingStrategy.d.ts +6 -6
- package/naming-strategy/MongoNamingStrategy.js +18 -18
- package/naming-strategy/NamingStrategy.d.ts +109 -99
- package/naming-strategy/UnderscoreNamingStrategy.d.ts +7 -7
- package/naming-strategy/UnderscoreNamingStrategy.js +21 -21
- package/not-supported.js +7 -4
- package/package.json +1 -1
- package/platforms/ExceptionConverter.d.ts +1 -1
- package/platforms/ExceptionConverter.js +4 -4
- package/platforms/Platform.d.ts +310 -299
- package/platforms/Platform.js +663 -636
- package/serialization/EntitySerializer.d.ts +49 -26
- package/serialization/EntitySerializer.js +224 -218
- package/serialization/EntityTransformer.d.ts +10 -6
- package/serialization/EntityTransformer.js +219 -217
- package/serialization/SerializationContext.d.ts +27 -23
- package/serialization/SerializationContext.js +105 -105
- package/types/ArrayType.d.ts +8 -8
- package/types/ArrayType.js +33 -33
- package/types/BigIntType.d.ts +17 -10
- package/types/BigIntType.js +37 -37
- package/types/BlobType.d.ts +3 -3
- package/types/BlobType.js +13 -13
- package/types/BooleanType.d.ts +4 -4
- package/types/BooleanType.js +12 -12
- package/types/CharacterType.d.ts +2 -2
- package/types/CharacterType.js +6 -6
- package/types/DateTimeType.d.ts +5 -5
- package/types/DateTimeType.js +15 -15
- package/types/DateType.d.ts +5 -5
- package/types/DateType.js +15 -15
- package/types/DecimalType.d.ts +7 -7
- package/types/DecimalType.js +26 -26
- package/types/DoubleType.d.ts +3 -3
- package/types/DoubleType.js +12 -12
- package/types/EnumArrayType.d.ts +5 -5
- package/types/EnumArrayType.js +24 -24
- package/types/EnumType.d.ts +3 -3
- package/types/EnumType.js +11 -11
- package/types/FloatType.d.ts +3 -3
- package/types/FloatType.js +9 -9
- package/types/IntegerType.d.ts +3 -3
- package/types/IntegerType.js +9 -9
- package/types/IntervalType.d.ts +4 -4
- package/types/IntervalType.js +12 -12
- package/types/JsonType.d.ts +8 -8
- package/types/JsonType.js +32 -32
- package/types/MediumIntType.d.ts +1 -1
- package/types/MediumIntType.js +3 -3
- package/types/SmallIntType.d.ts +3 -3
- package/types/SmallIntType.js +9 -9
- package/types/StringType.d.ts +4 -4
- package/types/StringType.js +12 -12
- package/types/TextType.d.ts +3 -3
- package/types/TextType.js +9 -9
- package/types/TimeType.d.ts +5 -5
- package/types/TimeType.js +17 -17
- package/types/TinyIntType.d.ts +3 -3
- package/types/TinyIntType.js +10 -10
- package/types/Type.d.ts +83 -79
- package/types/Type.js +82 -82
- package/types/Uint8ArrayType.d.ts +4 -4
- package/types/Uint8ArrayType.js +21 -21
- package/types/UnknownType.d.ts +4 -4
- package/types/UnknownType.js +12 -12
- package/types/UuidType.d.ts +5 -5
- package/types/UuidType.js +19 -19
- package/types/index.d.ts +75 -49
- package/types/index.js +52 -26
- package/typings.d.ts +1250 -737
- package/typings.js +244 -231
- package/unit-of-work/ChangeSet.d.ts +26 -26
- package/unit-of-work/ChangeSet.js +56 -56
- package/unit-of-work/ChangeSetComputer.d.ts +12 -12
- package/unit-of-work/ChangeSetComputer.js +178 -170
- package/unit-of-work/ChangeSetPersister.d.ts +63 -44
- package/unit-of-work/ChangeSetPersister.js +442 -421
- package/unit-of-work/CommitOrderCalculator.d.ts +40 -40
- package/unit-of-work/CommitOrderCalculator.js +89 -88
- package/unit-of-work/IdentityMap.d.ts +31 -31
- package/unit-of-work/IdentityMap.js +105 -105
- package/unit-of-work/UnitOfWork.d.ts +181 -141
- package/unit-of-work/UnitOfWork.js +1200 -1183
- package/utils/AbstractMigrator.d.ts +111 -91
- package/utils/AbstractMigrator.js +275 -275
- package/utils/AbstractSchemaGenerator.d.ts +43 -34
- package/utils/AbstractSchemaGenerator.js +121 -122
- package/utils/AsyncContext.d.ts +3 -3
- package/utils/AsyncContext.js +34 -35
- package/utils/Configuration.d.ts +852 -808
- package/utils/Configuration.js +359 -344
- package/utils/Cursor.d.ts +40 -22
- package/utils/Cursor.js +135 -127
- package/utils/DataloaderUtils.d.ts +58 -43
- package/utils/DataloaderUtils.js +203 -198
- package/utils/EntityComparator.d.ts +98 -81
- package/utils/EntityComparator.js +828 -728
- package/utils/NullHighlighter.d.ts +1 -1
- package/utils/NullHighlighter.js +3 -3
- package/utils/QueryHelper.d.ts +79 -51
- package/utils/QueryHelper.js +372 -361
- package/utils/RawQueryFragment.d.ts +50 -34
- package/utils/RawQueryFragment.js +107 -105
- package/utils/RequestContext.d.ts +32 -32
- package/utils/RequestContext.js +52 -53
- package/utils/TransactionContext.d.ts +16 -16
- package/utils/TransactionContext.js +27 -27
- package/utils/TransactionManager.d.ts +58 -58
- package/utils/TransactionManager.js +199 -197
- package/utils/Utils.d.ts +204 -145
- package/utils/Utils.js +812 -810
- package/utils/clone.js +104 -113
- package/utils/env-vars.js +90 -88
- package/utils/fs-utils.d.ts +15 -15
- package/utils/fs-utils.js +180 -181
- package/utils/upsert-utils.d.ts +20 -5
- package/utils/upsert-utils.js +114 -116
|
@@ -1,303 +1,303 @@
|
|
|
1
1
|
import { Utils } from './Utils.js';
|
|
2
2
|
export class AbstractMigrator {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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());
|
|
20
27
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|
|
30
69
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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);
|
|
37
79
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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();
|
|
44
88
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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;
|
|
53
129
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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';
|
|
59
140
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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 }));
|
|
65
150
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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);
|
|
78
|
-
}
|
|
151
|
+
}
|
|
152
|
+
async emit(event, data) {
|
|
153
|
+
for (const listener of this.#listeners.get(event) ?? []) {
|
|
154
|
+
await listener(data);
|
|
79
155
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
else {
|
|
87
|
-
this.generator = this.getDefaultGenerator();
|
|
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);
|
|
88
162
|
}
|
|
163
|
+
return this.initialize(migration.class, migration.name);
|
|
164
|
+
});
|
|
89
165
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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);
|
|
104
185
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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);
|
|
112
200
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
}
|
|
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));
|
|
139
208
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
}
|
|
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
|
+
}
|
|
149
215
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
+
}
|
|
154
222
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
}));
|
|
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);
|
|
171
234
|
}
|
|
172
|
-
|
|
173
|
-
|
|
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);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
toRun = this.filterDown(all, executed, options);
|
|
182
|
-
}
|
|
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;
|
|
235
|
+
if (options.to === 0) {
|
|
236
|
+
return executedReversed.map(name => migrationMap.get(name)).filter(Boolean);
|
|
200
237
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
238
|
+
if (options.to) {
|
|
239
|
+
const result = [];
|
|
240
|
+
for (const name of executedReversed) {
|
|
241
|
+
if (name === String(options.to)) {
|
|
242
|
+
break;
|
|
206
243
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const names = new Set(all.slice(idx + 1).map(m => m.name));
|
|
211
|
-
pending = pending.filter(m => names.has(m.name));
|
|
212
|
-
}
|
|
244
|
+
const m = migrationMap.get(name);
|
|
245
|
+
if (m) {
|
|
246
|
+
result.push(m);
|
|
213
247
|
}
|
|
214
|
-
|
|
215
|
-
|
|
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;
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
222
250
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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 [];
|
|
251
|
+
// Default: revert last 1
|
|
252
|
+
if (executedReversed.length > 0) {
|
|
253
|
+
const m = migrationMap.get(executedReversed[0]);
|
|
254
|
+
return m ? [m] : [];
|
|
255
255
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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)) };
|
|
259
265
|
}
|
|
260
|
-
|
|
261
|
-
|
|
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;
|
|
266
|
+
if (!options) {
|
|
267
|
+
return {};
|
|
281
268
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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));
|
|
269
|
+
const result = {};
|
|
270
|
+
if (options.migrations) {
|
|
271
|
+
result.migrations = options.migrations.map(name => this.getMigrationFilename(name));
|
|
291
272
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
273
|
+
if (options.from) {
|
|
274
|
+
result.from = this.getMigrationFilename(String(options.from));
|
|
275
|
+
}
|
|
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;
|
|
280
|
+
}
|
|
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));
|
|
287
|
+
}
|
|
288
|
+
if (Utils.isObject(options) && options.transaction) {
|
|
289
|
+
return this.runInTransaction(options.transaction, method, options);
|
|
290
|
+
}
|
|
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();
|
|
302
301
|
}
|
|
302
|
+
}
|
|
303
303
|
}
|