{"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":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/config/resolveConfig.ts","lineNumber":485,"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":467,"sourceCodeEnd":503,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/config/resolveConfig.ts#L467-L503","documentation":"Vitest clears the coverage reports directory at the start of each run to avoid stale data mixing with new results. The guard at resolveConfig.ts:481 refuses to proceed when the resolved `coverage.reportsDirectory` equals the project root or the current working directory, because deleting either would wipe the whole project.","triggerScenarios":"Set `coverage: { reportsDirectory: '.' }`, `reportsDirectory: '/'`, or `reportsDirectory` resolving to `process.cwd()` or `resolved.root`.","commonSituations":"Setting reportsDirectory to '.' to put coverage next to the config; absolute path that happens to be the repo root; relative path that resolves up to root.","solutions":["Point reportsDirectory at a dedicated subfolder: `reportsDirectory: './coverage'` (the default).","If you need a custom location, ensure it is strictly inside the project, not the root itself.","Double-check absolute paths that they don't resolve to process.cwd()."],"exampleFix":"// before\nexport default defineConfig({ test: { coverage: { enabled: true, reportsDirectory: '.' } } })\n// after\nexport default defineConfig({ test: { coverage: { enabled: true, reportsDirectory: './coverage' } } })","handlingStrategy":"validation","validationCode":"import { resolve } from 'node:path'\nfunction assertReportsDirectorySafe(reportsDirectory: string, root: string) {\n  const resolved = resolve(root, reportsDirectory)\n  if (resolved === root || resolved === process.cwd()) {\n    throw new Error(`coverage.reportsDirectory (${resolved}) must not be the project root or cwd.`)\n  }\n}","typeGuard":"function isReportsDirectorySafe(reportsDirectory: string, root: string): boolean {\n  const resolved = resolve(root, reportsDirectory)\n  return resolved !== root && resolved !== process.cwd()\n}","tryCatchPattern":null,"preventionTips":["Keep the default './coverage' or a named subfolder.","Never set reportsDirectory to '.' or '/'.","Resolve absolute paths and compare against root before applying."],"tags":["config","coverage","filesystem","safety"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}