{"id":"d17b741d8f6c2c85","repo":"vitest-dev/vitest","slug":"vitest-mergereports-requires-all-blob-files-to-b","errorCode":null,"errorMessage":"vitest.mergeReports() requires all blob files to be generated by the same Vitest version, received\n\n${blobs.map(b => `- \"${b.file}\" uses v${b.version}`).join('\\n')}","messagePattern":"vitest\\.mergeReports\\(\\) requires all blob files to be generated by the same Vitest version, received\n\n(.+?)\" uses v(.+?)`\\)\\.join\\('\\\\n'\\)\\}","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/reporters/blob.ts","lineNumber":151,"sourceCode":"    ) 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(\n      `vitest.mergeReports() requires at least one blob file in \"${blobsDirectory}\" directory, but none were found`,\n    )\n  }\n\n  const versions = new Set(blobs.map(blob => blob.version))\n  if (versions.size > 1) {\n    throw new Error(\n      `vitest.mergeReports() requires all blob files to be generated by the same Vitest version, received\\n\\n${blobs.map(b => `- \"${b.file}\" uses v${b.version}`).join('\\n')}`,\n    )\n  }\n\n  if (!versions.has(currentVersion)) {\n    throw new Error(\n      `the blobs in \"${blobsDirectory}\" were generated by a different version of Vitest. Expected v${currentVersion}, but received v${blobs[0].version}`,\n    )\n  }\n\n  // Restore module graph\n  const projects = Object.fromEntries(\n    projectsArray.map(p => [p.name, p]),\n  )\n\n  blobs.forEach((blob) => {\n    Object.entries(blob.environmentModules).forEach(([projectName, modulesByProject]) => {\n      const project = projects[projectName]","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/reporters/blob.ts#L133-L169","documentation":"Thrown by `readBlobs` (blob.ts:151) when all blob files in the merge-reports directory are valid but they were not all produced by the same Vitest version. After reading, Vitest collects `version` from every blob into a `Set`; if the set has more than one distinct version, merging is refused because blob formats and serialized structures are not guaranteed to be cross-version compatible. The message lists each file and its version.","triggerScenarios":"Collecting blob outputs from CI shards running different Vitest versions (e.g. one shard on 3.x, another on 2.x); reusing blob files from a previous run after a version bump; partial upgrade where some workspaces resolved a different Vitest.","commonSituations":"Monorepo with inconsistent `vitest` versions across packages; CI matrix that didn't pin the Vitest version; leftover blob files from a prior release combined with new ones.","solutions":["Align all runners/shards to the exact same Vitest version (check `pnpm why vitest` / lockfile).","Clear the merge-reports directory and regenerate all blob files in a single consistent run.","Pin the Vitest version in CI and re-run the blob+merge pipeline."],"exampleFix":"# before: shards produced blobs on different versions\n# after: pin and clean\npnpm dlx vitest@latest --reporter=blob  # same version everywhere\nrm -rf ./blob-reports && regenerate all shards","handlingStrategy":"validation","validationCode":"import { readdirSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { parse } from 'flatted'\nconst versions = new Set(\n  readdirSync(blobsDirectory).map(n => (parse(readFileSync(resolve(blobsDirectory, n), 'utf-8')) as any[])[0]),\n)\nif (versions.size > 1) throw new Error(`Mixed blob versions: ${[...versions].join(', ')}`)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pin a single Vitest version across all CI shards via the lockfile.","Run `pnpm why vitest` / `npm ls vitest` to detect version drift in monorepos.","Clear the blob directory before regenerating to avoid mixing old/new versions."],"tags":["reporter","blob","merge-reports","version-mismatch","ci"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}