CLI Tool to run a command when files in a directory have changed
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

73 lines
2.0 KiB

var colors = require('colors');
var path = require('path');
var spawn = require('child_process').spawn;
var watch = require('watch');
module.exports.tend = function(dir, rawCommand, options) {
options = options || {};
var pattern = options.pattern || '.';
var filter = new RegExp(pattern, 'i');
var ignoreHidden = options.ignoreHidden === true;
var restart = options.restart === true;
var args = rawCommand.split(' ');
var command = args.shift();
var executor = null;
var timeout = null;
var startCommand = function() {
console.log(('Running Command: ' + rawCommand).green);
executor = spawn(command, args);
executor.stdout.on('data', function(chunk) {
console.log(chunk.toString());
});
executor.stderr.on('data', function(chunk) {
console.error(chunk.toString().red);
});
executor.on('error', function(error) {
console.error('Error Running Command'.red);
});
executor.on('close', function(code, signal) {
if (code === 0) {
console.log('Command Exited Successfully'.green);
} else if (signal) {
console.warn(('Command Killed With Signal: ' + signal).yellow);
} else {
console.error(('Command Exited With Status: ' + code).red);
}
executor = null;
});
console.log(('Process ' + executor.pid + ' Started').green);
}.bind(this);
watch.watchTree(dir, function(f, curr, prev) {
if (curr === null && prev === null) {
return;
}
if (ignoreHidden) {
var basename = path.basename(f);
if (basename.indexOf('.') === 0) {
return;
}
}
if (!filter.test(f)) {
return;
}
if (executor && restart) {
console.warn(('Killing Process: ' + executor.pid).yellow);
executor.on('close', function(code, signal) {
startCommand();
});
executor.kill();
return;
} else if (executor) {
console.warn(('Process ' + executor.pid + ' Still Running').yellow);
return;
}
clearTimeout(timeout);
timeout = setTimeout(startCommand, 300);
});
};