CleverStack/clever-odm

View on GitHub
Gruntfile.js

Summary

Maintainability
B
4 hrs
Test Coverage
var fs         = require( 'fs' )
  , path       = require( 'path' )
  , appRoot    = path.resolve(path.join(__dirname, '..', '..'))
  , utils      = require(path.resolve(path.join(appRoot, 'lib', 'utils')))
  , _          = require( 'underscore' );

module.exports = function( grunt ) {
  var dbTarget        = grunt.option( 'module' ) || null
    , defaultConfig   = require( path.join( __dirname, 'config', 'default.json' ) )
    , configFile      = null
    , config          = {};

  return [{
    prompt: {
      odmConfigPrompt: {
        options: {
          questions: [
            {
              config: 'cleverstackodm.environment',
              type: 'list',
              message: 'What environment is this configuration for?',
              choices: [
                { name: 'LOCAL' },
                { name: 'TEST' },
                { name: 'DEV' },
                { name: 'STAG' },
                { name: 'PROD' }
              ],
              default: function() {
                return process.env.NODE_ENV ? process.env.NODE_ENV.toUpperCase() : 'LOCAL';
              },
              filter: function( env ) {
                _.extend( config, defaultConfig );

                configFile = path.resolve( path.join( __dirname, '..', '..', 'config', env.toLowerCase() + '.json' ) );

                if ( fs.existsSync( configFile ) ) {
                  _.extend( config, require( configFile ) );
                  
                  Object.keys( defaultConfig[ 'clever-odm' ] ).forEach( function( key ) {
                    if ( typeof config[ 'clever-odm' ][ key ] === 'undefined' ) {
                      config[ 'clever-odm' ][ key ] = defaultConfig[ 'clever-odm' ][ key ];
                    }
                  });
                }

                return true;
              }
            },
            {
              config: 'cleverstackodm.uri',
              type: 'input',
              message: 'Mongo URI',
              default: function() {
                return config[ 'clever-odm' ].uri !== '' ? config[ 'clever-odm' ].uri : 'mongodb://localhost/nodeseed';
              }
            },
            {
              config: 'cleverstackodm.mongoose.debug',
              type: 'confirm',
              message: 'Enable debugging',
              default: function() {
                return config[ 'clever-odm' ].mongoose.debug !== '' ? config[ 'clever-odm' ].mongoose.debug : 'mongodb://localhost/nodeseed';
              }
            }
          ]
        }
      }
    },
    exec: {
      odmRebase: {
        cmd: 'node modules/clever-odm/bin/rebase.js ' + dbTarget
      },
      odmSeed: {
        cmd: 'node modules/clever-odm/bin/seedModels.js ' + dbTarget
      }
    }
  }, function( grunt ) {
    grunt.loadNpmTasks( 'grunt-prompt' );

    // Register each command
    grunt.registerTask( 'db:odmRebase', [ 'exec:odmRebase' ] );
    grunt.registerTask( 'db:odmSeed', [ 'exec:odmSeed' ] );
    
    // Register grouped command
    grunt.registerTask( 'db:odm', [ 'db:odmRebase', 'db:odmSeed' ] );

    if (utils.getModulePaths().map(function(module) { return module.split(path.sep);}).indexOf('clever-orm') !== -1) {
      grunt.registerTask( 'db', [ 'db:orm', 'db:odm' ] );
      grunt.registerTask( 'db:rebase', [ 'db:ormRebase', 'db:odmRebase' ] );
      grunt.registerTask( 'db:seed', [ 'db:ormSeed', 'db:odmSeed' ] );
    } else {
      grunt.registerTask( 'db:rebase', [ 'db:odmRebase' ] );
      grunt.registerTask( 'db:seed', [ 'db:odmSeed' ] );
      grunt.registerTask( 'db', [ 'db:odm' ] );
    }

    // Register readme task
    grunt.registerTask( 'readme', 'Displays helpful infodmation', function ( ) {
      console.log( 'Installation instructions:' );
      console.log( '1. In the config file for your desired environment (ie. backend/config/local.json), update the clever-odm object with the details for your database.' );
      console.log( '' );
      console.log( '2. From your project\'s `backend` folder, run `NODE_ENV=local grunt db`.' );
      console.log( 'The database tables for your modules should now be installed and seeded with data!' );
    });

    grunt.registerTask( 'prompt:cleverOdmConfig', [ 'prompt:odmConfigPrompt', 'cleverOdmCreateConfig' ] );
    grunt.registerTask( 'cleverOdmCreateConfig', 'Creates a .json config file for database credentials', function() {
      var conf = grunt.config( 'cleverstackodm' );

      delete conf.environment;

      config[ 'clever-odm' ] = _.extend( config[ 'clever-odm' ], conf );

      fs.writeFileSync( configFile, JSON.stringify( config, null, '    ' ) );
    });
  }];
};