107 lines
2.5 KiB
TypeScript
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);
|
|
});
|