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

  1. Implement async generateReports(map, allTestsRun) in your subclass.
  2. Extend a concrete built-in reporter that already implements it.
  3. 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

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


AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03). Data as JSON: /data/errors/d8e04705736126cc.json. Report an issue: GitHub.