Files
omnivore/packages/db/migrate.ts
2022-02-11 09:24:33 -08:00

89 lines
2.2 KiB
TypeScript
Executable File

/* eslint-disable @typescript-eslint/naming-convention */
import * as dotenv from 'dotenv';
dotenv.config();
import Postgrator from 'postgrator';
import chalk from 'chalk';
const log = (text: string, style: typeof chalk.white = chalk.white): void =>
console.log(`${chalk.cyanBright('>')} ${style(text)}`);
interface DBEnv {
host: string;
port: number;
database: string;
username: string;
password: string;
}
const getEnv = (): DBEnv => {
const {
PG_HOST: host,
PG_PORT: port,
PG_DB: database,
PG_USER: username,
PG_PASSWORD: password,
} = process.env;
if (typeof username !== 'string') {
throw new Error('No PG user passed in env');
}
if (typeof password !== 'string') {
throw new Error('No PG password passed in env');
}
const config = {
host: host || '127.0.0.1',
port: port ? parseInt(port, 10) : 5432,
database: database || 'omnivore',
username,
password,
};
return config;
};
const postgrator = new Postgrator({
migrationDirectory: __dirname + '/migrations',
driver: 'pg',
...getEnv(),
// Schema table name
schemaTable: 'schemaversion',
// Validate migration md5 checksum to ensure the contents of the script have not changed
validateChecksums: true,
});
log('Starting migration manager');
const targetMigration = process.argv[2];
const targetMigrationLabel = targetMigration
? `'${chalk.blue(targetMigration)}'`
: chalk.blue('latest');
log(`Migrating to ${targetMigrationLabel}.\n`);
const logAppliedMigrations = (appliedMigrations: Postgrator.Migration[]): void => {
if (appliedMigrations.length > 0) {
log(`Applied ${chalk.green(appliedMigrations.length.toString())} migrations successfully:`);
for (const migration of appliedMigrations) {
const actionLabel = migration.action === 'do' ? chalk.green('+') : chalk.red('-');
console.log(` ${actionLabel} ${migration.name}`);
}
} else {
log(`No migrations applied.`);
}
};
postgrator
.migrate(targetMigration)
.then(logAppliedMigrations)
.catch(error => {
log(`${chalk.red('Migration failed: ')}${error.message}`, chalk.red);
const { appliedMigrations } = error;
logAppliedMigrations(appliedMigrations);
process.exit(1);
})
.then(() => console.log('\nExiting...'));