You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
7.2 KiB
327 lines
7.2 KiB
'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}; |
|
} |
|
|
|
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 {ARROW, CLEAR} = _jestUtil().specialChars; |
|
|
|
class SnapshotInteractiveMode { |
|
constructor(pipe) { |
|
_defineProperty(this, '_pipe', void 0); |
|
|
|
_defineProperty(this, '_isActive', void 0); |
|
|
|
_defineProperty(this, '_updateTestRunnerConfig', void 0); |
|
|
|
_defineProperty(this, '_testAssertions', void 0); |
|
|
|
_defineProperty(this, '_countPaths', void 0); |
|
|
|
_defineProperty(this, '_skippedNum', void 0); |
|
|
|
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;
|
|
|