@rpcbase/test 0.357.0 → 0.358.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clearDatabase.js +12 -10
- package/dist/clearDatabase.js.map +1 -1
- package/dist/cli.js +556 -439
- package/dist/cli.js.map +1 -1
- package/dist/coverage/collect.js +101 -63
- package/dist/coverage/collect.js.map +1 -1
- package/dist/coverage/config-loader.js +230 -180
- package/dist/coverage/config-loader.js.map +1 -1
- package/dist/coverage/config.js +100 -76
- package/dist/coverage/config.js.map +1 -1
- package/dist/coverage/console-text-report.js +220 -175
- package/dist/coverage/console-text-report.js.map +1 -1
- package/dist/coverage/files.js +58 -45
- package/dist/coverage/files.js.map +1 -1
- package/dist/coverage/fixtures.js +38 -27
- package/dist/coverage/fixtures.js.map +1 -1
- package/dist/coverage/global-setup.js +18 -15
- package/dist/coverage/global-setup.js.map +1 -1
- package/dist/coverage/index.js +55 -38
- package/dist/coverage/index.js.map +1 -1
- package/dist/coverage/report.js +466 -341
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/reporter.js +60 -47
- package/dist/coverage/reporter.js.map +1 -1
- package/dist/coverage/v8-tracker.js +147 -115
- package/dist/coverage/v8-tracker.js.map +1 -1
- package/dist/index.js +75 -46
- package/dist/index.js.map +1 -1
- package/dist/runners/playwright.js +563 -438
- package/dist/runners/playwright.js.map +1 -1
- package/dist/runners/process.d.ts.map +1 -1
- package/dist/runners/process.js +183 -125
- package/dist/runners/process.js.map +1 -1
- package/dist/runners/vitest.js +171 -124
- package/dist/runners/vitest.js.map +1 -1
- package/dist/serverCoverage.js +42 -28
- package/dist/serverCoverage.js.map +1 -1
- package/dist/vitest.config.d.ts +1 -1
- package/dist/vitest.config.js +74 -62
- package/dist/vitest.config.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,205 +1,250 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var CONSOLE_SUMMARIZER = "rbCwd";
|
|
2
|
+
const DEFAULT_CONSOLE_MAX_COLS = 80;
|
|
3
|
+
const CONSOLE_SUMMARIZER = "rbCwd";
|
|
5
4
|
function generateConsoleTextCoverageReport(reports, context) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
const debug = resolveConsoleReportDebugInfo();
|
|
6
|
+
const summarizer = registerConsoleSummarizer(context);
|
|
7
|
+
writeConsoleReportDebugLog({
|
|
8
|
+
...debug,
|
|
9
|
+
summarizer
|
|
10
|
+
});
|
|
11
|
+
const reportOutput = createConsoleTextReportOutput(reports, context, {
|
|
12
|
+
maxCols: debug.maxCols + 20,
|
|
13
|
+
summarizer
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
output: stripUncoveredLineNumbersColumn(reportOutput),
|
|
17
|
+
summarizer
|
|
18
|
+
};
|
|
19
19
|
}
|
|
20
20
|
function resolveConsoleReportDebugInfo() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
const isTTY = Boolean(process.stdout.isTTY);
|
|
22
|
+
const stdoutColumns = process.stdout.columns;
|
|
23
|
+
const envColumns = process.env.COLUMNS;
|
|
24
|
+
const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns);
|
|
25
|
+
return {
|
|
26
|
+
isTTY,
|
|
27
|
+
stdoutColumns,
|
|
28
|
+
envColumns,
|
|
29
|
+
maxCols
|
|
30
|
+
};
|
|
30
31
|
}
|
|
31
32
|
function resolveConsoleMaxCols(stdoutColumns, envColumns) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
33
|
+
if (typeof stdoutColumns === "number" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {
|
|
34
|
+
return stdoutColumns;
|
|
35
|
+
}
|
|
36
|
+
const parsed = typeof envColumns === "string" ? Number.parseInt(envColumns, 10) : Number.NaN;
|
|
37
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
return DEFAULT_CONSOLE_MAX_COLS;
|
|
41
|
+
}
|
|
42
|
+
function writeConsoleReportDebugLog({
|
|
43
|
+
isTTY,
|
|
44
|
+
stdoutColumns,
|
|
45
|
+
envColumns,
|
|
46
|
+
maxCols,
|
|
47
|
+
summarizer
|
|
48
|
+
}) {
|
|
49
|
+
const message = ["[coverage] debug", `stdout.isTTY=${isTTY ? "1" : "0"}`, `stdout.columns=${stdoutColumns ?? "undefined"}`, `env.COLUMNS=${envColumns ?? "undefined"}`, `resolvedMaxCols=${maxCols}`, `summarizer=${summarizer ?? "undefined"}`].join(" ");
|
|
50
|
+
process.stderr.write(`${message}
|
|
51
|
+
`);
|
|
47
52
|
}
|
|
48
53
|
function createConsoleTextReportOutput(reports, context, options) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
54
|
+
const fileWriter = context?.writer;
|
|
55
|
+
const fileWriterCtor = fileWriter?.constructor;
|
|
56
|
+
if (!fileWriterCtor || typeof fileWriterCtor.startCapture !== "function" || typeof fileWriterCtor.stopCapture !== "function" || typeof fileWriterCtor.getOutput !== "function" || typeof fileWriterCtor.resetOutput !== "function") {
|
|
57
|
+
reports.create("text", {
|
|
58
|
+
maxCols: options.maxCols,
|
|
59
|
+
summarizer: options.summarizer
|
|
60
|
+
}).execute(context);
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
fileWriterCtor.resetOutput();
|
|
64
|
+
fileWriterCtor.startCapture();
|
|
65
|
+
try {
|
|
66
|
+
reports.create("text", {
|
|
67
|
+
maxCols: options.maxCols,
|
|
68
|
+
summarizer: options.summarizer
|
|
69
|
+
}).execute(context);
|
|
70
|
+
} finally {
|
|
71
|
+
fileWriterCtor.stopCapture();
|
|
72
|
+
}
|
|
73
|
+
const output = fileWriterCtor.getOutput();
|
|
74
|
+
fileWriterCtor.resetOutput();
|
|
75
|
+
return output;
|
|
70
76
|
}
|
|
71
77
|
function stripUncoveredLineNumbersColumn(output) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
const lines = output.split("\n");
|
|
79
|
+
const filtered = lines.map((line) => {
|
|
80
|
+
const parts = line.split("|");
|
|
81
|
+
if (parts.length < 6) {
|
|
82
|
+
return line.trimEnd();
|
|
83
|
+
}
|
|
84
|
+
return parts.slice(0, 5).join("|").trimEnd();
|
|
85
|
+
});
|
|
86
|
+
return filtered.join("\n");
|
|
77
87
|
}
|
|
78
88
|
function registerConsoleSummarizer(context) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
89
|
+
const summarizerFactory = context?._summarizerFactory;
|
|
90
|
+
if (!summarizerFactory || typeof summarizerFactory !== "object") {
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
93
|
+
if (CONSOLE_SUMMARIZER in summarizerFactory) {
|
|
94
|
+
return CONSOLE_SUMMARIZER;
|
|
95
|
+
}
|
|
96
|
+
const pkgTree = context.getTree?.("pkg");
|
|
97
|
+
const pkgRoot = pkgTree?.getRoot?.();
|
|
98
|
+
if (!pkgRoot) {
|
|
99
|
+
return void 0;
|
|
100
|
+
}
|
|
101
|
+
summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd());
|
|
102
|
+
return CONSOLE_SUMMARIZER;
|
|
86
103
|
}
|
|
87
104
|
function createCollapsedCwdTree(root, cwd) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
const treeRoot = createCwdTreeFromCoverage(root, cwd);
|
|
106
|
+
const clonedRoot = cloneReportNode(treeRoot, null);
|
|
107
|
+
return {
|
|
108
|
+
getRoot: () => clonedRoot,
|
|
109
|
+
visit: (visitor, state) => {
|
|
110
|
+
const fullVisitor = toFullVisitor(visitor);
|
|
111
|
+
fullVisitor.onStart(clonedRoot, state);
|
|
112
|
+
clonedRoot.visit(fullVisitor, state);
|
|
113
|
+
fullVisitor.onEnd(clonedRoot, state);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
98
116
|
}
|
|
99
117
|
function createCwdTreeFromCoverage(root, cwd) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
118
|
+
const proto = Object.getPrototypeOf(root);
|
|
119
|
+
const pathCtor = root?.path?.constructor;
|
|
120
|
+
const fileCoverages = [];
|
|
121
|
+
collectFileCoverages(root, fileCoverages);
|
|
122
|
+
const treeRoot = Object.create(proto);
|
|
123
|
+
treeRoot.path = pathCtor ? new pathCtor([]) : root.path;
|
|
124
|
+
treeRoot.fileCoverage = null;
|
|
125
|
+
treeRoot.parent = null;
|
|
126
|
+
treeRoot.children = [];
|
|
127
|
+
const dirNodes = /* @__PURE__ */ new Map();
|
|
128
|
+
dirNodes.set("", treeRoot);
|
|
129
|
+
for (const fileCoverage of fileCoverages) {
|
|
130
|
+
const absolutePath = path.resolve(String(fileCoverage?.path ?? ""));
|
|
131
|
+
if (!absolutePath) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
let relativePath = toPosix(path.relative(cwd, absolutePath));
|
|
135
|
+
if (!relativePath) {
|
|
136
|
+
relativePath = toPosix(absolutePath);
|
|
137
|
+
}
|
|
138
|
+
if (isInsideCwd(relativePath) && (relativePath === "src" || relativePath.startsWith("src/"))) {
|
|
139
|
+
relativePath = relativePath === "src" ? "" : relativePath.slice("src/".length);
|
|
140
|
+
}
|
|
141
|
+
if (!relativePath) {
|
|
142
|
+
relativePath = toPosix(path.basename(absolutePath));
|
|
143
|
+
}
|
|
144
|
+
const segments = relativePath.split("/").filter(Boolean);
|
|
145
|
+
if (segments.length === 0) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
let parent = treeRoot;
|
|
149
|
+
let prefix = "";
|
|
150
|
+
for (let i = 0; i < segments.length - 1; i += 1) {
|
|
151
|
+
prefix = prefix ? `${prefix}/${segments[i]}` : segments[i];
|
|
152
|
+
const existing = dirNodes.get(prefix);
|
|
153
|
+
if (existing) {
|
|
154
|
+
parent = existing;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const dirNode = Object.create(proto);
|
|
158
|
+
dirNode.path = pathCtor ? new pathCtor(prefix.split("/")) : root.path;
|
|
159
|
+
dirNode.fileCoverage = null;
|
|
160
|
+
dirNode.parent = parent;
|
|
161
|
+
dirNode.children = [];
|
|
162
|
+
parent.children.push(dirNode);
|
|
163
|
+
dirNodes.set(prefix, dirNode);
|
|
164
|
+
parent = dirNode;
|
|
165
|
+
}
|
|
166
|
+
const fileNode = Object.create(proto);
|
|
167
|
+
fileNode.path = pathCtor ? new pathCtor(segments) : root.path;
|
|
168
|
+
fileNode.fileCoverage = fileCoverage;
|
|
169
|
+
fileNode.parent = parent;
|
|
170
|
+
fileNode.children = [];
|
|
171
|
+
parent.children.push(fileNode);
|
|
172
|
+
}
|
|
173
|
+
sortReportTree(treeRoot);
|
|
174
|
+
return treeRoot;
|
|
147
175
|
}
|
|
148
176
|
function collectFileCoverages(node, out) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
177
|
+
if (!node || typeof node.isSummary !== "function") {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (!node.isSummary()) {
|
|
181
|
+
const fileCoverage = typeof node.getFileCoverage === "function" ? node.getFileCoverage() : node.fileCoverage;
|
|
182
|
+
if (fileCoverage) {
|
|
183
|
+
out.push(fileCoverage);
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const children = typeof node.getChildren === "function" ? node.getChildren() : [];
|
|
188
|
+
for (const child of children) {
|
|
189
|
+
collectFileCoverages(child, out);
|
|
190
|
+
}
|
|
157
191
|
}
|
|
158
192
|
function sortReportTree(node) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
193
|
+
const children = Array.isArray(node?.children) ? node.children : [];
|
|
194
|
+
if (children.length === 0) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
children.sort((a, b) => {
|
|
198
|
+
const aKey = typeof a?.path?.toString === "function" ? a.path.toString() : "";
|
|
199
|
+
const bKey = typeof b?.path?.toString === "function" ? b.path.toString() : "";
|
|
200
|
+
return aKey < bKey ? -1 : aKey > bKey ? 1 : 0;
|
|
201
|
+
});
|
|
202
|
+
for (const child of children) {
|
|
203
|
+
sortReportTree(child);
|
|
204
|
+
}
|
|
167
205
|
}
|
|
168
206
|
function isInsideCwd(relativePosix) {
|
|
169
|
-
|
|
170
|
-
|
|
207
|
+
if (!relativePosix) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return !(relativePosix === ".." || relativePosix.startsWith("../"));
|
|
171
211
|
}
|
|
172
212
|
function toPosix(input) {
|
|
173
|
-
|
|
213
|
+
return String(input ?? "").split(path.sep).join("/");
|
|
174
214
|
}
|
|
175
215
|
function toFullVisitor(visitor) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
216
|
+
const call = (method) => (node, state) => {
|
|
217
|
+
if (typeof visitor?.[method] === "function") {
|
|
218
|
+
visitor[method](node, state);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
return {
|
|
222
|
+
onStart: call("onStart"),
|
|
223
|
+
onEnd: call("onEnd"),
|
|
224
|
+
onSummary: call("onSummary"),
|
|
225
|
+
onSummaryEnd: call("onSummaryEnd"),
|
|
226
|
+
onDetail: call("onDetail")
|
|
227
|
+
};
|
|
186
228
|
}
|
|
187
229
|
function cloneReportNode(node, parent) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
230
|
+
const clone = Object.create(Object.getPrototypeOf(node));
|
|
231
|
+
clone.path = node.path;
|
|
232
|
+
clone.fileCoverage = node.fileCoverage;
|
|
233
|
+
clone.parent = parent;
|
|
234
|
+
const children = typeof node.getChildren === "function" ? node.getChildren() : [];
|
|
235
|
+
clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone));
|
|
236
|
+
return clone;
|
|
194
237
|
}
|
|
195
238
|
function cloneOrCollapseNode(node, parent) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
239
|
+
if (typeof node?.isSummary === "function" && node.isSummary() && typeof node.isRoot === "function" && !node.isRoot() && typeof node.getChildren === "function") {
|
|
240
|
+
const children = node.getChildren();
|
|
241
|
+
if (Array.isArray(children) && children.length === 1 && typeof children[0]?.isSummary === "function" && !children[0].isSummary()) {
|
|
242
|
+
return [cloneReportNode(children[0], parent)];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return [cloneReportNode(node, parent)];
|
|
246
|
+
}
|
|
247
|
+
export {
|
|
248
|
+
generateConsoleTextCoverageReport
|
|
249
|
+
};
|
|
250
|
+
//# sourceMappingURL=console-text-report.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-text-report.js","names":["path","DEFAULT_CONSOLE_MAX_COLS","CONSOLE_SUMMARIZER","generateConsoleTextCoverageReport","reports","context","output","summarizer","debug","resolveConsoleReportDebugInfo","registerConsoleSummarizer","writeConsoleReportDebugLog","reportOutput","createConsoleTextReportOutput","maxCols","stripUncoveredLineNumbersColumn","isTTY","stdoutColumns","envColumns","Boolean","process","stdout","columns","env","COLUMNS","resolveConsoleMaxCols","Number","isFinite","parsed","parseInt","NaN","message","join","stderr","write","options","fileWriter","writer","fileWriterCtor","constructor","startCapture","stopCapture","getOutput","resetOutput","create","execute","lines","split","filtered","map","line","parts","length","trimEnd","slice","summarizerFactory","_summarizerFactory","undefined","pkgTree","getTree","pkgRoot","getRoot","createCollapsedCwdTree","cwd","root","visit","visitor","state","treeRoot","createCwdTreeFromCoverage","clonedRoot","cloneReportNode","fullVisitor","toFullVisitor","onStart","onEnd","proto","Object","getPrototypeOf","pathCtor","fileCoverages","collectFileCoverages","fileCoverage","parent","children","dirNodes","Map","set","absolutePath","resolve","String","relativePath","toPosix","relative","isInsideCwd","startsWith","basename","segments","filter","prefix","i","existing","get","dirNode","push","fileNode","sortReportTree","node","out","isSummary","getFileCoverage","getChildren","child","Array","isArray","sort","a","b","aKey","toString","bKey","relativePosix","input","sep","onSummary","onSummaryEnd","onDetail","call","method","clone","flatMap","cloneOrCollapseNode","isRoot"],"sources":["../../src/coverage/console-text-report.ts"],"sourcesContent":["import path from \"node:path\"\n\n\nconst DEFAULT_CONSOLE_MAX_COLS = 80\nconst CONSOLE_SUMMARIZER = \"rbCwd\"\n\nexport function generateConsoleTextCoverageReport(\n reports: any,\n context: any,\n): { output: string; summarizer: string | undefined } {\n const debug = resolveConsoleReportDebugInfo()\n const summarizer = registerConsoleSummarizer(context)\n writeConsoleReportDebugLog({ ...debug, summarizer })\n\n const reportOutput = createConsoleTextReportOutput(reports, context, {\n maxCols: debug.maxCols + 20,\n summarizer,\n })\n\n return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer }\n}\n\nfunction resolveConsoleReportDebugInfo(): {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n} {\n const isTTY = Boolean(process.stdout.isTTY)\n const stdoutColumns = process.stdout.columns\n const envColumns = process.env.COLUMNS\n const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns)\n\n return { isTTY, stdoutColumns, envColumns, maxCols }\n}\n\nfunction resolveConsoleMaxCols(stdoutColumns: number | undefined, envColumns: string | undefined): number {\n if (typeof stdoutColumns === \"number\" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {\n return stdoutColumns\n }\n\n const parsed = typeof envColumns === \"string\" ? Number.parseInt(envColumns, 10) : Number.NaN\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n\n return DEFAULT_CONSOLE_MAX_COLS\n}\n\nfunction writeConsoleReportDebugLog({\n isTTY,\n stdoutColumns,\n envColumns,\n maxCols,\n summarizer,\n}: {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n summarizer: string | undefined\n}): void {\n const message = [\n \"[coverage] debug\",\n `stdout.isTTY=${isTTY ? \"1\" : \"0\"}`,\n `stdout.columns=${stdoutColumns ?? \"undefined\"}`,\n `env.COLUMNS=${envColumns ?? \"undefined\"}`,\n `resolvedMaxCols=${maxCols}`,\n `summarizer=${summarizer ?? \"undefined\"}`,\n ].join(\" \")\n\n process.stderr.write(`${message}\\n`)\n}\n\nfunction createConsoleTextReportOutput(\n reports: any,\n context: any,\n options: { maxCols: number; summarizer?: string },\n): string {\n const fileWriter = context?.writer\n const fileWriterCtor = fileWriter?.constructor\n\n if (\n !fileWriterCtor\n || typeof fileWriterCtor.startCapture !== \"function\"\n || typeof fileWriterCtor.stopCapture !== \"function\"\n || typeof fileWriterCtor.getOutput !== \"function\"\n || typeof fileWriterCtor.resetOutput !== \"function\"\n ) {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n return \"\"\n }\n\n fileWriterCtor.resetOutput()\n fileWriterCtor.startCapture()\n try {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n } finally {\n fileWriterCtor.stopCapture()\n }\n const output = fileWriterCtor.getOutput()\n fileWriterCtor.resetOutput()\n return output\n}\n\nfunction stripUncoveredLineNumbersColumn(output: string): string {\n const lines = output.split(\"\\n\")\n const filtered = lines.map((line) => {\n const parts = line.split(\"|\")\n if (parts.length < 6) {\n return line.trimEnd()\n }\n return parts.slice(0, 5).join(\"|\").trimEnd()\n })\n return filtered.join(\"\\n\")\n}\n\nfunction registerConsoleSummarizer(context: any): string | undefined {\n const summarizerFactory = context?._summarizerFactory\n if (!summarizerFactory || typeof summarizerFactory !== \"object\") {\n return undefined\n }\n\n if (CONSOLE_SUMMARIZER in summarizerFactory) {\n return CONSOLE_SUMMARIZER\n }\n\n const pkgTree = context.getTree?.(\"pkg\")\n const pkgRoot = pkgTree?.getRoot?.()\n if (!pkgRoot) {\n return undefined\n }\n\n summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd())\n return CONSOLE_SUMMARIZER\n}\n\nfunction createCollapsedCwdTree(\n root: any,\n cwd: string,\n): { getRoot: () => any; visit: (visitor: any, state: any) => void } {\n const treeRoot = createCwdTreeFromCoverage(root, cwd)\n const clonedRoot = cloneReportNode(treeRoot, null)\n return {\n getRoot: () => clonedRoot,\n visit: (visitor: any, state: any) => {\n const fullVisitor = toFullVisitor(visitor)\n fullVisitor.onStart(clonedRoot, state)\n clonedRoot.visit(fullVisitor, state)\n fullVisitor.onEnd(clonedRoot, state)\n },\n }\n}\n\nfunction createCwdTreeFromCoverage(root: any, cwd: string): any {\n const proto = Object.getPrototypeOf(root)\n const pathCtor = root?.path?.constructor\n\n const fileCoverages: any[] = []\n collectFileCoverages(root, fileCoverages)\n\n const treeRoot = Object.create(proto)\n treeRoot.path = pathCtor ? new pathCtor([]) : root.path\n treeRoot.fileCoverage = null\n treeRoot.parent = null\n treeRoot.children = []\n\n const dirNodes = new Map<string, any>()\n dirNodes.set(\"\", treeRoot)\n\n for (const fileCoverage of fileCoverages) {\n const absolutePath = path.resolve(String(fileCoverage?.path ?? \"\"))\n if (!absolutePath) {\n continue\n }\n\n let relativePath = toPosix(path.relative(cwd, absolutePath))\n if (!relativePath) {\n relativePath = toPosix(absolutePath)\n }\n\n if (isInsideCwd(relativePath) && (relativePath === \"src\" || relativePath.startsWith(\"src/\"))) {\n relativePath = relativePath === \"src\" ? \"\" : relativePath.slice(\"src/\".length)\n }\n\n if (!relativePath) {\n relativePath = toPosix(path.basename(absolutePath))\n }\n\n const segments = relativePath.split(\"/\").filter(Boolean)\n if (segments.length === 0) {\n continue\n }\n\n let parent = treeRoot\n let prefix = \"\"\n\n for (let i = 0; i < segments.length - 1; i += 1) {\n prefix = prefix ? `${prefix}/${segments[i]}` : segments[i]\n const existing = dirNodes.get(prefix)\n if (existing) {\n parent = existing\n continue\n }\n\n const dirNode = Object.create(proto)\n dirNode.path = pathCtor ? new pathCtor(prefix.split(\"/\")) : root.path\n dirNode.fileCoverage = null\n dirNode.parent = parent\n dirNode.children = []\n parent.children.push(dirNode)\n dirNodes.set(prefix, dirNode)\n parent = dirNode\n }\n\n const fileNode = Object.create(proto)\n fileNode.path = pathCtor ? new pathCtor(segments) : root.path\n fileNode.fileCoverage = fileCoverage\n fileNode.parent = parent\n fileNode.children = []\n parent.children.push(fileNode)\n }\n\n sortReportTree(treeRoot)\n\n return treeRoot\n}\n\nfunction collectFileCoverages(node: any, out: any[]): void {\n if (!node || typeof node.isSummary !== \"function\") {\n return\n }\n\n if (!node.isSummary()) {\n const fileCoverage = typeof node.getFileCoverage === \"function\" ? node.getFileCoverage() : node.fileCoverage\n if (fileCoverage) {\n out.push(fileCoverage)\n }\n return\n }\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n for (const child of children) {\n collectFileCoverages(child, out)\n }\n}\n\nfunction sortReportTree(node: any): void {\n const children: any[] = Array.isArray(node?.children) ? node.children : []\n if (children.length === 0) {\n return\n }\n\n children.sort((a, b) => {\n const aKey = typeof a?.path?.toString === \"function\" ? a.path.toString() : \"\"\n const bKey = typeof b?.path?.toString === \"function\" ? b.path.toString() : \"\"\n return aKey < bKey ? -1 : aKey > bKey ? 1 : 0\n })\n\n for (const child of children) {\n sortReportTree(child)\n }\n}\n\nfunction isInsideCwd(relativePosix: string): boolean {\n if (!relativePosix) {\n return false\n }\n return !(relativePosix === \"..\" || relativePosix.startsWith(\"../\"))\n}\n\nfunction toPosix(input: string): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction toFullVisitor(visitor: any): {\n onStart: (node: any, state: any) => void\n onEnd: (node: any, state: any) => void\n onSummary: (node: any, state: any) => void\n onSummaryEnd: (node: any, state: any) => void\n onDetail: (node: any, state: any) => void\n} {\n const call = (method: string) => (node: any, state: any) => {\n if (typeof visitor?.[method] === \"function\") {\n visitor[method](node, state)\n }\n }\n\n return {\n onStart: call(\"onStart\"),\n onEnd: call(\"onEnd\"),\n onSummary: call(\"onSummary\"),\n onSummaryEnd: call(\"onSummaryEnd\"),\n onDetail: call(\"onDetail\"),\n }\n}\n\nfunction cloneReportNode(node: any, parent: any): any {\n const clone = Object.create(Object.getPrototypeOf(node))\n clone.path = node.path\n clone.fileCoverage = node.fileCoverage\n clone.parent = parent\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone))\n\n return clone\n}\n\nfunction cloneOrCollapseNode(node: any, parent: any): any[] {\n if (\n typeof node?.isSummary === \"function\"\n && node.isSummary()\n && typeof node.isRoot === \"function\"\n && !node.isRoot()\n && typeof node.getChildren === \"function\"\n ) {\n const children = node.getChildren()\n if (\n Array.isArray(children)\n && children.length === 1\n && typeof children[0]?.isSummary === \"function\"\n && !children[0].isSummary()\n ) {\n return [cloneReportNode(children[0], parent)]\n }\n }\n\n return [cloneReportNode(node, parent)]\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"console-text-report.js","sources":["../../src/coverage/console-text-report.ts"],"sourcesContent":["import path from \"node:path\"\n\n\nconst DEFAULT_CONSOLE_MAX_COLS = 80\nconst CONSOLE_SUMMARIZER = \"rbCwd\"\n\nexport function generateConsoleTextCoverageReport(\n reports: any,\n context: any,\n): { output: string; summarizer: string | undefined } {\n const debug = resolveConsoleReportDebugInfo()\n const summarizer = registerConsoleSummarizer(context)\n writeConsoleReportDebugLog({ ...debug, summarizer })\n\n const reportOutput = createConsoleTextReportOutput(reports, context, {\n maxCols: debug.maxCols + 20,\n summarizer,\n })\n\n return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer }\n}\n\nfunction resolveConsoleReportDebugInfo(): {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n} {\n const isTTY = Boolean(process.stdout.isTTY)\n const stdoutColumns = process.stdout.columns\n const envColumns = process.env.COLUMNS\n const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns)\n\n return { isTTY, stdoutColumns, envColumns, maxCols }\n}\n\nfunction resolveConsoleMaxCols(stdoutColumns: number | undefined, envColumns: string | undefined): number {\n if (typeof stdoutColumns === \"number\" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {\n return stdoutColumns\n }\n\n const parsed = typeof envColumns === \"string\" ? Number.parseInt(envColumns, 10) : Number.NaN\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n\n return DEFAULT_CONSOLE_MAX_COLS\n}\n\nfunction writeConsoleReportDebugLog({\n isTTY,\n stdoutColumns,\n envColumns,\n maxCols,\n summarizer,\n}: {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n summarizer: string | undefined\n}): void {\n const message = [\n \"[coverage] debug\",\n `stdout.isTTY=${isTTY ? \"1\" : \"0\"}`,\n `stdout.columns=${stdoutColumns ?? \"undefined\"}`,\n `env.COLUMNS=${envColumns ?? \"undefined\"}`,\n `resolvedMaxCols=${maxCols}`,\n `summarizer=${summarizer ?? \"undefined\"}`,\n ].join(\" \")\n\n process.stderr.write(`${message}\\n`)\n}\n\nfunction createConsoleTextReportOutput(\n reports: any,\n context: any,\n options: { maxCols: number; summarizer?: string },\n): string {\n const fileWriter = context?.writer\n const fileWriterCtor = fileWriter?.constructor\n\n if (\n !fileWriterCtor\n || typeof fileWriterCtor.startCapture !== \"function\"\n || typeof fileWriterCtor.stopCapture !== \"function\"\n || typeof fileWriterCtor.getOutput !== \"function\"\n || typeof fileWriterCtor.resetOutput !== \"function\"\n ) {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n return \"\"\n }\n\n fileWriterCtor.resetOutput()\n fileWriterCtor.startCapture()\n try {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n } finally {\n fileWriterCtor.stopCapture()\n }\n const output = fileWriterCtor.getOutput()\n fileWriterCtor.resetOutput()\n return output\n}\n\nfunction stripUncoveredLineNumbersColumn(output: string): string {\n const lines = output.split(\"\\n\")\n const filtered = lines.map((line) => {\n const parts = line.split(\"|\")\n if (parts.length < 6) {\n return line.trimEnd()\n }\n return parts.slice(0, 5).join(\"|\").trimEnd()\n })\n return filtered.join(\"\\n\")\n}\n\nfunction registerConsoleSummarizer(context: any): string | undefined {\n const summarizerFactory = context?._summarizerFactory\n if (!summarizerFactory || typeof summarizerFactory !== \"object\") {\n return undefined\n }\n\n if (CONSOLE_SUMMARIZER in summarizerFactory) {\n return CONSOLE_SUMMARIZER\n }\n\n const pkgTree = context.getTree?.(\"pkg\")\n const pkgRoot = pkgTree?.getRoot?.()\n if (!pkgRoot) {\n return undefined\n }\n\n summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd())\n return CONSOLE_SUMMARIZER\n}\n\nfunction createCollapsedCwdTree(\n root: any,\n cwd: string,\n): { getRoot: () => any; visit: (visitor: any, state: any) => void } {\n const treeRoot = createCwdTreeFromCoverage(root, cwd)\n const clonedRoot = cloneReportNode(treeRoot, null)\n return {\n getRoot: () => clonedRoot,\n visit: (visitor: any, state: any) => {\n const fullVisitor = toFullVisitor(visitor)\n fullVisitor.onStart(clonedRoot, state)\n clonedRoot.visit(fullVisitor, state)\n fullVisitor.onEnd(clonedRoot, state)\n },\n }\n}\n\nfunction createCwdTreeFromCoverage(root: any, cwd: string): any {\n const proto = Object.getPrototypeOf(root)\n const pathCtor = root?.path?.constructor\n\n const fileCoverages: any[] = []\n collectFileCoverages(root, fileCoverages)\n\n const treeRoot = Object.create(proto)\n treeRoot.path = pathCtor ? new pathCtor([]) : root.path\n treeRoot.fileCoverage = null\n treeRoot.parent = null\n treeRoot.children = []\n\n const dirNodes = new Map<string, any>()\n dirNodes.set(\"\", treeRoot)\n\n for (const fileCoverage of fileCoverages) {\n const absolutePath = path.resolve(String(fileCoverage?.path ?? \"\"))\n if (!absolutePath) {\n continue\n }\n\n let relativePath = toPosix(path.relative(cwd, absolutePath))\n if (!relativePath) {\n relativePath = toPosix(absolutePath)\n }\n\n if (isInsideCwd(relativePath) && (relativePath === \"src\" || relativePath.startsWith(\"src/\"))) {\n relativePath = relativePath === \"src\" ? \"\" : relativePath.slice(\"src/\".length)\n }\n\n if (!relativePath) {\n relativePath = toPosix(path.basename(absolutePath))\n }\n\n const segments = relativePath.split(\"/\").filter(Boolean)\n if (segments.length === 0) {\n continue\n }\n\n let parent = treeRoot\n let prefix = \"\"\n\n for (let i = 0; i < segments.length - 1; i += 1) {\n prefix = prefix ? `${prefix}/${segments[i]}` : segments[i]\n const existing = dirNodes.get(prefix)\n if (existing) {\n parent = existing\n continue\n }\n\n const dirNode = Object.create(proto)\n dirNode.path = pathCtor ? new pathCtor(prefix.split(\"/\")) : root.path\n dirNode.fileCoverage = null\n dirNode.parent = parent\n dirNode.children = []\n parent.children.push(dirNode)\n dirNodes.set(prefix, dirNode)\n parent = dirNode\n }\n\n const fileNode = Object.create(proto)\n fileNode.path = pathCtor ? new pathCtor(segments) : root.path\n fileNode.fileCoverage = fileCoverage\n fileNode.parent = parent\n fileNode.children = []\n parent.children.push(fileNode)\n }\n\n sortReportTree(treeRoot)\n\n return treeRoot\n}\n\nfunction collectFileCoverages(node: any, out: any[]): void {\n if (!node || typeof node.isSummary !== \"function\") {\n return\n }\n\n if (!node.isSummary()) {\n const fileCoverage = typeof node.getFileCoverage === \"function\" ? node.getFileCoverage() : node.fileCoverage\n if (fileCoverage) {\n out.push(fileCoverage)\n }\n return\n }\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n for (const child of children) {\n collectFileCoverages(child, out)\n }\n}\n\nfunction sortReportTree(node: any): void {\n const children: any[] = Array.isArray(node?.children) ? node.children : []\n if (children.length === 0) {\n return\n }\n\n children.sort((a, b) => {\n const aKey = typeof a?.path?.toString === \"function\" ? a.path.toString() : \"\"\n const bKey = typeof b?.path?.toString === \"function\" ? b.path.toString() : \"\"\n return aKey < bKey ? -1 : aKey > bKey ? 1 : 0\n })\n\n for (const child of children) {\n sortReportTree(child)\n }\n}\n\nfunction isInsideCwd(relativePosix: string): boolean {\n if (!relativePosix) {\n return false\n }\n return !(relativePosix === \"..\" || relativePosix.startsWith(\"../\"))\n}\n\nfunction toPosix(input: string): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction toFullVisitor(visitor: any): {\n onStart: (node: any, state: any) => void\n onEnd: (node: any, state: any) => void\n onSummary: (node: any, state: any) => void\n onSummaryEnd: (node: any, state: any) => void\n onDetail: (node: any, state: any) => void\n} {\n const call = (method: string) => (node: any, state: any) => {\n if (typeof visitor?.[method] === \"function\") {\n visitor[method](node, state)\n }\n }\n\n return {\n onStart: call(\"onStart\"),\n onEnd: call(\"onEnd\"),\n onSummary: call(\"onSummary\"),\n onSummaryEnd: call(\"onSummaryEnd\"),\n onDetail: call(\"onDetail\"),\n }\n}\n\nfunction cloneReportNode(node: any, parent: any): any {\n const clone = Object.create(Object.getPrototypeOf(node))\n clone.path = node.path\n clone.fileCoverage = node.fileCoverage\n clone.parent = parent\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone))\n\n return clone\n}\n\nfunction cloneOrCollapseNode(node: any, parent: any): any[] {\n if (\n typeof node?.isSummary === \"function\"\n && node.isSummary()\n && typeof node.isRoot === \"function\"\n && !node.isRoot()\n && typeof node.getChildren === \"function\"\n ) {\n const children = node.getChildren()\n if (\n Array.isArray(children)\n && children.length === 1\n && typeof children[0]?.isSummary === \"function\"\n && !children[0].isSummary()\n ) {\n return [cloneReportNode(children[0], parent)]\n }\n }\n\n return [cloneReportNode(node, parent)]\n}\n"],"names":["DEFAULT_CONSOLE_MAX_COLS","CONSOLE_SUMMARIZER","generateConsoleTextCoverageReport","reports","context","debug","resolveConsoleReportDebugInfo","summarizer","registerConsoleSummarizer","writeConsoleReportDebugLog","reportOutput","createConsoleTextReportOutput","maxCols","output","stripUncoveredLineNumbersColumn","isTTY","Boolean","process","stdout","stdoutColumns","columns","envColumns","env","COLUMNS","resolveConsoleMaxCols","Number","isFinite","parsed","parseInt","NaN","message","join","stderr","write","options","fileWriter","writer","fileWriterCtor","constructor","startCapture","stopCapture","getOutput","resetOutput","create","execute","lines","split","filtered","map","line","parts","length","trimEnd","slice","summarizerFactory","_summarizerFactory","undefined","pkgTree","getTree","pkgRoot","getRoot","createCollapsedCwdTree","cwd","root","treeRoot","createCwdTreeFromCoverage","clonedRoot","cloneReportNode","visit","visitor","state","fullVisitor","toFullVisitor","onStart","onEnd","proto","Object","getPrototypeOf","pathCtor","path","fileCoverages","collectFileCoverages","fileCoverage","parent","children","dirNodes","Map","set","absolutePath","resolve","String","relativePath","toPosix","relative","isInsideCwd","startsWith","basename","segments","filter","prefix","i","existing","get","dirNode","push","fileNode","sortReportTree","node","out","isSummary","getFileCoverage","getChildren","child","Array","isArray","sort","a","b","aKey","toString","bKey","relativePosix","input","sep","call","method","onSummary","onSummaryEnd","onDetail","clone","flatMap","cloneOrCollapseNode","isRoot"],"mappings":"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"}
|
package/dist/coverage/files.js
CHANGED
|
@@ -1,52 +1,65 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
//#region src/coverage/files.ts
|
|
4
3
|
function resolveCoverageRoots(config) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
path.join(buildDir, "vitest", "coverage"),
|
|
9
|
-
path.join(config.testResultsRoot, "playwright"),
|
|
10
|
-
path.join(config.testResultsRoot, "vitest")
|
|
11
|
-
];
|
|
12
|
-
return Array.from(new Set(roots.map((root) => path.resolve(root))));
|
|
4
|
+
const buildDir = path.join(config.rootDir, "build");
|
|
5
|
+
const roots = [path.join(buildDir, "playwright", "coverage"), path.join(buildDir, "vitest", "coverage"), path.join(config.testResultsRoot, "playwright"), path.join(config.testResultsRoot, "vitest")];
|
|
6
|
+
return Array.from(new Set(roots.map((root) => path.resolve(root))));
|
|
13
7
|
}
|
|
14
8
|
async function findCoverageFiles(config, root) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
9
|
+
const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
|
|
10
|
+
const files = [];
|
|
11
|
+
async function walk(current) {
|
|
12
|
+
const entries = await fs.readdir(current, {
|
|
13
|
+
withFileTypes: true
|
|
14
|
+
});
|
|
15
|
+
await Promise.all(entries.map(async (entry) => {
|
|
16
|
+
const entryPath = path.join(current, entry.name);
|
|
17
|
+
if (entry.isDirectory()) {
|
|
18
|
+
await walk(entryPath);
|
|
19
|
+
} else if (entry.isFile() && entry.name === config.coverageFileName) {
|
|
20
|
+
files.push(entryPath);
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
for (const root2 of roots) {
|
|
25
|
+
try {
|
|
26
|
+
const stats = await fs.stat(root2);
|
|
27
|
+
if (!stats.isDirectory()) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
await walk(root2);
|
|
34
|
+
}
|
|
35
|
+
return files.sort();
|
|
34
36
|
}
|
|
35
37
|
async function removeCoverageFiles(config, root) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
|
|
39
|
+
async function walk(current) {
|
|
40
|
+
const entries = await fs.readdir(current, {
|
|
41
|
+
withFileTypes: true
|
|
42
|
+
});
|
|
43
|
+
await Promise.all(entries.map(async (entry) => {
|
|
44
|
+
const entryPath = path.join(current, entry.name);
|
|
45
|
+
if (entry.isDirectory()) {
|
|
46
|
+
await walk(entryPath);
|
|
47
|
+
} else if (entry.isFile() && entry.name === config.coverageFileName) {
|
|
48
|
+
await fs.rm(entryPath, {
|
|
49
|
+
force: true
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
for (const root2 of roots) {
|
|
55
|
+
try {
|
|
56
|
+
await walk(root2);
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
}
|
|
48
60
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
export {
|
|
62
|
+
findCoverageFiles,
|
|
63
|
+
removeCoverageFiles
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=files.js.map
|