Created
August 31, 2016 08:50
-
-
Save jirikrepl/fd7eadbbf607aa111cbeb770a9cd971c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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