1 | #!/usr/bin/env node
|
2 | 'use strict';
|
3 |
|
4 | var debug = require('debug')('ava');
|
5 |
|
6 |
|
7 | var resolveCwd = require('resolve-cwd');
|
8 | var localCLI = resolveCwd('ava/cli');
|
9 |
|
10 | if (localCLI && localCLI !== __filename) {
|
11 | debug('Using local install of AVA');
|
12 | require(localCLI);
|
13 | return;
|
14 | }
|
15 |
|
16 | if (debug.enabled) {
|
17 | require('time-require');
|
18 | }
|
19 |
|
20 | var updateNotifier = require('update-notifier');
|
21 | var figures = require('figures');
|
22 | var arrify = require('arrify');
|
23 | var meow = require('meow');
|
24 | var Promise = require('bluebird');
|
25 | var pkgConf = require('pkg-conf');
|
26 | var isCi = require('is-ci');
|
27 | var colors = require('./lib/colors');
|
28 | var verboseReporter = require('./lib/reporters/verbose');
|
29 | var miniReporter = require('./lib/reporters/mini');
|
30 | var tapReporter = require('./lib/reporters/tap');
|
31 | var Logger = require('./lib/logger');
|
32 | var Watcher = require('./lib/watcher');
|
33 | var Api = require('./api');
|
34 |
|
35 |
|
36 | Promise.longStackTraces();
|
37 |
|
38 | var conf = pkgConf.sync('ava', {
|
39 | defaults: {
|
40 | babel: 'default'
|
41 | }
|
42 | });
|
43 |
|
44 | var 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 |
|
96 | updateNotifier({pkg: cli.pkg}).notify();
|
97 |
|
98 | if (cli.flags.init) {
|
99 | require('ava-init')();
|
100 | return;
|
101 | }
|
102 |
|
103 | var 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 |
|
113 | var reporter;
|
114 |
|
115 | if (cli.flags.tap) {
|
116 | reporter = tapReporter();
|
117 | } else if (cli.flags.verbose || isCi) {
|
118 | reporter = verboseReporter();
|
119 | } else {
|
120 | reporter = miniReporter();
|
121 | }
|
122 |
|
123 | reporter.api = api;
|
124 | var logger = new Logger(reporter);
|
125 |
|
126 | logger.start();
|
127 |
|
128 | api.on('test', logger.test);
|
129 | api.on('error', logger.unhandledError);
|
130 |
|
131 | api.on('stdout', logger.stdout);
|
132 | api.on('stderr', logger.stderr);
|
133 |
|
134 | var files = cli.input.length ? cli.input : arrify(conf.files);
|
135 | if (files.length === 0) {
|
136 | files = [
|
137 | 'test.js',
|
138 | 'test-*.js',
|
139 | 'test'
|
140 | ];
|
141 | }
|
142 |
|
143 | if (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 |
|
150 | console.log(' ' + colors.error(figures.cross) + ' ' + err.message);
|
151 | logger.exit(1);
|
152 | } else {
|
153 |
|
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 |
|
165 |
|
166 | setImmediate(function () {
|
167 | throw err;
|
168 | });
|
169 | });
|
170 | }
|