Skip to content

Commit 6ecfc4e

Browse files
authored
fix(ui): add support for ui coverage with subdir option (#3917)
1 parent 3891d05 commit 6ecfc4e

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

docs/guide/coverage.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,9 @@ To see all configurable options for coverage, see the [coverage Config Reference
169169
170170
Since Vitest 0.31.0, you can check your coverage report in [Vitest UI](./ui).
171171
172-
If you have configured coverage reporters, don't forget to add `html` reporter to the list, Vitest UI will only enable html coverage report if it is present.
172+
Vitest UI will enable coverage report when it is enabled explicitly and the html coverage reporter is present, otherwise it will not be available:
173+
- enable `coverage.enabled=true` in your configuration or run Vitest with `--coverage.enabled=true` flag
174+
- add `html` to the `coverage.reporters` list: you can also enable `subdir` option to put coverage report in a subdirectory
173175
174176
<img alt="html coverage activation in Vitest UI" img-light src="/vitest-ui-show-coverage-light.png">
175177
<img alt="html coverage activation in Vitest UI" img-dark src="/vitest-ui-show-coverage-dark.png">

packages/ui/client/composables/navigation.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,15 @@ export const coverageUrl = computed(() => {
2121
if (coverageEnabled.value) {
2222
const url = `${window.location.protocol}//${window.location.hostname}:${config.value!.api!.port!}`
2323
const idx = coverage.value!.reportsDirectory.lastIndexOf('/')
24-
return `${url}/${coverage.value!.reportsDirectory.slice(idx + 1)}/index.html`
24+
const htmlReporter = coverage.value!.reporter.find((reporter) => {
25+
if (reporter[0] !== 'html')
26+
return undefined
27+
28+
return reporter
29+
})
30+
return htmlReporter && 'subdir' in htmlReporter[1]
31+
? `${url}/${coverage.value!.reportsDirectory.slice(idx + 1)}/${htmlReporter[1].subdir}/index.html`
32+
: `${url}/${coverage.value!.reportsDirectory.slice(idx + 1)}/index.html`
2533
}
2634

2735
return undefined

packages/ui/node/index.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ export default (ctx: Vitest) => {
1313
const uiOptions = ctx.config
1414
const base = uiOptions.uiBase
1515
const coverageFolder = resolveCoverageFolder(ctx)
16-
const coveragePath = coverageFolder ? `/${basename(coverageFolder)}/` : undefined
16+
const coveragePath = coverageFolder ? coverageFolder[1] : undefined
1717
if (coveragePath && base === coveragePath)
1818
throw new Error(`The ui base path and the coverage path cannot be the same: ${base}, change coverage.reportsDirectory`)
1919

20-
coverageFolder && server.middlewares.use(coveragePath!, sirv(coverageFolder, {
20+
coverageFolder && server.middlewares.use(coveragePath!, sirv(coverageFolder[0], {
2121
single: true,
2222
dev: true,
2323
setHeaders: (res) => {
@@ -35,20 +35,30 @@ export default (ctx: Vitest) => {
3535

3636
function resolveCoverageFolder(ctx: Vitest) {
3737
const options = ctx.config
38-
const enabled = options.api?.port
39-
&& options.coverage?.enabled
40-
&& options.coverage.reporter.some((reporter) => {
38+
const htmlReporter = (options.api?.port && options.coverage?.enabled)
39+
? options.coverage.reporter.find((reporter) => {
4140
if (typeof reporter === 'string')
4241
return reporter === 'html'
4342

44-
return reporter.length && reporter.includes('html')
43+
return reporter[0] === 'html'
4544
})
45+
: undefined
46+
47+
if (!htmlReporter)
48+
return undefined
4649

4750
// reportsDirectory not resolved yet
48-
return enabled
49-
? resolve(
50-
ctx.config?.root || options.root || process.cwd(),
51-
options.coverage.reportsDirectory || coverageConfigDefaults.reportsDirectory,
52-
)
51+
const root = resolve(
52+
ctx.config?.root || options.root || process.cwd(),
53+
options.coverage.reportsDirectory || coverageConfigDefaults.reportsDirectory,
54+
)
55+
56+
const subdir = (Array.isArray(htmlReporter) && htmlReporter.length > 1 && 'subdir' in htmlReporter[1])
57+
? htmlReporter[1].subdir
5358
: undefined
59+
60+
if (!subdir)
61+
return [root, `/${basename(root)}/`]
62+
63+
return [resolve(root, subdir), `/${basename(root)}/${subdir}/`]
5464
}

0 commit comments

Comments
 (0)