{"id":"a856c5d97245d13e","repo":"vitest-dev/vitest","slug":"basereporter-s-createcoveragemap-was-not-overwritt","errorCode":null,"errorMessage":"BaseReporter's createCoverageMap was not overwritten","messagePattern":"BaseReporter's createCoverageMap was not overwritten","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/coverage.ts","lineNumber":248,"sourceCode":"    }\n\n    return includedFiles.map(file => slash(path.resolve(root, file)))\n  }\n\n  async getUntestedFiles(testedFiles: string[]): Promise<string[]> {\n    if (this.options.include == null) {\n      return []\n    }\n\n    const rootMapper = this.getUntestedFilesByRoot.bind(this, testedFiles, this.options.include)\n\n    const matrix = await Promise.all(this.roots.map(rootMapper))\n\n    return matrix.flatMap(files => files)\n  }\n\n  createCoverageMap(): CoverageMap {\n    throw new Error('BaseReporter\\'s createCoverageMap was not overwritten')\n  }\n\n  async generateReports(_: CoverageMap, __: boolean | undefined): Promise<void> {\n    throw new Error('BaseReporter\\'s generateReports was not overwritten')\n  }\n\n  async parseConfigModule(_: string): Promise<{ generate: () => { code: string } }> {\n    throw new Error('BaseReporter\\'s parseConfigModule was not overwritten')\n  }\n\n  resolveOptions(): ResolvedCoverageOptions {\n    return this.options\n  }\n\n  async clean(clean = true): Promise<void> {\n    await this.reportsDirectoryLock.acquire()\n\n    if (clean && existsSync(this.options.reportsDirectory)) {","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/coverage.ts#L230-L266","documentation":"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.","triggerScenarios":"A custom coverage reporter that extends BaseReporter without implementing createCoverageMap, exercised during the mergeReports/coverage-aggregation flow that calls it.","commonSituations":"Writing a custom coverage reporter and missing a required override; instantiating BaseReporter directly instead of a concrete reporter.","solutions":["Implement createCoverageMap(): CoverageMap in your custom reporter subclass.","Extend a concrete reporter (e.g. IstanbulReporter / V8Reporter) instead of the abstract base.","Mirror the contract from the built-in reporters in packages/coverage-*."],"exampleFix":"// before\nclass MyReporter extends BaseReporter {}\n// mergeReports calls createCoverageMap() -> throws\n\n// after\nclass MyReporter extends BaseReporter {\n  createCoverageMap(): CoverageMap { return new CoverageMap() }\n}","handlingStrategy":"type-guard","validationCode":"if (typeof reporter.createCoverageMap !== 'function'\n    || reporter.createCoverageMap === BaseReporter.prototype.createCoverageMap) {\n  throw new Error('Custom reporter must override createCoverageMap')\n}","typeGuard":"function overridesCreateCoverageMap(r: BaseReporter): boolean {\n  return r.createCoverageMap !== BaseReporter.prototype.createCoverageMap\n}","tryCatchPattern":null,"preventionTips":["Implement all required overrides when subclassing BaseReporter.","Prefer extending a concrete reporter (V8/Istanbul).","Add a unit test that exercises the coverage merge path for custom reporters."],"tags":["coverage","reporters","extensibility","abstract"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}