{"id":"d8e04705736126cc","repo":"vitest-dev/vitest","slug":"basereporter-s-generatereports-was-not-overwritten","errorCode":null,"errorMessage":"BaseReporter's generateReports was not overwritten","messagePattern":"BaseReporter's generateReports was not overwritten","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/coverage.ts","lineNumber":252,"sourceCode":"\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)) {\n      await fs.rm(this.options.reportsDirectory, {\n        recursive: true,\n        force: true,\n        maxRetries: 10,","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/coverage.ts#L234-L270","documentation":"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.","triggerScenarios":"A custom coverage reporter extending BaseReporter without implementing generateReports, hit at the end of a coverage run when vitest calls it.","commonSituations":"Custom reporter missing overrides; subclassing the wrong base class.","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)."],"exampleFix":"// before\nclass MyReporter extends BaseReporter {}\n\n// after\nclass MyReporter extends BaseReporter {\n  async generateReports(map: CoverageMap, allTestsRun?: boolean) {\n    await fs.writeFile('coverage.txt', stringify(map))\n  }\n}","handlingStrategy":"type-guard","validationCode":"if (reporter.generateReports === BaseReporter.prototype.generateReports) {\n  throw new Error('Custom reporter must override generateReports')\n}","typeGuard":"function overridesGenerateReports(r: BaseReporter): boolean {\n  return r.generateReports !== BaseReporter.prototype.generateReports\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["coverage","reporters","extensibility","abstract"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}