Skip to content

Commit c469c74

Browse files
authored
fix(coverage): clean up empty coverage reports directory (#5731)
1 parent a20e75b commit c469c74

File tree

4 files changed

+38
-3
lines changed

4 files changed

+38
-3
lines changed

packages/coverage-istanbul/src/provider.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { existsSync, promises as fs, writeFileSync } from 'node:fs'
1+
import { existsSync, promises as fs, readdirSync, writeFileSync } from 'node:fs'
22
import { resolve } from 'pathe'
33
import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest'
44
import { coverageConfigDefaults, defaultExclude, defaultInclude } from 'vitest/config'
@@ -255,6 +255,10 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co
255255
if (!keepResults) {
256256
this.coverageFiles = new Map()
257257
await fs.rm(this.coverageFilesDirectory, { recursive: true })
258+
259+
// Remove empty reports directory, e.g. when only text-reporter is used
260+
if (readdirSync(this.options.reportsDirectory).length === 0)
261+
await fs.rm(this.options.reportsDirectory, { recursive: true })
258262
}
259263
}
260264

packages/coverage-v8/src/provider.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { existsSync, promises as fs, writeFileSync } from 'node:fs'
1+
import { existsSync, promises as fs, readdirSync, writeFileSync } from 'node:fs'
22
import type { Profiler } from 'node:inspector'
33
import { fileURLToPath, pathToFileURL } from 'node:url'
44
import v8ToIstanbul from 'v8-to-istanbul'
@@ -246,6 +246,10 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
246246
if (!keepResults) {
247247
this.coverageFiles = new Map()
248248
await fs.rm(this.coverageFilesDirectory, { recursive: true })
249+
250+
// Remove empty reports directory, e.g. when only text-reporter is used
251+
if (readdirSync(this.options.reportsDirectory).length === 0)
252+
await fs.rm(this.options.reportsDirectory, { recursive: true })
249253
}
250254
}
251255

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Generic test fixture to generate some coverage
2+
3+
import { test } from 'vitest'
4+
import { add } from '../src/utils'
5+
6+
test('cover some lines', () => {
7+
add(1, 2)
8+
})

test/coverage-test/testing-options.mjs

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readFileSync, rmSync, writeFileSync } from 'node:fs'
1+
import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
22
import { startVitest } from 'vitest/node'
33

44
/**
@@ -147,6 +147,25 @@ const testCases = [
147147
process.exitCode = 0
148148
},
149149
},
150+
{
151+
testConfig: {
152+
name: 'remove empty coverages directory',
153+
include: ['option-tests/fixture.test.ts'],
154+
coverage: {
155+
reporter: 'text',
156+
all: false,
157+
include: ['src/utils.ts'],
158+
},
159+
},
160+
after() {
161+
if (existsSync('./coverage')) {
162+
if (readdirSync('./coverage').length !== 0)
163+
throw new Error('Test case expected coverage directory to be empty')
164+
165+
throw new Error('Empty coverage directory was not cleaned')
166+
}
167+
},
168+
},
150169
]
151170

152171
for (const provider of ['v8', 'istanbul']) {

0 commit comments

Comments
 (0)