vitest-dev/vitest · error · Error

vitest.mergeReports() requires all blob files to be generate

Error message

vitest.mergeReports() requires all blob files to be generated by the same Vitest version, received

${blobs.map(b => `- "${b.file}" uses v${b.version}`).join('\n')}

What it means

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.

Source

Thrown at packages/vitest/src/node/reporters/blob.ts:151

    ) as MergeReport
    if (!version) {
      throw new TypeError(
        `vitest.mergeReports() expects all paths in "${blobsDirectory}" to be files generated by the blob reporter, but "${filename}" is not a valid blob file`,
      )
    }
    return { version, files, errors, coverage, file: filename, executionTime, environmentModules, transformTime }
  })
  const blobs = await Promise.all(promises)

  if (!blobs.length) {
    throw new Error(
      `vitest.mergeReports() requires at least one blob file in "${blobsDirectory}" directory, but none were found`,
    )
  }

  const versions = new Set(blobs.map(blob => blob.version))
  if (versions.size > 1) {
    throw new Error(
      `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')}`,
    )
  }

  if (!versions.has(currentVersion)) {
    throw new Error(
      `the blobs in "${blobsDirectory}" were generated by a different version of Vitest. Expected v${currentVersion}, but received v${blobs[0].version}`,
    )
  }

  // Restore module graph
  const projects = Object.fromEntries(
    projectsArray.map(p => [p.name, p]),
  )

  blobs.forEach((blob) => {
    Object.entries(blob.environmentModules).forEach(([projectName, modulesByProject]) => {
      const project = projects[projectName]

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Align all runners/shards to the exact same Vitest version (check `pnpm why vitest` / lockfile).
  2. Clear the merge-reports directory and regenerate all blob files in a single consistent run.
  3. Pin the Vitest version in CI and re-run the blob+merge pipeline.

Example fix

# before: shards produced blobs on different versions
# after: pin and clean
pnpm dlx vitest@latest --reporter=blob  # same version everywhere
rm -rf ./blob-reports && regenerate all shards
Defensive patterns

Strategy: validation

Validate before calling

import { readdirSync, readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { parse } from 'flatted'
const versions = new Set(
  readdirSync(blobsDirectory).map(n => (parse(readFileSync(resolve(blobsDirectory, n), 'utf-8')) as any[])[0]),
)
if (versions.size > 1) throw new Error(`Mixed blob versions: ${[...versions].join(', ')}`)

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03). Data as JSON: /data/errors/d17b741d8f6c2c85.json. Report an issue: GitHub.