|
1 |
| -import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises' |
| 1 | +import { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises' |
2 | 2 | import { existsSync } from 'node:fs'
|
3 | 3 | import { parse, stringify } from 'flatted'
|
4 | 4 | import { dirname, resolve } from 'pathe'
|
@@ -79,18 +79,37 @@ export async function readBlobs(
|
79 | 79 | // using process.cwd() because --merge-reports can only be used in CLI
|
80 | 80 | const resolvedDir = resolve(process.cwd(), blobsDirectory)
|
81 | 81 | const blobsFiles = await readdir(resolvedDir)
|
82 |
| - const promises = blobsFiles.map(async (file) => { |
83 |
| - const content = await readFile(resolve(resolvedDir, file), 'utf-8') |
| 82 | + const promises = blobsFiles.map(async (filename) => { |
| 83 | + const fullPath = resolve(resolvedDir, filename) |
| 84 | + const stats = await stat(fullPath) |
| 85 | + if (!stats.isFile()) { |
| 86 | + throw new TypeError( |
| 87 | + `vitest.mergeReports() expects all paths in "${blobsDirectory}" to be files generated by the blob reporter, but "${filename}" is not a file`, |
| 88 | + ) |
| 89 | + } |
| 90 | + const content = await readFile(fullPath, 'utf-8') |
84 | 91 | const [version, files, errors, moduleKeys, coverage] = parse(
|
85 | 92 | content,
|
86 | 93 | ) as MergeReport
|
87 |
| - return { version, files, errors, moduleKeys, coverage } |
| 94 | + if (!version) { |
| 95 | + throw new TypeError( |
| 96 | + `vitest.mergeReports() expects all paths in "${blobsDirectory}" to be files generated by the blob reporter, but "${filename}" is not a valid blob file`, |
| 97 | + ) |
| 98 | + } |
| 99 | + return { version, files, errors, moduleKeys, coverage, file: filename } |
88 | 100 | })
|
89 | 101 | const blobs = await Promise.all(promises)
|
90 | 102 |
|
91 | 103 | if (!blobs.length) {
|
92 | 104 | throw new Error(
|
93 |
| - `vitest.mergeReports() requires at least one blob file paths in the config`, |
| 105 | + `vitest.mergeReports() requires at least one blob file in "${blobsDirectory}" directory, but none were found`, |
| 106 | + ) |
| 107 | + } |
| 108 | + |
| 109 | + const versions = new Set(blobs.map(blob => blob.version)) |
| 110 | + if (versions.size > 1) { |
| 111 | + throw new Error( |
| 112 | + `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')}`, |
94 | 113 | )
|
95 | 114 | }
|
96 | 115 |
|
|
0 commit comments