UNPKG

sails-generate-migrate

Version:
198 lines (154 loc) 4.63 kB
'use strict'; /** * Module dependencies */ const util = require('util'); const fs = require('fs'); const path = require('path'); const DBMigrate = require('db-migrate'); const Sails = require('sails').Sails; const commands = [ 'up', 'down', 'create' ]; const adapters = [ {driver: 'sqlite3', regex: /sqlite/i}, {driver: 'mysql', regex: /mysql/i}, {driver: 'pg', regex: /postgre|pg/i}, {driver: 'mongodb', regex: /mongo/i}, ]; /** * sails-generate-migrate * * Usage: * `sails generate migrate` * * @description Generates a migrate * @help See http://links.sailsjs.org/docs/generators */ function maybeMakeDir(dir, done){ fs.stat(dir, (err, stat) =>{ if( !err && stat) return done(); fs.mkdir(dir, done); }); } /** * INVALID_SCOPE_VARIABLE() * * Helper method to put together a nice error about a missing or invalid * scope variable. We should always validate any required scope variables * to avoid inadvertently smashing someone's filesystem. * * @param {String} varname [the name of the missing/invalid scope variable] * @param {String} details [optional - additional details to display on the console] * @param {String} message [optional - override for the default message] * @return {Error} * @api private */ function INVALID_SCOPE_VARIABLE (varname, details, message) { var DEFAULT_MESSAGE = 'Issue encountered in generator "migrate":\n'+ 'Missing required scope variable: `%s`"\n' + 'If you are the author of `sails-generate-migrate`, please resolve this '+ 'issue and publish a new patch release.'; message = (message || DEFAULT_MESSAGE) + (details ? '\n'+details : ''); message = util.inspect(message, varname); return new Error(message); } function getMigrateInstance(config){ if( !config ){ var migrate = DBMigrate.getInstance(true, {env: 'dev',config:{ ['dev'] : {} }}); migrate.internals.argv._ = migrate.internals.argv._.slice(3); return migrate; } var connection; try{ connection = config.connections[config.models.connection]; }catch(e){} if( !connection || !connection.adapter){ sails.log.warn('Connection not supported or missing adapter'); return done(); } let driver = adapters.filter(adapter => adapter.regex.test(connection.adapter)) .reduce((o, n) => n.driver || o, false); if( !driver ){ sails.log.warn('adapter %s not supported for sails-hook-migrate', connection.adapter); return done(); } var migrate = DBMigrate.getInstance(true, { config: { [process.env.NODE_ENV]: Object.assign({ driver: driver, }, connection) } }); migrate.internals.argv._ = migrate.internals.argv._.slice(3); return migrate; } var Migrator = { /** * `before()` is run before executing any of the `targets` * defined below. * * This is where we can validate user input, configure default * scope variables, get extra dependencies, and so on. * * @param {Object} scope * @param {Function} done [callback] */ before: function (scope, done) { if (!scope.args[0]) return done( new Error('Please provide a task') ); //if (!scope.args[1]) //return done( new Error('Please provide a name for this migrate.') ); if (!scope.rootPath) return done( INVALID_SCOPE_VARIABLE('rootPath') ); maybeMakeDir(path.join(scope.rootPath, 'migrations'), err =>{ if( err ) return done(err); // initialize db migrate as module. Environment and connection strings do not matter here var migrate = getMigrateInstance(); let command = scope.args.slice(0, 1)[0].split(':')[0]; if( command === 'create' ) return Migrator[command].call(migrate, scope.args, done); Sails().lift({ hooks: { grunt: false, blueprints: false, cors: false, csrf: false, http: false, i18n: false, request: false, responses: false, policies: false, routes: false, session: false, sockets: false, views: false, pubsub: false }, log: {level: "error"} },function (err, _sails) { if (err) return done(err); var migrate = getMigrateInstance(_sails.config); Migrator[command].call(migrate, scope.args, done); }); }); }, up: function(argv, done){ this.up(done); }, down: function(argv, done){ this.down(done); }, create: function(argv, done){ let model = argv[1]; this.create(model, done); }, }; module.exports = Migrator;