vitest-dev/vitest · error · Error

BaseReporter's createCoverageMap was not overwritten

Error message

BaseReporter's createCoverageMap was not overwritten

What it means

BaseReporter.createCoverageMap() (coverage.ts:248) is an abstract-style stub — the base class cannot build a coverage map, so it always throws. Concrete coverage reporters (Istanbul/V8) override it; the error only surfaces when a custom subclass forgets to.

Source

Thrown at packages/vitest/src/node/coverage.ts:248

    }

    return includedFiles.map(file => slash(path.resolve(root, file)))
  }

  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)) {

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Implement createCoverageMap(): CoverageMap in your custom reporter subclass.
  2. Extend a concrete reporter (e.g. IstanbulReporter / V8Reporter) instead of the abstract base.
  3. Mirror the contract from the built-in reporters in packages/coverage-*.

Example fix

// before
class MyReporter extends BaseReporter {}
// mergeReports calls createCoverageMap() -> throws

// after
class MyReporter extends BaseReporter {
  createCoverageMap(): CoverageMap { return new CoverageMap() }
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (typeof reporter.createCoverageMap !== 'function'
    || reporter.createCoverageMap === BaseReporter.prototype.createCoverageMap) {
  throw new Error('Custom reporter must override createCoverageMap')
}

Type guard

function overridesCreateCoverageMap(r: BaseReporter): boolean {
  return r.createCoverageMap !== BaseReporter.prototype.createCoverageMap
}

Prevention

When it happens

Trigger: A custom coverage reporter that extends BaseReporter without implementing createCoverageMap, exercised during the mergeReports/coverage-aggregation flow that calls it.

Common situations: Writing a custom coverage reporter and missing a required override; instantiating BaseReporter directly instead of a concrete reporter.

Related errors


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