/** * Downgrades the database schema to a target version. * * npm run downgrade -- * * Provider from env: DB_PROVIDER=sqlite (+ SQLITE_PATH) or mssql (MSSQL_*, default). * Runs src/providers//downgrade/_to_.js one step at a time, * each in its own transaction. Not part of the server — the server only upgrades. * Note: starting a server whose code knows a higher version upgrades again. */ import 'dotenv/config'; const [rawTarget] = process.argv.slice(2); const target = Number(rawTarget); if (!rawTarget || !Number.isInteger(target) || target < 1) { console.error('Usage: npm run downgrade -- '); process.exit(1); } const providerName = process.env.DB_PROVIDER || (process.env.SQLITE_PATH ? 'sqlite' : 'mssql'); let provider; if (providerName === 'sqlite' || providerName === 'better-sqlite3') { if (!process.env.SQLITE_PATH) { console.error('SQLITE_PATH is required for DB_PROVIDER=sqlite'); process.exit(1); } const { BetterSqlite3Provider } = await import('../src/providers/sqlite3/index.js'); provider = new BetterSqlite3Provider({ filename: process.env.SQLITE_PATH, fileMustExist: true }); } else if (providerName === 'mssql') { const { MssqlProvider } = await import('../src/providers/mssql/index.js'); provider = new MssqlProvider({ server: process.env.MSSQL_SERVER, database: process.env.MSSQL_DATABASE, user: process.env.MSSQL_USER, password: process.env.MSSQL_PASSWORD, options: { encrypt: false, trustServerCertificate: true }, }); } else { console.error(`Unknown DB_PROVIDER: ${providerName}`); process.exit(1); } try { const before = await provider.getSchemaVersion(); const steps = await provider.downgradeSchema(target); console.log(`Schema ${providerName}: ${before} -> ${target} (${steps} step(s))`); } catch (err) { console.error(`Downgrade failed: ${err.message}`); process.exitCode = 1; } finally { await provider.close(); }