mirror of
https://github.com/vitest-dev/vitest.git
synced 2025-12-08 18:26:03 +00:00
94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs'
|
|
import type { AfterSuiteRunMeta, CoverageProvider, CoverageProviderModule, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest'
|
|
|
|
import { normalizeFilename } from './coverage-report-tests/utils'
|
|
|
|
const CustomCoverageProviderModule: CoverageProviderModule = {
|
|
getProvider(): CoverageProvider {
|
|
return new CustomCoverageProvider()
|
|
},
|
|
|
|
takeCoverage() {
|
|
// @ts-expect-error -- untyped
|
|
globalThis.CUSTOM_PROVIDER_TAKE_COVERAGE = true
|
|
|
|
// @ts-expect-error -- untyped
|
|
if (!globalThis.CUSTOM_PROVIDER_START_COVERAGE)
|
|
throw new Error('takeCoverage was called before startCoverage!')
|
|
|
|
return { customCoverage: 'Coverage report passed from workers to main thread' }
|
|
},
|
|
|
|
startCoverage() {
|
|
// @ts-expect-error -- untyped
|
|
globalThis.CUSTOM_PROVIDER_START_COVERAGE = true
|
|
},
|
|
|
|
stopCoverage() {
|
|
// @ts-expect-error -- untyped
|
|
if (!globalThis.CUSTOM_PROVIDER_START_COVERAGE)
|
|
throw new Error('stopCoverage was called before startCoverage!')
|
|
|
|
// @ts-expect-error -- untyped
|
|
if (!globalThis.CUSTOM_PROVIDER_TAKE_COVERAGE)
|
|
throw new Error('stopCoverage was called before takeCoverage!')
|
|
},
|
|
}
|
|
|
|
/**
|
|
* Provider that simply keeps track of the functions that were called
|
|
*/
|
|
class CustomCoverageProvider implements CoverageProvider {
|
|
name = 'custom-coverage-provider'
|
|
|
|
options!: ResolvedCoverageOptions
|
|
calls: Set<string> = new Set()
|
|
transformedFiles: Set<string> = new Set()
|
|
|
|
initialize(ctx: Vitest) {
|
|
this.options = ctx.config.coverage
|
|
|
|
this.calls.add(`initialized ${ctx ? 'with' : 'without'} context`)
|
|
}
|
|
|
|
clean(force: boolean) {
|
|
this.calls.add(`clean ${force ? 'with' : 'without'} force`)
|
|
}
|
|
|
|
onAfterSuiteRun(meta: AfterSuiteRunMeta) {
|
|
this.calls.add(`onAfterSuiteRun with ${JSON.stringify(meta)}`)
|
|
}
|
|
|
|
reportCoverage(reportContext?: ReportContext) {
|
|
this.calls.add(`reportCoverage with ${JSON.stringify(reportContext)}`)
|
|
|
|
const jsonReport = JSON.stringify({
|
|
calls: Array.from(this.calls.values()),
|
|
transformedFiles: Array.from(this.transformedFiles.values()).sort(),
|
|
}, null, 2)
|
|
|
|
if (existsSync('./coverage'))
|
|
rmSync('./coverage', { maxRetries: 10, recursive: true })
|
|
|
|
mkdirSync('./coverage')
|
|
writeFileSync('./coverage/custom-coverage-provider-report.json', jsonReport, 'utf-8')
|
|
}
|
|
|
|
onFileTransform(code: string, id: string) {
|
|
const filename = normalizeFilename(id).split('?')[0]
|
|
|
|
if (/\/src\//.test(filename))
|
|
this.transformedFiles.add(filename)
|
|
|
|
return { code }
|
|
}
|
|
|
|
resolveOptions(): ResolvedCoverageOptions {
|
|
this.calls.add('resolveOptions')
|
|
|
|
return this.options
|
|
}
|
|
}
|
|
|
|
export default CustomCoverageProviderModule
|