@rpcbase/test 0.326.0 → 0.327.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.
Files changed (70) hide show
  1. package/package.json +1 -1
  2. package/dist/clearDatabase.d.ts +0 -2
  3. package/dist/clearDatabase.d.ts.map +0 -1
  4. package/dist/clearDatabase.js +0 -12
  5. package/dist/clearDatabase.js.map +0 -1
  6. package/dist/cli.d.ts +0 -2
  7. package/dist/cli.d.ts.map +0 -1
  8. package/dist/cli.js +0 -799
  9. package/dist/cli.js.map +0 -1
  10. package/dist/coverage/collect.d.ts +0 -5
  11. package/dist/coverage/collect.d.ts.map +0 -1
  12. package/dist/coverage/collect.js +0 -113
  13. package/dist/coverage/collect.js.map +0 -1
  14. package/dist/coverage/config-loader.d.ts +0 -10
  15. package/dist/coverage/config-loader.d.ts.map +0 -1
  16. package/dist/coverage/config-loader.js +0 -286
  17. package/dist/coverage/config-loader.js.map +0 -1
  18. package/dist/coverage/config.d.ts +0 -3
  19. package/dist/coverage/config.d.ts.map +0 -1
  20. package/dist/coverage/config.js +0 -101
  21. package/dist/coverage/config.js.map +0 -1
  22. package/dist/coverage/console-text-report.d.ts +0 -5
  23. package/dist/coverage/console-text-report.d.ts.map +0 -1
  24. package/dist/coverage/console-text-report.js +0 -240
  25. package/dist/coverage/console-text-report.js.map +0 -1
  26. package/dist/coverage/files.d.ts +0 -4
  27. package/dist/coverage/files.d.ts.map +0 -1
  28. package/dist/coverage/files.js +0 -68
  29. package/dist/coverage/files.js.map +0 -1
  30. package/dist/coverage/fixtures.d.ts +0 -5
  31. package/dist/coverage/fixtures.d.ts.map +0 -1
  32. package/dist/coverage/fixtures.js +0 -45
  33. package/dist/coverage/fixtures.js.map +0 -1
  34. package/dist/coverage/global-setup.d.ts +0 -3
  35. package/dist/coverage/global-setup.d.ts.map +0 -1
  36. package/dist/coverage/global-setup.js +0 -18
  37. package/dist/coverage/global-setup.js.map +0 -1
  38. package/dist/coverage/index.d.ts +0 -10
  39. package/dist/coverage/index.d.ts.map +0 -1
  40. package/dist/coverage/index.js +0 -62
  41. package/dist/coverage/index.js.map +0 -1
  42. package/dist/coverage/report.d.ts +0 -7
  43. package/dist/coverage/report.d.ts.map +0 -1
  44. package/dist/coverage/report.js +0 -529
  45. package/dist/coverage/report.js.map +0 -1
  46. package/dist/coverage/reporter.d.ts +0 -16
  47. package/dist/coverage/reporter.d.ts.map +0 -1
  48. package/dist/coverage/reporter.js +0 -61
  49. package/dist/coverage/reporter.js.map +0 -1
  50. package/dist/coverage/types.d.ts +0 -45
  51. package/dist/coverage/types.d.ts.map +0 -1
  52. package/dist/coverage/v8-tracker.d.ts +0 -6
  53. package/dist/coverage/v8-tracker.d.ts.map +0 -1
  54. package/dist/coverage/v8-tracker.js +0 -168
  55. package/dist/coverage/v8-tracker.js.map +0 -1
  56. package/dist/defineConfig.d.ts +0 -3
  57. package/dist/defineConfig.d.ts.map +0 -1
  58. package/dist/index.d.ts +0 -11
  59. package/dist/index.d.ts.map +0 -1
  60. package/dist/index.js +0 -80
  61. package/dist/index.js.map +0 -1
  62. package/dist/register-tty.cjs +0 -33
  63. package/dist/serverCoverage.d.ts +0 -8
  64. package/dist/serverCoverage.d.ts.map +0 -1
  65. package/dist/serverCoverage.js +0 -42
  66. package/dist/serverCoverage.js.map +0 -1
  67. package/dist/vitest.config.d.ts +0 -3
  68. package/dist/vitest.config.d.ts.map +0 -1
  69. package/dist/vitest.config.js +0 -83
  70. package/dist/vitest.config.js.map +0 -1
@@ -1,101 +0,0 @@
1
- import path from "node:path";
2
- const DEFAULT_THRESHOLDS = {
3
- branches: 60,
4
- functions: 75,
5
- lines: 75,
6
- statements: 75
7
- };
8
- const THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS);
9
- const THRESHOLD_KEY_SET = new Set(THRESHOLD_KEYS);
10
- function createCoverageConfig(options) {
11
- const { rootDir } = options;
12
- if (!rootDir) {
13
- throw new Error("createCoverageConfig requires a rootDir");
14
- }
15
- const resolvedRootDir = path.resolve(rootDir);
16
- const includeAllFiles = options.includeAllFiles !== false;
17
- const collectCoverageFrom = Array.isArray(options.collectCoverageFrom) ? options.collectCoverageFrom.map((pattern) => String(pattern ?? "").trim()).filter((pattern) => pattern.length > 0) : [];
18
- if (collectCoverageFrom.length === 0) {
19
- throw new Error("createCoverageConfig requires a collectCoverageFrom option");
20
- }
21
- const testResultsRoot = path.join(resolvedRootDir, "build", "coverage");
22
- const coverageReportDir = path.join(testResultsRoot, "report");
23
- const coverageFileName = options.coverageFileName ?? "v8-coverage.json";
24
- const disabledEnvVar = options.disabledEnvVar ?? "RB_DISABLE_COVERAGE";
25
- const coverageEnabled = process.env[disabledEnvVar] !== "1";
26
- const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds);
27
- return {
28
- rootDir: resolvedRootDir,
29
- collectCoverageFrom,
30
- testResultsRoot,
31
- coverageReportDir,
32
- coverageFileName,
33
- thresholds,
34
- thresholdTargets,
35
- coverageEnabled,
36
- disabledEnvVar,
37
- includeAllFiles
38
- };
39
- }
40
- function normalizeThresholdOptions(rawThresholds) {
41
- const globalThresholds = { ...DEFAULT_THRESHOLDS };
42
- const targets = [];
43
- if (!isPlainObject(rawThresholds)) {
44
- return { global: globalThresholds, targets };
45
- }
46
- const thresholdMap = rawThresholds;
47
- for (const key of THRESHOLD_KEYS) {
48
- const value = thresholdMap[key];
49
- if (isThresholdValue(value)) {
50
- globalThresholds[key] = value;
51
- }
52
- }
53
- if (Object.prototype.hasOwnProperty.call(thresholdMap, "global")) {
54
- if (!isPlainObject(thresholdMap.global)) {
55
- throw new Error("coverage thresholds: the `global` override must be an object of metric values");
56
- }
57
- Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global));
58
- }
59
- for (const [pattern, overrides] of Object.entries(thresholdMap)) {
60
- if (pattern === "global" || THRESHOLD_KEY_SET.has(pattern)) {
61
- continue;
62
- }
63
- if (!isPlainObject(overrides)) {
64
- throw new Error(
65
- `coverage thresholds: override for "${pattern}" must be an object containing coverage metrics`
66
- );
67
- }
68
- targets.push({
69
- id: pattern,
70
- pattern,
71
- thresholds: {
72
- ...globalThresholds,
73
- ...pickThresholdOverrides(overrides)
74
- }
75
- });
76
- }
77
- return { global: globalThresholds, targets };
78
- }
79
- function pickThresholdOverrides(source) {
80
- const overrides = {};
81
- if (!isPlainObject(source)) {
82
- return overrides;
83
- }
84
- for (const key of THRESHOLD_KEYS) {
85
- const value = source[key];
86
- if (isThresholdValue(value)) {
87
- overrides[key] = value;
88
- }
89
- }
90
- return overrides;
91
- }
92
- function isPlainObject(value) {
93
- return value !== null && typeof value === "object" && !Array.isArray(value);
94
- }
95
- function isThresholdValue(value) {
96
- return typeof value === "number" && Number.isFinite(value);
97
- }
98
- export {
99
- createCoverageConfig
100
- };
101
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = path.join(resolvedRootDir, \"build\", \"coverage\")\n const coverageReportDir = path.join(testResultsRoot, \"report\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export declare function generateConsoleTextCoverageReport(reports: any, context: any): {
2
- output: string;
3
- summarizer: string | undefined;
4
- };
5
- //# sourceMappingURL=console-text-report.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console-text-report.d.ts","sourceRoot":"","sources":["../../src/coverage/console-text-report.ts"],"names":[],"mappings":"AAMA,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG,GACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAWpD"}
@@ -1,240 +0,0 @@
1
- import path from "node:path";
2
- const DEFAULT_CONSOLE_MAX_COLS = 80;
3
- const CONSOLE_SUMMARIZER = "rbCwd";
4
- function generateConsoleTextCoverageReport(reports, context) {
5
- const debug = resolveConsoleReportDebugInfo();
6
- const summarizer = registerConsoleSummarizer(context);
7
- writeConsoleReportDebugLog({ ...debug, summarizer });
8
- const reportOutput = createConsoleTextReportOutput(reports, context, {
9
- maxCols: debug.maxCols + 20,
10
- summarizer
11
- });
12
- return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer };
13
- }
14
- function resolveConsoleReportDebugInfo() {
15
- const isTTY = Boolean(process.stdout.isTTY);
16
- const stdoutColumns = process.stdout.columns;
17
- const envColumns = process.env.COLUMNS;
18
- const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns);
19
- return { isTTY, stdoutColumns, envColumns, maxCols };
20
- }
21
- function resolveConsoleMaxCols(stdoutColumns, envColumns) {
22
- if (typeof stdoutColumns === "number" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {
23
- return stdoutColumns;
24
- }
25
- const parsed = typeof envColumns === "string" ? Number.parseInt(envColumns, 10) : Number.NaN;
26
- if (Number.isFinite(parsed) && parsed > 0) {
27
- return parsed;
28
- }
29
- return DEFAULT_CONSOLE_MAX_COLS;
30
- }
31
- function writeConsoleReportDebugLog({
32
- isTTY,
33
- stdoutColumns,
34
- envColumns,
35
- maxCols,
36
- summarizer
37
- }) {
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}
47
- `);
48
- }
49
- function createConsoleTextReportOutput(reports, context, options) {
50
- const fileWriter = context?.writer;
51
- const fileWriterCtor = fileWriter?.constructor;
52
- if (!fileWriterCtor || typeof fileWriterCtor.startCapture !== "function" || typeof fileWriterCtor.stopCapture !== "function" || typeof fileWriterCtor.getOutput !== "function" || typeof fileWriterCtor.resetOutput !== "function") {
53
- reports.create("text", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context);
54
- return "";
55
- }
56
- fileWriterCtor.resetOutput();
57
- fileWriterCtor.startCapture();
58
- try {
59
- reports.create("text", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context);
60
- } finally {
61
- fileWriterCtor.stopCapture();
62
- }
63
- const output = fileWriterCtor.getOutput();
64
- fileWriterCtor.resetOutput();
65
- return output;
66
- }
67
- function stripUncoveredLineNumbersColumn(output) {
68
- const lines = output.split("\n");
69
- const filtered = lines.map((line) => {
70
- const parts = line.split("|");
71
- if (parts.length < 6) {
72
- return line.trimEnd();
73
- }
74
- return parts.slice(0, 5).join("|").trimEnd();
75
- });
76
- return filtered.join("\n");
77
- }
78
- function registerConsoleSummarizer(context) {
79
- const summarizerFactory = context?._summarizerFactory;
80
- if (!summarizerFactory || typeof summarizerFactory !== "object") {
81
- return void 0;
82
- }
83
- if (CONSOLE_SUMMARIZER in summarizerFactory) {
84
- return CONSOLE_SUMMARIZER;
85
- }
86
- const pkgTree = context.getTree?.("pkg");
87
- const pkgRoot = pkgTree?.getRoot?.();
88
- if (!pkgRoot) {
89
- return void 0;
90
- }
91
- summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd());
92
- return CONSOLE_SUMMARIZER;
93
- }
94
- function createCollapsedCwdTree(root, cwd) {
95
- const treeRoot = createCwdTreeFromCoverage(root, cwd);
96
- const clonedRoot = cloneReportNode(treeRoot, null);
97
- return {
98
- getRoot: () => clonedRoot,
99
- visit: (visitor, state) => {
100
- const fullVisitor = toFullVisitor(visitor);
101
- fullVisitor.onStart(clonedRoot, state);
102
- clonedRoot.visit(fullVisitor, state);
103
- fullVisitor.onEnd(clonedRoot, state);
104
- }
105
- };
106
- }
107
- function createCwdTreeFromCoverage(root, cwd) {
108
- const proto = Object.getPrototypeOf(root);
109
- const pathCtor = root?.path?.constructor;
110
- const fileCoverages = [];
111
- collectFileCoverages(root, fileCoverages);
112
- const treeRoot = Object.create(proto);
113
- treeRoot.path = pathCtor ? new pathCtor([]) : root.path;
114
- treeRoot.fileCoverage = null;
115
- treeRoot.parent = null;
116
- treeRoot.children = [];
117
- const dirNodes = /* @__PURE__ */ new Map();
118
- dirNodes.set("", treeRoot);
119
- for (const fileCoverage of fileCoverages) {
120
- const absolutePath = path.resolve(String(fileCoverage?.path ?? ""));
121
- if (!absolutePath) {
122
- continue;
123
- }
124
- let relativePath = toPosix(path.relative(cwd, absolutePath));
125
- if (!relativePath) {
126
- relativePath = toPosix(absolutePath);
127
- }
128
- if (isInsideCwd(relativePath) && (relativePath === "src" || relativePath.startsWith("src/"))) {
129
- relativePath = relativePath === "src" ? "" : relativePath.slice("src/".length);
130
- }
131
- if (!relativePath) {
132
- relativePath = toPosix(path.basename(absolutePath));
133
- }
134
- const segments = relativePath.split("/").filter(Boolean);
135
- if (segments.length === 0) {
136
- continue;
137
- }
138
- let parent = treeRoot;
139
- let prefix = "";
140
- for (let i = 0; i < segments.length - 1; i += 1) {
141
- prefix = prefix ? `${prefix}/${segments[i]}` : segments[i];
142
- const existing = dirNodes.get(prefix);
143
- if (existing) {
144
- parent = existing;
145
- continue;
146
- }
147
- const dirNode = Object.create(proto);
148
- dirNode.path = pathCtor ? new pathCtor(prefix.split("/")) : root.path;
149
- dirNode.fileCoverage = null;
150
- dirNode.parent = parent;
151
- dirNode.children = [];
152
- parent.children.push(dirNode);
153
- dirNodes.set(prefix, dirNode);
154
- parent = dirNode;
155
- }
156
- const fileNode = Object.create(proto);
157
- fileNode.path = pathCtor ? new pathCtor(segments) : root.path;
158
- fileNode.fileCoverage = fileCoverage;
159
- fileNode.parent = parent;
160
- fileNode.children = [];
161
- parent.children.push(fileNode);
162
- }
163
- sortReportTree(treeRoot);
164
- return treeRoot;
165
- }
166
- function collectFileCoverages(node, out) {
167
- if (!node || typeof node.isSummary !== "function") {
168
- return;
169
- }
170
- if (!node.isSummary()) {
171
- const fileCoverage = typeof node.getFileCoverage === "function" ? node.getFileCoverage() : node.fileCoverage;
172
- if (fileCoverage) {
173
- out.push(fileCoverage);
174
- }
175
- return;
176
- }
177
- const children = typeof node.getChildren === "function" ? node.getChildren() : [];
178
- for (const child of children) {
179
- collectFileCoverages(child, out);
180
- }
181
- }
182
- function sortReportTree(node) {
183
- const children = Array.isArray(node?.children) ? node.children : [];
184
- if (children.length === 0) {
185
- return;
186
- }
187
- children.sort((a, b) => {
188
- const aKey = typeof a?.path?.toString === "function" ? a.path.toString() : "";
189
- const bKey = typeof b?.path?.toString === "function" ? b.path.toString() : "";
190
- return aKey < bKey ? -1 : aKey > bKey ? 1 : 0;
191
- });
192
- for (const child of children) {
193
- sortReportTree(child);
194
- }
195
- }
196
- function isInsideCwd(relativePosix) {
197
- if (!relativePosix) {
198
- return false;
199
- }
200
- return !(relativePosix === ".." || relativePosix.startsWith("../"));
201
- }
202
- function toPosix(input) {
203
- return String(input ?? "").split(path.sep).join("/");
204
- }
205
- function toFullVisitor(visitor) {
206
- const call = (method) => (node, state) => {
207
- if (typeof visitor?.[method] === "function") {
208
- visitor[method](node, state);
209
- }
210
- };
211
- return {
212
- onStart: call("onStart"),
213
- onEnd: call("onEnd"),
214
- onSummary: call("onSummary"),
215
- onSummaryEnd: call("onSummaryEnd"),
216
- onDetail: call("onDetail")
217
- };
218
- }
219
- function cloneReportNode(node, parent) {
220
- const clone = Object.create(Object.getPrototypeOf(node));
221
- clone.path = node.path;
222
- clone.fileCoverage = node.fileCoverage;
223
- clone.parent = parent;
224
- const children = typeof node.getChildren === "function" ? node.getChildren() : [];
225
- clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone));
226
- return clone;
227
- }
228
- function cloneOrCollapseNode(node, parent) {
229
- if (typeof node?.isSummary === "function" && node.isSummary() && typeof node.isRoot === "function" && !node.isRoot() && typeof node.getChildren === "function") {
230
- const children = node.getChildren();
231
- if (Array.isArray(children) && children.length === 1 && typeof children[0]?.isSummary === "function" && !children[0].isSummary()) {
232
- return [cloneReportNode(children[0], parent)];
233
- }
234
- }
235
- return [cloneReportNode(node, parent)];
236
- }
237
- export {
238
- generateConsoleTextCoverageReport
239
- };
240
- //# sourceMappingURL=console-text-report.js.map
@@ -1 +0,0 @@
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":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { CoverageConfig } from './types';
2
- export declare function findCoverageFiles(config: CoverageConfig, root?: string | string[]): Promise<string[]>;
3
- export declare function removeCoverageFiles(config: CoverageConfig, root?: string | string[]): Promise<void>;
4
- //# sourceMappingURL=files.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/coverage/files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAe7C,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -1,68 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- function resolveCoverageRoots(config) {
4
- const buildDir = path.join(config.rootDir, "build");
5
- const roots = [
6
- path.join(buildDir, "playwright", "coverage"),
7
- path.join(buildDir, "vitest", "coverage"),
8
- path.join(config.testResultsRoot, "playwright"),
9
- path.join(config.testResultsRoot, "vitest")
10
- ];
11
- return Array.from(new Set(roots.map((root) => path.resolve(root))));
12
- }
13
- async function findCoverageFiles(config, root) {
14
- const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
15
- const files = [];
16
- async function walk(current) {
17
- const entries = await fs.readdir(current, { withFileTypes: true });
18
- await Promise.all(
19
- entries.map(async (entry) => {
20
- const entryPath = path.join(current, entry.name);
21
- if (entry.isDirectory()) {
22
- await walk(entryPath);
23
- } else if (entry.isFile() && entry.name === config.coverageFileName) {
24
- files.push(entryPath);
25
- }
26
- })
27
- );
28
- }
29
- for (const root2 of roots) {
30
- try {
31
- const stats = await fs.stat(root2);
32
- if (!stats.isDirectory()) {
33
- continue;
34
- }
35
- } catch {
36
- continue;
37
- }
38
- await walk(root2);
39
- }
40
- return files.sort();
41
- }
42
- async function removeCoverageFiles(config, root) {
43
- const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
44
- async function walk(current) {
45
- const entries = await fs.readdir(current, { withFileTypes: true });
46
- await Promise.all(
47
- entries.map(async (entry) => {
48
- const entryPath = path.join(current, entry.name);
49
- if (entry.isDirectory()) {
50
- await walk(entryPath);
51
- } else if (entry.isFile() && entry.name === config.coverageFileName) {
52
- await fs.rm(entryPath, { force: true });
53
- }
54
- })
55
- );
56
- }
57
- for (const root2 of roots) {
58
- try {
59
- await walk(root2);
60
- } catch {
61
- }
62
- }
63
- }
64
- export {
65
- findCoverageFiles,
66
- removeCoverageFiles
67
- };
68
- //# sourceMappingURL=files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.js","sources":["../../src/coverage/files.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CoverageConfig } from \"./types\"\n\n\nfunction resolveCoverageRoots(config: CoverageConfig): string[] {\n const buildDir = path.join(config.rootDir, \"build\")\n const roots = [\n path.join(buildDir, \"playwright\", \"coverage\"),\n path.join(buildDir, \"vitest\", \"coverage\"),\n path.join(config.testResultsRoot, \"playwright\"),\n path.join(config.testResultsRoot, \"vitest\"),\n ]\n\n return Array.from(new Set(roots.map((root) => path.resolve(root))))\n}\n\nexport async function findCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<string[]> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n const files: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n files.push(entryPath)\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n const stats = await fs.stat(root)\n if (!stats.isDirectory()) {\n continue\n }\n } catch {\n continue\n }\n\n await walk(root)\n }\n\n return files.sort()\n}\n\nexport async function removeCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<void> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n await fs.rm(entryPath, { force: true })\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n await walk(root)\n } catch {\n // ignore cleanup errors\n }\n }\n}\n"],"names":["root"],"mappings":";;AAMA,SAAS,qBAAqB,QAAkC;AAC9D,QAAM,WAAW,KAAK,KAAK,OAAO,SAAS,OAAO;AAClD,QAAM,QAAQ;AAAA,IACZ,KAAK,KAAK,UAAU,cAAc,UAAU;AAAA,IAC5C,KAAK,KAAK,UAAU,UAAU,UAAU;AAAA,IACxC,KAAK,KAAK,OAAO,iBAAiB,YAAY;AAAA,IAC9C,KAAK,KAAK,OAAO,iBAAiB,QAAQ;AAAA,EAAA;AAG5C,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC;AACpE;AAEA,eAAsB,kBACpB,QACA,MACmB;AACnB,QAAM,QAAQ,SAAS,SAAY,qBAAqB,MAAM,IAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACpG,QAAM,QAAkB,CAAA;AAExB,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,KAAK,SAAS;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,aAAWA,SAAQ,OAAO;AACxB,QAAI;AACF,YAAM,QAAQ,MAAM,GAAG,KAAKA,KAAI;AAChC,UAAI,CAAC,MAAM,eAAe;AACxB;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,KAAKA,KAAI;AAAA,EACjB;AAEA,SAAO,MAAM,KAAA;AACf;AAEA,eAAsB,oBACpB,QACA,MACe;AACf,QAAM,QAAQ,SAAS,SAAY,qBAAqB,MAAM,IAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAEpG,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,GAAG,GAAG,WAAW,EAAE,OAAO,MAAM;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,aAAWA,SAAQ,OAAO;AACxB,QAAI;AACF,YAAM,KAAKA,KAAI;AAAA,IACjB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;"}
@@ -1,5 +0,0 @@
1
- import { CoverageConfig } from './types';
2
- export declare function createCoverageFixtures<T extends {
3
- extend: (fixtures: any) => unknown;
4
- }>(baseTest: T, config: CoverageConfig): T;
5
- //# sourceMappingURL=fixtures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/coverage/fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAyB7C,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAA;CAAE,EACrF,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,cAAc,GACrB,CAAC,CAiCH"}
@@ -1,45 +0,0 @@
1
- import { createCoverageTracker } from "./v8-tracker.js";
2
- function isChromiumPage(page) {
3
- return page.context().browser()?.browserType().name() === "chromium";
4
- }
5
- function shouldSilenceCoverageInitError(error) {
6
- const message = error instanceof Error ? error.message : String(error);
7
- return message.includes("Script execution is prohibited") || message.includes("CDP session is only available in Chromium");
8
- }
9
- function noopTracker() {
10
- return {
11
- async stop() {
12
- }
13
- };
14
- }
15
- function createCoverageFixtures(baseTest, config) {
16
- return baseTest.extend({
17
- page: async ({ page }, use, testInfo) => {
18
- let tracker = noopTracker();
19
- if (config.coverageEnabled && isChromiumPage(page)) {
20
- try {
21
- tracker = await createCoverageTracker(page, config);
22
- } catch (error) {
23
- if (shouldSilenceCoverageInitError(error)) {
24
- tracker = noopTracker();
25
- } else {
26
- console.warn("[coverage] failed to initialize V8 coverage:", error);
27
- }
28
- }
29
- }
30
- try {
31
- await use(page);
32
- } finally {
33
- try {
34
- await tracker.stop(testInfo);
35
- } catch (error) {
36
- console.warn("[coverage] failed to record V8 coverage:", error);
37
- }
38
- }
39
- }
40
- });
41
- }
42
- export {
43
- createCoverageFixtures
44
- };
45
- //# sourceMappingURL=fixtures.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.js","sources":["../../src/coverage/fixtures.ts"],"sourcesContent":["import type { Page, TestInfo } from \"@playwright/test\"\n\nimport { createCoverageTracker } from \"./v8-tracker\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype CoverageTracker = {\n stop: (testInfo: TestInfo) => Promise<void>\n}\n\nfunction isChromiumPage(page: Page): boolean {\n return page.context().browser()?.browserType().name() === \"chromium\"\n}\n\nfunction shouldSilenceCoverageInitError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(\"Script execution is prohibited\")\n || message.includes(\"CDP session is only available in Chromium\")\n}\n\nfunction noopTracker(): CoverageTracker {\n return {\n async stop() {\n // no-op\n },\n }\n}\n\nexport function createCoverageFixtures<T extends { extend: (fixtures: any) => unknown }>(\n baseTest: T,\n config: CoverageConfig,\n): T {\n return baseTest.extend({\n page: async (\n { page }: { page: Page },\n use: (page: Page) => Promise<void>,\n testInfo: TestInfo,\n ) => {\n let tracker: CoverageTracker = noopTracker()\n\n if (config.coverageEnabled && isChromiumPage(page)) {\n try {\n tracker = await createCoverageTracker(page, config)\n } catch (error) {\n if (shouldSilenceCoverageInitError(error)) {\n tracker = noopTracker()\n } else {\n console.warn(\"[coverage] failed to initialize V8 coverage:\", error)\n }\n }\n }\n\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n await use(page)\n } finally {\n try {\n await tracker.stop(testInfo)\n } catch (error) {\n console.warn(\"[coverage] failed to record V8 coverage:\", error)\n }\n }\n },\n }) as T\n}\n"],"names":[],"mappings":";AAUA,SAAS,eAAe,MAAqB;AAC3C,SAAO,KAAK,UAAU,QAAA,GAAW,YAAA,EAAc,WAAW;AAC5D;AAEA,SAAS,+BAA+B,OAAyB;AAC/D,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,gCAAgC,KACnD,QAAQ,SAAS,2CAA2C;AACnE;AAEA,SAAS,cAA+B;AACtC,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IAEb;AAAA,EAAA;AAEJ;AAEO,SAAS,uBACd,UACA,QACG;AACH,SAAO,SAAS,OAAO;AAAA,IACrB,MAAM,OACJ,EAAE,QACF,KACA,aACG;AACH,UAAI,UAA2B,YAAA;AAE/B,UAAI,OAAO,mBAAmB,eAAe,IAAI,GAAG;AAClD,YAAI;AACF,oBAAU,MAAM,sBAAsB,MAAM,MAAM;AAAA,QACpD,SAAS,OAAO;AACd,cAAI,+BAA+B,KAAK,GAAG;AACzC,sBAAU,YAAA;AAAA,UACZ,OAAO;AACL,oBAAQ,KAAK,gDAAgD,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,IAAI,IAAI;AAAA,MAChB,UAAA;AACE,YAAI;AACF,gBAAM,QAAQ,KAAK,QAAQ;AAAA,QAC7B,SAAS,OAAO;AACd,kBAAQ,KAAK,4CAA4C,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AACH;"}
@@ -1,3 +0,0 @@
1
- import { CoverageConfig } from './types';
2
- export declare function createCoverageGlobalSetup(config: CoverageConfig): () => Promise<void>;
3
- //# sourceMappingURL=global-setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../../src/coverage/global-setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAG7C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAarF"}
@@ -1,18 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import { removeCoverageFiles } from "./files.js";
3
- function createCoverageGlobalSetup(config) {
4
- return async function globalSetup() {
5
- if (process.env.RB_TEST_COMBINED_COVERAGE === "1") {
6
- return;
7
- }
8
- if (!config.coverageEnabled) {
9
- return;
10
- }
11
- await removeCoverageFiles(config);
12
- await fs.rm(config.coverageReportDir, { recursive: true, force: true });
13
- };
14
- }
15
- export {
16
- createCoverageGlobalSetup
17
- };
18
- //# sourceMappingURL=global-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"global-setup.js","sources":["../../src/coverage/global-setup.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\nexport function createCoverageGlobalSetup(config: CoverageConfig): () => Promise<void> {\n return async function globalSetup() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(config)\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n }\n}\n"],"names":[],"mappings":";;AAMO,SAAS,0BAA0B,QAA6C;AACrF,SAAO,eAAe,cAAc;AAClC,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,iBAAiB;AAC3B;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAChC,UAAM,GAAG,GAAG,OAAO,mBAAmB,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EACxE;AACF;"}
@@ -1,10 +0,0 @@
1
- import { CoverageHarness, CoverageHarnessOptions } from './types';
2
- export declare function createCoverageHarness(options: CoverageHarnessOptions): CoverageHarness;
3
- export { CoverageReporter } from './reporter';
4
- export { createCoverageConfig } from './config';
5
- export { generateCoverageReport } from './report';
6
- export { createCoverageFixtures } from './fixtures';
7
- export { createCoverageGlobalSetup } from './global-setup';
8
- export { findCoverageFiles, removeCoverageFiles } from './files';
9
- export type * from './types';
10
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coverage/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAGtE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAgBtF;AAkCD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAChE,mBAAmB,SAAS,CAAA"}