supercov 0.0.0 → 0.0.2

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 (97) hide show
  1. package/bin/supercov.js +2 -5
  2. package/dist/analyze.d.ts +12 -0
  3. package/dist/analyze.d.ts.map +1 -0
  4. package/dist/analyze.js +699 -0
  5. package/dist/analyze.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +245 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/instrumenter.d.ts +11 -0
  11. package/dist/instrumenter.d.ts.map +1 -0
  12. package/dist/instrumenter.js +940 -0
  13. package/dist/instrumenter.js.map +1 -0
  14. package/dist/integrity.d.ts +10 -0
  15. package/dist/integrity.d.ts.map +1 -0
  16. package/dist/integrity.js +153 -0
  17. package/dist/integrity.js.map +1 -0
  18. package/dist/playwright.d.ts +13 -0
  19. package/dist/playwright.d.ts.map +1 -0
  20. package/dist/playwright.js +794 -0
  21. package/dist/playwright.js.map +1 -0
  22. package/dist/playwrightReporter.d.ts +6 -0
  23. package/dist/playwrightReporter.d.ts.map +1 -0
  24. package/dist/playwrightReporter.js +40 -0
  25. package/dist/playwrightReporter.js.map +1 -0
  26. package/dist/project.d.ts +11 -0
  27. package/dist/project.d.ts.map +1 -0
  28. package/dist/project.js +112 -0
  29. package/dist/project.js.map +1 -0
  30. package/dist/provenance.d.ts +9 -0
  31. package/dist/provenance.d.ts.map +1 -0
  32. package/dist/provenance.js +51 -0
  33. package/dist/provenance.js.map +1 -0
  34. package/dist/query.d.ts +9 -0
  35. package/dist/query.d.ts.map +1 -0
  36. package/dist/query.js +911 -0
  37. package/dist/query.js.map +1 -0
  38. package/dist/queueAdapters.d.ts +15 -0
  39. package/dist/queueAdapters.d.ts.map +1 -0
  40. package/dist/queueAdapters.js +55 -0
  41. package/dist/queueAdapters.js.map +1 -0
  42. package/dist/register.d.mts +2 -0
  43. package/dist/register.d.mts.map +1 -0
  44. package/dist/register.mjs +112 -0
  45. package/dist/register.mjs.map +1 -0
  46. package/dist/reporter.d.ts +17 -0
  47. package/dist/reporter.d.ts.map +1 -0
  48. package/dist/reporter.js +311 -0
  49. package/dist/reporter.js.map +1 -0
  50. package/dist/resolve-loader.d.mts +2 -0
  51. package/dist/resolve-loader.d.mts.map +1 -0
  52. package/dist/resolve-loader.mjs +40 -0
  53. package/dist/resolve-loader.mjs.map +1 -0
  54. package/dist/runtime.d.ts +46 -0
  55. package/dist/runtime.d.ts.map +1 -0
  56. package/dist/runtime.js +480 -0
  57. package/dist/runtime.js.map +1 -0
  58. package/dist/transport.d.ts +15 -0
  59. package/dist/transport.d.ts.map +1 -0
  60. package/dist/transport.js +100 -0
  61. package/dist/transport.js.map +1 -0
  62. package/dist/types.d.ts +353 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +2 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/vitePlugin.d.ts +8 -0
  67. package/dist/vitePlugin.d.ts.map +1 -0
  68. package/dist/vitePlugin.js +83 -0
  69. package/dist/vitePlugin.js.map +1 -0
  70. package/dist/vitest.d.ts +2 -0
  71. package/dist/vitest.d.ts.map +1 -0
  72. package/dist/vitest.js +89 -0
  73. package/dist/vitest.js.map +1 -0
  74. package/dist/vitestReporter.d.ts +28 -0
  75. package/dist/vitestReporter.d.ts.map +1 -0
  76. package/dist/vitestReporter.js +48 -0
  77. package/dist/vitestReporter.js.map +1 -0
  78. package/package.json +21 -9
  79. package/src/analyze.ts +0 -993
  80. package/src/cli.ts +0 -336
  81. package/src/instrumenter.ts +0 -1254
  82. package/src/integrity.ts +0 -187
  83. package/src/playwright.ts +0 -1009
  84. package/src/playwrightReporter.ts +0 -55
  85. package/src/project.ts +0 -149
  86. package/src/provenance.ts +0 -69
  87. package/src/query.ts +0 -1354
  88. package/src/queueAdapters.ts +0 -104
  89. package/src/register.mjs +0 -123
  90. package/src/reporter.ts +0 -431
  91. package/src/resolve-loader.mjs +0 -45
  92. package/src/runtime.ts +0 -656
  93. package/src/transport.ts +0 -132
  94. package/src/types.ts +0 -412
  95. package/src/vitePlugin.ts +0 -121
  96. package/src/vitest.ts +0 -101
  97. package/src/vitestReporter.ts +0 -72
@@ -0,0 +1,353 @@
1
+ export interface McdcDecisionMeta {
2
+ id: string;
3
+ file: string;
4
+ line: number;
5
+ column: number;
6
+ source: string;
7
+ conditions: string[];
8
+ kind: "if" | "ternary" | "while" | "do-while" | "for";
9
+ }
10
+ export interface McdcVector {
11
+ values: Array<boolean | null>;
12
+ outcome: boolean;
13
+ }
14
+ export interface McdcDecisionSnapshot {
15
+ meta: McdcDecisionMeta;
16
+ vectors: McdcVector[];
17
+ }
18
+ export type CoveragePointKind = "statement" | "function";
19
+ export interface CoveragePointMeta {
20
+ id: string;
21
+ kind: CoveragePointKind;
22
+ file: string;
23
+ line: number;
24
+ column: number;
25
+ source: string;
26
+ label?: string;
27
+ }
28
+ export type CoverageBranchKind = "logical-value" | "logical-assignment" | "optional-chain" | "default-value" | "try-catch" | "for-in" | "for-of" | "switch" | "dynamic-code";
29
+ export interface CoverageBranchMeta {
30
+ id: string;
31
+ kind: CoverageBranchKind;
32
+ file: string;
33
+ line: number;
34
+ column: number;
35
+ source: string;
36
+ alternatives: Array<{
37
+ id: string;
38
+ label: string;
39
+ }>;
40
+ }
41
+ export interface CoverageManifest {
42
+ decisions: McdcDecisionMeta[];
43
+ points: CoveragePointMeta[];
44
+ branches: CoverageBranchMeta[];
45
+ limitations?: CoverageLimitation[];
46
+ }
47
+ export interface CoverageLimitation {
48
+ id: string;
49
+ kind: "dynamic-code";
50
+ file: string;
51
+ line: number;
52
+ column: number;
53
+ source: string;
54
+ reason: string;
55
+ }
56
+ export interface CoverageRuntimeSnapshot {
57
+ decisions: McdcDecisionSnapshot[];
58
+ hits: string[];
59
+ events?: CoverageRuntimeEvent[];
60
+ }
61
+ export interface CoverageExecutionScope {
62
+ version: 1;
63
+ runId: string;
64
+ workerId: string;
65
+ testId: string;
66
+ testKey: string;
67
+ retry: number;
68
+ attemptId: string;
69
+ }
70
+ export type CoverageRuntimeEvent = {
71
+ type: "hit";
72
+ id: string;
73
+ timestampMs: number;
74
+ phaseId?: string;
75
+ environment: "browser" | "server";
76
+ } | {
77
+ type: "decision";
78
+ id: string;
79
+ vector: McdcVector;
80
+ timestampMs: number;
81
+ phaseId?: string;
82
+ environment: "browser" | "server";
83
+ };
84
+ export type CoverageServerRecord = {
85
+ type: "decision";
86
+ meta: McdcDecisionMeta;
87
+ vector: McdcVector;
88
+ timestampMs?: number;
89
+ phaseId?: string;
90
+ scope?: CoverageExecutionScope;
91
+ } | {
92
+ type: "hit";
93
+ id: string;
94
+ timestampMs?: number;
95
+ phaseId?: string;
96
+ scope?: CoverageExecutionScope;
97
+ };
98
+ export interface CoverageCarrier {
99
+ version: 1;
100
+ scope?: CoverageExecutionScope;
101
+ phaseId?: string;
102
+ }
103
+ export interface CoveragePhase {
104
+ id: string;
105
+ kind: "action" | "assertion";
106
+ operation: string;
107
+ source?: string;
108
+ causedByPhaseId?: string;
109
+ startedAtMs: number;
110
+ endedAtMs?: number;
111
+ status?: "passed" | "failed";
112
+ error?: string;
113
+ }
114
+ export interface TestProvenance {
115
+ /** The process responsible for executing the test, such as playwright or vitest. */
116
+ runner: string;
117
+ /** The semantic testing level, such as unit, integration, e2e, or component. */
118
+ kind: string;
119
+ project?: string;
120
+ /** How the kind was established so inferred labels are never presented as explicit. */
121
+ source: "explicit" | "project" | "path" | "runner-default" | "unknown";
122
+ }
123
+ export interface McdcRawTestResult {
124
+ testId?: string;
125
+ /** Run/worker/test/retry identity for an exact concurrently executed attempt. */
126
+ scope?: CoverageExecutionScope;
127
+ test: string;
128
+ testFile?: string;
129
+ title?: string;
130
+ retry?: number;
131
+ /** Outcome of this exact attempt, normalized across test runners. */
132
+ status?: TestAttemptStatus;
133
+ /** Runner-level expected outcome (notably Playwright's test.fail()). */
134
+ expectedStatus?: TestAttemptStatus;
135
+ /** True when the runner reports that an earlier attempt failed. */
136
+ flaky?: boolean;
137
+ provenance?: TestProvenance;
138
+ role?: "test" | "setup" | "background";
139
+ phases?: CoveragePhase[];
140
+ runtime?: CoverageRuntimeSnapshot[];
141
+ browser: CoverageRuntimeSnapshot[];
142
+ server: CoverageServerRecord[];
143
+ }
144
+ export type TestAttemptStatus = "passed" | "failed" | "skipped" | "timedOut" | "interrupted" | "unknown";
145
+ export type TestOutcome = "passed" | "failed" | "flaky" | "skipped" | "timedOut" | "interrupted" | "unknown";
146
+ export interface TestAttemptResult {
147
+ retry: number;
148
+ status: TestAttemptStatus;
149
+ expectedStatus?: TestAttemptStatus;
150
+ }
151
+ export interface McdcVectorObservation {
152
+ vector: McdcVector;
153
+ tests: string[];
154
+ phases?: string[];
155
+ explicitPhases?: string[];
156
+ confidence?: CoverageConfidence;
157
+ }
158
+ export interface CoverageConfidence {
159
+ level: "unexecuted" | "executed" | "action" | "asserted";
160
+ setupOnly: boolean;
161
+ backgroundOnly: boolean;
162
+ asserted: boolean;
163
+ tests: string[];
164
+ assertedTests: string[];
165
+ runners: string[];
166
+ kinds: string[];
167
+ e2e: boolean;
168
+ }
169
+ export interface McdcConditionResult {
170
+ index: number;
171
+ source: string;
172
+ covered: boolean;
173
+ witness?: [McdcVector, McdcVector];
174
+ witnessTests?: [string[], string[]];
175
+ assertionCovered?: boolean;
176
+ }
177
+ export interface McdcDecisionResult {
178
+ meta: McdcDecisionMeta;
179
+ executed: boolean;
180
+ covered: boolean;
181
+ vectors: McdcVector[];
182
+ vectorObservations: McdcVectorObservation[];
183
+ conditions: McdcConditionResult[];
184
+ tests: string[];
185
+ confidence?: CoverageConfidence;
186
+ }
187
+ export interface CoverageCount {
188
+ covered: number;
189
+ total: number;
190
+ percentage: number;
191
+ }
192
+ export interface CoveragePointResult {
193
+ meta: CoveragePointMeta;
194
+ covered: boolean;
195
+ tests: string[];
196
+ phases?: string[];
197
+ confidence?: CoverageConfidence;
198
+ }
199
+ export interface CoverageBranchResult {
200
+ meta: CoverageBranchMeta;
201
+ covered: boolean;
202
+ alternatives: Array<{
203
+ id: string;
204
+ label: string;
205
+ covered: boolean;
206
+ tests: string[];
207
+ phases?: string[];
208
+ confidence?: CoverageConfidence;
209
+ }>;
210
+ }
211
+ export interface CoveragePhaseResult extends CoveragePhase {
212
+ test: string;
213
+ hits: string[];
214
+ decisions: Array<{
215
+ id: string;
216
+ vectors: McdcVector[];
217
+ }>;
218
+ lines: Array<{
219
+ file: string;
220
+ line: number;
221
+ }>;
222
+ browserEvents: number;
223
+ serverEvents: number;
224
+ explicitEvents: number;
225
+ inferredEvents: number;
226
+ explicitBrowserEvents: number;
227
+ inferredBrowserEvents: number;
228
+ explicitServerEvents: number;
229
+ inferredServerEvents: number;
230
+ }
231
+ export interface TestCoverageResult {
232
+ id: string;
233
+ name: string;
234
+ file?: string;
235
+ title?: string;
236
+ retries: number[];
237
+ attempts: TestAttemptResult[];
238
+ outcome: TestOutcome;
239
+ provenance: TestProvenance;
240
+ role: "test" | "setup" | "background";
241
+ hits: string[];
242
+ decisions: Array<{
243
+ id: string;
244
+ vectors: McdcVector[];
245
+ }>;
246
+ lines: Array<{
247
+ file: string;
248
+ line: number;
249
+ }>;
250
+ }
251
+ export interface TestFileCoverageResult {
252
+ file: string;
253
+ tests: string[];
254
+ runners: string[];
255
+ kinds: string[];
256
+ lines: Array<{
257
+ file: string;
258
+ line: number;
259
+ }>;
260
+ }
261
+ export interface CoverageSummary {
262
+ decisions: number;
263
+ executedDecisions: number;
264
+ coveredDecisions: number;
265
+ conditions: number;
266
+ coveredConditions: number;
267
+ conditionCoveragePct: number;
268
+ lines: CoverageCount;
269
+ statements: CoverageCount;
270
+ functions: CoverageCount;
271
+ branches: CoverageCount;
272
+ decisionOutcomes: CoverageCount;
273
+ conditionOutcomes: CoverageCount;
274
+ valueSelections: CoverageCount;
275
+ coverageComplete: boolean;
276
+ completenessBlocked?: boolean;
277
+ }
278
+ export interface CoverageRunFingerprint {
279
+ algorithm: "sha256";
280
+ source: string;
281
+ tests: string;
282
+ dependencies: string;
283
+ configuration: string;
284
+ instrumenter: string;
285
+ combined: string;
286
+ sourceFiles: number;
287
+ testFiles: number;
288
+ }
289
+ export interface CoverageRunIntegrity {
290
+ schemaVersion: number;
291
+ instrumenterVersion: string;
292
+ git?: {
293
+ revision?: string;
294
+ dirty: boolean;
295
+ };
296
+ fingerprint: CoverageRunFingerprint;
297
+ stale?: boolean;
298
+ staleReasons?: string[];
299
+ }
300
+ export interface McdcCoverageView {
301
+ generatedAt: string;
302
+ variant: "masking-short-circuit";
303
+ model: {
304
+ name: string;
305
+ completenessMeaning: string;
306
+ measured: string[];
307
+ notMeasured: string[];
308
+ };
309
+ integrity?: CoverageRunIntegrity;
310
+ limitations?: CoverageLimitation[];
311
+ summary: CoverageSummary;
312
+ coverageByKind: Array<{
313
+ kind: string;
314
+ tests: number;
315
+ setups: number;
316
+ summary: CoverageSummary;
317
+ }>;
318
+ coverageByRunner: Array<{
319
+ runner: string;
320
+ tests: number;
321
+ setups: number;
322
+ summary: CoverageSummary;
323
+ }>;
324
+ decisions: McdcDecisionResult[];
325
+ points: CoveragePointResult[];
326
+ branches: CoverageBranchResult[];
327
+ tests: TestCoverageResult[];
328
+ testFiles: TestFileCoverageResult[];
329
+ phases: CoveragePhaseResult[];
330
+ lines: Array<{
331
+ file: string;
332
+ line: number;
333
+ covered: boolean;
334
+ tests: string[];
335
+ runners: string[];
336
+ kinds: string[];
337
+ exclusiveKind?: string;
338
+ phases?: string[];
339
+ confidence?: CoverageConfidence;
340
+ }>;
341
+ }
342
+ export interface McdcReport extends McdcCoverageView {
343
+ execution?: {
344
+ testExitCode?: number | null;
345
+ valid: boolean;
346
+ };
347
+ /** Materialized evidence filters; top-level coverage contains all attempts. */
348
+ filters?: {
349
+ passed: McdcCoverageView;
350
+ failed: McdcCoverageView;
351
+ };
352
+ }
353
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { Plugin } from "vite";
2
+ export interface McdcVitePluginOptions {
3
+ root?: string;
4
+ sourceRoots?: string[];
5
+ manifestPath?: string;
6
+ }
7
+ export declare function mcdcVitePlugin(options?: McdcVitePluginOptions): Plugin;
8
+ //# sourceMappingURL=vitePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePlugin.d.ts","sourceRoot":"","sources":["../src/vitePlugin.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AASnC,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAgG1E"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from "node:fs";
2
+ import { dirname, relative, resolve, sep } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { instrumentMcdc, mcdcRuntimeModuleId } from "./instrumenter.js";
5
+ export function mcdcVitePlugin(options = {}) {
6
+ const root = options.root ?? process.cwd();
7
+ const sourceRoots = (options.sourceRoots ?? ["app", "src"])
8
+ .map((directory) => resolve(root, directory))
9
+ .filter((directory) => existsSync(directory));
10
+ const runtimePath = fileURLToPath(new URL("./runtime.js", import.meta.url));
11
+ const manifestPath = options.manifestPath
12
+ ? resolve(root, options.manifestPath)
13
+ : resolve(root, ".supercov/mcdc-manifest.json");
14
+ const markerPath = resolve(dirname(manifestPath), ".mcdc-enabled");
15
+ const decisions = new Map();
16
+ const points = new Map();
17
+ const branches = new Map();
18
+ const limitations = new Map();
19
+ const recordManifest = (manifest) => {
20
+ for (const decision of manifest.decisions)
21
+ decisions.set(decision.id, decision);
22
+ for (const point of manifest.points)
23
+ points.set(point.id, point);
24
+ for (const branch of manifest.branches)
25
+ branches.set(branch.id, branch);
26
+ for (const limitation of manifest.limitations ?? [])
27
+ limitations.set(limitation.id, limitation);
28
+ };
29
+ const sourceFiles = (directory) => readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
30
+ const path = resolve(directory, entry.name);
31
+ if (entry.isDirectory())
32
+ return sourceFiles(path);
33
+ return /\.[cm]?[jt]sx?$/.test(entry.name) ? [path] : [];
34
+ });
35
+ return {
36
+ name: "supercov-mcdc",
37
+ enforce: "pre",
38
+ resolveId(id) {
39
+ if (id === mcdcRuntimeModuleId)
40
+ return runtimePath;
41
+ return null;
42
+ },
43
+ buildStart() {
44
+ // Vite only transforms modules reachable from a build entry. Scan every
45
+ // source file up front so never-imported executable code is still in the
46
+ // denominator and appears as uncovered rather than disappearing.
47
+ for (const sourceRoot of sourceRoots) {
48
+ for (const id of sourceFiles(sourceRoot)) {
49
+ const file = relative(root, id).split(sep).join("/");
50
+ recordManifest(instrumentMcdc(readFileSync(id, "utf8"), file).manifest);
51
+ }
52
+ }
53
+ },
54
+ transform(code, rawId) {
55
+ const id = rawId.split("?")[0] ?? rawId;
56
+ if (!sourceRoots.some((sourceRoot) => id === sourceRoot || id.startsWith(`${sourceRoot}${sep}`)) ||
57
+ !/\.[cm]?[jt]sx?$/.test(id))
58
+ return null;
59
+ const file = relative(root, id).split(sep).join("/");
60
+ const result = instrumentMcdc(code, file);
61
+ recordManifest(result.manifest);
62
+ return {
63
+ code: result.code,
64
+ ...(result.map ? { map: JSON.parse(JSON.stringify(result.map)) } : {}),
65
+ };
66
+ },
67
+ closeBundle() {
68
+ mkdirSync(dirname(manifestPath), { recursive: true });
69
+ const sortByLocation = (values) => values.sort((left, right) => left.file === right.file
70
+ ? left.line - right.line || left.column - right.column
71
+ : left.file.localeCompare(right.file));
72
+ const manifest = {
73
+ decisions: sortByLocation([...decisions.values()]),
74
+ points: sortByLocation([...points.values()]),
75
+ branches: sortByLocation([...branches.values()]),
76
+ limitations: sortByLocation([...limitations.values()]),
77
+ };
78
+ writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
79
+ writeFileSync(markerPath, "coverage-completeness-v2\n");
80
+ },
81
+ };
82
+ }
83
+ //# sourceMappingURL=vitePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitePlugin.js","sourceRoot":"","sources":["../src/vitePlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vitest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":""}
package/dist/vitest.js ADDED
@@ -0,0 +1,89 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { relative, resolve, sep } from "node:path";
3
+ import { afterEach, beforeEach } from "vitest";
4
+ import { coverageSnapshot, resetCoverage } from "./runtime.js";
5
+ import { inferTestProvenance } from "./provenance.js";
6
+ const evidenceDirectory = process.env["SUPERCOV_EVIDENCE_DIR"];
7
+ const emittedSetupFiles = new Set();
8
+ function attemptStatus(state) {
9
+ if (state === "pass")
10
+ return "passed";
11
+ if (state === "fail")
12
+ return "failed";
13
+ if (state === "skip" || state === "todo")
14
+ return "skipped";
15
+ return "unknown";
16
+ }
17
+ function titlePath(task) {
18
+ const names = [task.name];
19
+ let suite = task.suite;
20
+ while (suite?.name) {
21
+ names.unshift(suite.name);
22
+ suite = suite.suite;
23
+ }
24
+ return names;
25
+ }
26
+ function writeEvidence(payload, suffix) {
27
+ if (!evidenceDirectory)
28
+ return;
29
+ const directory = resolve(process.cwd(), evidenceDirectory, suffix);
30
+ mkdirSync(directory, { recursive: true });
31
+ writeFileSync(resolve(directory, "mcdc.json"), `${JSON.stringify(payload)}\n`);
32
+ }
33
+ beforeEach((context) => {
34
+ const task = context.task;
35
+ const testFile = relative(process.cwd(), task.file.filepath)
36
+ .split(sep)
37
+ .join("/");
38
+ if (!emittedSetupFiles.has(testFile)) {
39
+ emittedSetupFiles.add(testFile);
40
+ const setupSnapshot = coverageSnapshot();
41
+ if (setupSnapshot.hits.length || setupSnapshot.decisions.length) {
42
+ writeEvidence({
43
+ testId: `vitest:${task.file.id}:setup`,
44
+ test: `${testFile} > module setup`,
45
+ testFile,
46
+ title: "module setup",
47
+ retry: 0,
48
+ status: "passed",
49
+ provenance: inferTestProvenance({
50
+ runner: "vitest",
51
+ file: testFile,
52
+ project: task.file.projectName,
53
+ explicitKind: process.env["SUPERCOV_TEST_KIND"],
54
+ }),
55
+ role: "setup",
56
+ runtime: [setupSnapshot],
57
+ browser: [],
58
+ server: [],
59
+ }, `vitest-${task.file.id}-setup`);
60
+ }
61
+ }
62
+ resetCoverage(`vitest:${task.id}`);
63
+ });
64
+ afterEach((context) => {
65
+ const task = context.task;
66
+ const testFile = relative(process.cwd(), task.file.filepath)
67
+ .split(sep)
68
+ .join("/");
69
+ const retry = task.result?.retryCount ?? 0;
70
+ const payload = {
71
+ testId: `vitest:${task.id}`,
72
+ test: [...titlePath(task)].join(" > "),
73
+ testFile,
74
+ title: task.name,
75
+ retry,
76
+ status: attemptStatus(task.result?.state),
77
+ provenance: inferTestProvenance({
78
+ runner: "vitest",
79
+ file: testFile,
80
+ project: task.file.projectName,
81
+ explicitKind: process.env["SUPERCOV_TEST_KIND"],
82
+ }),
83
+ runtime: [coverageSnapshot()],
84
+ browser: [],
85
+ server: [],
86
+ };
87
+ writeEvidence(payload, `vitest-${task.id}-${retry}`);
88
+ });
89
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Reporter } from "vitest/reporters";
2
+ interface ReportedTestCase {
3
+ id: string;
4
+ name: string;
5
+ fullName: string;
6
+ module: {
7
+ moduleId: string;
8
+ };
9
+ project: {
10
+ name?: string;
11
+ };
12
+ options: {
13
+ fails?: boolean;
14
+ };
15
+ result(): {
16
+ state: "passed" | "failed" | "skipped" | "pending";
17
+ };
18
+ diagnostic(): {
19
+ retryCount: number;
20
+ flaky: boolean;
21
+ } | undefined;
22
+ }
23
+ /** Records final runner outcomes, including tests that never execute hooks. */
24
+ export default class SupercovVitestReporter implements Reporter {
25
+ onTestCaseResult(testCase: ReportedTestCase): void;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=vitestReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitestReporter.d.ts","sourceRoot":"","sources":["../src/vitestReporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7B,MAAM,IAAI;QACR,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;KACpD,CAAC;IACF,UAAU,IACN;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GACtC,SAAS,CAAC;CACf;AASD,+EAA+E;AAC/E,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,QAAQ;IAC7D,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAuCjD;CACF"}
@@ -0,0 +1,48 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { relative, resolve, sep } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { inferTestProvenance } from "./provenance.js";
5
+ function sourcePath(moduleId) {
6
+ const absolute = moduleId.startsWith("file:")
7
+ ? fileURLToPath(moduleId)
8
+ : moduleId;
9
+ return relative(process.cwd(), absolute).split(sep).join("/");
10
+ }
11
+ /** Records final runner outcomes, including tests that never execute hooks. */
12
+ export default class SupercovVitestReporter {
13
+ onTestCaseResult(testCase) {
14
+ const evidenceDirectory = process.env["SUPERCOV_EVIDENCE_DIR"];
15
+ if (!evidenceDirectory)
16
+ return;
17
+ const result = testCase.result();
18
+ if (result.state === "pending")
19
+ return;
20
+ const diagnostic = testCase.diagnostic();
21
+ const testFile = sourcePath(testCase.module.moduleId);
22
+ const retry = diagnostic?.retryCount ?? 0;
23
+ const payload = {
24
+ testId: `vitest:${testCase.id}`,
25
+ test: testCase.fullName,
26
+ testFile,
27
+ title: testCase.name,
28
+ retry,
29
+ status: result.state,
30
+ expectedStatus: testCase.options.fails ? "failed" : "passed",
31
+ flaky: diagnostic?.flaky ?? false,
32
+ provenance: inferTestProvenance({
33
+ runner: "vitest",
34
+ file: testFile,
35
+ project: testCase.project.name,
36
+ explicitKind: process.env["SUPERCOV_TEST_KIND"],
37
+ }),
38
+ runtime: [],
39
+ browser: [],
40
+ server: [],
41
+ };
42
+ const safeId = testCase.id.replace(/[^a-zA-Z0-9_-]/g, "_");
43
+ const directory = resolve(process.cwd(), evidenceDirectory, `vitest-${safeId}-${retry}-status`);
44
+ mkdirSync(directory, { recursive: true });
45
+ writeFileSync(resolve(directory, "mcdc.json"), `${JSON.stringify(payload)}\n`);
46
+ }
47
+ }
48
+ //# sourceMappingURL=vitestReporter.js.map