slush-y
Version:
A slush generator for Best Practices with AngularJS Fullstack applications.
215 lines (160 loc) • 6.56 kB
JavaScript
(function(){
'use strict';
var $ = require('gulp-load-plugins')({lazy:false});
var _ = require('lodash');
var path = require('path');
var gulp = require('gulp');
var storage = require('gulp-storage')(gulp)
var questions = require('./prompts');
var inquirer = require('inquirer');
var _str = require('../../../src/Utility/strings/index.js');
var fs = require('fs');
var chalk = require('chalk');
/**
* Controller Bound to the Slushy Prototype;
* @return {Function} Callback function for the Controller Task to Call
*/
module.exports = function ( done ) {
var _this = this;
var generator = _this.seq[0];
if(!_this.args[0]){
console.log(chalk.bold.red('**************************************************************************'));
console.log(chalk.bold.red('****** '+chalk.bold.red('Incorrect usage of the sub-generator!!')));
console.log(chalk.bold.red('****** '+chalk.bold.red('Try slush y:'+generator+' <'+generator+'-name>')));
console.log(chalk.bold.red('****** '+chalk.bold.red('Ex: slush y:'+generator+' article')));
console.log(chalk.bold.red('**************************************************************************'));
return done();
}
_this.storage.create('config-y','config-y.json');
// setDefaults();
// generate();
_this.prompts = [];
/////////////////////
var templates = {};
templates.complex = {}
templates.simple = {}
templates.complex.path = path.join(__dirname+'', 'templates', 'options', 'complex');
templates.simple.path = path.join(__dirname+'', 'templates', 'options', 'simple');
templates.complex.all = path.join( templates.complex.path, '**/*' );
templates.simple.all = path.join( templates.simple.path, '**/*' );
var dest = {};
dest.app = path.join(process.cwd(), 'client/app');
dest.modules = path.join(dest.app, 'modules');
var flags = {};
flags.module = _this.util.env.m || _this.util.env.module || [];
flags.providers = _this.util.env.p || _this.util.env.providers || [];
flags.functions = _this.util.env.f || _this.util.env.functions || [];
var prompts = questions();
var filters = {};
filters.providers = [];
filters.functions = [];
filters.module = null;
filters.appName = null;
filters.names = {};
filters.simple = _this.util.env.simple || false;
filters.complex = _this.util.env.complex || false;
var config = _this.storage.get();
var defaults = {};
defaults.functions = ['actionOne', 'actionTwo'];
defaults.providers = [];
var args = _this.args;
/////////////////////
init( function (){
done();
});
/////////////////////
function init(cb){
_this.name = args[0];
_this.names = _str.str().simple(_this.name);
_.forEach( flags, function (flag, key){
if(_.isEmpty(flag)){
_this.prompts.push( prompts[key] )
} else if(_.isString( flag )) {
if(key === 'module'){
filters[key] = flag;
} else {
filters[key] = flag.split(',');
}
}
});
if(filters.complex) filters.type = 'complex';
if(filters.simple) filters.type = 'simple';
/**
* Add the prompt for choosing complex or simple
*/
if(!filters.type){
_this.prompts.push( prompts.type );
}
if(_.size( _this.prompts )){
if(_this.prompts[0].name === 'module'){
_this.prompts[0].choices = findModules();
}
startPrompt( next );
} else {
next({});
}
function next(answers){
filters.moduleNames = _str.str().simple( filters.module || answers.module );
_.assign(filters, config);
_.assign(filters, answers);
filters.names = _this.names;
if(filters.complex) filters.type = 'complex';
if(filters.simple) filters.type = 'simple';
if(_.isEmpty(filters.functions)){
filters.functions = defaults.functions;
}
// console.log(filters.providers)
if(_.isEmpty(filters.providers)){
filters.providers = defaults.providers;
}
if(filters.moduleNames.slug === 'core'){
dest.final = path.join(dest.app, 'core', 'directives', filters.names.camelized);
} else {
dest.final = path.join(dest.modules, filters.moduleNames.slug, 'directives', filters.names.camelized);
}
var directivePath = path.join( 'app/modules', filters.moduleNames.slug, 'directives', filters.names.camelized );
filters.directive_view_path = path.join( directivePath, filters.names.camelized + '.view.html' );
generate()
}
}
function startPrompt(callback){
inquirer
.prompt(_this.prompts, function (chosen){
var finalAnswers = {};
finalAnswers.type = chosen.directiveType;
if(chosen.providers ){finalAnswers.providers = chosen.providers.split(",")}
if(chosen.functions ){finalAnswers.functions = chosen.functions.split(",")}
if(chosen.module){finalAnswers.module = chosen.module}
callback(finalAnswers)
})
}
function generate(){
gulp.src( templates[filters.type].all )
.pipe( $.template( filters ) )
.pipe( $.rename(function (file){
if (file.basename.indexOf('_') == 0) {
file.basename = file.basename.replace('_', _this.names.camelized);
}
}))
.pipe( $.conflict( dest.final ))
.pipe( gulp.dest( dest.final ))
}
function findModules(){
var array = [{value:'core',name:'core'}];
var dirs = fs.readdirSync(dest.modules);
getModules()
return array;
function getModules(){
_.forEach(dirs, function (folder){
var stat = fs.statSync(dest.modules + '/' + folder);
if (stat.isDirectory()) {
array.push({
value: folder,
name: folder
});
}
});
}
}
};
})();