| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637 | 'use strict';Object.defineProperty(exports, '__esModule', {  value: true});exports.getTestID =  exports.getTestDuration =  exports.getEachHooksForTest =  exports.getAllHooksForDescribe =  exports.describeBlockHasTests =  exports.callAsyncCircusFn =  exports.addErrorToEachTestUnderDescribe =    void 0;exports.invariant = invariant;exports.parseSingleTestResult =  exports.makeTest =  exports.makeSingleTestResult =  exports.makeRunResult =  exports.makeDescribe =    void 0;var path = _interopRequireWildcard(require('path'));var _co = _interopRequireDefault(require('co'));var _dedent = _interopRequireDefault(require('dedent'));var _isGeneratorFn = _interopRequireDefault(require('is-generator-fn'));var _slash = _interopRequireDefault(require('slash'));var _stackUtils = _interopRequireDefault(require('stack-utils'));var _jestUtil = require('jest-util');var _prettyFormat = require('pretty-format');var _state = require('./state');function _interopRequireDefault(obj) {  return obj && obj.__esModule ? obj : {default: obj};}function _getRequireWildcardCache(nodeInterop) {  if (typeof WeakMap !== 'function') return null;  var cacheBabelInterop = new WeakMap();  var cacheNodeInterop = new WeakMap();  return (_getRequireWildcardCache = function (nodeInterop) {    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;  })(nodeInterop);}function _interopRequireWildcard(obj, nodeInterop) {  if (!nodeInterop && obj && obj.__esModule) {    return obj;  }  if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {    return {default: obj};  }  var cache = _getRequireWildcardCache(nodeInterop);  if (cache && cache.has(obj)) {    return cache.get(obj);  }  var newObj = {};  var hasPropertyDescriptor =    Object.defineProperty && Object.getOwnPropertyDescriptor;  for (var key in obj) {    if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {      var desc = hasPropertyDescriptor        ? Object.getOwnPropertyDescriptor(obj, key)        : null;      if (desc && (desc.get || desc.set)) {        Object.defineProperty(newObj, key, desc);      } else {        newObj[key] = obj[key];      }    }  }  newObj.default = obj;  if (cache) {    cache.set(obj, newObj);  }  return newObj;}var global = (function () {  if (typeof globalThis !== 'undefined') {    return globalThis;  } else if (typeof global !== 'undefined') {    return global;  } else if (typeof self !== 'undefined') {    return self;  } else if (typeof window !== 'undefined') {    return window;  } else {    return Function('return this')();  }})();var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;var global = (function () {  if (typeof globalThis !== 'undefined') {    return globalThis;  } else if (typeof global !== 'undefined') {    return global;  } else if (typeof self !== 'undefined') {    return self;  } else if (typeof window !== 'undefined') {    return window;  } else {    return Function('return this')();  }})();var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;var global = (function () {  if (typeof globalThis !== 'undefined') {    return globalThis;  } else if (typeof global !== 'undefined') {    return global;  } else if (typeof self !== 'undefined') {    return self;  } else if (typeof window !== 'undefined') {    return window;  } else {    return Function('return this')();  }})();var jestNow = global[Symbol.for('jest-native-now')] || global.Date.now;var global = (function () {  if (typeof globalThis !== 'undefined') {    return globalThis;  } else if (typeof global !== 'undefined') {    return global;  } else if (typeof self !== 'undefined') {    return self;  } else if (typeof window !== 'undefined') {    return window;  } else {    return Function('return this')();  }})();var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;var global = (function () {  if (typeof globalThis !== 'undefined') {    return globalThis;  } else if (typeof global !== 'undefined') {    return global;  } else if (typeof self !== 'undefined') {    return self;  } else if (typeof window !== 'undefined') {    return window;  } else {    return Function('return this')();  }})();var Promise = global[Symbol.for('jest-native-promise')] || global.Promise;const stackUtils = new _stackUtils.default({  cwd: 'A path that does not exist'});const jestEachBuildDir = (0, _slash.default)(  path.dirname(require.resolve('jest-each')));function takesDoneCallback(fn) {  return fn.length > 0;}function isGeneratorFunction(fn) {  return (0, _isGeneratorFn.default)(fn);}const makeDescribe = (name, parent, mode) => {  let _mode = mode;  if (parent && !mode) {    // If not set explicitly, inherit from the parent describe.    _mode = parent.mode;  }  return {    type: 'describeBlock',    // eslint-disable-next-line sort-keys    children: [],    hooks: [],    mode: _mode,    name: (0, _jestUtil.convertDescriptorToString)(name),    parent,    tests: []  };};exports.makeDescribe = makeDescribe;const makeTest = (fn, mode, name, parent, timeout, asyncError) => ({  type: 'test',  // eslint-disable-next-line sort-keys  asyncError,  duration: null,  errors: [],  fn,  invocations: 0,  mode,  name: (0, _jestUtil.convertDescriptorToString)(name),  parent,  seenDone: false,  startedAt: null,  status: null,  timeout}); // Traverse the tree of describe blocks and return true if at least one describe// block has an enabled test.exports.makeTest = makeTest;const hasEnabledTest = describeBlock => {  const {hasFocusedTests, testNamePattern} = (0, _state.getState)();  return describeBlock.children.some(child =>    child.type === 'describeBlock'      ? hasEnabledTest(child)      : !(          child.mode === 'skip' ||          (hasFocusedTests && child.mode !== 'only') ||          (testNamePattern && !testNamePattern.test(getTestID(child)))        )  );};const getAllHooksForDescribe = describe => {  const result = {    afterAll: [],    beforeAll: []  };  if (hasEnabledTest(describe)) {    for (const hook of describe.hooks) {      switch (hook.type) {        case 'beforeAll':          result.beforeAll.push(hook);          break;        case 'afterAll':          result.afterAll.push(hook);          break;      }    }  }  return result;};exports.getAllHooksForDescribe = getAllHooksForDescribe;const getEachHooksForTest = test => {  const result = {    afterEach: [],    beforeEach: []  };  let block = test.parent;  do {    const beforeEachForCurrentBlock = []; // TODO: inline after https://github.com/microsoft/TypeScript/pull/34840 is released    let hook;    for (hook of block.hooks) {      switch (hook.type) {        case 'beforeEach':          beforeEachForCurrentBlock.push(hook);          break;        case 'afterEach':          result.afterEach.push(hook);          break;      }    } // 'beforeEach' hooks are executed from top to bottom, the opposite of the    // way we traversed it.    result.beforeEach = [...beforeEachForCurrentBlock, ...result.beforeEach];  } while ((block = block.parent));  return result;};exports.getEachHooksForTest = getEachHooksForTest;const describeBlockHasTests = describe =>  describe.children.some(    child => child.type === 'test' || describeBlockHasTests(child)  );exports.describeBlockHasTests = describeBlockHasTests;const _makeTimeoutMessage = (timeout, isHook) =>  `Exceeded timeout of ${(0, _jestUtil.formatTime)(timeout)} for a ${    isHook ? 'hook' : 'test'  }.\nUse jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test.`; // Global values can be overwritten by mocks or tests. We'll capture// the original values in the variables before we require any files.const {setTimeout, clearTimeout} = global;function checkIsError(error) {  return !!(error && error.message && error.stack);}const callAsyncCircusFn = (testOrHook, testContext, {isHook, timeout}) => {  let timeoutID;  let completed = false;  const {fn, asyncError} = testOrHook;  return new Promise((resolve, reject) => {    timeoutID = setTimeout(      () => reject(_makeTimeoutMessage(timeout, isHook)),      timeout    ); // If this fn accepts `done` callback we return a promise that fulfills as    // soon as `done` called.    if (takesDoneCallback(fn)) {      let returnedValue = undefined;      const done = reason => {        // We need to keep a stack here before the promise tick        const errorAtDone = new _jestUtil.ErrorWithStack(undefined, done);        if (!completed && testOrHook.seenDone) {          errorAtDone.message =            'Expected done to be called once, but it was called multiple times.';          if (reason) {            errorAtDone.message +=              ' Reason: ' +              (0, _prettyFormat.format)(reason, {                maxDepth: 3              });          }          reject(errorAtDone);          throw errorAtDone;        } else {          testOrHook.seenDone = true;        } // Use `Promise.resolve` to allow the event loop to go a single tick in case `done` is called synchronously        Promise.resolve().then(() => {          if (returnedValue !== undefined) {            asyncError.message = (0, _dedent.default)`      Test functions cannot both take a 'done' callback and return something. Either use a 'done' callback, or return a promise.      Returned value: ${(0, _prettyFormat.format)(returnedValue, {        maxDepth: 3      })}      `;            return reject(asyncError);          }          let errorAsErrorObject;          if (checkIsError(reason)) {            errorAsErrorObject = reason;          } else {            errorAsErrorObject = errorAtDone;            errorAtDone.message = `Failed: ${(0, _prettyFormat.format)(reason, {              maxDepth: 3            })}`;          } // Consider always throwing, regardless if `reason` is set or not          if (completed && reason) {            errorAsErrorObject.message =              'Caught error after test environment was torn down\n\n' +              errorAsErrorObject.message;            throw errorAsErrorObject;          }          return reason ? reject(errorAsErrorObject) : resolve();        });      };      returnedValue = fn.call(testContext, done);      return;    }    let returnedValue;    if (isGeneratorFunction(fn)) {      returnedValue = _co.default.wrap(fn).call({});    } else {      try {        returnedValue = fn.call(testContext);      } catch (error) {        reject(error);        return;      }    } // If it's a Promise, return it. Test for an object with a `then` function    // to support custom Promise implementations.    if (      typeof returnedValue === 'object' &&      returnedValue !== null &&      typeof returnedValue.then === 'function'    ) {      returnedValue.then(() => resolve(), reject);      return;    }    if (!isHook && returnedValue !== undefined) {      reject(        new Error((0, _dedent.default)`      test functions can only return Promise or undefined.      Returned value: ${(0, _prettyFormat.format)(returnedValue, {        maxDepth: 3      })}      `)      );      return;    } // Otherwise this test is synchronous, and if it didn't throw it means    // it passed.    resolve();  })    .then(() => {      var _timeoutID$unref, _timeoutID;      completed = true; // If timeout is not cleared/unrefed the node process won't exit until      // it's resolved.      (_timeoutID$unref = (_timeoutID = timeoutID).unref) === null ||      _timeoutID$unref === void 0        ? void 0        : _timeoutID$unref.call(_timeoutID);      clearTimeout(timeoutID);    })    .catch(error => {      var _timeoutID$unref2, _timeoutID2;      completed = true;      (_timeoutID$unref2 = (_timeoutID2 = timeoutID).unref) === null ||      _timeoutID$unref2 === void 0        ? void 0        : _timeoutID$unref2.call(_timeoutID2);      clearTimeout(timeoutID);      throw error;    });};exports.callAsyncCircusFn = callAsyncCircusFn;const getTestDuration = test => {  const {startedAt} = test;  return typeof startedAt === 'number' ? jestNow() - startedAt : null;};exports.getTestDuration = getTestDuration;const makeRunResult = (describeBlock, unhandledErrors) => ({  testResults: makeTestResults(describeBlock),  unhandledErrors: unhandledErrors.map(_getError).map(getErrorStack)});exports.makeRunResult = makeRunResult;const makeSingleTestResult = test => {  const {includeTestLocationInResult} = (0, _state.getState)();  const testPath = [];  let parent = test;  const {status} = test;  invariant(status, 'Status should be present after tests are run.');  do {    testPath.unshift(parent.name);  } while ((parent = parent.parent));  let location = null;  if (includeTestLocationInResult) {    var _parsedLine, _parsedLine$file;    const stackLines = test.asyncError.stack.split('\n');    const stackLine = stackLines[1];    let parsedLine = stackUtils.parseLine(stackLine);    if (      (_parsedLine = parsedLine) !== null &&      _parsedLine !== void 0 &&      (_parsedLine$file = _parsedLine.file) !== null &&      _parsedLine$file !== void 0 &&      _parsedLine$file.startsWith(jestEachBuildDir)    ) {      const stackLine = stackLines[4];      parsedLine = stackUtils.parseLine(stackLine);    }    if (      parsedLine &&      typeof parsedLine.column === 'number' &&      typeof parsedLine.line === 'number'    ) {      location = {        column: parsedLine.column,        line: parsedLine.line      };    }  }  const errorsDetailed = test.errors.map(_getError);  return {    duration: test.duration,    errors: errorsDetailed.map(getErrorStack),    errorsDetailed,    invocations: test.invocations,    location,    status,    testPath: Array.from(testPath)  };};exports.makeSingleTestResult = makeSingleTestResult;const makeTestResults = describeBlock => {  const testResults = [];  for (const child of describeBlock.children) {    switch (child.type) {      case 'describeBlock': {        testResults.push(...makeTestResults(child));        break;      }      case 'test': {        testResults.push(makeSingleTestResult(child));        break;      }    }  }  return testResults;}; // Return a string that identifies the test (concat of parent describe block// names + test title)const getTestID = test => {  const titles = [];  let parent = test;  do {    titles.unshift(parent.name);  } while ((parent = parent.parent));  titles.shift(); // remove TOP_DESCRIBE_BLOCK_NAME  return titles.join(' ');};exports.getTestID = getTestID;const _getError = errors => {  let error;  let asyncError;  if (Array.isArray(errors)) {    error = errors[0];    asyncError = errors[1];  } else {    error = errors;    asyncError = new Error();  }  if (error && (typeof error.stack === 'string' || error.message)) {    return error;  }  asyncError.message = `thrown: ${(0, _prettyFormat.format)(error, {    maxDepth: 3  })}`;  return asyncError;};const getErrorStack = error =>  typeof error.stack === 'string' ? error.stack : error.message;const addErrorToEachTestUnderDescribe = (describeBlock, error, asyncError) => {  for (const child of describeBlock.children) {    switch (child.type) {      case 'describeBlock':        addErrorToEachTestUnderDescribe(child, error, asyncError);        break;      case 'test':        child.errors.push([error, asyncError]);        break;    }  }};exports.addErrorToEachTestUnderDescribe = addErrorToEachTestUnderDescribe;function invariant(condition, message) {  if (!condition) {    throw new Error(message);  }}const parseSingleTestResult = testResult => {  let status;  if (testResult.status === 'skip') {    status = 'pending';  } else if (testResult.status === 'todo') {    status = 'todo';  } else if (testResult.errors.length > 0) {    status = 'failed';  } else {    status = 'passed';  }  const ancestorTitles = testResult.testPath.filter(    name => name !== _state.ROOT_DESCRIBE_BLOCK_NAME  );  const title = ancestorTitles.pop();  return {    ancestorTitles,    duration: testResult.duration,    failureDetails: testResult.errorsDetailed,    failureMessages: Array.from(testResult.errors),    fullName: title      ? ancestorTitles.concat(title).join(' ')      : ancestorTitles.join(' '),    invocations: testResult.invocations,    location: testResult.location,    numPassingAsserts: 0,    status,    title: testResult.testPath[testResult.testPath.length - 1]  };};exports.parseSingleTestResult = parseSingleTestResult;
 |