index.js 2.91 KB
Newer Older
YazhouChen's avatar
YazhouChen committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
import path from 'path';
import _ from 'lodash';

import parseArgv from './parseArgv';
import { existsFileSync } from '../util/exists';
import parseConfig from './parseConfig';
import requireWebpackConfig from './requireWebpackConfig';
import { ensureGlob, extensionsToGlob } from '../util/glob';
import createMochaWebpack from '../createMochaWebpack';


function resolve(mod) {
  const absolute = existsFileSync(mod) || existsFileSync(`${mod}.js`);
  const file = absolute ? path.resolve(mod) : mod;
  return file;
}

function exit(lazy, code) {
  if (lazy) {
    process.on('exit', () => {
      process.exit(code);
    });
  } else {
    process.exit(code);
  }
}

const cliOptions = parseArgv(process.argv.slice(2), true);
const configOptions = parseConfig(cliOptions.opts);
const requiresWebpackConfig = cliOptions.webpackConfig != null || configOptions.webpackConfig != null;
const defaultOptions = parseArgv([]);

const options = _.defaults({}, cliOptions, configOptions, defaultOptions);

options.require.forEach((mod) => {
  require(resolve(mod)); // eslint-disable-line global-require
});

options.include = options.include.map(resolve);

options.webpackConfig = requireWebpackConfig(options.webpackConfig, requiresWebpackConfig, options.webpackEnv);

const mochaWebpack = createMochaWebpack();

options.include.forEach((f) => mochaWebpack.addInclude(f));

const extensions = _.get(options.webpackConfig, 'resolve.extensions', ['.js']);
const fallbackFileGlob = extensionsToGlob(extensions);
const fileGlob = options.glob != null ? options.glob : fallbackFileGlob;

options.files.forEach((f) => mochaWebpack.addEntry(ensureGlob(f, options.recursive, fileGlob)));

mochaWebpack.cwd(process.cwd());
mochaWebpack.webpackConfig(options.webpackConfig);
mochaWebpack.bail(options.bail);
mochaWebpack.reporter(options.reporter, options.reporterOptions);
mochaWebpack.ui(options.ui);
mochaWebpack.interactive(options.interactive);

if (options.fgrep) {
  mochaWebpack.fgrep(options.fgrep);
}

if (options.grep) {
  mochaWebpack.grep(options.grep);
}

if (options.invert) {
  mochaWebpack.invert();
}

if (options.checkLeaks) {
  mochaWebpack.ignoreLeaks(false);
}

if (options.fullTrace) {
  mochaWebpack.fullStackTrace();
}

if (options.quiet) {
  mochaWebpack.quiet();
}

mochaWebpack.useColors(options.colors);
mochaWebpack.useInlineDiffs(options.inlineDiffs);
mochaWebpack.timeout(options.timeout);

if (options.retries) {
  mochaWebpack.retries(options.retries);
}

mochaWebpack.slow(options.slow);

if (options.asyncOnly) {
  mochaWebpack.asyncOnly();
}

if (options.delay) {
  mochaWebpack.delay();
}

if (options.growl) {
  mochaWebpack.growl();
}

Promise
  .resolve()
  .then(() => {
    if (options.watch) {
      return mochaWebpack.watch();
    }
    return mochaWebpack.run();
  })
  .then((failures) => {
    exit(options.exit, failures);
  })
  .catch((e) => {
    if (e) {
      console.error(e.stack); // eslint-disable-line
    }
    exit(options.exit, 1);
  });