Skip to content

Commit ae73f27

Browse files
authoredFeb 2, 2024
fix(browser): support coverage.reportsDirectory with multiple directories (#5056)
1 parent 1fa90d1 commit ae73f27

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed
 

‎packages/browser/src/node/index.ts

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { fileURLToPath } from 'node:url'
22

3-
import { resolve } from 'node:path'
3+
import { basename, resolve } from 'pathe'
44
import sirv from 'sirv'
55
import type { Plugin } from 'vite'
66
import type { WorkspaceProject } from 'vitest/node'
7+
import { coverageConfigDefaults } from 'vitest/config'
78
import { injectVitestModule } from './esmInjector'
89

910
export default (project: WorkspaceProject, base = '/'): Plugin[] => {
@@ -36,6 +37,19 @@ export default (project: WorkspaceProject, base = '/'): Plugin[] => {
3637
},
3738
}),
3839
)
40+
41+
const coverageFolder = resolveCoverageFolder(project)
42+
const coveragePath = coverageFolder ? coverageFolder[1] : undefined
43+
if (coveragePath && base === coveragePath)
44+
throw new Error(`The ui base path and the coverage path cannot be the same: ${base}, change coverage.reportsDirectory`)
45+
46+
coverageFolder && server.middlewares.use(coveragePath!, sirv(coverageFolder[0], {
47+
single: true,
48+
dev: true,
49+
setHeaders: (res) => {
50+
res.setHeader('Cache-Control', 'public,max-age=0,must-revalidate')
51+
},
52+
}))
3953
},
4054
},
4155
{
@@ -114,3 +128,33 @@ export default (project: WorkspaceProject, base = '/'): Plugin[] => {
114128
},
115129
]
116130
}
131+
132+
function resolveCoverageFolder(project: WorkspaceProject) {
133+
const options = project.ctx.config
134+
const htmlReporter = options.coverage?.enabled
135+
? options.coverage.reporter.find((reporter) => {
136+
if (typeof reporter === 'string')
137+
return reporter === 'html'
138+
139+
return reporter[0] === 'html'
140+
})
141+
: undefined
142+
143+
if (!htmlReporter)
144+
return undefined
145+
146+
// reportsDirectory not resolved yet
147+
const root = resolve(
148+
options.root || options.root || process.cwd(),
149+
options.coverage.reportsDirectory || coverageConfigDefaults.reportsDirectory,
150+
)
151+
152+
const subdir = (Array.isArray(htmlReporter) && htmlReporter.length > 1 && 'subdir' in htmlReporter[1])
153+
? htmlReporter[1].subdir
154+
: undefined
155+
156+
if (!subdir || typeof subdir !== 'string')
157+
return [root, `/${basename(root)}/`]
158+
159+
return [resolve(root, subdir), `/${basename(root)}/${subdir}/`]
160+
}

0 commit comments

Comments
 (0)
Please sign in to comment.