UNPKG

3.85 kBJavaScriptView Raw
1#!/usr/bin/env node
2'use strict';
3
4var debug = require('debug')('ava');
5
6// Prefer the local installation of AVA.
7var resolveCwd = require('resolve-cwd');
8var localCLI = resolveCwd('ava/cli');
9
10if (localCLI && localCLI !== __filename) {
11 debug('Using local install of AVA');
12 require(localCLI);
13 return;
14}
15
16if (debug.enabled) {
17 require('time-require');
18}
19
20var updateNotifier = require('update-notifier');
21var figures = require('figures');
22var arrify = require('arrify');
23var meow = require('meow');
24var Promise = require('bluebird');
25var pkgConf = require('pkg-conf');
26var isCi = require('is-ci');
27var colors = require('./lib/colors');
28var verboseReporter = require('./lib/reporters/verbose');
29var miniReporter = require('./lib/reporters/mini');
30var tapReporter = require('./lib/reporters/tap');
31var Logger = require('./lib/logger');
32var Watcher = require('./lib/watcher');
33var Api = require('./api');
34
35// Bluebird specific
36Promise.longStackTraces();
37
38var conf = pkgConf.sync('ava', {
39 defaults: {
40 babel: 'default'
41 }
42});
43
44var cli = meow([
45 'Usage',
46 ' ava [<file|directory|glob> ...]',
47 '',
48 'Options',
49 ' --init Add AVA to your project',
50 ' --fail-fast Stop after first test failure',
51 ' --serial, -s Run tests serially',
52 ' --require, -r Module to preload (Can be repeated)',
53 ' --tap, -t Generate TAP output',
54 ' --verbose, -v Enable verbose output',
55 ' --no-cache Disable the transpiler cache',
56 ' --match, -m Only run tests with matching title (Can be repeated)',
57 ' --watch, -w Re-run tests when tests and source files change',
58 ' --source, -S Pattern to match source files so tests can be re-run (Can be repeated)',
59 '',
60 'Examples',
61 ' ava',
62 ' ava test.js test2.js',
63 ' ava test-*.js',
64 ' ava test',
65 ' ava --init',
66 ' ava --init foo.js',
67 '',
68 'Default patterns when no arguments:',
69 'test.js test-*.js test/**/*.js'
70], {
71 string: [
72 '_',
73 'require',
74 'source',
75 'match'
76 ],
77 boolean: [
78 'fail-fast',
79 'verbose',
80 'serial',
81 'tap',
82 'watch'
83 ],
84 default: conf,
85 alias: {
86 t: 'tap',
87 v: 'verbose',
88 r: 'require',
89 s: 'serial',
90 m: 'match',
91 w: 'watch',
92 S: 'source'
93 }
94});
95
96updateNotifier({pkg: cli.pkg}).notify();
97
98if (cli.flags.init) {
99 require('ava-init')();
100 return;
101}
102
103var api = new Api({
104 failFast: cli.flags.failFast,
105 serial: cli.flags.serial,
106 require: arrify(cli.flags.require),
107 cacheEnabled: cli.flags.cache !== false,
108 explicitTitles: cli.flags.watch,
109 match: arrify(cli.flags.match),
110 babelConfig: conf.babel
111});
112
113var reporter;
114
115if (cli.flags.tap) {
116 reporter = tapReporter();
117} else if (cli.flags.verbose || isCi) {
118 reporter = verboseReporter();
119} else {
120 reporter = miniReporter();
121}
122
123reporter.api = api;
124var logger = new Logger(reporter);
125
126logger.start();
127
128api.on('test', logger.test);
129api.on('error', logger.unhandledError);
130
131api.on('stdout', logger.stdout);
132api.on('stderr', logger.stderr);
133
134var files = cli.input.length ? cli.input : arrify(conf.files);
135if (files.length === 0) {
136 files = [
137 'test.js',
138 'test-*.js',
139 'test'
140 ];
141}
142
143if (cli.flags.watch) {
144 try {
145 var watcher = new Watcher(logger, api, files, arrify(cli.flags.source));
146 watcher.observeStdin(process.stdin);
147 } catch (err) {
148 if (err.name === 'AvaError') {
149 // An AvaError may be thrown if chokidar is not installed. Log it nicely.
150 console.log(' ' + colors.error(figures.cross) + ' ' + err.message);
151 logger.exit(1);
152 } else {
153 // Rethrow so it becomes an uncaught exception.
154 throw err;
155 }
156 }
157} else {
158 api.run(files)
159 .then(function () {
160 logger.finish();
161 logger.exit(api.failCount > 0 || api.rejectionCount > 0 || api.exceptionCount > 0 ? 1 : 0);
162 })
163 .catch(function (err) {
164 // Don't swallow exceptions. Note that any expected error should already
165 // have been logged.
166 setImmediate(function () {
167 throw err;
168 });
169 });
170}