|
1 | 1 | import { fileURLToPath } from 'node:url'
|
2 | 2 |
|
3 |
| -import { resolve } from 'node:path' |
| 3 | +import { basename, resolve } from 'pathe' |
4 | 4 | import sirv from 'sirv'
|
5 | 5 | import type { Plugin } from 'vite'
|
6 | 6 | import type { WorkspaceProject } from 'vitest/node'
|
| 7 | +import { coverageConfigDefaults } from 'vitest/config' |
7 | 8 | import { injectVitestModule } from './esmInjector'
|
8 | 9 |
|
9 | 10 | export default (project: WorkspaceProject, base = '/'): Plugin[] => {
|
@@ -36,6 +37,19 @@ export default (project: WorkspaceProject, base = '/'): Plugin[] => {
|
36 | 37 | },
|
37 | 38 | }),
|
38 | 39 | )
|
| 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 | + })) |
39 | 53 | },
|
40 | 54 | },
|
41 | 55 | {
|
@@ -114,3 +128,33 @@ export default (project: WorkspaceProject, base = '/'): Plugin[] => {
|
114 | 128 | },
|
115 | 129 | ]
|
116 | 130 | }
|
| 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