#!/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 ", "Create a new schema revision", { description: { describe: "A brief textual description of the purpose of the revision" } }) .command("upgrade ", "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 ", "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)); }); } }); });