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