{"id":"ab015487f91a9b7d","repo":"vitest-dev/vitest","slug":"vitest-mergereports-expects-all-paths-in-blob","errorCode":null,"errorMessage":"vitest.mergeReports() expects all paths in \"${blobsDirectory}\" to be files generated by the blob reporter, but \"${filename}\" is not a file","messagePattern":"vitest\\.mergeReports\\(\\) expects all paths in \"(.+?)\" to be files generated by the blob reporter, but \"(.+?)\" is not a file","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/reporters/blob.ts","lineNumber":126,"sourceCode":"    }\n\n    this.ctx.logger.log('blob report written to', outputFile)\n  }\n}\n\nexport async function readBlobs(\n  currentVersion: string,\n  blobsDirectory: string,\n  projectsArray: TestProject[],\n): Promise<MergedBlobs> {\n  // using process.cwd() because --merge-reports can only be used in CLI\n  const resolvedDir = resolve(process.cwd(), blobsDirectory)\n  const blobsFiles = await readdir(resolvedDir)\n  const promises = blobsFiles.map(async (filename) => {\n    const fullPath = resolve(resolvedDir, filename)\n    const stats = await stat(fullPath)\n    if (!stats.isFile()) {\n      throw new TypeError(\n        `vitest.mergeReports() expects all paths in \"${blobsDirectory}\" to be files generated by the blob reporter, but \"${filename}\" is not a file`,\n      )\n    }\n    const content = await readFile(fullPath, 'utf-8')\n    const [version, files, errors, coverage, executionTime, environmentModules, transformTime] = parse(\n      content,\n    ) as MergeReport\n    if (!version) {\n      throw new TypeError(\n        `vitest.mergeReports() expects all paths in \"${blobsDirectory}\" to be files generated by the blob reporter, but \"${filename}\" is not a valid blob file`,\n      )\n    }\n    return { version, files, errors, coverage, file: filename, executionTime, environmentModules, transformTime }\n  })\n  const blobs = await Promise.all(promises)\n\n  if (!blobs.length) {\n    throw new Error(","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/reporters/blob.ts#L108-L144","documentation":"Thrown as a `TypeError` by `readBlobs` (blob.ts:126) when merging reports: Vitest reads every entry in the `--merge-reports` directory and calls `stat()` on each; if an entry is not a regular file (`stats.isFile()` is false, e.g. a subdirectory or a symlink to a directory), it rejects the entry because blob files must be flat files written by the blob reporter.","triggerScenarios":"Pointing `vitest --merge-reports <dir>` at a directory that contains subdirectories, symlinks to directories, FIFO/socket entries, or `.DS_Store`-like directory metadata. Any non-file entry inside the blobs directory triggers it.","commonSituations":"Reusing a directory that also holds other artifacts (e.g. `node_modules`, coverage output); a leftover subdirectory from a previous tool; accidentally passing the project root or `.vitest` cache as the merge-reports dir.","solutions":["Point `--merge-reports` at a clean directory that contains only blob JSON files produced by the blob reporter.","Remove subdirectories and non-blob entries from the merge-reports directory.","Use a dedicated output directory for blob reports (set `blob.outputFile` or rely on the default `blob` report dir) so no foreign entries are present."],"exampleFix":"# before\nvitest --merge-reports .\n# after\nvitest --merge-reports ./blob-reports","handlingStrategy":"validation","validationCode":"import { readdirSync, statSync } from 'node:fs'\nimport { resolve } from 'node:path'\nconst dir = resolve(process.cwd(), blobsDirectory)\nconst offenders = readdirSync(dir).filter(name => !statSync(resolve(dir, name)).isFile())\nif (offenders.length) throw new Error(`Non-file entries in merge dir: ${offenders.join(', ')}`)","typeGuard":"import { statSync } from 'node:fs'\nconst isRegularFile = (p: string): boolean => { try { return statSync(p).isFile() } catch { return false } }","tryCatchPattern":null,"preventionTips":["Dedicate a directory to blob outputs and keep foreign entries out of it.","Clean the merge directory before each run.","Avoid reusing directories that hold node_modules, coverage, or other artifacts."],"tags":["reporter","blob","merge-reports","filesystem"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}