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  };