rspace-online/server/local-first/migration/dry-run.ts

107 lines
2.5 KiB
TypeScript

/**
* Dry-run all migration adapters against the live DB.
* Usage: bun run server/local-first/migration/dry-run.ts
*/
import postgres from 'postgres';
import {
migrateModule,
notesMigration,
workMigration,
calMigration,
voteMigration,
booksMigration,
cartMigration,
providersMigration,
filesMigration,
tripsMigration,
inboxMigration,
splatMigration,
type MigrationResult,
} from './pg-to-automerge';
const DATABASE_URL =
process.env.DATABASE_URL || 'postgres://rspace:REDACTED@rspace-db:5432/rspace';
const sql = postgres(DATABASE_URL, { max: 5, idle_timeout: 10 });
// Wrap postgres.js in a pg-compatible pool.query() interface
const pool = {
async query(text: string, params?: any[]) {
const result = params
? await sql.unsafe(text, params)
: await sql.unsafe(text);
return { rows: Array.from(result) };
},
};
const space = process.argv[2] || 'demo';
const allMigrations = [
notesMigration,
workMigration,
calMigration,
voteMigration,
booksMigration,
cartMigration,
providersMigration,
filesMigration,
tripsMigration,
inboxMigration,
splatMigration,
];
async function main() {
console.log(`\n=== DRY-RUN MIGRATION (space: "${space}") ===\n`);
const results: MigrationResult[] = [];
for (const migration of allMigrations) {
const result = await migrateModule(migration, pool, space, undefined, {
dryRun: true,
});
results.push(result);
console.log('');
}
console.log('\n=== SUMMARY ===\n');
console.log(
`${'Module'.padEnd(12)} ${'Docs'.padStart(5)} ${'Rows'.padStart(6)} ${'Errors'.padStart(7)} ${'Time'.padStart(8)}`
);
console.log('-'.repeat(40));
let totalDocs = 0;
let totalRows = 0;
let totalErrors = 0;
for (const r of results) {
console.log(
`${r.module.padEnd(12)} ${String(r.docsCreated).padStart(5)} ${String(r.rowsMigrated).padStart(6)} ${String(r.errors.length).padStart(7)} ${(r.durationMs + 'ms').padStart(8)}`
);
totalDocs += r.docsCreated;
totalRows += r.rowsMigrated;
totalErrors += r.errors.length;
}
console.log('-'.repeat(40));
console.log(
`${'TOTAL'.padEnd(12)} ${String(totalDocs).padStart(5)} ${String(totalRows).padStart(6)} ${String(totalErrors).padStart(7)}`
);
if (totalErrors > 0) {
console.log('\n=== ERRORS ===\n');
for (const r of results) {
for (const e of r.errors) {
console.error(`[${r.module}] ${e}`);
}
}
}
await sql.end();
}
main().catch((e) => {
console.error('Fatal:', e);
process.exit(1);
});