vitest-dev/vitest · error · Error
BaseReporter's generateReports was not overwritten
Error message
BaseReporter's generateReports was not overwritten
What it means
BaseReporter.generateReports() (coverage.ts:252) is the abstract-style stub that throws unless overridden. It is the hook where a concrete reporter writes final reports (lcov/json/etc.); the base has no implementation to fall back to.
Source
Thrown at packages/vitest/src/node/coverage.ts:252
async getUntestedFiles(testedFiles: string[]): Promise<string[]> {
if (this.options.include == null) {
return []
}
const rootMapper = this.getUntestedFilesByRoot.bind(this, testedFiles, this.options.include)
const matrix = await Promise.all(this.roots.map(rootMapper))
return matrix.flatMap(files => files)
}
createCoverageMap(): CoverageMap {
throw new Error('BaseReporter\'s createCoverageMap was not overwritten')
}
async generateReports(_: CoverageMap, __: boolean | undefined): Promise<void> {
throw new Error('BaseReporter\'s generateReports was not overwritten')
}
async parseConfigModule(_: string): Promise<{ generate: () => { code: string } }> {
throw new Error('BaseReporter\'s parseConfigModule was not overwritten')
}
resolveOptions(): ResolvedCoverageOptions {
return this.options
}
async clean(clean = true): Promise<void> {
await this.reportsDirectoryLock.acquire()
if (clean && existsSync(this.options.reportsDirectory)) {
await fs.rm(this.options.reportsDirectory, {
recursive: true,
force: true,
maxRetries: 10,View on GitHub (pinned to d568f8ce37)
Solutions
- Implement async generateReports(map, allTestsRun) in your subclass.
- Extend a concrete built-in reporter that already implements it.
- Cross-check the full override contract (createCoverageMap, generateReports, parseConfigModule).
Example fix
// before
class MyReporter extends BaseReporter {}
// after
class MyReporter extends BaseReporter {
async generateReports(map: CoverageMap, allTestsRun?: boolean) {
await fs.writeFile('coverage.txt', stringify(map))
}
} Defensive patterns
Strategy: type-guard
Validate before calling
if (reporter.generateReports === BaseReporter.prototype.generateReports) {
throw new Error('Custom reporter must override generateReports')
} Type guard
function overridesGenerateReports(r: BaseReporter): boolean {
return r.generateReports !== BaseReporter.prototype.generateReports
} Prevention
- Implement generateReports in every custom coverage reporter.
- Use a built-in reporter as the base if you don't need custom output.
- Write a smoke test that runs coverage end-to-end with your reporter.
When it happens
Trigger: A custom coverage reporter extending BaseReporter without implementing generateReports, hit at the end of a coverage run when vitest calls it.
Common situations: Custom reporter missing overrides; subclassing the wrong base class.
Related errors
- BaseReporter's createCoverageMap was not overwritten
- BaseReporter's parseConfigModule was not overwritten
- Something removed the coverage directory "${coverageFilesDir
- Something removed the coverage directory "${coverageFilesDir
- V8 provider missing inspector session.
AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03).
Data as JSON: /data/errors/d8e04705736126cc.json.
Report an issue: GitHub.