var gulp = require ( 'gulp' ) ;
/* CoffeeScript compile deps */
var path = require ( 'path' ) ;
var gutil = require ( 'gulp-util' ) ;
var concat = require ( 'gulp-concat' ) ;
var rename = require ( 'gulp-rename' ) ;
var coffee = require ( 'gulp-coffee' ) ;
var sass = require ( "gulp-sass" ) ;
var cache = require ( 'gulp-cached' ) ;
var remember = require ( 'gulp-remember' ) ;
var plumber = require ( 'gulp-plumber' ) ;
var livereload = require ( 'gulp-livereload' ) ;
var nodemon = require ( "gulp-nodemon" ) ;
var jade = require ( "gulp-jade" ) ;
var net = require ( "net" ) ;
var spy = require ( "through2-spy" ) ;
var webpack = require ( "gulp-webpack" ) ;
var named = require ( "vinyl-named" ) ;
function namedLog ( name ) {
return function gutilLog ( log ) {
gc = gutil . colors ;
items = [ "[- " + gc . magenta ( name ) + " -]" ] ;
for ( i in arguments ) {
items . push ( arguments [ i ] ) ;
}
gutil . log . apply ( null , items ) ;
}
}
tasks = {
coffee : [
{
name : "util" ,
source : [ "templateUtil.coffee" ] ,
base : "." ,
destination : "."
}
] ,
jade : [
{
name : "views" ,
source : [ "./views/client/**/*.jade" ] ,
base : "./views/client" ,
destination : "./public/views"
} , {
name : "elements" ,
source : [ "./src/elements/**/*.jade" ] ,
base : "./src/elements" ,
destination : "./public/elements"
}
] ,
sass : [
{
name : "elements" ,
source : [ "./src/elements/**/*.scss" ] ,
base : "./src/elements" ,
destination : "./public/elements"
}
]
}
function concatName ( type , name ) {
return type + "-" + name ;
}
for ( var type in tasks ) {
var subTasks = tasks [ type ] ;
for ( var i in subTasks ) {
var subTask = subTasks [ i ] ;
( function ( type , subTask ) {
var taskName = concatName ( type , subTask . name ) ;
gulp . task ( taskName , function ( ) {
var processor ;
switch ( type ) {
case "coffee" :
processor = coffee ( { bare : true } ) ;
break ;
case "jade" :
processor = jade ( { locals : require ( "./templateUtil" ) } ) ;
break ;
case "sass" :
processor = sass ( ) ;
break ;
}
return gulp . src ( subTask . source , { base : subTask . base } )
. pipe ( plumber ( ) )
. pipe ( cache ( taskName ) )
. pipe ( processor . on ( 'error' , gutil . log ) )
. pipe ( spy . obj ( namedLog ( taskName ) ) )
. pipe ( remember ( taskName ) )
. pipe ( gulp . dest ( subTask . destination ) ) ;
} ) ;
} ) ( type , subTask ) ;
}
}
gulp . task ( 'webpack' , function ( ) {
return gulp . src ( "./src/coffee/index.coffee" )
. pipe ( webpack ( {
watch : true ,
module : {
loaders : [ { test : /\.coffee$/ , loader : "coffee-loader" } ]
} ,
resolve : { extensions : [ "" , ".web.coffee" , ".web.js" , ".coffee" , ".js" ] }
} ) )
. pipe ( rename ( "bundle.js" ) )
. pipe ( gulp . dest ( "./public/js" ) ) ;
} ) ;
gulp . task ( "webpack-elements" , function ( ) {
return gulp . src ( [ "./src/elements/**/*.coffee" ] , { base : "./src/elements" } )
. pipe ( plumber ( ) )
. pipe ( named ( ) )
. pipe ( webpack ( {
watch : true ,
module : {
loaders : [ { test : /\.coffee$/ , loader : "coffee-loader" } ]
} ,
resolve : { extensions : [ "" , ".web.coffee" , ".web.js" , ".coffee" , ".js" ] }
} ) )
. pipe ( gulp . dest ( "./public/elements" ) ) ;
} ) ;
function checkServerUp ( ) {
setTimeout ( function ( ) {
var sock = new net . Socket ( ) ;
sock . setTimeout ( 50 ) ;
sock . on ( "connect" , function ( ) {
console . log ( "Triggering page reload..." ) ;
livereload . changed ( ) ;
sock . destroy ( ) ;
} )
. on ( "timeout" , checkServerUp )
. on ( "error" , checkServerUp )
. connect ( 3000 ) ;
} , 70 ) ;
}
var startupTasks = [ ] ;
var watchTasks = [ ] ;
for ( var type in tasks ) {
var subTasks = tasks [ type ] ;
for ( var i in subTasks ) {
var subTask = subTasks [ i ] ;
var taskName = concatName ( type , subTask . name ) ;
startupTasks . push ( taskName ) ;
watchTasks . push ( [ subTask , taskName ] ) ;
}
}
gulp . task ( 'watch' , function ( ) {
global . isWatching = true ;
livereload . listen ( ) ;
gulp . watch ( [ './**/*.css' , 'views/**/*.jade' , '!views/client/**/*.jade' , 'package.json' ] ) . on ( 'change' , livereload . changed ) ;
gulp . watch ( [ 'public/views/**/*.html' , 'public/elements/**/*' ] ) . on ( 'change' , function ( ) { livereload . changed ( "*" ) ; } ) ; // We need to explicitly reload everything here; Polymer doesn't do partial reloading
for ( i in watchTasks ) {
task = watchTasks [ i ] ;
gulp . watch ( task [ 0 ] . source , [ task [ 1 ] ] ) ;
}
nodemon ( { script : "./bin/www.coffee" , ext : "coffee" , delay : 500 } ) . on ( "start" , checkServerUp ) ;
} ) ;
startupTasks . push ( "webpack" , "webpack-elements" , "watch" ) ;
gulp . task ( 'default' , startupTasks ) ;