You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.4 KiB
JavaScript

#!/usr/bin/env node
"use strict";
const Promise = require("bluebird");
const yargs = require("yargs");
const matchValue = require("match-value");
const chalk = require("chalk");
const loadConfiguration = require("../src/load-configuration");
const generateSchema = require("../src/schema-generator");
const renderSchema = require("../src/render-schema");
const processSchemaUpdate = require("../src/process-schema-update");
// FIXME: Update to take timestamps instead of revision numbers (and autocomplete them!)
let argv = yargs
.command("change <description>", "Create a new schema revision", {
description: { describe: "A brief textual description of the purpose of the revision" }
})
.command("upgrade <revision>", "Upgrade the database to a new schema revision", {
revision: { describe: "The number of the revision to upgrade to (or 'latest')" }
})
.command("undo", "Undo the most recent schema revision upgrade")
.command("show <revision>", "Show the full database schema at a given revision", {
revision: { describe: "The number of the revision at which the schema should be shown (or 'latest')" }
})
.argv;
// FIXME: Error/help when no subcommand has been specified
// console.log(argv);
return Promise.try(() => {
return loadConfiguration();
}).then(({ configuration, configurationPath }) => {
let state = { configurationPath, configuration };
// FIXME: Make configurable
const schemaProvider = require("../src/schema-providers/fs")(state);
matchValue(argv._[0], {
change: () => {
return Promise.try(() => {
return schemaProvider.create({ description: argv.description });
}).then(({ statusMessage }) => {
console.log(chalk.green(`${statusMessage}`));
});
},
upgrade: () => {
return Promise.try(() => {
return schemaProvider.getAll();
}).then((schemaUpdates) => {
let processed = schemaUpdates.map((update) => {
return processSchemaUpdate(update);
});
// console.log(require("util").inspect(processed, { colors: true, depth: null }));
});
// TODO: Allow-gap option to permit filling in 'gapped migrations' (eg. after an earlier migration gets merged in via branch merge)
},
undo: () => {
console.log("undo");
},
show: () => {
return Promise.try(() => {
return schemaProvider.getAll();
}).then((schemaUpdates) => {
let schema = generateSchema(schemaUpdates);
console.log(renderSchema(schema));
});
}
});
});