@launchql/migrate
Version:
PostgreSQL Migration Tools
90 lines (82 loc) • 2.93 kB
JavaScript
import fs from 'fs';
import path from 'path';
export const writeSqitchFiles = (rows, opts) => {
rows.forEach((row) => writeVerify(row, opts));
rows.forEach((row) => writeRevert(row, opts));
rows.forEach((row) => writeDeploy(row, opts));
};
const ordered = (arr) => {
if (!arr)
return [];
return arr.sort((a, b) => a.length - b.length || a.localeCompare(b));
};
const writeDeploy = (row, opts) => {
const deploy = opts.replacer(row.deploy);
const dir = path.dirname(deploy);
const prefix = path.join(opts.outdir, opts.name, 'deploy');
const actualDir = path.resolve(prefix, dir);
const actualFile = path.resolve(prefix, `${deploy}.sql`);
fs.mkdirSync(actualDir, { recursive: true });
const content = `-- Deploy: ${deploy} to pg
-- made with <3 @ launchql.com
${opts.replacer(ordered(row?.deps)
.map((dep) => `-- requires: ${dep}`)
.join('\n') || '')}
BEGIN;
${opts.replacer(row.content)}
COMMIT;
`;
fs.writeFileSync(actualFile, content);
};
const writeVerify = (row, opts) => {
const deploy = opts.replacer(row.deploy);
const dir = path.dirname(deploy);
const prefix = path.join(opts.outdir, opts.name, 'verify');
const actualDir = path.resolve(prefix, dir);
const actualFile = path.resolve(prefix, `${deploy}.sql`);
fs.mkdirSync(actualDir, { recursive: true });
const content = opts.replacer(`-- Verify: ${deploy} on pg
BEGIN;
${opts.replacer(row.verify)}
COMMIT;
`);
fs.writeFileSync(actualFile, content);
};
const writeRevert = (row, opts) => {
const deploy = opts.replacer(row.deploy);
const dir = path.dirname(deploy);
const prefix = path.join(opts.outdir, opts.name, 'revert');
const actualDir = path.resolve(prefix, dir);
const actualFile = path.resolve(prefix, `${deploy}.sql`);
fs.mkdirSync(actualDir, { recursive: true });
const content = `-- Revert: ${deploy} from pg
BEGIN;
${opts.replacer(row.revert)}
COMMIT;
`;
fs.writeFileSync(actualFile, content);
};
export const writeSqitchPlan = (rows, opts) => {
const dir = path.resolve(path.join(opts.outdir, opts.name));
fs.mkdirSync(dir, { recursive: true });
const date = () => '2017-08-11T08:11:51Z'; // stubbed timestamp
const duplicates = {};
const plan = opts.replacer(`%syntax-version=1.0.0
%project=launchql-extension-name
%uri=launchql-extension-name
${rows
.map((row) => {
if (duplicates[row.deploy]) {
console.log('DUPLICATE ' + row.deploy);
return '';
}
duplicates[row.deploy] = true;
if (row.deps?.length) {
return `${row.deploy} [${row.deps.join(' ')}] ${date()} launchql <launchql@5b0c196eeb62> # add ${row.name}`;
}
return `${row.deploy} ${date()} launchql <launchql@5b0c196eeb62> # add ${row.name}`;
})
.join('\n')}
`);
fs.writeFileSync(path.join(dir, 'sqitch.plan'), plan);
};