import { ensureMigrations, getMigrationHistory, OperationType, updateMigrationHistory, type Migration } from "./data"; import operations from "./operations"; const implementedOperations = [ "initResourceGroup", "removeResourceGroup", "configureFramework" ] as const; type ImplementedOperations = (typeof implementedOperations)[number]; export async function isMigrationApplied( migration: Migration ): Promise { const history = await getMigrationHistory(); return history.migrations.includes(migration.id); } export const ensureMigrationNotApplied = async (migration: Migration) => { await ensureMigrations(); const migrationApplied = await isMigrationApplied(migration); if (migrationApplied) { throw `Migration ${migration.id} already applied`; } }; export const triggerMigration = async ( migration: Migration, apply: boolean = true, cmdArgs?: { noScroll?: boolean; } ) => { if (apply) { await ensureMigrationNotApplied(migration); } for (const operation of apply ? migration.up : (migration.down ?? []).reverse()) { if (!operation.options) { throw new Error(`Missing options for ${operation.type} operation`); } await operations[operation.type as ImplementedOperations]({ options: operation.options, cmdArgs }); } await updateMigrationHistory(migration.id, apply); };