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