1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.removeTrimmingDots = exports.formatTestNameByPattern = exports.highlight = exports.getTerminalWidth = exports.trimAndFormatPath = void 0;
|
7 |
|
8 | var _path = _interopRequireDefault(require("path"));
|
9 |
|
10 | var _chalk = _interopRequireDefault(require("chalk"));
|
11 |
|
12 | var _slash = _interopRequireDefault(require("slash"));
|
13 |
|
14 | var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
|
15 |
|
16 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17 |
|
18 | const TRIMMING_DOTS = '...';
|
19 | const ENTER = '⏎';
|
20 |
|
21 | const 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 |
|
34 | const 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 |
|
36 | const 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;
|
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 | }
|
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 | }
|
62 |
|
63 |
|
64 | return (0, _slash.default)(_chalk.default.bold(`${TRIMMING_DOTS}${basename.slice(-maxLength + 3)}`));
|
65 | };
|
66 |
|
67 | exports.trimAndFormatPath = trimAndFormatPath;
|
68 |
|
69 | const getTerminalWidth = (pipe = process.stdout) => pipe.columns;
|
70 |
|
71 | exports.getTerminalWidth = getTerminalWidth;
|
72 |
|
73 | const 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 |
|
107 | exports.highlight = highlight;
|
108 |
|
109 | const 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 |
|
146 | exports.formatTestNameByPattern = formatTestNameByPattern;
|
147 |
|
148 | const removeTrimmingDots = value => {
|
149 | if (value.startsWith(TRIMMING_DOTS)) {
|
150 | return value.slice(TRIMMING_DOTS.length);
|
151 | }
|
152 |
|
153 | return value;
|
154 | };
|
155 |
|
156 | exports.removeTrimmingDots = removeTrimmingDots; |
\ | No newline at end of file |