Skip to content

Instantly share code, notes, and snippets.

@jirkadev
Created August 31, 2016 08:50
Show Gist options
  • Save jirkadev/fd7eadbbf607aa111cbeb770a9cd971c to your computer and use it in GitHub Desktop.
Save jirkadev/fd7eadbbf607aa111cbeb770a9cd971c to your computer and use it in GitHub Desktop.

Revisions

  1. jirkadev created this gist Aug 31, 2016.
    263 changes: 263 additions & 0 deletions gulpfile.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,263 @@
    // Gulp with Symfony framework: http://knpuniversity.com/screencast/gulp
    // run "gulp" in development environment
    // run "gulp --production" in production environment

    var gulp = require('gulp'),
    minifyCss = require('gulp-minify-css'),
    less = require('gulp-less'),
    concat = require('gulp-concat'),
    uglify = require('gulp-uglify'),
    ngAnnotate = require('gulp-ng-annotate'),
    sourcemaps = require('gulp-sourcemaps'),
    plumber = require('gulp-plumber'), // http://knpuniversity.com/screencast/gulp/errors-call-the-plumber
    util = require('gulp-util'), // http://knpuniversity.com/screencast/gulp/minify-only-production
    gulpIf = require('gulp-if'),
    rev = require('gulp-rev'),
    browserSync = require('browser-sync'),
    reload = browserSync.reload,
    rename = require("gulp-rename"),
    replace = require('gulp-replace'),
    del = require('del');

    var c = function () {
    var assetDir = 'app/Resources/assets/';
    var lessDir = assetDir + 'less/';
    var fontDir = assetDir + 'fonts/';
    var scriptsDir = assetDir + 'js/';
    var controllers = scriptsDir + 'controllers/';
    var dateControllers = controllers + 'dateCalculators/';
    var financialControllers = controllers + 'financialCalculators/';
    var fitnessControllers = controllers + 'fitnessCalculators/';
    var mathControllers = controllers + 'mathCalculators/';
    var womenControllers = controllers + 'womenCalculators/';
    var physicsControllers = controllers + 'physicsCalculators/';
    var otherControllers = controllers + 'otherCalculators/';
    var serviceDir = scriptsDir + 'services/';
    var directivesDir = scriptsDir + 'directives/';
    var dateService = serviceDir + 'dateService.js';
    var convertService = serviceDir + 'convertService.js';
    var jsTranslator = 'vendor/willdurand/js-translation-bundle/Bazinga/Bundle/JsTranslationBundle/Resources/public/js/translator.min.js';
    var bowerDir = 'vendor/bower_components/';
    var momentJs = [bowerDir + 'moment/moment.js', bowerDir + 'moment/locale/cs.js', bowerDir + 'moment/locale/de.js'];
    var calcViewsDir = 'src/CalcBundle/Resources/views/';
    var manifestFile = 'app/Resources/assets/rev-manifest.json';

    return {
    production: !!util.env.production, // responds to "gulp --production" command
    development: !util.env.production,
    assetDir: assetDir,
    lessDir: lessDir,
    fontDir: fontDir,
    jsAssetsDir: scriptsDir,
    controllers: controllers,
    dateControllers: dateControllers,
    financialControllers: financialControllers,
    fitnessControllers: fitnessControllers,
    mathControllers: mathControllers,
    womenControllers: womenControllers,
    physicsControllers: physicsControllers,
    otherControllers: otherControllers,
    serviceDir: serviceDir,
    directivesDir: directivesDir,
    dateService: dateService,
    convertService: convertService,
    jsTranslator: jsTranslator,
    bowerDir: bowerDir,
    momentJs: momentJs,
    calcViewsDir: calcViewsDir,
    manifestFile: manifestFile
    }
    }();

    var app = {};
    /**
    * In this function I isolate (put in one place) logic for processing less.* -> css.*
    * @param {Array} paths -- array with source paths
    * @param {string} outputFilename -- if defined concat source files into that filename. In undefined do not concat files (for calculator's pages specific style file)
    **/
    app.addStyle = function (paths, outputFilename) {
    var renameFile = rename(function (path) {
    path.basename = 'css/' + path.basename;
    });

    return gulp.src(paths)
    .pipe(plumber())
    .pipe(gulpIf(c.development, sourcemaps.init()))
    .pipe(less())
    .pipe(outputFilename ? concat('css/' + outputFilename) : renameFile)
    .pipe(minifyCss({keepSpecialComments: 0}))
    .pipe(rev())
    .pipe(gulpIf(c.development, sourcemaps.write('.')))
    .pipe(gulp.dest('web/'))
    .pipe(rev.manifest(c.manifestFile, {merge: true}))
    .pipe(gulp.dest('.'));
    };

    /**
    * In this function I isolate (put in one place) logic for processing javascript files.
    * @param {Array} paths -- array with source paths
    * @param {string} outputFilename -- if defined concat source files into that filename. In undefined do not concat files (for calculator's pages specific style file)
    * @param {boolean} doNgAnnotate -- if true, annotate Angular's DI
    **/
    app.addJavaScript = function (paths, outputFilename, doNgAnnotate) {
    var renameFile = rename(function (path) {
    path.basename = 'js/' + path.basename;
    });

    return gulp.src(paths)
    .pipe(gulpIf(c.development, sourcemaps.init()))
    .pipe(outputFilename ? concat('js/' + outputFilename) : renameFile) // https://github.com/gulpjs/gulp-util#noop
    .pipe(doNgAnnotate ? ngAnnotate() : util.noop())
    .pipe(c.production ? uglify() : uglify({mangle: false, compress: false}))
    .pipe(rev())
    .pipe(gulpIf(c.development, sourcemaps.write('.')))
    .pipe(gulp.dest('web/'))
    .pipe(rev.manifest(c.manifestFile, {merge: true}))
    .pipe(gulp.dest('.'));
    };

    gulp.task('clean', function () {
    del(['web/js', 'web/css', c.manifestFile], function (err, paths) {
    console.log('Deleted files/folders:\n', paths.join('\n'));
    });
    });

    // Process with Less separate calculator style files (They won't be concatenated).
    gulp.task('less', ['clean'], function () {
    return app.addStyle([c.lessDir + 'svgShapes.less', c.lessDir + 'onlineCalc.less'], null);
    });
    // Create common 'app.css' production css file. Bootstrap library has be here on first place (others depend on it).
    gulp.task('app.css', ['less'], function () {
    return app.addStyle([c.assetDir + 'bootstrapCustom/css/bootstrap.css', c.fontDir + 'font_awesome_by_icomoon/style.css', c.lessDir + 'sb-admin.less', c.lessDir + 'app.less'], 'app.css');
    });
    gulp.task('app.js', ['app.css'], function () {
    var paths = [c.bowerDir + 'jquery/dist/jquery.js', c.assetDir + 'bootstrapCustom/js/bootstrap.js', c.bowerDir + 'angular/angular.js', c.jsAssetsDir + '*.js'];
    return app.addJavaScript(paths, 'app.js', true);
    });
    gulp.task('contactUs.js', ['app.js'], function () {
    return app.addJavaScript([c.controllers + 'contactUsCtrl.js'], 'contactUs.js', true);
    });
    // DATE CALCULATORS
    gulp.task('age.js', ['contactUs.js'], function () {
    return app.addJavaScript([c.dateControllers + 'ageCtrl.js', c.dateService, c.jsTranslator].concat(c.momentJs), 'age.js', true);
    });
    gulp.task('zodiac.js', ['age.js'], function () {
    return app.addJavaScript([c.dateControllers + 'zodiacCtrl.js', c.dateService, c.jsTranslator].concat(c.momentJs), 'zodiac.js', true);
    });
    // FINANCIAL CALCULATORS
    gulp.task('compoundInterest.js', ['zodiac.js'], function () {
    return app.addJavaScript([c.financialControllers + 'compoundInterestCtrl.js'], 'compoundInterest.js', true);
    });
    gulp.task('currency.js', ['compoundInterest.js'], function () {
    return app.addJavaScript([c.financialControllers + 'currencyCtrl.js'], 'currency.js', true);
    });
    gulp.task('presentValue.js', ['currency.js'], function () {
    return app.addJavaScript([c.financialControllers + 'presentValueCtrl.js'], 'presentValue.js', true);
    });
    gulp.task('tip.js', ['presentValue.js'], function () {
    return app.addJavaScript([c.financialControllers + 'tipCtrl.js'], 'tip.js', true);
    });
    // FITNESS CALCULATORS
    gulp.task('bmi.js', ['tip.js'], function () {
    return app.addJavaScript([c.fitnessControllers + 'bmiCtrl.js', c.convertService], 'bmi.js', true);
    });
    gulp.task('bmr.js', ['bmi.js'], function () {
    return app.addJavaScript([c.fitnessControllers + 'bmrCtrl.js', c.convertService], 'bmr.js', true);
    });
    gulp.task('bodyFat.js', ['bmr.js'], function () {
    return app.addJavaScript([c.fitnessControllers + 'bodyFatCtrl.js', c.convertService], 'bodyFat.js', true);
    });
    gulp.task('idealWeight.js', ['bodyFat.js'], function () {
    return app.addJavaScript([c.fitnessControllers + 'idealWeightCtrl.js', c.convertService], 'idealWeight.js', true);
    });
    // MATH CALCULATORS
    gulp.task('onlineCalc.js', ['idealWeight.js'], function () {
    paths = [c.mathControllers + 'onlineCalcCtrl.js', c.serviceDir + 'highlightNumbersService.js', c.serviceDir + 'parserService.js',
    c.serviceDir + 'parserHelperService.js', c.directivesDir + 'keyboardShortcutsDirective.js',
    c.serviceDir + 'keyboardShortcutsService.js', c.bowerDir + 'underscore/underscore.js'];
    return app.addJavaScript(paths, 'onlineCalc.js', true);
    });
    gulp.task('percentage.js', ['onlineCalc.js'], function () {
    return app.addJavaScript([c.mathControllers + 'percentageCtrl.js', c.convertService], 'percentage.js', true);
    });
    gulp.task('primeNumber.js', ['percentage.js'], function () {
    return app.addJavaScript([c.mathControllers + 'primeNumberCtrl.js', c.jsTranslator], 'primeNumber.js', true);
    });
    gulp.task('circleCircumference.js', ['primeNumber.js'], function () {
    return app.addJavaScript([c.mathControllers + 'shapes/circleCircumferenceCtrl.js'], 'circleCircumference.js', true);
    });
    gulp.task('circleArea.js', ['circleCircumference.js'], function () {
    return app.addJavaScript([c.mathControllers + 'shapes/circleAreaCtrl.js'], 'circleArea.js', true);
    });
    gulp.task('cylinderArea.js', ['circleArea.js'], function () {
    return app.addJavaScript([c.mathControllers + 'shapes/cylinderAreaCtrl.js'], 'cylinderArea.js', true);
    });
    gulp.task('cylinderVolume.js', ['cylinderArea.js'], function () {
    return app.addJavaScript([c.mathControllers + 'shapes/cylinderVolumeCtrl.js'], 'cylinderVolume.js', true);
    });
    // WOMEN CALCULATORS
    gulp.task('ovulation.js', ['cylinderVolume.js'], function () {
    return app.addJavaScript([c.womenControllers + 'ovulationCtrl.js', c.dateService].concat(c.momentJs), 'ovulation.js', true);
    });
    gulp.task('pregnancy.js', ['ovulation.js'], function () {
    return app.addJavaScript([c.womenControllers + 'pregnancyCtrl.js', c.dateService].concat(c.momentJs), 'pregnancy.js', true);
    });
    // PHYSICS CALCULATORS
    gulp.task('averageVelocity.js', ['pregnancy.js'], function () {
    return app.addJavaScript([c.physicsControllers + 'averageVelocityCtrl.js'], 'averageVelocity.js', true);
    });
    // OTHER CALCULATORS
    gulp.task('love.js', ['averageVelocity.js'], function () {
    return app.addJavaScript([c.otherControllers + 'loveCtrl.js'], 'love.js', true);
    });
    gulp.task('death.js', ['love.js'], function () {
    return app.addJavaScript([c.otherControllers + 'deathCtrl.js', c.convertService, c.dateService, c.serviceDir + 'deathCountries.js'].concat(c.momentJs), 'death.js', true);
    });
    gulp.task('pixelDensity.js', ['death.js'], function () {
    return app.addJavaScript([c.otherControllers + 'pixelDensityCtrl.js', c.convertService, c.jsTranslator], 'pixelDensity.js', true);
    });
    gulp.task('averageSpeed.js', ['pixelDensity.js'], function () {
    return app.addJavaScript([c.otherControllers + 'averageSpeedCtrl.js', c.convertService], 'averageSpeed.js', true);
    });

    // replaces "css\\svgShapes.css" -> "css/svgShapes.css"
    gulp.task('manifest-replace', ['averageSpeed.js'], function () {
    gulp.src([c.manifestFile])
    .pipe(replace('\\\\', '/'))
    .pipe(gulp.dest(c.assetDir));
    });

    gulp.task('copy', ['manifest-replace'], function () {
    // Copy fonts.
    gulp.src([c.fontDir + 'stix/fonts/*', c.fontDir + 'font_awesome_by_icomoon/fonts/*', c.fontDir + 'digital-7/*', c.fontDir + 'digital-7-mono/*'])
    .pipe(gulp.dest('web/fonts/'));
    // Copy images
    gulp.src([c.assetDir + 'images/*']).pipe(gulp.dest('web/images/'));
    });

    gulp.task('watch', function () {
    // watch 'less' task for less files
    gulp.watch(c.lessDir + '*.less', ['less']);
    gulp.watch(c.jsAssetsDir + '*.js', ['js']);
    gulp.watch(c.jsAssetsDir + '**/*.js', ['js']);
    gulp.watch(c.calcViewsDir + '**/*.html.twig', ['bs-reload']);
    });

    // Starts browser-sync
    gulp.task('browser-sync', function () {
    browserSync({
    proxy: "localhost/kingsCalcSymfony2.6/web/app_dev.php"
    });
    });

    // Reload all Browsers
    gulp.task('bs-reload', function () {
    browserSync.reload();
    });

    // Default development Task
    //gulp.task('default', ['copy', 'watch', 'browser-sync']);
    gulp.task('default', ['copy']);

    // Production Task used for deployment
    gulp.task('deploy', ['copy']);