orionsoft-react-scripts
Version:
Orionsoft Configuration and scripts for Create React App.
262 lines (214 loc) • 7.75 kB
JavaScript
/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*
*/
;var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();
const chalk = require('chalk');
const path = require('path');
const PROGRESS_BAR_WIDTH = 40;
const trimAndFormatPath = (
pad,
config,
testPath,
columns) =>
{
const maxLength = columns - pad;
const relative = relativePath(config, testPath);const
basename = relative.basename;let
dirname = relative.dirname;
// length is ok
if ((dirname + path.sep + basename).length <= maxLength) {
return chalk.dim(dirname + path.sep) + chalk.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 chalk.dim(dirname + path.sep) + chalk.bold(basename);
}
if (basenameLength + 4 === maxLength) {
return chalk.dim('...' + path.sep) + chalk.bold(basename);
}
// can't fit dirname, but can fit trimmed basename
return chalk.bold(
'...' +
basename.slice(basename.length - maxLength - 4, basename.length));
};
const formatTestPath = (config, testPath) => {var _relativePath =
relativePath(config, testPath);const dirname = _relativePath.dirname;const basename = _relativePath.basename;
return chalk.dim(dirname + path.sep) + chalk.bold(basename);
};
const relativePath = (config, testPath) => {
testPath = path.relative(config.rootDir, testPath);
const dirname = path.dirname(testPath);
const basename = path.basename(testPath);
return { dirname, basename };
};
const pluralize = (word, count) =>
`${ count } ${ word }${ count === 1 ? '' : 's' }`;
const getSummary = (
aggregatedResults,
options) =>
{
let runTime = (Date.now() - aggregatedResults.startTime) / 1000;
if (options && options.roundTime) {
runTime = Math.floor(runTime);
}
const estimatedTime = options && options.estimatedTime || 0;
const snapshotResults = aggregatedResults.snapshot;
const snapshotsAdded = snapshotResults.added;
const snapshotsFailed = snapshotResults.unmatched;
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 testsTotal = aggregatedResults.numTotalTests;
const width = options && options.width || 0;
const suites =
chalk.bold('Test Suites: ') + (
suitesFailed ? chalk.bold.red(`${ suitesFailed } failed`) + ', ' : '') + (
suitesPending ?
chalk.bold.yellow(`${ suitesPending } skipped`) + ', ' :
'') + (
suitesPassed ?
chalk.bold.green(`${ suitesPassed } passed`) + ', ' :
'') + (
suitesRun !== suitesTotal ?
suitesRun + ' of ' + suitesTotal :
suitesTotal) +
` total`;
const tests =
chalk.bold('Tests: ') + (
testsFailed ? chalk.bold.red(`${ testsFailed } failed`) + ', ' : '') + (
testsPending ?
chalk.bold.yellow(`${ testsPending } skipped`) + ', ' :
'') + (
testsPassed ?
chalk.bold.green(`${ testsPassed } passed`) + ', ' :
'') +
`${ testsTotal } total`;
const snapshots =
chalk.bold('Snapshots: ') + (
snapshotsFailed ?
chalk.bold.red(`${ snapshotsFailed } failed`) + ', ' :
'') + (
snapshotsUpdated ?
chalk.bold.green(`${ snapshotsUpdated } updated`) + ', ' :
'') + (
snapshotsAdded ?
chalk.bold.green(`${ snapshotsAdded } added`) + ', ' :
'') + (
snapshotsPassed ?
chalk.bold.green(`${ snapshotsPassed } passed`) + ', ' :
'') +
`${ snapshotsTotal } total`;
const time = renderTime(runTime, estimatedTime, width);
return [suites, tests, snapshots, time].join('\n');
};
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.bold.yellow(runTime + 's') :
runTime + 's';
let time = chalk.bold(`Time:`) + ` ${ renderedTime }`;
if (runTime < estimatedTime) {
time += `, estimated ${ estimatedTime }s`;
}
// 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.green.inverse(' ').repeat(length) +
chalk.white.inverse(' ').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/g;
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, _ref) => {var _ref2 = _slicedToArray(_ref, 2);let kind = _ref2[0];let token = _ref2[1];
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');
};
module.exports = {
formatTestPath,
getSummary,
pluralize,
relativePath,
trimAndFormatPath,
wrapAnsiString };