'use strict'; var minimist = require('minimist'); var fs = require('fs'); var lazypipe = require('lazypipe'); // command line arguments var varg = minimist(process.argv.slice(2), { string: 'env', default: { env: process.env.NODE_ENV || 'debug' } }); var options = { opt: varg.env !== 'debug' || varg.release, inc: !varg.force, beauty: varg.beauty || varg.rainbow, }; // gulp // common var gulp = require('gulp'); var changed = require('gulp-changed'); var empty = require('gulp-empty'); // var plumber = require('gulp-plumber'); // var gulpif = require('gulp-if'); // var rename = require('gulp-rename'); //переименовывание // var watch = require('gulp-watch'); // var filter = require('gulp-filter'); // css/less var less = require('gulp-less'); var prefix = require('gulp-autoprefixer'); //префиксы var minifyCss = require('gulp-minify-css'); //минификация // var concatCss = require('gulp-concat-css'); //конкатенация // js var uglify = require('gulp-uglify'); var prettify = options.beauty? require('gulp-jsbeautifier'): empty; var paths = new (function() { var self = this; self.root = '..'; var app = self.root + '/~dev_rating'; var media = self.root + '/media'; var stat = app + '/static'; self.src = { css: media + '/css/**/*.css', less: media + '/less/**/*.less', js: media + '/js/**/*.js', config: self.root + '/config/*' }; self.dst = { css: stat + '/css/', less: stat + '/css/', js: stat + '/js/', config: app + '/application/config/' }; })(); // ============================= // pipes // ============================= var pipes = (function() { var cssPipe = lazypipe() .pipe(prefix, 'last 2 versions', '> 1%', 'ie9') //.pipe(rename, {suffix: '.min'}) .pipe(options.opt? minifyCss: prettify); var lessPipe = lazypipe() .pipe(less) .pipe(cssPipe); var jsPipe = lazypipe() .pipe(options.opt? uglify: prettify); return { css: cssPipe, less: lessPipe, js: jsPipe } })(); var ext = { css: '.css', less: '.css', js: '.js' }; // ============================= // helpers // ============================= var constructHandler = function(msg) { return function() { process.stdout.write('>>> ' + msg + '\n'); }; }; var getConfig = function(type, src, dst, pipe) { var _src = src || paths.src[type]; var _dst = dst || paths.dst[type]; var _pipe = pipe || pipes[type]; return { src: _src, dst: _dst, pipe: _pipe, changed: options.inc, ext: ext[type], error: constructHandler(type + ' error') }; } var constructTask = function(config) { var dump = function(e) { throw e; }; var errorHandler = config.error || dump; var midPipe = config.pipe || empty; var ext = config.ext? { extension: config.ext }: {}; var chgPipe = config.changed? lazypipe().pipe(changed, config.dst, ext): empty; gulp.src(config.src) .pipe(chgPipe()) .pipe(midPipe()) .on('error', errorHandler) .pipe(gulp.dest(config.dst)); }; var constructWatch = function(config) { gulp.watch(config.src, function(event) { constructTask(config); }); } // ============================= // rules // ============================= gulp.task('less:compile', function () { constructTask(getConfig('less')); }); gulp.task('css:copy', function() { constructTask(getConfig('css')); }); gulp.task('js:copy', function() { constructTask(getConfig('js')); }); gulp.task('config:copy', function() { constructTask({ src: paths.src.config, dst: paths.dst.config }); }); // todo: gulp.task('folders:create', function() { var app = paths.root + '/~dev_rating/application'; var dirs = [ app + '/logs/' ]; fs.mkdir(dirs[0], function() {}); fs.mkdir(dirs[1], function() { fs.mkdir(dirs[2], function() {}); }); }); // ============================= // watch // ============================= gulp.task('watch', function (event) { constructWatch(getConfig('less', event.path)); constructWatch(getConfig('css', event.path)); constructWatch(getConfig('js', event.path)); }); // ============================= // common tasks // ============================= gulp.task('config', [ 'config:copy' ]); gulp.task('default', [ 'less:compile', 'css:copy', 'js:copy', ]); gulp.task('install', [ 'folders:create', 'config', 'default' ]);