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