import { Client } from 'pg'; export type Credential = { user: string; database: string; port: number; host: string; password: string; }; const defaultCred: Credential = { database: process.env.TYPEORM_DATABASE!, host: process.env.TYPEORM_HOST!, password: process.env.TYPEORM_PASSWORD!, port: Number(process.env.TYPEORM_PORT!), user: process.env.TYPEORM_USERNAME!, }; export const getClient = async (): Promise => { const client = new Client({ ...defaultCred }); await client.connect(); return client; }; export async function createDatabase(name: string): Promise { const client = await getClient(); const existingDb = await client.query(` SELECT datname FROM pg_catalog.pg_database WHERE lower(datname) = lower('${name}'); `); if (existingDb.rowCount > 0) { throw Error('DB exists'); } await client.query(`CREATE DATABASE "${name}";`); return client; } export async function dropDatabase( client: Client, name: string ): Promise { const existingDb = await client.query(` SELECT datname FROM pg_catalog.pg_database WHERE lower(datname) = lower('${name}'); `); if (existingDb.rowCount === 0) { throw new Error('no database exists'); } await dropConnections(client, name); await client.query(`DROP DATABASE "${name}";`); } export async function dropConnections( client: Client, name: string ): Promise { await client.query(` SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${name}' AND pid <> pg_backend_pid(); `); } export async function teardown(client: Client, name: string): Promise { await dropDatabase(client, name); await client.end(); }