UNPKG

graphile-migrate

Version:

Opinionated SQL-powered migration tool for PostgreSQL

89 lines (87 loc) 3.62 kB
"use strict"; 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