Skip to content

Instantly share code, notes, and snippets.

@byjamaljama
Forked from Dpblandin/Gulpfile.js
Last active August 29, 2015 14:07
Show Gist options
  • Save byjamaljama/f0598b908173b7e31b39 to your computer and use it in GitHub Desktop.
Save byjamaljama/f0598b908173b7e31b39 to your computer and use it in GitHub Desktop.
var gulp = require('gulp');
var sequence = require('run-sequence');
var es = require('event-stream');
var clean = require('gulp-clean');
var htmlReplace = require('gulp-html-replace');
var inject = require('gulp-inject');
var compass = require('gulp-compass');
var minifyCSS = require('gulp-minify-css');
var ngAnnotate = require('gulp-ng-annotate');
var uglify = require('gulp-uglify');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var rename = require('gulp-rename');
var plumber = require('gulp-plumber');
var templateCache = require('gulp-angular-templatecache');
var revall = require('gulp-rev-all');
var notify = require('gulp-notify');
var imagemin = require('gulp-imagemin');
var pngquant = require('imagemin-pngquant');
var browserSync = require('browser-sync');
var naturalSort = require('gulp-natural-sort');
var vendorLibs =
[ 'bower_components/angular-local-storage/angular-local-storage.min.js',
'bower_components/angular-ui-router/release/angular-ui-router.min.js',
'bower_components/angular-ui-select/dist/select.min.js',
'bower_components/angular-sanitize/angular-sanitize.min.js'
]
var angularLib = 'bower_components/angular/angular.min.js';
var viewDir = '../app/views';
var viewFile = viewDir+'/hp.blade.php';
var partialsDir = 'partials';
var imgDir = 'img';
var distDir = 'dist';
var distJsDir = distDir+'/js';
var distCssDir = distDir+'/css';
var angularCdn = 'https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js';
var browserSyncProxy : 'app.dev';
var angularModule : 'exampleApp';
/**
* Returns a blade friendly template for js tags for inject plugin
**/
function bladeJs(filename) {
return '{{ HTML::script("'+filename+'") }}';
}
function bladeFallback(filename) {
return '<script>window.angular || document.write(\'<script src="{{URL::asset(\"'+filename+'\")}}"><\\/script>\')</script>';
}
function bladeCss(filename) {
return '{{ HTML::style("'+filename+'") }}';
}
gulp.task('cleanDist', function() {
return gulp.src(distDir, {read: false})
.pipe(clean())
.pipe(notify({onLast: true, message : 'Dist dir removed. Preparing for build time...' }));
});
gulp.task('templateCache', function () {
return gulp.src(partialsDir+'/**/*.html')
.pipe(templateCache('templates.js', {module: angularModule, root: partialsDir}))
.pipe(gulp.dest('js'))
.pipe(notify({onLast: true, message : 'Template Cache generated from views' }));
});
gulp.task('lintDev', function() {
return gulp.src('js/**/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulp.task('lintDist', function() {
return gulp.src(distDir+'/app.min.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulp.task('compassDist', function() {
return gulp.src('scss/**/*.scss')
.pipe(plumber())
.pipe(compass({
config_file : 'config.rb',
css: 'css',
sass: 'scss'
}))
.pipe(minifyCSS())
.pipe(gulp.dest(distCssDir))
.pipe(notify({onLast: true, message : 'Sass files converted and minified' }));
});
gulp.task('compassDev', function() {
return gulp.src('scss/**/*.scss')
.pipe(plumber())
.pipe(compass({
config_file : 'config.rb',
css: 'css',
sass: 'scss'
}))
.pipe(minifyCSS())
.pipe(gulp.dest('css'))
.pipe(browserSync.reload({stream:true}));
});
gulp.task('imagemin', function() {
return gulp.src(imgDir+'/**/*')
.pipe(imagemin({
progressive : true,
use : [pngquant()]
}))
.pipe(gulp.dest(distDir+'/images'))
.pipe(notify({onLast: true, message : 'Images compressed and saved to: '+distDir+'/images' }));
});
gulp.task('appScripts', function() {
return gulp.src('js/**/*.js')
.pipe(plumber())
.pipe(ngAnnotate())
.pipe(naturalSort())
.pipe(concat('app.js'))
.pipe(rename({suffix : '.min'}))
.pipe(uglify())
.pipe(gulp.dest(distJsDir))
.pipe(notify({onLast: true, message : 'App scripts compiled to: '+distDir }));
});
gulp.task('vendorLibs', function() {
return gulp.src(vendorLibs)
.pipe(plumber())
.pipe(concat('vendors.js'))
.pipe(uglify({compress: false}))
.pipe(gulp.dest(distJsDir))
.pipe(gulp.src(angularLib))
.pipe(gulp.dest(distJsDir))
.pipe(notify({onLast: true, message : 'Vendor libs compiled to: '+distDir }));
});
gulp.task('revision', function() {
return gulp.src([distCssDir+'/*.css', distJsDir+'/*.js'])
.pipe(revall())
.pipe(gulp.dest(distDir))
.pipe(notify({onLast: true, message : 'Files revisioned' }));
});
gulp.task('htmlReplace', function(){
return gulp.src(viewFile)
.pipe(htmlReplace({
'js-angular-cdn' : {
src : angularCdn,
tpl : '{{ HTML::script("%s") }}'
}
}))
.pipe(gulp.dest(distDir))
.pipe(notify({onLast: true, message : 'Rebuilding Blade templates...' }));
});
gulp.task('buildIndex', ['htmlReplace'], function() {
return gulp.src(distDir+'/hp.blade.php')
.pipe(inject(gulp.src(distDir+'/style*.css'),
{
starttag : '<!-- inject:style:{{ext}} -->',
transform : bladeCss
}))
.pipe(inject(gulp.src(distDir+'/angular.min*.js'),
{
starttag : '<!-- inject:angular-fallback:{{ext}} -->',
transform: bladeFallback
}))
.pipe(inject(gulp.src(distDir+'/app*.js'),
{
starttag : '<!-- inject:app:{{ext}} -->',
transform: bladeJs
}))
.pipe(inject(gulp.src(distDir+'/vendors*.js'),
{
starttag : '<!-- inject:vendors:{{ext}} -->',
transform : bladeJs
}))
.pipe(gulp.dest(distDir))
.pipe(notify({onLast: true, message : 'Blade template file rebuilt' }));
});
gulp.task('cleanFinal', function() {
return gulp.src([distJsDir, distCssDir], {read: false})
.pipe(clean())
.pipe(notify({onLast: true, message : 'Final cleaning done.' }));
});
gulp.task('watch', ['browser-sync'], function() {
gulp.watch('js/**/*.js', ['lintDev']);
gulp.watch('scss/**/*.scss', ['compassDev']);
gulp.watch('partials/**/*.html', ['templateCache']);
});
gulp.task('browser-sync', function() {
browserSync({
proxy: browserSyncProxy
});
});
gulp.task('build', function(callback) {
sequence(
'cleanDist',
['templateCache', 'compassDist', 'imagemin' ],
['appScripts', 'vendorLibs'],
'revision',
'buildIndex',
'cleanFinal',
callback
);
});
gulp.task('default', ['build']);
{
"name": "",
"version": "0.0.1",
"description": "",
"main": "gulpfile.js",
"dependencies": {},
"devDependencies": {
"gulp": "~3.6.2",
"gulp-html-replace": "^1.1.0",
"gulp-uglify": "^0.3.0",
"gulp-jshint": "^1.6.1",
"gulp-concat": "^2.2.0",
"gulp-rename": "^1.2.0",
"gulp-compass": "^1.1.9",
"gulp-minify-css": "^0.3.4",
"gulp-ng-annotate": "^0.1.1",
"gulp-plumber": "^0.6.6",
"gulp-angular-templatecache": "^1.1.3",
"gulp-notify": "^1.2.5",
"gulp-clean": "^0.2.4",
"run-sequence": "^0.3.6",
"gulp-rev-all": "^0.2.0",
"event-stream": "^3.1.5",
"gulp-inject": "^0.4.1",
"gulp-imagemin": "^0.5.0",
"imagemin-pngquant": "^0.1.2",
"browser-sync": "^1.5.2",
"gulp-natural-sort": "^0.1.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"postinstall": "bower install",
"prestart": "npm install"
},
"repository": {
"type": "git",
"url": ""
},
"keywords": [
"",
"",
""
],
"author": "David Pascaud-Blandin",
"license": "ISC"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment