slush-gladius
Version:
Slush generator for bleeding edge weapo... ehr, applications!
299 lines (282 loc) • 8.51 kB
JavaScript
/* jshint -W079 */
var
gulp = require('gulp'),
$ = require('gulp-load-plugins')(),
inquirer = require('inquirer'),
del = require('del'),
iniparser = require('iniparser');
var defaults = (function () {
var
homeDir = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE,
workingDirName = process.cwd().split('/').pop().split('\\').pop(),
osUserName = homeDir && homeDir.split('/').pop() || 'root',
configFile = homeDir + '/.gitconfig',
user = {};
if (require('fs').existsSync(configFile)) {
user = iniparser.parseSync(configFile).user;
}
return {
appName: workingDirName,
userName: user.name || osUserName,
authorEmail: user.email || '',
serverPort: 3000,
modules: {
styles: 'Less',
templates: 'Handlebars'
},
source: {
base: 'src/',
styles: 'styles/',
scripts: 'scripts/',
esnextExtension: '.es6.js',
templates: 'views/',
partials: 'partials/'
},
output: {
base: 'public/',
styles: 'css/',
scripts: 'js/'
}
};
})();
var styleFilters = [
'!' + __dirname + '/**/*.less',
'!' + __dirname + '/**/*.sass',
'!' + __dirname + '/**/*.scssCompass',
'!' + __dirname + '/**/*.stylus',
'!' + __dirname + '/**/*.myth',
'!' + __dirname + '/**/*.none'
];
var templatesFilters = [
'!' + __dirname + '/templates/app/handlebars.helpers.js',
'!' + __dirname + '/**/*.handlebars',
'!' + __dirname + '/**/*.jade',
'!' + __dirname + '/**/*.dust',
'!' + __dirname + '/**/*.dot'
];
var filterModuleNames = function(val) {
return val.toLowerCase().replace(/\+(\w)/, function(match, $1) {
return $1.toUpperCase();
});
};
var filterPaths = function(val) {
return val.replace(/(\w)([^\/])$/, '$1$2/');
};
var filterExt = function(val) {
return val.replace(/^([^\.])/, '.$1').replace(/\W+/g, '.');
};
var sourceCustomizationWanted = function(answers) {
return !!answers.sourceCustomization;
};
var outputCustomizationWanted = function(answers) {
return !!answers.outputCustomization;
};
var handleDefaults = function(answers) {
if (!answers.sourceCustomization) {
answers.sourceBase = defaults.source.base;
answers.sourceStyles = defaults.source.styles;
answers.sourceScripts = defaults.source.scripts;
answers.sourceEsnextExt = defaults.source.esnextExtension;
answers.sourcePartials = defaults.source.partials;
answers.sourceTemplates = defaults.source.templates;
}
if (!answers.outputCustomization) {
answers.outputBase = defaults.output.base;
answers.outputStyles = defaults.output.styles;
answers.outputScripts = defaults.output.scripts;
}
answers.sourceEsnextModuleExt = answers.sourceEsnextExt.replace(/\.js$/, '');
return answers;
};
gulp.task('default', function(done) {
inquirer.prompt([{
name: 'name',
message: 'Give your app a name',
default: defaults.appName
}, {
name: 'appVersion',
message: 'What is the version of your project?',
default: '0.1.0'
}, {
name: 'authorName',
message: 'What is the author name?',
}, {
name: 'authorEmail',
message: 'What is the author email?',
default: defaults.authorEmail
}, {
name: 'userName',
message: 'What is the github username?',
default: defaults.userName
}, {
type: 'list',
name: 'stylesPlugin',
message: 'Which CSS preprocessor would you want to use?',
choices: [
'Less',
'Sass',
'SCSS+Compass',
'Stylus',
'Myth',
'None'
],
filter: filterModuleNames,
default: defaults.modules.styles
}, {
type: 'list',
name: 'templatesPlugin',
message: 'Which templating engine would you want to use?',
choices: [
'Handlebars',
'Jade',
'Dust',
'Dot'/*,
'None'*/
],
filter: filterModuleNames,
default: defaults.modules.templates
}, {
type: 'confirm',
name: 'sourceCustomization',
default: false,
message: 'Would you like to customize source files folders?'
}, {
name: 'sourceBase',
message: 'The base folder of your source files:',
when: sourceCustomizationWanted,
filter: filterPaths,
default: defaults.source.base
}, {
name: 'sourceStyles',
message: 'The folder for your stylesheets:',
when: sourceCustomizationWanted,
filter: filterPaths,
default: defaults.source.styles
}, {
name: 'sourceScripts',
message: 'The folder for your scripts:',
when: sourceCustomizationWanted,
filter: filterPaths,
default: defaults.source.scripts
}, {
name: 'sourceEsnextExt',
message: 'The extension of your esnext files:',
when: sourceCustomizationWanted,
filter: filterExt,
default: defaults.source.esnextExtension
}, {
name: 'sourceTemplates',
message: 'The folder for your templates:',
when: sourceCustomizationWanted,
filter: filterPaths,
default: defaults.source.templates
}, {
name: 'sourcePartials',
message: 'The folder for your partials (client side templates):',
when: sourceCustomizationWanted,
filter: filterPaths,
default: defaults.source.partials
}, {
type: 'confirm',
name: 'outputCustomization',
default: false,
message: 'Would you like to customize output folders?'
}, {
name: 'outputBase',
message: 'The base folder of your output files:',
when: outputCustomizationWanted,
filter: filterPaths,
default: defaults.output.base
}, {
name: 'outputStyles',
message: 'The folder for your stylesheets:',
when: outputCustomizationWanted,
filter: filterPaths,
default: defaults.output.styles
}, {
name: 'outputScripts',
message: 'The folder for your scripts:',
when: outputCustomizationWanted,
filter: filterPaths,
default: defaults.output.scripts
}, {
name: 'serverPort',
message: 'Which server port should be used during development?',
default: defaults.serverPort
}, {
type: 'confirm',
name: 'moveon',
message: 'Continue?'
}],
function(answers) {
var dirMap;
if (!answers.moveon) {
return done();
}
answers = handleDefaults(answers);
answers.year = (new Date()).getFullYear();
styleFilters = styleFilters.filter(function(f) {
return !~f.indexOf(answers.stylesPlugin);
}).map(function(f) {
return f.replace('.scssCompass', '.scss').replace('.none', '.css')
.replace('.stylus', '.styl');
});
templatesFilters = templatesFilters.filter(function(f) {
return !~f.indexOf(answers.templatesPlugin);
}).map(function(f) {
return f.replace('.handlebars', '.hbs').replace('.dust', '.html');
});
dirMap = {
'src': answers.sourceBase,
'styles': answers.sourceStyles,
'scripts': answers.sourceScripts,
'partials': answers.sourcePartials,
'views': answers.sourceTemplates
};
gulp.src([
__dirname + '/templates/app/**'
].concat(styleFilters).concat(templatesFilters))
.pipe($.template(answers, {
interpolate: /<%=\s([\s\S]+?)%>/g
}))
.pipe($.rename(function(file) {
if (file.extname === '.es6') {
file.extname = answers.sourceEsnextExt;
}
if (file.extname === '.myth') {
file.extname = '.css';
}
if (file.basename[0] === '_') {
file.basename = '.' + file.basename.slice(1);
}
if (answers.sourceCustomization) {
file.dirname = file.dirname.replace(
/^(src|views)\b|\/(scripts|styles|partials)\b/g,
function(match, $1, $2) {
return dirMap[$1 || $2] || $1 || $2;
});
}
}))
.pipe($.conflict('./'))
.pipe(gulp.dest('./'))
.pipe($.install())
.on('finish', function() {
var
a = answers,
dirs = [
'./' + a.sourceBase + a.sourceScripts + 'vendor/*-runtime.js',
'!./' + a.sourceBase + a.sourceScripts + 'vendor/' + a.templatesPlugin + '-runtime.js'
];
if (a.sourceCustomization) {
a.sourceBase !== 'src/' && dirs.push('./src');
a.sourceScripts !== 'scripts/' && dirs.push('./' + a.sourceBase + 'scripts');
a.sourceStyles !== 'styles/' && dirs.push('./' + a.sourceBase + 'styles');
a.sourceTemplates !== 'views/' && dirs.push('./views');
a.sourcePartials !== 'partials/' && dirs.push('./' + a.sourceTemplates + 'partials');
del(dirs, done);
} else {
del(dirs, done);
}
});
});
});