| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 | 'use strict';function _exit() {  const data = _interopRequireDefault(require('exit'));  _exit = function _exit() {    return data;  };  return data;}function _throat() {  const data = _interopRequireDefault(require('throat'));  _throat = function _throat() {    return data;  };  return data;}function _jestWorker() {  const data = _interopRequireDefault(require('jest-worker'));  _jestWorker = function _jestWorker() {    return data;  };  return data;}var _runTest = _interopRequireDefault(require('./runTest'));var _testWorker = require('./testWorker');function _interopRequireDefault(obj) {  return obj && obj.__esModule ? obj : {default: obj};}function _objectSpread(target) {  for (var i = 1; i < arguments.length; i++) {    var source = arguments[i] != null ? arguments[i] : {};    var ownKeys = Object.keys(source);    if (typeof Object.getOwnPropertySymbols === 'function') {      ownKeys = ownKeys.concat(        Object.getOwnPropertySymbols(source).filter(function(sym) {          return Object.getOwnPropertyDescriptor(source, sym).enumerable;        })      );    }    ownKeys.forEach(function(key) {      _defineProperty(target, key, source[key]);    });  }  return target;}function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {  try {    var info = gen[key](arg);    var value = info.value;  } catch (error) {    reject(error);    return;  }  if (info.done) {    resolve(value);  } else {    Promise.resolve(value).then(_next, _throw);  }}function _asyncToGenerator(fn) {  return function() {    var self = this,      args = arguments;    return new Promise(function(resolve, reject) {      var gen = fn.apply(self, args);      function _next(value) {        asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value);      }      function _throw(err) {        asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err);      }      _next(undefined);    });  };}function _defineProperty(obj, key, value) {  if (key in obj) {    Object.defineProperty(obj, key, {      value: value,      enumerable: true,      configurable: true,      writable: true    });  } else {    obj[key] = value;  }  return obj;}const TEST_WORKER_PATH = require.resolve('./testWorker');/* eslint-disable-next-line no-redeclare */class TestRunner {  constructor(globalConfig, context) {    _defineProperty(this, '_globalConfig', void 0);    _defineProperty(this, '_context', void 0);    this._globalConfig = globalConfig;    this._context = context || {};  }  runTests(tests, watcher, onStart, onResult, onFailure, options) {    var _this = this;    return _asyncToGenerator(function*() {      return yield options.serial        ? _this._createInBandTestRun(            tests,            watcher,            onStart,            onResult,            onFailure          )        : _this._createParallelTestRun(            tests,            watcher,            onStart,            onResult,            onFailure          );    })();  }  _createInBandTestRun(tests, watcher, onStart, onResult, onFailure) {    var _this2 = this;    return _asyncToGenerator(function*() {      process.env.JEST_WORKER_ID = '1';      const mutex = (0, _throat().default)(1);      return tests.reduce(        (promise, test) =>          mutex(() =>            promise              .then(                /*#__PURE__*/                _asyncToGenerator(function*() {                  if (watcher.isInterrupted()) {                    throw new CancelRun();                  }                  yield onStart(test);                  return (0,                  _runTest.default)(test.path, _this2._globalConfig, test.context.config, test.context.resolver, _this2._context);                })              )              .then(result => onResult(test, result))              .catch(err => onFailure(test, err))          ),        Promise.resolve()      );    })();  }  _createParallelTestRun(tests, watcher, onStart, onResult, onFailure) {    var _this3 = this;    return _asyncToGenerator(function*() {      const resolvers = new Map();      var _iteratorNormalCompletion = true;      var _didIteratorError = false;      var _iteratorError = undefined;      try {        for (          var _iterator = tests[Symbol.iterator](), _step;          !(_iteratorNormalCompletion = (_step = _iterator.next()).done);          _iteratorNormalCompletion = true        ) {          const test = _step.value;          if (!resolvers.has(test.context.config.name)) {            resolvers.set(test.context.config.name, {              config: test.context.config,              serializableModuleMap: test.context.moduleMap.toJSON()            });          }        }      } catch (err) {        _didIteratorError = true;        _iteratorError = err;      } finally {        try {          if (!_iteratorNormalCompletion && _iterator.return != null) {            _iterator.return();          }        } finally {          if (_didIteratorError) {            throw _iteratorError;          }        }      }      const worker = new (_jestWorker()).default(TEST_WORKER_PATH, {        exposedMethods: ['worker'],        forkOptions: {          stdio: 'pipe'        },        maxRetries: 3,        numWorkers: _this3._globalConfig.maxWorkers,        setupArgs: [          {            serializableResolvers: Array.from(resolvers.values())          }        ]      });      if (worker.getStdout()) worker.getStdout().pipe(process.stdout);      if (worker.getStderr()) worker.getStderr().pipe(process.stderr);      const mutex = (0, _throat().default)(_this3._globalConfig.maxWorkers); // Send test suites to workers continuously instead of all at once to track      // the start time of individual tests.      const runTestInWorker = test =>        mutex(          /*#__PURE__*/          _asyncToGenerator(function*() {            if (watcher.isInterrupted()) {              return Promise.reject();            }            yield onStart(test);            return worker.worker({              config: test.context.config,              context: _objectSpread({}, _this3._context, {                changedFiles:                  _this3._context.changedFiles &&                  Array.from(_this3._context.changedFiles)              }),              globalConfig: _this3._globalConfig,              path: test.path            });          })        );      const onError =        /*#__PURE__*/        (function() {          var _ref3 = _asyncToGenerator(function*(err, test) {            yield onFailure(test, err);            if (err.type === 'ProcessTerminatedError') {              console.error(                'A worker process has quit unexpectedly! ' +                  'Most likely this is an initialization error.'              );              (0, _exit().default)(1);            }          });          return function onError(_x, _x2) {            return _ref3.apply(this, arguments);          };        })();      const onInterrupt = new Promise((_, reject) => {        watcher.on('change', state => {          if (state.interrupted) {            reject(new CancelRun());          }        });      });      const runAllTests = Promise.all(        tests.map(test =>          runTestInWorker(test)            .then(testResult => onResult(test, testResult))            .catch(error => onError(error, test))        )      );      const cleanup = () => worker.end();      return Promise.race([runAllTests, onInterrupt]).then(cleanup, cleanup);    })();  }}class CancelRun extends Error {  constructor(message) {    super(message);    this.name = 'CancelRun';  }}module.exports = TestRunner;
 |