import { Command } from "commander"; import { getMigrationFiles, getMigrationHistory, Migration, parseMigration } from "@/migrations/data"; import path from "path"; import { cwd } from "process"; import { readFile } from "fs/promises"; import { triggerMigration } from "@/migrations/apply"; import { migrateOptionsSchema } from "."; export const revert = new Command() .name("revert") .description("Revert the most recently applied infrastructure migration") .option( "-d, --directory ", "Directory for the base infrastructure folder where the component should be added", process.cwd() ) .action(async (options) => { const cmdArgs = migrateOptionsSchema.parse(options); const currentDirectory = process.cwd(); process.chdir(cmdArgs.directory); console.log("Reverting last migration..."); const migrationHistory = await getMigrationHistory(); const migrationFiles = await getMigrationFiles(); if ( migrationFiles.length === 0 || migrationHistory.migrations.length === 0 ) { console.log("No migrations to revert."); return; } const lastMigrationId = migrationHistory.migrations.pop(); const lastMigrationFile = migrationFiles.find((file) => file.includes(lastMigrationId!) ); if (!lastMigrationFile) { console.log("No migrations to revert."); return; } console.log(`Reverting migration ${lastMigrationId}...`); const migrationPath = path.join( cwd(), "infrastructure", "migrations", lastMigrationFile ); const migrationYaml = await readFile(migrationPath, "utf-8"); const lastMigration: Migration = parseMigration(migrationYaml); await triggerMigration(lastMigration, false); console.log(`Migration ${lastMigration.id} reverted.`); process.chdir(currentDirectory); });