UNPKG

@luminati-io/jake

Version:

JavaScript build tool, similar to Make or Rake

100 lines (84 loc) 2.67 kB
var fs = require('fs') , FileList = require('filelist').FileList; var THROTTLE = 5000; /** @name WatchTask @constructor @description Watches specified files for changes, and runs a set of tasks each time there's a change @param {String} [name] Name of the WatchTask -- defaults to 'watch' if not specified @param {Array} taskNames The list of tasks to run with each change @param {Function} definition Function to set up the WatchTask -- invoked on `this` after the initial construction */ var WatchTask = function () { var self = this , args = Array.prototype.slice.call(arguments) , arg , definition , taskNames , name , last = (new Date()).getTime() - THROTTLE; args = args.filter(function (a) { return !!a; }); while ((arg = args.shift())) { if (typeof arg == 'string') { name = arg; } else if (typeof arg == 'object' && Array.isArray(arg)) { taskNames = arg; } else if (typeof arg == 'function') { definition = arg; } } if (!(taskNames && taskNames.length)) { throw new Error('Watch task needs some tasks to run'); } name = name || 'watch'; definition = definition || function () {}; if (jake.Task[name]) { throw new Error('WatchTask named "' + name + '" already exists. ' + 'Please use a different name.'); } this.watchTasks = Array.isArray(taskNames) ? taskNames : [taskNames]; this.watchFiles = new FileList(); this.rootTask = task('watchTasks', this.watchTasks); this.throttle = THROTTLE; this.watchFiles.include(WatchTask.DEFAULT_INCLUDE_FILES); this.watchFiles.exclude(WatchTask.DEFAULT_EXCLUDE_FILES); if (typeof definition == 'function') { definition.call(this); } desc('Runs these tasks: ' + this.watchTasks.join(', ')); task(name, function () { console.log('WatchTask started for: ' + self.watchTasks.join(', ')); jake.watch('.', {includePattern: /.+/}, function (filePath) { var fileMatch = self.watchFiles.toArray().some(function (item) { return item == filePath; }); if (fileMatch && ((new Date()).getTime() - last) > self.throttle) { last = (new Date()).getTime(); self.rootTask.reenable(true); self.rootTask.invoke(); } }); }); }; WatchTask.DEFAULT_INCLUDE_FILES = [ './**/*.js' , './**/*.coffee' , './**/*.css' , './**/*.less' , './**/*.scss' ]; WatchTask.DEFAULT_EXCLUDE_FILES = []; if (fs.existsSync('node_modules')) { WatchTask.DEFAULT_EXCLUDE_FILES.push('node_modules/**'); } if (fs.existsSync('.git')) { WatchTask.DEFAULT_EXCLUDE_FILES.push('.git/**'); } exports.WatchTask = WatchTask;