github.com/fanux/shipyard@v0.0.0-20161009071005-6515ce223235/controller/static/semantic/tasks/watch.js (about) 1 /******************************* 2 Watch Task 3 *******************************/ 4 5 var 6 gulp = require('gulp'), 7 8 // node dependencies 9 console = require('better-console'), 10 fs = require('fs'), 11 12 // gulp dependencies 13 autoprefixer = require('gulp-autoprefixer'), 14 chmod = require('gulp-chmod'), 15 clone = require('gulp-clone'), 16 gulpif = require('gulp-if'), 17 less = require('gulp-less'), 18 minifyCSS = require('gulp-minify-css'), 19 plumber = require('gulp-plumber'), 20 print = require('gulp-print'), 21 rename = require('gulp-rename'), 22 replace = require('gulp-replace'), 23 uglify = require('gulp-uglify'), 24 util = require('gulp-util'), 25 watch = require('gulp-watch'), 26 27 // user config 28 config = require('./config/user'), 29 30 // task config 31 tasks = require('./config/project/tasks'), 32 install = require('./config/project/install'), 33 34 // shorthand 35 globs = config.globs, 36 assets = config.paths.assets, 37 output = config.paths.output, 38 source = config.paths.source, 39 40 banner = tasks.banner, 41 comments = tasks.regExp.comments, 42 log = tasks.log, 43 settings = tasks.settings 44 45 ; 46 47 // add tasks that shouldn't be exposed to end-user 48 require('./collections/internal')(gulp); 49 50 51 // export task 52 module.exports = function(callback) { 53 54 if( !install.isSetup() ) { 55 console.error('Cannot watch files. Run "gulp install" to set-up Semantic'); 56 return; 57 } 58 59 // check for right-to-left language 60 if(config.rtl === true || config.rtl === 'Yes') { 61 gulp.start('watch-rtl'); 62 return; 63 } 64 65 //console.clear(); 66 console.log('Watching source files for changes'); 67 68 /*-------------- 69 Watch CSS 70 ---------------*/ 71 72 gulp 73 .watch([ 74 source.config, 75 source.definitions + '/**/*.less', 76 source.site + '/**/*.{overrides,variables}', 77 source.themes + '/**/*.{overrides,variables}' 78 ], function(file) { 79 80 var 81 lessPath, 82 83 stream, 84 compressedStream, 85 uncompressedStream, 86 87 isDefinition, 88 isPackagedTheme, 89 isSiteTheme, 90 isConfig 91 ; 92 93 // log modified file 94 gulp.src(file.path) 95 .pipe(print(log.modified)) 96 ; 97 98 /*-------------- 99 Find Source 100 ---------------*/ 101 102 // recompile on *.override , *.variable change 103 isConfig = (file.path.indexOf('theme.config') !== -1 || file.path.indexOf('site.variables') !== -1); 104 isPackagedTheme = (file.path.indexOf(source.themes) !== -1); 105 isSiteTheme = (file.path.indexOf(source.site) !== -1); 106 isDefinition = (file.path.indexOf(source.definitions) !== -1); 107 108 if(isConfig) { 109 console.info('Rebuilding all UI'); 110 // impossible to tell which file was updated in theme.config, rebuild all 111 gulp.start('build'); 112 return; 113 } 114 else if(isPackagedTheme) { 115 console.log('Change detected in packaged theme'); 116 lessPath = util.replaceExtension(file.path, '.less'); 117 lessPath = lessPath.replace(tasks.regExp.theme, source.definitions); 118 } 119 else if(isSiteTheme) { 120 console.log('Change detected in site theme'); 121 lessPath = util.replaceExtension(file.path, '.less'); 122 lessPath = lessPath.replace(source.site, source.definitions); 123 } 124 else { 125 console.log('Change detected in definition'); 126 lessPath = file.path; 127 } 128 129 /*-------------- 130 Create CSS 131 ---------------*/ 132 133 if( fs.existsSync(lessPath) ) { 134 135 // unified css stream 136 stream = gulp.src(lessPath) 137 .pipe(plumber()) 138 .pipe(less(settings.less)) 139 .pipe(replace(comments.variables.in, comments.variables.out)) 140 .pipe(replace(comments.license.in, comments.license.out)) 141 .pipe(replace(comments.large.in, comments.large.out)) 142 .pipe(replace(comments.small.in, comments.small.out)) 143 .pipe(replace(comments.tiny.in, comments.tiny.out)) 144 .pipe(autoprefixer(settings.prefix)) 145 .pipe(gulpif(config.hasPermission, chmod(config.permission))) 146 ; 147 148 // use 2 concurrent streams from same pipe 149 uncompressedStream = stream.pipe(clone()); 150 compressedStream = stream.pipe(clone()); 151 152 uncompressedStream 153 .pipe(plumber()) 154 .pipe(replace(assets.source, assets.uncompressed)) 155 .pipe(gulp.dest(output.uncompressed)) 156 .pipe(print(log.created)) 157 .on('end', function() { 158 gulp.start('package uncompressed css'); 159 }) 160 ; 161 162 compressedStream = stream 163 .pipe(plumber()) 164 .pipe(replace(assets.source, assets.compressed)) 165 .pipe(minifyCSS(settings.minify)) 166 .pipe(rename(settings.rename.minCSS)) 167 .pipe(gulp.dest(output.compressed)) 168 .pipe(print(log.created)) 169 .on('end', function() { 170 gulp.start('package compressed css'); 171 }) 172 ; 173 174 } 175 else { 176 console.log('Cannot find UI definition at path', lessPath); 177 } 178 }) 179 ; 180 181 /*-------------- 182 Watch JS 183 ---------------*/ 184 185 gulp 186 .watch([ 187 source.definitions + '/**/*.js' 188 ], function(file) { 189 gulp.src(file.path) 190 .pipe(plumber()) 191 .pipe(replace(comments.license.in, comments.license.out)) 192 .pipe(gulpif(config.hasPermission, chmod(config.permission))) 193 .pipe(gulp.dest(output.uncompressed)) 194 .pipe(print(log.created)) 195 .pipe(uglify(settings.uglify)) 196 .pipe(rename(settings.rename.minJS)) 197 .pipe(gulp.dest(output.compressed)) 198 .pipe(print(log.created)) 199 .on('end', function() { 200 gulp.start('package compressed js'); 201 gulp.start('package uncompressed js'); 202 }) 203 ; 204 }) 205 ; 206 207 /*-------------- 208 Watch Assets 209 ---------------*/ 210 211 // only copy assets that match component names (or their plural) 212 gulp 213 .watch([ 214 source.themes + '/**/assets/**/' + globs.components + '?(s).*' 215 ], function(file) { 216 // copy assets 217 gulp.src(file.path, { base: source.themes }) 218 .pipe(gulpif(config.hasPermission, chmod(config.permission))) 219 .pipe(gulp.dest(output.themes)) 220 .pipe(print(log.created)) 221 ; 222 }) 223 ; 224 225 };