#!/usr/bin/env node // vim: set ft=javascript: 'use strict' var program = require('commander') var path = require('path') var minimatch = require('minimatch') var dotenv = require('dotenv') var migrate = require('../') var runMigrations = require('../lib/migrate') var log = require('../lib/log') var registerCompiler = require('../lib/register-compiler') var pkg = require('../package.json') program .version(pkg.version) .usage('[options] ') .option('-c, --chdir ', 'Change the working directory', process.cwd()) .option('-f, --state-file ', 'Set path to state file', '.migrate') .option('-s, --store ', 'Set the migrations store', path.join(__dirname, '..', 'lib', 'file-store')) .option('--migrations-dir ', 'Change the migrations directory name', 'migrations') .option('--matches ', 'A glob pattern to filter migration files', '*') .option('--compiler ', 'Use the given module to compile files') .option('--env [name]', 'Use dotenv to load an environment file') .parse(process.argv) // Change the working dir process.chdir(program.chdir) // Setup environment if (program.env) { var e = dotenv.config({ path: typeof program.env === 'string' ? program.env : '.env' }) if (e && e.error instanceof Error) { throw e.error } } // Load compiler if (program.compiler) { registerCompiler(program.compiler) } // Setup store if (program.store[0] === '.') program.store = path.join(process.cwd(), program.store) var Store = require(program.store) var store = new Store(program.stateFile) // Load in migrations migrate.load({ stateStore: store, migrationsDirectory: program.migrationsDir, filterFunction: minimatch.filter(program.matches) }, function (err, set) { if (err) { log.error('error', err) process.exit(1) } set.on('migration', function (migration, direction) { log(direction, migration.title) }) runMigrations(set, 'down', program.args[0], function (err) { if (err) { log('error', err) process.exit(1) } log('migration', 'complete') process.exit(0) }) })