graphile-migrate
Version:
Opinionated SQL-powered migration tool for PostgreSQL
89 lines (87 loc) • 3.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const pgMinify = require("pg-minify");
const current_1 = require("../current");
const migration_1 = require("../migration");
const pg_1 = require("../pg");
const settings_1 = require("../settings");
const _common_1 = require("./_common");
async function _status(parsedSettings, { skipDatabase }) {
// Checks that don't need a database connection
const currentLocation = await current_1.getCurrentMigrationLocation(parsedSettings);
const body = await current_1.readCurrentMigration(parsedSettings, currentLocation);
const minifiedBody = pgMinify(body);
const hasCurrentMigration = minifiedBody !== "";
// Checks that need a database connection
let remainingMigrations;
if (!skipDatabase) {
const connectionString = parsedSettings.connectionString;
if (!connectionString) {
throw new Error("Could not determine connection string");
}
await pg_1.withClient(connectionString, parsedSettings, async (pgClient) => {
const lastMigration = await migration_1.getLastMigration(pgClient, parsedSettings);
const remainingMigrationDefinitions = await migration_1.getMigrationsAfter(parsedSettings, lastMigration);
remainingMigrations = remainingMigrationDefinitions.map(m => m.filename);
return {
remainingMigrations,
};
});
}
return {
remainingMigrations,
hasCurrentMigration,
};
}
async function status(settings, options = {}) {
const parsedSettings = await settings_1.parseSettings(settings, true);
return _status(parsedSettings, options);
}
exports.status = status;
exports.statusCommand = {
command: "status",
aliases: [],
describe: `\
Exits with a bitmap status code indicating statuses:
- 1 if there are committed migrations that have not been executed yet (requires DB connection)
- 2 if the current migration is non-empty (ignoring comments)
If both of the above are true then the output status will be 3 (1+2). If neither
are true, exit status will be 0 (success). Additional messages may also be output.`,
builder: {
skipDatabase: {
type: "boolean",
description: "Skip checks that require a database connection.",
default: false,
},
},
handler: async (argv) => {
var _a;
/* eslint-disable no-console */
let exitCode = 0;
const { config } = argv, options = tslib_1.__rest(argv, ["config"]);
const details = await status(await _common_1.getSettings({ configFile: config }), options);
if (details.remainingMigrations) {
const remainingCount = (_a = details.remainingMigrations) === null || _a === void 0 ? void 0 : _a.length;
if (remainingCount > 0) {
console.log(`There are ${remainingCount} committed migrations pending:\n\n ${details.remainingMigrations.join("\n ")}`);
exitCode += 1;
}
}
if (details.hasCurrentMigration) {
if (exitCode) {
console.log();
}
console.log("The current migration is not empty and has not been committed.");
exitCode += 2;
}
// ESLint false positive.
// eslint-disable-next-line require-atomic-updates
process.exitCode = exitCode;
if (exitCode === 0) {
console.log("Up to date.");
}
/* eslint-enable */
},
};
//# sourceMappingURL=status.js.map