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;
|