collab/postgres/index.ts (43 lines of code) (raw):

import fs from 'fs'; import path from 'path'; import postgres from 'postgres'; const directory = path.join(__dirname, 'migrations'); const fileExtension = '.sql'; const tableAlreadyExistsErrCode = '42P07'; const successMessage = 'Database migration complete'; const errorMessage = 'Error running database migration'; type PostgresError = { code: string; } const sql = postgres({ host: process.env['db.host'] ?? '', port: parseInt(process.env['db.port'] ?? ''), database: process.env['db.database'] ?? '', username: process.env['db.username'] ?? '', password: process.env['db.password'] ?? '', ssl: 'require', }); const migrate = async () => { for (const file of fs.readdirSync(directory) .filter(f => f.endsWith(fileExtension)) .sort()) { await sql.file(`${directory}/${file}`).catch(err => handleError(err)); } }; const handleError = (err: unknown) => { if ((err as PostgresError).code === tableAlreadyExistsErrCode) { return; // ignore 'table already exists' errors } else { console.error(`${errorMessage}: ${String(err)}`); process.exit(1); } } migrate() .then(() => { console.info(successMessage); process.exit(0); }) .catch((errors) => { console.error(`${errorMessage}: ${errors}`); process.exit(1); });