Skip to content

Commit e7f3521

Browse files
authored
fix: move Vitest.setServer to post configureServer hook to enable import analysis for workspace config loading (#6584)
1 parent 891d6fe commit e7f3521

File tree

7 files changed

+73
-44
lines changed

7 files changed

+73
-44
lines changed

packages/ui/node/index.ts

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,44 @@ export default (ctx: Vitest): Plugin => {
2222
return <Plugin>{
2323
name: 'vitest:ui',
2424
apply: 'serve',
25-
configureServer(server) {
26-
const uiOptions = ctx.config
27-
const base = uiOptions.uiBase
28-
const coverageFolder = resolveCoverageFolder(ctx)
29-
const coveragePath = coverageFolder ? coverageFolder[1] : undefined
30-
if (coveragePath && base === coveragePath) {
31-
throw new Error(
32-
`The ui base path and the coverage path cannot be the same: ${base}, change coverage.reportsDirectory`,
33-
)
34-
}
25+
configureServer: {
26+
order: 'post',
27+
handler(server) {
28+
const uiOptions = ctx.config
29+
const base = uiOptions.uiBase
30+
const coverageFolder = resolveCoverageFolder(ctx)
31+
const coveragePath = coverageFolder ? coverageFolder[1] : undefined
32+
if (coveragePath && base === coveragePath) {
33+
throw new Error(
34+
`The ui base path and the coverage path cannot be the same: ${base}, change coverage.reportsDirectory`,
35+
)
36+
}
3537

36-
if (coverageFolder) {
38+
if (coverageFolder) {
39+
server.middlewares.use(
40+
coveragePath!,
41+
sirv(coverageFolder[0], {
42+
single: true,
43+
dev: true,
44+
setHeaders: (res) => {
45+
res.setHeader(
46+
'Cache-Control',
47+
'public,max-age=0,must-revalidate',
48+
)
49+
},
50+
}),
51+
)
52+
}
53+
54+
const clientDist = resolve(fileURLToPath(import.meta.url), '../client')
3755
server.middlewares.use(
38-
coveragePath!,
39-
sirv(coverageFolder[0], {
56+
base,
57+
sirv(clientDist, {
4058
single: true,
4159
dev: true,
42-
setHeaders: (res) => {
43-
res.setHeader(
44-
'Cache-Control',
45-
'public,max-age=0,must-revalidate',
46-
)
47-
},
4860
}),
4961
)
50-
}
51-
52-
const clientDist = resolve(fileURLToPath(import.meta.url), '../client')
53-
server.middlewares.use(
54-
base,
55-
sirv(clientDist, {
56-
single: true,
57-
dev: true,
58-
}),
59-
)
62+
},
6063
},
6164
}
6265
}

packages/vitest/src/node/plugins/index.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -233,22 +233,26 @@ export async function VitestPlugin(
233233

234234
hijackVitePluginInject(viteConfig)
235235
},
236-
async configureServer(server) {
237-
if (options.watch && process.env.VITE_TEST_WATCHER_DEBUG) {
238-
server.watcher.on('ready', () => {
239-
// eslint-disable-next-line no-console
240-
console.log('[debug] watcher is ready')
241-
})
242-
}
243-
await ctx.setServer(options, server, userConfig)
244-
if (options.api && options.watch) {
245-
(await import('../../api/setup')).setup(ctx)
246-
}
236+
configureServer: {
237+
// runs after vite:import-analysis as it relies on `server` instance on Vite 5
238+
order: 'post',
239+
async handler(server) {
240+
if (options.watch && process.env.VITE_TEST_WATCHER_DEBUG) {
241+
server.watcher.on('ready', () => {
242+
// eslint-disable-next-line no-console
243+
console.log('[debug] watcher is ready')
244+
})
245+
}
246+
await ctx.setServer(options, server, userConfig)
247+
if (options.api && options.watch) {
248+
(await import('../../api/setup')).setup(ctx)
249+
}
247250

248-
// #415, in run mode we don't need the watcher, close it would improve the performance
249-
if (!options.watch) {
250-
await server.watcher.close()
251-
}
251+
// #415, in run mode we don't need the watcher, close it would improve the performance
252+
if (!options.watch) {
253+
await server.watcher.close()
254+
}
255+
},
252256
},
253257
},
254258
SsrReplacerPlugin(),
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default [] satisfies string[];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "a"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { test } from 'vitest';
2+
3+
test('test - a')
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import depAsJs from "./dep.js"
2+
3+
export default [
4+
"./packages/*",
5+
...depAsJs,
6+
]

test/config/test/workspace.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,12 @@ it('fails if referenced file doesnt exist', async () => {
8181
`Workspace config file "vitest.workspace.ts" references a non-existing file or a directory: ${resolve('fixtures/workspace/invalid-non-existing-config/vitest.config.js')}`,
8282
)
8383
})
84+
85+
it('vite import analysis is applied when loading workspace config', async () => {
86+
const { stderr, stdout } = await runVitest({
87+
root: 'fixtures/workspace/config-import-analysis',
88+
workspace: './fixtures/workspace/config-import-analysis/vitest.workspace.ts',
89+
})
90+
expect(stderr).toBe('')
91+
expect(stdout).toContain('test - a')
92+
})

0 commit comments

Comments
 (0)