2019-07-24 10:27:47 -04:00

85 lines
2.3 KiB
TypeScript

import * as fs from 'fs';
import * as path from 'path';
import { readWorkspaceConfigPath, updateJsonFile } from '../utils/fileutils';
type Migration = { description: string; run(): void };
type MigrationName = { name: string; migration: Migration };
const allMigrations = fs
.readdirSync(path.join(__dirname, '/../../migrations'))
.filter(f => f.endsWith('.js') && !f.endsWith('.d.js'))
.map(file => ({
migration: require(`../../migrations/${file}`).default,
name: path.parse(file).name
}));
const latestMigration = readLatestMigration();
const migrationsToRun = calculateMigrationsToRun(
allMigrations,
latestMigration
);
if (migrationsToRun.length === 0) {
console.log('No migrations to run');
process.exit(0);
}
printMigrationsNames(latestMigration, migrationsToRun);
runMigrations(migrationsToRun);
updateLatestMigration();
console.log('All migrations run successfully');
function readLatestMigration(): string {
const angularCli = readWorkspaceConfigPath();
return angularCli.project.latestMigration;
}
function calculateMigrationsToRun(
migrations: MigrationName[],
latestMigration: string
) {
const startingWith = latestMigration
? migrations.findIndex(item => item.name === latestMigration) + 1
: 0;
return migrations.slice(startingWith);
}
function printMigrationsNames(
latestMigration: string,
migrations: MigrationName[]
): void {
console.log(
`Nx will run the following migrations (after ${latestMigration}):`
);
migrations.forEach(m => {
console.log(`- ${m.name}`);
});
console.log('---------------------------------------------');
}
function runMigrations(migrations: MigrationName[]): void {
migrations.forEach(m => {
try {
console.log(`Running ${m.name}`);
console.log(m.migration.description);
m.migration.run();
console.log('---------------------------------------------');
} catch (e) {
console.error(`Migration ${m.name} failed`);
console.error(e);
console.error(`Please run 'git checkout .'`);
process.exit(1);
}
});
}
function updateLatestMigration(): void {
// we must reread .angular-cli.json because some of the migrations could have modified it
updateJsonFile('.angular-cli.json', angularCliJson => {
angularCliJson.project.latestMigration =
migrationsToRun[migrationsToRun.length - 1].name;
});
}