{"record":{"id":"9aea5b61e49688ab","repo":"vitest-dev/vitest","slug":"you-cannot-set-coverage-reportsdirectory-as-re","errorCode":null,"errorMessage":"You cannot set \"coverage.reportsDirectory\" as ${reportsDirectory}. Vitest needs to be able to remove this directory before test run","messagePattern":"You cannot set \"coverage\\.reportsDirectory\" as (.+?)\\. Vitest needs to be able to remove this directory before test run","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/config/resolveConfig.ts","lineNumber":513,"sourceCode":"        resolved.coverage.reporter.push(['text-summary', {}])\n      }\n    }\n  }\n  if (resolved.coverage.changed === undefined && resolved.changed !== undefined) {\n    resolved.coverage.changed = resolved.changed\n  }\n\n  if (resolved.coverage.enabled && resolved.coverage.reportsDirectory) {\n    const reportsDirectory = resolve(\n      resolved.root,\n      resolved.coverage.reportsDirectory,\n    )\n\n    if (\n      reportsDirectory === resolved.root\n      || reportsDirectory === process.cwd()\n    ) {\n      throw new Error(\n        `You cannot set \"coverage.reportsDirectory\" as ${reportsDirectory}. Vitest needs to be able to remove this directory before test run`,\n      )\n    }\n\n    if (resolved.coverage.htmlDir) {\n      resolved.coverage.htmlDir = resolve(\n        resolved.root,\n        resolved.coverage.htmlDir,\n      )\n    }\n\n    // infer default htmlDir based on builtin reporter's html output location\n    if (!resolved.coverage.htmlDir) {\n      const htmlReporter = resolved.coverage.reporter.find(([name]) => name === 'html' || name === 'html-spa')\n      if (htmlReporter) {\n        const [, options] = htmlReporter\n        const subdir = options && typeof options === 'object' && 'subdir' in options && typeof options.subdir === 'string'\n          ? options.subdir","sourceCodeStart":495,"sourceCodeEnd":531,"githubUrl":"https://github.com/vitest-dev/vitest/blob/1fa9837ec26533512fdcad8baebf249771bd340a/packages/vitest/src/node/config/resolveConfig.ts#L495-L531","documentation":"Before each run Vitest clears the coverage `reportsDirectory` so stale data does not leak into the new report. If that directory resolves to the project root or `process.cwd()`, clearing it would delete the user's whole project. The guard compares the resolved path against `resolved.root` and `process.cwd()` and refuses rather than perform a destructive wipe.","triggerScenarios":"Setting `coverage.reportsDirectory: '.'`, `coverage.reportsDirectory: './'`, or pointing it at the same path as `root`/cwd.","commonSituations":"Trying to dump coverage at the repo root for convenience; a relative path that resolves to the root in CI but to a subfolder locally.","solutions":["Point `coverage.reportsDirectory` at a subfolder such as `./coverage`.","If you need coverage artifacts at the root, post-process/copy them after the run instead of redirecting the directory.","Confirm the resolved absolute path is neither `root` nor `cwd`."],"exampleFix":"// before\ntest: { coverage: { reportsDirectory: '.' } }\n// after\ntest: { coverage: { reportsDirectory: './coverage' } }","handlingStrategy":"validation","validationCode":"import { resolve } from 'node:path'\nconst reportsDirectory = resolve(config.root ?? process.cwd(), config.test.coverage.reportsDirectory)\nif (reportsDirectory === config.root || reportsDirectory === process.cwd()) {\n  throw new Error(`coverage.reportsDirectory resolves to root: ${reportsDirectory}`)\n}","typeGuard":"function isSafeReportsDirectory(dir: string, root: string, cwd: string): boolean {\n  return dir !== root && dir !== cwd\n}","tryCatchPattern":null,"preventionTips":["Always use a named subfolder like `./coverage`.","In CI, assert the resolved reports directory is a child of the workspace root."],"tags":["config","coverage","safety","filesystem"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}