239 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
'use strict';
 | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
exports.default = void 0;
 | 
						|
function _ansiEscapes() {
 | 
						|
  const data = _interopRequireDefault(require('ansi-escapes'));
 | 
						|
  _ansiEscapes = function () {
 | 
						|
    return data;
 | 
						|
  };
 | 
						|
  return data;
 | 
						|
}
 | 
						|
function _chalk() {
 | 
						|
  const data = _interopRequireDefault(require('chalk'));
 | 
						|
  _chalk = function () {
 | 
						|
    return data;
 | 
						|
  };
 | 
						|
  return data;
 | 
						|
}
 | 
						|
function _jestUtil() {
 | 
						|
  const data = require('jest-util');
 | 
						|
  _jestUtil = function () {
 | 
						|
    return data;
 | 
						|
  };
 | 
						|
  return data;
 | 
						|
}
 | 
						|
function _jestWatcher() {
 | 
						|
  const data = require('jest-watcher');
 | 
						|
  _jestWatcher = function () {
 | 
						|
    return data;
 | 
						|
  };
 | 
						|
  return data;
 | 
						|
}
 | 
						|
function _interopRequireDefault(obj) {
 | 
						|
  return obj && obj.__esModule ? obj : {default: obj};
 | 
						|
}
 | 
						|
/**
 | 
						|
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 | 
						|
 *
 | 
						|
 * This source code is licensed under the MIT license found in the
 | 
						|
 * LICENSE file in the root directory of this source tree.
 | 
						|
 */
 | 
						|
 | 
						|
const {ARROW, CLEAR} = _jestUtil().specialChars;
 | 
						|
class SnapshotInteractiveMode {
 | 
						|
  _pipe;
 | 
						|
  _isActive;
 | 
						|
  _updateTestRunnerConfig;
 | 
						|
  _testAssertions;
 | 
						|
  _countPaths;
 | 
						|
  _skippedNum;
 | 
						|
  constructor(pipe) {
 | 
						|
    this._pipe = pipe;
 | 
						|
    this._isActive = false;
 | 
						|
    this._skippedNum = 0;
 | 
						|
  }
 | 
						|
  isActive() {
 | 
						|
    return this._isActive;
 | 
						|
  }
 | 
						|
  getSkippedNum() {
 | 
						|
    return this._skippedNum;
 | 
						|
  }
 | 
						|
  _clearTestSummary() {
 | 
						|
    this._pipe.write(_ansiEscapes().default.cursorUp(6));
 | 
						|
    this._pipe.write(_ansiEscapes().default.eraseDown);
 | 
						|
  }
 | 
						|
  _drawUIProgress() {
 | 
						|
    this._clearTestSummary();
 | 
						|
    const numPass = this._countPaths - this._testAssertions.length;
 | 
						|
    const numRemaining = this._countPaths - numPass - this._skippedNum;
 | 
						|
    let stats = _chalk().default.bold.dim(
 | 
						|
      `${(0, _jestUtil().pluralize)('snapshot', numRemaining)} remaining`
 | 
						|
    );
 | 
						|
    if (numPass) {
 | 
						|
      stats += `, ${_chalk().default.bold.green(
 | 
						|
        `${(0, _jestUtil().pluralize)('snapshot', numPass)} updated`
 | 
						|
      )}`;
 | 
						|
    }
 | 
						|
    if (this._skippedNum) {
 | 
						|
      stats += `, ${_chalk().default.bold.yellow(
 | 
						|
        `${(0, _jestUtil().pluralize)('snapshot', this._skippedNum)} skipped`
 | 
						|
      )}`;
 | 
						|
    }
 | 
						|
    const messages = [
 | 
						|
      `\n${_chalk().default.bold('Interactive Snapshot Progress')}`,
 | 
						|
      ARROW + stats,
 | 
						|
      `\n${_chalk().default.bold('Watch Usage')}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}u${_chalk().default.dim(
 | 
						|
        ' to update failing snapshots for this test.'
 | 
						|
      )}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}s${_chalk().default.dim(
 | 
						|
        ' to skip the current test.'
 | 
						|
      )}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}q${_chalk().default.dim(
 | 
						|
        ' to quit Interactive Snapshot Mode.'
 | 
						|
      )}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}Enter${_chalk().default.dim(
 | 
						|
        ' to trigger a test run.'
 | 
						|
      )}`
 | 
						|
    ];
 | 
						|
    this._pipe.write(`${messages.filter(Boolean).join('\n')}\n`);
 | 
						|
  }
 | 
						|
  _drawUIDoneWithSkipped() {
 | 
						|
    this._pipe.write(CLEAR);
 | 
						|
    const numPass = this._countPaths - this._testAssertions.length;
 | 
						|
    let stats = _chalk().default.bold.dim(
 | 
						|
      `${(0, _jestUtil().pluralize)('snapshot', this._countPaths)} reviewed`
 | 
						|
    );
 | 
						|
    if (numPass) {
 | 
						|
      stats += `, ${_chalk().default.bold.green(
 | 
						|
        `${(0, _jestUtil().pluralize)('snapshot', numPass)} updated`
 | 
						|
      )}`;
 | 
						|
    }
 | 
						|
    if (this._skippedNum) {
 | 
						|
      stats += `, ${_chalk().default.bold.yellow(
 | 
						|
        `${(0, _jestUtil().pluralize)('snapshot', this._skippedNum)} skipped`
 | 
						|
      )}`;
 | 
						|
    }
 | 
						|
    const messages = [
 | 
						|
      `\n${_chalk().default.bold('Interactive Snapshot Result')}`,
 | 
						|
      ARROW + stats,
 | 
						|
      `\n${_chalk().default.bold('Watch Usage')}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}r${_chalk().default.dim(
 | 
						|
        ' to restart Interactive Snapshot Mode.'
 | 
						|
      )}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}q${_chalk().default.dim(
 | 
						|
        ' to quit Interactive Snapshot Mode.'
 | 
						|
      )}`
 | 
						|
    ];
 | 
						|
    this._pipe.write(`${messages.filter(Boolean).join('\n')}\n`);
 | 
						|
  }
 | 
						|
  _drawUIDone() {
 | 
						|
    this._pipe.write(CLEAR);
 | 
						|
    const numPass = this._countPaths - this._testAssertions.length;
 | 
						|
    let stats = _chalk().default.bold.dim(
 | 
						|
      `${(0, _jestUtil().pluralize)('snapshot', this._countPaths)} reviewed`
 | 
						|
    );
 | 
						|
    if (numPass) {
 | 
						|
      stats += `, ${_chalk().default.bold.green(
 | 
						|
        `${(0, _jestUtil().pluralize)('snapshot', numPass)} updated`
 | 
						|
      )}`;
 | 
						|
    }
 | 
						|
    const messages = [
 | 
						|
      `\n${_chalk().default.bold('Interactive Snapshot Result')}`,
 | 
						|
      ARROW + stats,
 | 
						|
      `\n${_chalk().default.bold('Watch Usage')}`,
 | 
						|
      `${_chalk().default.dim(`${ARROW}Press `)}Enter${_chalk().default.dim(
 | 
						|
        ' to return to watch mode.'
 | 
						|
      )}`
 | 
						|
    ];
 | 
						|
    this._pipe.write(`${messages.filter(Boolean).join('\n')}\n`);
 | 
						|
  }
 | 
						|
  _drawUIOverlay() {
 | 
						|
    if (this._testAssertions.length === 0) {
 | 
						|
      return this._drawUIDone();
 | 
						|
    }
 | 
						|
    if (this._testAssertions.length - this._skippedNum === 0) {
 | 
						|
      return this._drawUIDoneWithSkipped();
 | 
						|
    }
 | 
						|
    return this._drawUIProgress();
 | 
						|
  }
 | 
						|
  put(key) {
 | 
						|
    switch (key) {
 | 
						|
      case 's':
 | 
						|
        if (this._skippedNum === this._testAssertions.length) break;
 | 
						|
        this._skippedNum += 1;
 | 
						|
 | 
						|
        // move skipped test to the end
 | 
						|
        this._testAssertions.push(this._testAssertions.shift());
 | 
						|
        if (this._testAssertions.length - this._skippedNum > 0) {
 | 
						|
          this._run(false);
 | 
						|
        } else {
 | 
						|
          this._drawUIDoneWithSkipped();
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case 'u':
 | 
						|
        this._run(true);
 | 
						|
        break;
 | 
						|
      case 'q':
 | 
						|
      case _jestWatcher().KEYS.ESCAPE:
 | 
						|
        this.abort();
 | 
						|
        break;
 | 
						|
      case 'r':
 | 
						|
        this.restart();
 | 
						|
        break;
 | 
						|
      case _jestWatcher().KEYS.ENTER:
 | 
						|
        if (this._testAssertions.length === 0) {
 | 
						|
          this.abort();
 | 
						|
        } else {
 | 
						|
          this._run(false);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  abort() {
 | 
						|
    this._isActive = false;
 | 
						|
    this._skippedNum = 0;
 | 
						|
    this._updateTestRunnerConfig(null, false);
 | 
						|
  }
 | 
						|
  restart() {
 | 
						|
    this._skippedNum = 0;
 | 
						|
    this._countPaths = this._testAssertions.length;
 | 
						|
    this._run(false);
 | 
						|
  }
 | 
						|
  updateWithResults(results) {
 | 
						|
    const hasSnapshotFailure = !!results.snapshot.failure;
 | 
						|
    if (hasSnapshotFailure) {
 | 
						|
      this._drawUIOverlay();
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    this._testAssertions.shift();
 | 
						|
    if (this._testAssertions.length - this._skippedNum === 0) {
 | 
						|
      this._drawUIOverlay();
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Go to the next test
 | 
						|
    this._run(false);
 | 
						|
  }
 | 
						|
  _run(shouldUpdateSnapshot) {
 | 
						|
    const testAssertion = this._testAssertions[0];
 | 
						|
    this._updateTestRunnerConfig(testAssertion, shouldUpdateSnapshot);
 | 
						|
  }
 | 
						|
  run(failedSnapshotTestAssertions, onConfigChange) {
 | 
						|
    if (!failedSnapshotTestAssertions.length) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    this._testAssertions = [...failedSnapshotTestAssertions];
 | 
						|
    this._countPaths = this._testAssertions.length;
 | 
						|
    this._updateTestRunnerConfig = onConfigChange;
 | 
						|
    this._isActive = true;
 | 
						|
    this._run(false);
 | 
						|
  }
 | 
						|
}
 | 
						|
exports.default = SnapshotInteractiveMode;
 |