UNPKG

4.94 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.removeTrimmingDots = exports.formatTestNameByPattern = exports.highlight = exports.getTerminalWidth = exports.trimAndFormatPath = void 0;
7
8var _path = _interopRequireDefault(require("path"));
9
10var _chalk = _interopRequireDefault(require("chalk"));
11
12var _slash = _interopRequireDefault(require("slash"));
13
14var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
15
16function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
18const TRIMMING_DOTS = '...';
19const ENTER = '⏎';
20
21const relativePath = (config, testPath) => {
22 const relativeTestPath = _path.default.relative(config.cwd || config.rootDir, testPath);
23
24 const dirname = _path.default.dirname(relativeTestPath);
25
26 const basename = _path.default.basename(relativeTestPath);
27
28 return {
29 basename,
30 dirname
31 };
32};
33
34const colorize = (str, start, end) => _chalk.default.dim(str.slice(0, start)) + _chalk.default.reset(str.slice(start, end)) + _chalk.default.dim(str.slice(end));
35
36const trimAndFormatPath = (pad, config, testPath, columns) => {
37 const maxLength = columns - pad;
38 const relative = relativePath(config, testPath);
39 const {
40 basename
41 } = relative;
42 let {
43 dirname
44 } = relative; // length is ok
45
46 if ((dirname + _path.default.sep + basename).length <= maxLength) {
47 return (0, _slash.default)(_chalk.default.dim(dirname + _path.default.sep) + _chalk.default.bold(basename));
48 } // we can fit trimmed dirname and full basename
49
50
51 const basenameLength = basename.length;
52
53 if (basenameLength + 4 < maxLength) {
54 const dirnameLength = maxLength - 4 - basenameLength;
55 dirname = `${TRIMMING_DOTS}${dirname.slice(dirname.length - dirnameLength, dirname.length)}`;
56 return (0, _slash.default)(_chalk.default.dim(dirname + _path.default.sep) + _chalk.default.bold(basename));
57 }
58
59 if (basenameLength + 4 === maxLength) {
60 return (0, _slash.default)(_chalk.default.dim(`${TRIMMING_DOTS}${_path.default.sep}`) + _chalk.default.bold(basename));
61 } // can't fit dirname, but can fit trimmed basename
62
63
64 return (0, _slash.default)(_chalk.default.bold(`${TRIMMING_DOTS}${basename.slice(-maxLength + 3)}`));
65};
66
67exports.trimAndFormatPath = trimAndFormatPath;
68
69const getTerminalWidth = (pipe = process.stdout) => pipe.columns;
70
71exports.getTerminalWidth = getTerminalWidth;
72
73const highlight = (rawPath, filePath, pattern) => {
74 const relativePathHead = './';
75 let regexp;
76
77 try {
78 regexp = new RegExp(pattern, 'i');
79 } catch (e) {
80 return _chalk.default.dim(filePath);
81 }
82
83 const strippedRawPath = (0, _stripAnsi.default)(rawPath);
84 const strippedFilePath = (0, _stripAnsi.default)(filePath);
85 const match = strippedRawPath.match(regexp);
86
87 if (!match || match.index == null) {
88 return _chalk.default.dim(strippedFilePath);
89 }
90
91 const offset = strippedRawPath.length - strippedFilePath.length;
92 let trimLength;
93
94 if (strippedFilePath.startsWith(TRIMMING_DOTS)) {
95 trimLength = TRIMMING_DOTS.length;
96 } else if (strippedFilePath.startsWith(relativePathHead)) {
97 trimLength = relativePathHead.length;
98 } else {
99 trimLength = 0;
100 }
101
102 const start = match.index - offset;
103 const end = start + match[0].length;
104 return colorize(strippedFilePath, Math.max(start, 0), Math.max(end, trimLength));
105};
106
107exports.highlight = highlight;
108
109const formatTestNameByPattern = (testName, pattern, width) => {
110 const inlineTestName = testName.replace(/(\r\n|\n|\r)/gm, ENTER);
111 let regexp;
112
113 try {
114 regexp = new RegExp(pattern, 'i');
115 } catch (e) {
116 return _chalk.default.dim(inlineTestName);
117 }
118
119 const match = inlineTestName.match(regexp);
120
121 if (!match || match.index == null) {
122 return _chalk.default.dim(inlineTestName);
123 }
124
125 const startPatternIndex = Math.max(match.index, 0);
126 const endPatternIndex = startPatternIndex + match[0].length;
127 const testNameFitsInTerminal = inlineTestName.length <= width;
128
129 if (testNameFitsInTerminal) {
130 return colorize(inlineTestName, startPatternIndex, endPatternIndex);
131 }
132
133 const numberOfTruncatedChars = TRIMMING_DOTS.length + inlineTestName.length - width;
134 const end = Math.max(endPatternIndex - numberOfTruncatedChars, 0);
135 const truncatedTestName = inlineTestName.slice(numberOfTruncatedChars);
136 const shouldHighlightDots = startPatternIndex <= numberOfTruncatedChars;
137
138 if (shouldHighlightDots) {
139 return colorize(TRIMMING_DOTS + truncatedTestName, 0, end + TRIMMING_DOTS.length);
140 }
141
142 const start = startPatternIndex - numberOfTruncatedChars;
143 return colorize(TRIMMING_DOTS + truncatedTestName, start + TRIMMING_DOTS.length, end + TRIMMING_DOTS.length);
144};
145
146exports.formatTestNameByPattern = formatTestNameByPattern;
147
148const removeTrimmingDots = value => {
149 if (value.startsWith(TRIMMING_DOTS)) {
150 return value.slice(TRIMMING_DOTS.length);
151 }
152
153 return value;
154};
155
156exports.removeTrimmingDots = removeTrimmingDots;
\No newline at end of file