Skip to content

Instantly share code, notes, and snippets.

@jirikrepl
Created August 31, 2016 08:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jirikrepl/fd7eadbbf607aa111cbeb770a9cd971c to your computer and use it in GitHub Desktop.
Save jirikrepl/fd7eadbbf607aa111cbeb770a9cd971c to your computer and use it in GitHub Desktop.
// 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']);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment