Skip to content
Snippets Groups Projects
gulpfile.js 6.3 KiB
Newer Older
pimka's avatar
pimka committed
'use strict';
var minimist = require('minimist');
var fs = require('fs');
var lazypipe = require('lazypipe');
xamgore's avatar
xamgore committed
var babel = require('gulp-babel');
Artem Konenko's avatar
Artem Konenko committed
var apidoc = require('gulp-apidoc');

// command line arguments
var varg = minimist(process.argv.slice(2), {
    string: 'env',
xamgore's avatar
xamgore committed
    default: {env: process.env.NODE_ENV || 'debug'}
    opt: varg.env !== 'debug' || varg.release, // optimize
    inc: !varg.force, // incremental build
    beauty: varg.beauty || varg.rainbow,
    dst: varg.dst
pimka's avatar
pimka committed
var gulp = require('gulp');
var changed = require('gulp-changed');
var through = require('through');
var empty = function () {
    return through(function (data) {
        this.emit('data', data);
    }, function () {
        this.emit('end');
    });
};

// 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');
pimka's avatar
pimka committed
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');
xamgore's avatar
xamgore committed
var prettify = options.beauty ? require('gulp-jsbeautifier') : empty;
xamgore's avatar
xamgore committed
var paths = new (function () {
    self.root = '.';
    var src = '.';
    var dst = options.dst || self.root + '/~dev_rating';

    var app = self.root + '/~dev_rating';
    var media = src + '/media';
    var stat = dst + '/static';

    self.src = {
        css: media + '/css/**/*.css',
        less: media + '/less/**/*.less',
        js: media + '/js/**/*.js',
        config: src + '/deploy/phpConfig/**/*',
        css_components: media + '/components/**/*.css',
        js_components: media + '/components/**/*.js',
        twig_components: media + '/components/**/*.twig'
    };


    self.dst = {
        css: stat + '/css/',
        less: stat + '/css/',
        js: stat + '/js/',
        config: dst + '/application/config/',
        css_components: stat + '/components/',
        js_components: stat + '/components/',
        twig_components: stat + '/components/'
PavelBegunkov's avatar
PavelBegunkov committed

// =============================
PavelBegunkov's avatar
PavelBegunkov committed
// =============================
pimka's avatar
pimka committed

xamgore's avatar
xamgore committed
var pipes = (function () {
    var cssPipe = lazypipe()
        .pipe(prefix, 'last 2 versions', '> 1%', 'ie9')
        //.pipe(rename, {suffix: '.min'})
xamgore's avatar
xamgore committed
        .pipe(options.opt ? minifyCss : prettify);

    var lessPipe = lazypipe()
        .pipe(less)
        .pipe(cssPipe);

    var jsPipe = lazypipe()
xamgore's avatar
xamgore committed
        .pipe(babel, { presets: ['es2015-without-strict'], ignore: /js\/lib/ })
xamgore's avatar
xamgore committed
        .pipe(options.opt ? uglify : prettify);
    var twigPipe = empty;
        js: jsPipe,
        css_components: cssPipe,
        js_components: jsPipe,
        twig_components: twigPipe
xamgore's avatar
xamgore committed
    less: '.less',
    js: '.js',
    'css_components': '.css',
    'js_components': '.js',
    'twig_components': '.twig'
pimka's avatar
pimka committed


// =============================
//          helpers
// =============================

xamgore's avatar
xamgore committed
var constructHandler = function (msg) {
    return function () {
        process.stdout.write('>>> ' + msg + '\n');
    };
xamgore's avatar
xamgore committed
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')
    };
xamgore's avatar
xamgore committed
};
xamgore's avatar
xamgore committed
var constructTask = function (config) {
    var dump = function (e) {
        throw e;
    };
    var errorHandler = config.error || dump;

    var midPipe = config.pipe || empty;

xamgore's avatar
xamgore committed
    var ext = config.ext ? {extension: config.ext} : {};
    var chgPipe = config.changed ?
        lazypipe().pipe(changed, config.dst, ext) :
PavelBegunkov's avatar
PavelBegunkov committed
    return gulp.src(config.src)
        .pipe(chgPipe())
        .pipe(midPipe())
        .on('error', errorHandler)
        .pipe(gulp.dest(config.dst));
xamgore's avatar
xamgore committed
var constructWatch = function (config) {
    gulp.watch(config.src, function (event) {
        constructTask(config);
xamgore's avatar
xamgore committed
};
PavelBegunkov's avatar
PavelBegunkov committed

// =============================
//          rules
// =============================
gulp.task('less:compile', function () {
PavelBegunkov's avatar
PavelBegunkov committed
    return constructTask(getConfig('less'));
xamgore's avatar
xamgore committed
gulp.task('css:copy', function () {
PavelBegunkov's avatar
PavelBegunkov committed
    return constructTask(getConfig('css'));
pimka's avatar
pimka committed
});

xamgore's avatar
xamgore committed
gulp.task('js:copy', function () {
PavelBegunkov's avatar
PavelBegunkov committed
    return constructTask(getConfig('js'));
pimka's avatar
pimka committed
});

xamgore's avatar
xamgore committed
gulp.task('config:copy', function () {
PavelBegunkov's avatar
PavelBegunkov committed
    return constructTask({
        src: paths.src.config,
        dst: paths.dst.config
    });
gulp.task('components:copy', function () {
    constructTask(getConfig('css_components'));
    constructTask(getConfig('twig_components'));
PavelBegunkov's avatar
PavelBegunkov committed
    return constructTask(getConfig('js_components'));
xamgore's avatar
xamgore committed
gulp.task('folders:create', function () {
    var app = paths.root + '/~dev_rating/application';
    var dirs = [
        app + '/logs/',
PavelBegunkov's avatar
PavelBegunkov committed
        app + '/static/',
        app + '/static/components/'
PavelBegunkov's avatar
PavelBegunkov committed
    dirs.forEach(function (dir) {
        try {
            fs.mkdirSync(dir);
        } catch (err) {
            if (err.code !== 'EEXIST') {
                throw err;
            }
        }
pimka's avatar
pimka committed
});


PavelBegunkov's avatar
PavelBegunkov committed
// =============================
//          watch
// =============================

gulp.task('watch', function (event) {
    constructWatch(getConfig('less', event.path));
    constructWatch(getConfig('css', event.path));
    constructWatch(getConfig('js', event.path));
    constructWatch(getConfig('css_components', event.path));
    constructWatch(getConfig('js_components', event.path));
    constructWatch(getConfig('twig_components', event.path));
pimka's avatar
pimka committed


PavelBegunkov's avatar
PavelBegunkov committed
// =============================
//          common tasks
// =============================

gulp.task('config', [
    'config:copy'
]);

gulp.task('default', [
    'less:compile',
    'css:copy',
    'js:copy',
    'components:copy'
PavelBegunkov's avatar
PavelBegunkov committed
]);

gulp.task('install', [
    'folders:create',
    'config',
    'default'
Artem Konenko's avatar
Artem Konenko committed

gulp.task('apidoc', function(done){
    apidoc({
        src: "~dev_rating/application/classes",
        dest: "apidoc/",
        config: "./"
    },done);
});