knex/lib/migrations/migrate/sources/fs-migrations.js
Igor Savin bd1c31a07e
Implement support for custom seed sources (#4842)
Co-authored-by: maximelkin <maxelkin@list.ru>
2021-11-27 02:23:31 +02:00

75 lines
2.1 KiB
JavaScript

const path = require('path');
const sortBy = require('lodash/sortBy');
const { readdir } = require('../../util/fs');
const { AbstractMigrationsLoader } = require('../../common/MigrationsLoader');
class FsMigrations extends AbstractMigrationsLoader {
/**
* Gets the migration names
* @returns Promise<string[]>
*/
getMigrations(loadExtensions) {
// Get a list of files in all specified migration directories
const readMigrationsPromises = this.migrationsPaths.map((configDir) => {
const absoluteDir = path.resolve(process.cwd(), configDir);
return readdir(absoluteDir).then((files) => ({
files,
configDir,
absoluteDir,
}));
});
return Promise.all(readMigrationsPromises).then((allMigrations) => {
const migrations = allMigrations.reduce((acc, migrationDirectory) => {
// When true, files inside the folder should be sorted
if (this.sortDirsSeparately) {
migrationDirectory.files = migrationDirectory.files.sort();
}
migrationDirectory.files.forEach((file) =>
acc.push({ file, directory: migrationDirectory.configDir })
);
return acc;
}, []);
// If true we have already sorted the migrations inside the folders
// return the migrations fully qualified
if (this.sortDirsSeparately) {
return filterMigrations(
this,
migrations,
loadExtensions || this.loadExtensions
);
}
return filterMigrations(
this,
sortBy(migrations, 'file'),
loadExtensions || this.loadExtensions
);
});
}
getMigrationName(migration) {
return migration.file;
}
getMigration(migrationInfo) {
return this.getFile(migrationInfo);
}
}
function filterMigrations(migrationSource, migrations, loadExtensions) {
return migrations.filter((migration) => {
const migrationName = migrationSource.getMigrationName(migration);
const extension = path.extname(migrationName);
return loadExtensions.includes(extension);
});
}
module.exports = {
FsMigrations,
};