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