Skip to content

Commit 47dde76

Browse files
authoredOct 11, 2024··
fix(vitest): show rollup error details as test error (#6686)
1 parent 4b2ce07 commit 47dde76

File tree

6 files changed

+65
-3
lines changed

6 files changed

+65
-3
lines changed
 

‎packages/vitest/src/node/error.ts

+10
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,16 @@ export function printError(
119119
logger.error(`${e.codeFrame}\n`)
120120
}
121121

122+
if ('__vitest_rollup_error__' in e) {
123+
// https://github.com/vitejs/vite/blob/95020ab49e12d143262859e095025cf02423c1d9/packages/vite/src/node/server/middlewares/error.ts#L25-L36
124+
const err = e.__vitest_rollup_error__ as any
125+
logger.error([
126+
err.plugin && ` Plugin: ${c.magenta(err.plugin)}`,
127+
err.id && ` File: ${c.cyan(err.id)}${err.loc ? `:${err.loc.line}:${err.loc.column}` : ''}`,
128+
err.frame && c.yellow((err.frame as string).split(/\r?\n/g).map(l => ` `.repeat(2) + l).join(`\n`)),
129+
].filter(Boolean).join('\n'))
130+
}
131+
122132
// E.g. AssertionError from assert does not set showDiff but has both actual and expected properties
123133
if (e.diff) {
124134
displayDiff(e.diff, logger.console)

‎packages/vitest/src/node/pools/rpc.ts

+23-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export function createMethodsRPC(project: WorkspaceProject, options: MethodsOpti
3333
return r?.map as RawSourceMap | undefined
3434
},
3535
async fetch(id, transformMode) {
36-
const result = await project.vitenode.fetchResult(id, transformMode)
36+
const result = await project.vitenode.fetchResult(id, transformMode).catch(handleRollupError)
3737
const code = result.code
3838
if (!cacheFs || result.externalize) {
3939
return result
@@ -66,10 +66,10 @@ export function createMethodsRPC(project: WorkspaceProject, options: MethodsOpti
6666
return { id: tmp }
6767
},
6868
resolveId(id, importer, transformMode) {
69-
return project.vitenode.resolveId(id, importer, transformMode)
69+
return project.vitenode.resolveId(id, importer, transformMode).catch(handleRollupError)
7070
},
7171
transform(id, environment) {
72-
return project.vitenode.transformModule(id, environment)
72+
return project.vitenode.transformModule(id, environment).catch(handleRollupError)
7373
},
7474
onPathsCollected(paths) {
7575
ctx.state.collectPaths(paths)
@@ -104,3 +104,23 @@ export function createMethodsRPC(project: WorkspaceProject, options: MethodsOpti
104104
},
105105
}
106106
}
107+
108+
// serialize rollup error on server to preserve details as a test error
109+
function handleRollupError(e: unknown): never {
110+
if (e instanceof Error && 'plugin' in e) {
111+
// eslint-disable-next-line no-throw-literal
112+
throw {
113+
name: e.name,
114+
message: e.message,
115+
stack: e.stack,
116+
cause: e.cause,
117+
__vitest_rollup_error__: {
118+
plugin: (e as any).plugin,
119+
id: (e as any).id,
120+
loc: (e as any).loc,
121+
frame: (e as any).frame,
122+
},
123+
}
124+
}
125+
throw e
126+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "vite/no-such-export"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '@vitejs/no-such-package'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { defineConfig } from "vitest/config";
2+
3+
// pnpm -C test/config test -- --root fixtures/rollup-error --environment happy-dom
4+
// pnpm -C test/config test -- --root fixtures/rollup-error --environment node
5+
6+
export default defineConfig({})

‎test/config/test/rollup-error.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { expect, test } from 'vitest'
2+
import { runVitest } from '../../test-utils'
3+
4+
test('rollup error node', async () => {
5+
const { stdout } = await runVitest({
6+
root: './fixtures/rollup-error',
7+
environment: 'node',
8+
reporters: ['junit'],
9+
})
10+
expect(stdout).toContain(`Error: Missing "./no-such-export" specifier in "vite" package`)
11+
expect(stdout).toContain(`Plugin: vite:import-analysis`)
12+
expect(stdout).toContain(`Error: Failed to load url @vitejs/no-such-package`)
13+
})
14+
15+
test('rollup error web', async () => {
16+
const { stdout } = await runVitest({
17+
root: './fixtures/rollup-error',
18+
environment: 'jsdom',
19+
reporters: ['junit'],
20+
})
21+
expect(stdout).toContain(`Error: Missing "./no-such-export" specifier in "vite" package`)
22+
expect(stdout).toContain(`Plugin: vite:import-analysis`)
23+
expect(stdout).toContain(`Error: Failed to resolve import "@vitejs/no-such-package" from "fixtures/rollup-error/not-found-package.test.ts". Does the file exist?`)
24+
})

0 commit comments

Comments
 (0)
Please sign in to comment.