Spaces:
Sleeping
Sleeping
; | |
Object.defineProperty(exports, '__esModule', { | |
value: true | |
}); | |
exports.wrapAnsiString = | |
exports.trimAndFormatPath = | |
exports.relativePath = | |
exports.printDisplayName = | |
exports.getSummary = | |
exports.formatTestPath = | |
void 0; | |
function path() { | |
const data = _interopRequireWildcard(require('path')); | |
path = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _chalk() { | |
const data = _interopRequireDefault(require('chalk')); | |
_chalk = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _slash() { | |
const data = _interopRequireDefault(require('slash')); | |
_slash = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _jestUtil() { | |
const data = require('jest-util'); | |
_jestUtil = function () { | |
return data; | |
}; | |
return data; | |
} | |
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; | |
} | |
/** | |
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | |
* | |
* This source code is licensed under the MIT license found in the | |
* LICENSE file in the root directory of this source tree. | |
*/ | |
const PROGRESS_BAR_WIDTH = 40; | |
const printDisplayName = config => { | |
const {displayName} = config; | |
const white = _chalk().default.reset.inverse.white; | |
if (!displayName) { | |
return ''; | |
} | |
const {name, color} = displayName; | |
const chosenColor = _chalk().default.reset.inverse[color] | |
? _chalk().default.reset.inverse[color] | |
: white; | |
return _chalk().default.supportsColor ? chosenColor(` ${name} `) : name; | |
}; | |
exports.printDisplayName = printDisplayName; | |
const trimAndFormatPath = (pad, config, testPath, columns) => { | |
const maxLength = columns - pad; | |
const relative = relativePath(config, testPath); | |
const {basename} = relative; | |
let {dirname} = relative; // length is ok | |
if ((dirname + path().sep + basename).length <= maxLength) { | |
return (0, _slash().default)( | |
_chalk().default.dim(dirname + path().sep) + | |
_chalk().default.bold(basename) | |
); | |
} // we can fit trimmed dirname and full basename | |
const basenameLength = basename.length; | |
if (basenameLength + 4 < maxLength) { | |
const dirnameLength = maxLength - 4 - basenameLength; | |
dirname = | |
'...' + dirname.slice(dirname.length - dirnameLength, dirname.length); | |
return (0, _slash().default)( | |
_chalk().default.dim(dirname + path().sep) + | |
_chalk().default.bold(basename) | |
); | |
} | |
if (basenameLength + 4 === maxLength) { | |
return (0, _slash().default)( | |
_chalk().default.dim('...' + path().sep) + _chalk().default.bold(basename) | |
); | |
} // can't fit dirname, but can fit trimmed basename | |
return (0, _slash().default)( | |
_chalk().default.bold( | |
'...' + basename.slice(basename.length - maxLength - 4, basename.length) | |
) | |
); | |
}; | |
exports.trimAndFormatPath = trimAndFormatPath; | |
const formatTestPath = (config, testPath) => { | |
const {dirname, basename} = relativePath(config, testPath); | |
return (0, _slash().default)( | |
_chalk().default.dim(dirname + path().sep) + _chalk().default.bold(basename) | |
); | |
}; | |
exports.formatTestPath = formatTestPath; | |
const relativePath = (config, testPath) => { | |
// this function can be called with ProjectConfigs or GlobalConfigs. GlobalConfigs | |
// do not have config.cwd, only config.rootDir. Try using config.cwd, fallback | |
// to config.rootDir. (Also, some unit just use config.rootDir, which is ok) | |
testPath = path().relative(config.cwd || config.rootDir, testPath); | |
const dirname = path().dirname(testPath); | |
const basename = path().basename(testPath); | |
return { | |
basename, | |
dirname | |
}; | |
}; | |
exports.relativePath = relativePath; | |
const getValuesCurrentTestCases = (currentTestCases = []) => { | |
let numFailingTests = 0; | |
let numPassingTests = 0; | |
let numPendingTests = 0; | |
let numTodoTests = 0; | |
let numTotalTests = 0; | |
currentTestCases.forEach(testCase => { | |
switch (testCase.testCaseResult.status) { | |
case 'failed': { | |
numFailingTests++; | |
break; | |
} | |
case 'passed': { | |
numPassingTests++; | |
break; | |
} | |
case 'skipped': { | |
numPendingTests++; | |
break; | |
} | |
case 'todo': { | |
numTodoTests++; | |
break; | |
} | |
} | |
numTotalTests++; | |
}); | |
return { | |
numFailingTests, | |
numPassingTests, | |
numPendingTests, | |
numTodoTests, | |
numTotalTests | |
}; | |
}; | |
const getSummary = (aggregatedResults, options) => { | |
let runTime = (Date.now() - aggregatedResults.startTime) / 1000; | |
if (options && options.roundTime) { | |
runTime = Math.floor(runTime); | |
} | |
const valuesForCurrentTestCases = getValuesCurrentTestCases( | |
options === null || options === void 0 ? void 0 : options.currentTestCases | |
); | |
const estimatedTime = (options && options.estimatedTime) || 0; | |
const snapshotResults = aggregatedResults.snapshot; | |
const snapshotsAdded = snapshotResults.added; | |
const snapshotsFailed = snapshotResults.unmatched; | |
const snapshotsOutdated = snapshotResults.unchecked; | |
const snapshotsFilesRemoved = snapshotResults.filesRemoved; | |
const snapshotsDidUpdate = snapshotResults.didUpdate; | |
const snapshotsPassed = snapshotResults.matched; | |
const snapshotsTotal = snapshotResults.total; | |
const snapshotsUpdated = snapshotResults.updated; | |
const suitesFailed = aggregatedResults.numFailedTestSuites; | |
const suitesPassed = aggregatedResults.numPassedTestSuites; | |
const suitesPending = aggregatedResults.numPendingTestSuites; | |
const suitesRun = suitesFailed + suitesPassed; | |
const suitesTotal = aggregatedResults.numTotalTestSuites; | |
const testsFailed = aggregatedResults.numFailedTests; | |
const testsPassed = aggregatedResults.numPassedTests; | |
const testsPending = aggregatedResults.numPendingTests; | |
const testsTodo = aggregatedResults.numTodoTests; | |
const testsTotal = aggregatedResults.numTotalTests; | |
const width = (options && options.width) || 0; | |
const suites = | |
_chalk().default.bold('Test Suites: ') + | |
(suitesFailed | |
? _chalk().default.bold.red(`${suitesFailed} failed`) + ', ' | |
: '') + | |
(suitesPending | |
? _chalk().default.bold.yellow(`${suitesPending} skipped`) + ', ' | |
: '') + | |
(suitesPassed | |
? _chalk().default.bold.green(`${suitesPassed} passed`) + ', ' | |
: '') + | |
(suitesRun !== suitesTotal | |
? suitesRun + ' of ' + suitesTotal | |
: suitesTotal) + | |
' total'; | |
const updatedTestsFailed = | |
testsFailed + valuesForCurrentTestCases.numFailingTests; | |
const updatedTestsPending = | |
testsPending + valuesForCurrentTestCases.numPendingTests; | |
const updatedTestsTodo = testsTodo + valuesForCurrentTestCases.numTodoTests; | |
const updatedTestsPassed = | |
testsPassed + valuesForCurrentTestCases.numPassingTests; | |
const updatedTestsTotal = | |
testsTotal + valuesForCurrentTestCases.numTotalTests; | |
const tests = | |
_chalk().default.bold('Tests: ') + | |
(updatedTestsFailed > 0 | |
? _chalk().default.bold.red(`${updatedTestsFailed} failed`) + ', ' | |
: '') + | |
(updatedTestsPending > 0 | |
? _chalk().default.bold.yellow(`${updatedTestsPending} skipped`) + ', ' | |
: '') + | |
(updatedTestsTodo > 0 | |
? _chalk().default.bold.magenta(`${updatedTestsTodo} todo`) + ', ' | |
: '') + | |
(updatedTestsPassed > 0 | |
? _chalk().default.bold.green(`${updatedTestsPassed} passed`) + ', ' | |
: '') + | |
`${updatedTestsTotal} total`; | |
const snapshots = | |
_chalk().default.bold('Snapshots: ') + | |
(snapshotsFailed | |
? _chalk().default.bold.red(`${snapshotsFailed} failed`) + ', ' | |
: '') + | |
(snapshotsOutdated && !snapshotsDidUpdate | |
? _chalk().default.bold.yellow(`${snapshotsOutdated} obsolete`) + ', ' | |
: '') + | |
(snapshotsOutdated && snapshotsDidUpdate | |
? _chalk().default.bold.green(`${snapshotsOutdated} removed`) + ', ' | |
: '') + | |
(snapshotsFilesRemoved && !snapshotsDidUpdate | |
? _chalk().default.bold.yellow( | |
(0, _jestUtil().pluralize)('file', snapshotsFilesRemoved) + | |
' obsolete' | |
) + ', ' | |
: '') + | |
(snapshotsFilesRemoved && snapshotsDidUpdate | |
? _chalk().default.bold.green( | |
(0, _jestUtil().pluralize)('file', snapshotsFilesRemoved) + ' removed' | |
) + ', ' | |
: '') + | |
(snapshotsUpdated | |
? _chalk().default.bold.green(`${snapshotsUpdated} updated`) + ', ' | |
: '') + | |
(snapshotsAdded | |
? _chalk().default.bold.green(`${snapshotsAdded} written`) + ', ' | |
: '') + | |
(snapshotsPassed | |
? _chalk().default.bold.green(`${snapshotsPassed} passed`) + ', ' | |
: '') + | |
`${snapshotsTotal} total`; | |
const time = renderTime(runTime, estimatedTime, width); | |
return [suites, tests, snapshots, time].join('\n'); | |
}; | |
exports.getSummary = getSummary; | |
const renderTime = (runTime, estimatedTime, width) => { | |
// If we are more than one second over the estimated time, highlight it. | |
const renderedTime = | |
estimatedTime && runTime >= estimatedTime + 1 | |
? _chalk().default.bold.yellow((0, _jestUtil().formatTime)(runTime, 0)) | |
: (0, _jestUtil().formatTime)(runTime, 0); | |
let time = _chalk().default.bold('Time:') + ` ${renderedTime}`; | |
if (runTime < estimatedTime) { | |
time += `, estimated ${(0, _jestUtil().formatTime)(estimatedTime, 0)}`; | |
} // Only show a progress bar if the test run is actually going to take | |
// some time. | |
if (estimatedTime > 2 && runTime < estimatedTime && width) { | |
const availableWidth = Math.min(PROGRESS_BAR_WIDTH, width); | |
const length = Math.min( | |
Math.floor((runTime / estimatedTime) * availableWidth), | |
availableWidth | |
); | |
if (availableWidth >= 2) { | |
time += | |
'\n' + | |
_chalk().default.green('β').repeat(length) + | |
_chalk() | |
.default.white('β') | |
.repeat(availableWidth - length); | |
} | |
} | |
return time; | |
}; // word-wrap a string that contains ANSI escape sequences. | |
// ANSI escape sequences do not add to the string length. | |
const wrapAnsiString = (string, terminalWidth) => { | |
if (terminalWidth === 0) { | |
// if the terminal width is zero, don't bother word-wrapping | |
return string; | |
} | |
const ANSI_REGEXP = /[\u001b\u009b]\[\d{1,2}m/gu; | |
const tokens = []; | |
let lastIndex = 0; | |
let match; | |
while ((match = ANSI_REGEXP.exec(string))) { | |
const ansi = match[0]; | |
const index = match['index']; | |
if (index != lastIndex) { | |
tokens.push(['string', string.slice(lastIndex, index)]); | |
} | |
tokens.push(['ansi', ansi]); | |
lastIndex = index + ansi.length; | |
} | |
if (lastIndex != string.length - 1) { | |
tokens.push(['string', string.slice(lastIndex, string.length)]); | |
} | |
let lastLineLength = 0; | |
return tokens | |
.reduce( | |
(lines, [kind, token]) => { | |
if (kind === 'string') { | |
if (lastLineLength + token.length > terminalWidth) { | |
while (token.length) { | |
const chunk = token.slice(0, terminalWidth - lastLineLength); | |
const remaining = token.slice( | |
terminalWidth - lastLineLength, | |
token.length | |
); | |
lines[lines.length - 1] += chunk; | |
lastLineLength += chunk.length; | |
token = remaining; | |
if (token.length) { | |
lines.push(''); | |
lastLineLength = 0; | |
} | |
} | |
} else { | |
lines[lines.length - 1] += token; | |
lastLineLength += token.length; | |
} | |
} else { | |
lines[lines.length - 1] += token; | |
} | |
return lines; | |
}, | |
[''] | |
) | |
.join('\n'); | |
}; | |
exports.wrapAnsiString = wrapAnsiString; | |