aboutsummaryrefslogtreecommitdiff
path: root/node_modules/ava/lib/cli.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-28 00:38:50 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-28 00:40:43 +0200
commit7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch)
tree6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/ava/lib/cli.js
parent963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff)
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/ava/lib/cli.js')
-rw-r--r--node_modules/ava/lib/cli.js200
1 files changed, 200 insertions, 0 deletions
diff --git a/node_modules/ava/lib/cli.js b/node_modules/ava/lib/cli.js
new file mode 100644
index 000000000..f6213f107
--- /dev/null
+++ b/node_modules/ava/lib/cli.js
@@ -0,0 +1,200 @@
+'use strict';
+const path = require('path');
+const updateNotifier = require('update-notifier');
+const figures = require('figures');
+const arrify = require('arrify');
+const meow = require('meow');
+const Promise = require('bluebird');
+const pkgConf = require('pkg-conf');
+const isCi = require('is-ci');
+const hasFlag = require('has-flag');
+const Api = require('../api');
+const colors = require('./colors');
+const VerboseReporter = require('./reporters/verbose');
+const MiniReporter = require('./reporters/mini');
+const TapReporter = require('./reporters/tap');
+const Logger = require('./logger');
+const Watcher = require('./watcher');
+const babelConfigHelper = require('./babel-config');
+
+// Bluebird specific
+Promise.longStackTraces();
+
+exports.run = () => {
+ const conf = pkgConf.sync('ava');
+
+ const filepath = pkgConf.filepath(conf);
+ const projectDir = filepath === null ? process.cwd() : path.dirname(filepath);
+
+ const cli = meow(`
+ Usage
+ ava [<file|directory|glob> ...]
+
+ Options
+ --init Add AVA to your project
+ --fail-fast Stop after first test failure
+ --serial, -s Run tests serially
+ --tap, -t Generate TAP output
+ --verbose, -v Enable verbose output
+ --no-cache Disable the transpiler cache
+ --no-power-assert Disable Power Assert
+ --color Force color output
+ --no-color Disable color output
+ --match, -m Only run tests with matching title (Can be repeated)
+ --watch, -w Re-run tests when tests and source files change
+ --timeout, -T Set global timeout
+ --concurrency, -c Maximum number of test files running at the same time (EXPERIMENTAL)
+ --update-snapshots, -u Update snapshots
+
+ Examples
+ ava
+ ava test.js test2.js
+ ava test-*.js
+ ava test
+ ava --init
+ ava --init foo.js
+
+ Default patterns when no arguments:
+ test.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js
+ `, {
+ string: [
+ '_',
+ 'match',
+ 'timeout',
+ 'concurrency'
+ ],
+ boolean: [
+ 'init',
+ 'fail-fast',
+ 'serial',
+ 'tap',
+ 'verbose',
+ 'watch',
+ 'update-snapshots',
+ 'color'
+ ],
+ default: {
+ cache: conf.cache,
+ color: 'color' in conf ? conf.color : require('supports-color') !== false,
+ concurrency: conf.concurrency,
+ failFast: conf.failFast,
+ init: conf.init,
+ match: conf.match,
+ powerAssert: conf.powerAssert,
+ serial: conf.serial,
+ tap: conf.tap,
+ timeout: conf.timeout,
+ updateSnapshots: conf.updateSnapshots,
+ verbose: conf.verbose,
+ watch: conf.watch
+ },
+ alias: {
+ t: 'tap',
+ v: 'verbose',
+ s: 'serial',
+ m: 'match',
+ w: 'watch',
+ T: 'timeout',
+ c: 'concurrency',
+ u: 'update-snapshots'
+ }
+ });
+
+ updateNotifier({pkg: cli.pkg}).notify();
+
+ if (cli.flags.init) {
+ require('ava-init')();
+ return;
+ }
+
+ if (
+ ((hasFlag('--watch') || hasFlag('-w')) && (hasFlag('--tap') || hasFlag('-t'))) ||
+ (conf.watch && conf.tap)
+ ) {
+ throw new Error(colors.error(figures.cross) + ' The TAP reporter is not available when using watch mode.');
+ }
+
+ if ((hasFlag('--watch') || hasFlag('-w')) && isCi) {
+ throw new Error(colors.error(figures.cross) + ' Watch mode is not available in CI, as it prevents AVA from terminating.');
+ }
+
+ if (hasFlag('--require') || hasFlag('-r')) {
+ throw new Error(colors.error(figures.cross) + ' The --require and -r flags are deprecated. Requirements should be configured in package.json - see documentation.');
+ }
+
+ // Copy resultant cli.flags into conf for use with Api and elsewhere
+ Object.assign(conf, cli.flags);
+
+ const api = new Api({
+ failFast: conf.failFast,
+ failWithoutAssertions: conf.failWithoutAssertions !== false,
+ serial: conf.serial,
+ require: arrify(conf.require),
+ cacheEnabled: conf.cache !== false,
+ powerAssert: conf.powerAssert !== false,
+ explicitTitles: conf.watch,
+ match: arrify(conf.match),
+ babelConfig: babelConfigHelper.validate(conf.babel),
+ resolveTestsFrom: cli.input.length === 0 ? projectDir : process.cwd(),
+ projectDir,
+ timeout: conf.timeout,
+ concurrency: conf.concurrency ? parseInt(conf.concurrency, 10) : 0,
+ updateSnapshots: conf.updateSnapshots,
+ color: conf.color
+ });
+
+ let reporter;
+
+ if (conf.tap && !conf.watch) {
+ reporter = new TapReporter();
+ } else if (conf.verbose || isCi) {
+ reporter = new VerboseReporter({color: conf.color});
+ } else {
+ reporter = new MiniReporter({color: conf.color, watching: conf.watch});
+ }
+
+ reporter.api = api;
+ const logger = new Logger(reporter);
+
+ logger.start();
+
+ api.on('test-run', runStatus => {
+ reporter.api = runStatus;
+ runStatus.on('test', logger.test);
+ runStatus.on('error', logger.unhandledError);
+
+ runStatus.on('stdout', logger.stdout);
+ runStatus.on('stderr', logger.stderr);
+ });
+
+ const files = cli.input.length ? cli.input : arrify(conf.files);
+
+ if (conf.watch) {
+ try {
+ const watcher = new Watcher(logger, api, files, arrify(conf.source));
+ watcher.observeStdin(process.stdin);
+ } catch (err) {
+ if (err.name === 'AvaError') {
+ // An AvaError may be thrown if `chokidar` is not installed. Log it nicely.
+ console.error(` ${colors.error(figures.cross)} ${err.message}`);
+ logger.exit(1);
+ } else {
+ // Rethrow so it becomes an uncaught exception
+ throw err;
+ }
+ }
+ } else {
+ api.run(files)
+ .then(runStatus => {
+ logger.finish(runStatus);
+ logger.exit(runStatus.failCount > 0 || runStatus.rejectionCount > 0 || runStatus.exceptionCount > 0 ? 1 : 0);
+ })
+ .catch(err => {
+ // Don't swallow exceptions. Note that any expected error should already
+ // have been logged.
+ setImmediate(() => {
+ throw err;
+ });
+ });
+ }
+};