diff --git a/cli.js b/cli.js index c776bb699..2189b23af 100755 --- a/cli.js +++ b/cli.js @@ -24,6 +24,7 @@ var meow = require('meow'); var Promise = require('bluebird'); var pkgConf = require('pkg-conf'); var isCi = require('is-ci'); +var chokidar = require('chokidar'); var colors = require('./lib/colors'); var verboseReporter = require('./lib/reporters/verbose'); var miniReporter = require('./lib/reporters/mini'); @@ -48,6 +49,7 @@ var cli = meow([ ' --tap, -t Generate TAP output', ' --verbose, -v Enable verbose output', ' --no-cache Disable the transpiler cache', + ' --watch, -w Run tests when files change', '', 'Examples', ' ava', @@ -68,14 +70,16 @@ var cli = meow([ 'fail-fast', 'verbose', 'serial', - 'tap' + 'tap', + 'watch' ], default: conf, alias: { t: 'tap', v: 'verbose', r: 'require', - s: 'serial' + s: 'serial', + w: 'watch' } }); @@ -95,6 +99,7 @@ var api = new Api(cli.input.length ? cli.input : arrify(conf.files), { var logger = new Logger(); logger.api = api; +logger.watch = cli.flags.watch; if (cli.flags.tap) { logger.use(tapReporter()); @@ -112,17 +117,32 @@ api.on('error', logger.unhandledError); api.on('stdout', logger.stdout); api.on('stderr', logger.stderr); -api.run() - .then(function () { - logger.finish(); - logger.exit(api.failCount > 0 || api.rejectionCount > 0 || api.exceptionCount > 0 ? 1 : 0); - }) - .catch(function (err) { - if (err.name === 'AvaError') { - console.log(' ' + colors.error(figures.cross) + ' ' + err.message); - } else { - console.error(colors.stack(err.stack)); - } - - logger.exit(1); +function run() { + api.run() + .then(function () { + logger.finish(); + logger.exit(api.failCount > 0 || api.rejectionCount > 0 || api.exceptionCount > 0 ? 1 : 0); + }) + .catch(function (err) { + if (err.name === 'AvaError') { + console.log(' ' + colors.error(figures.cross) + ' ' + err.message); + } else { + console.error(colors.stack(err.stack)); + } + + logger.exit(1); }); +} + +run(); + +var cwd = process.cwd(); +var watcher = chokidar.watch(cwd, { + persistent: cli.flags.watch, + ignored: [cwd + '/node_modules', cwd + '/.git'], + followSymlinks: false +}); + +watcher.on('change', function (filepath) { + run(); +}); diff --git a/lib/logger.js b/lib/logger.js index 930c95d0a..b98d7af96 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -75,6 +75,10 @@ Logger.prototype.exit = function (code) { process.stdout.write(''); process.stderr.write(''); + if (this.watch) { + return; + } + // timeout required to correctly flush IO on Node.js 0.10 on Windows setTimeout(function () { process.exit(code); diff --git a/package.json b/package.json index 17d3a87f0..a567b8601 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "bluebird": "^3.0.0", "caching-transform": "^1.0.0", "chalk": "^1.0.0", + "chokidar": "^1.4.2", "cli-cursor": "^1.0.2", "co-with-promise": "^4.6.0", "commondir": "^1.0.1",