Skip to content

Commit 00e8112

Browse files
authored
fix(vitest): don't start the server when optimizer is enabled (#4095)
1 parent 5943418 commit 00e8112

File tree

11 files changed

+43
-19
lines changed

11 files changed

+43
-19
lines changed

packages/vitest/src/integrations/browser/server.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ export async function createBrowserServer(project: WorkspaceProject, configFile:
3636
port: defaultBrowserPort,
3737
}
3838

39+
// browser never runs in middleware mode
40+
server.middlewareMode = false
41+
3942
config.server = server
4043
config.server.fs ??= {}
4144
config.server.fs.allow = config.server.fs.allow || []

packages/vitest/src/node/config.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,12 @@ export function resolveApiServerConfig<Options extends ApiConfig & UserConfig>(
4949
}
5050

5151
if (api) {
52-
if (!api.port)
52+
if (!api.port && !api.middlewareMode)
5353
api.port = defaultPort
5454
}
55+
else {
56+
api = { middlewareMode: true }
57+
}
5558

5659
return api
5760
}

packages/vitest/src/node/create.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { resolve } from 'pathe'
2-
import { createServer, mergeConfig } from 'vite'
2+
import { mergeConfig } from 'vite'
33
import type { InlineConfig as ViteInlineConfig, UserConfig as ViteUserConfig } from 'vite'
44
import { findUp } from 'find-up'
55
import type { UserConfig, VitestRunMode } from '../types'
66
import { configFiles } from '../constants'
77
import { Vitest } from './core'
88
import { VitestPlugin } from './plugins'
9+
import { createViteServer } from './vite'
910

1011
export async function createVitest(mode: VitestRunMode, options: UserConfig, viteOverrides: ViteUserConfig = {}) {
1112
const ctx = new Vitest(mode)
@@ -27,13 +28,10 @@ export async function createVitest(mode: VitestRunMode, options: UserConfig, vit
2728
plugins: await VitestPlugin(options, ctx),
2829
}
2930

30-
const server = await createServer(mergeConfig(config, mergeConfig(viteOverrides, { root: options.root })))
31+
const server = await createViteServer(mergeConfig(config, mergeConfig(viteOverrides, { root: options.root })))
3132

32-
// optimizer needs .listen() to be called
33-
if (ctx.config.api?.port || ctx.config.deps?.optimizer?.web?.enabled || ctx.config.deps?.optimizer?.ssr?.enabled)
33+
if (ctx.config.api?.port)
3434
await server.listen()
35-
else
36-
await server.pluginContainer.buildStart({})
3735

3836
return ctx
3937
}

packages/vitest/src/node/logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export class Logger {
139139

140140
if (this.ctx.config.ui)
141141
this.log(c.dim(c.green(` UI started at http://${this.ctx.config.api?.host || 'localhost'}:${c.bold(`${this.ctx.server.config.server.port}`)}${this.ctx.config.uiBase}`)))
142-
else if (this.ctx.config.api)
142+
else if (this.ctx.config.api?.port)
143143
this.log(c.dim(c.green(` API started at http://${this.ctx.config.api?.host || 'localhost'}:${c.bold(`${this.ctx.config.api.port}`)}`)))
144144

145145
if (this.ctx.coverageProvider)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
5757

5858
;(options as ResolvedConfig).defines = defines
5959

60-
let open: string | boolean | undefined
60+
let open: string | boolean | undefined = false
6161

6262
if (testConfig.ui && testConfig.open)
6363
open = testConfig.uiBase ?? '/__vitest__/'

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function WorkspaceVitestPlugin(project: WorkspaceProject, options: Worksp
7070
open: false,
7171
hmr: false,
7272
preTransformRequests: false,
73+
middlewareMode: true,
7374
fs: {
7475
allow: resolveFsAllow(
7576
project.ctx.config.root,

packages/vitest/src/node/vite.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import type { InlineConfig } from 'vite'
2+
import { createServer } from 'vite'
3+
4+
export async function createViteServer(inlineConfig: InlineConfig) {
5+
// Vite prints an error (https://github.com/vitejs/vite/issues/14328)
6+
// But Vitest works correctly either way
7+
const error = console.error
8+
console.error = (...args: any[]) => {
9+
if (typeof args[0] === 'string' && args[0].includes('WebSocket server error:'))
10+
return
11+
error(...args)
12+
}
13+
14+
const server = await createServer({
15+
logLevel: 'error',
16+
...inlineConfig,
17+
})
18+
19+
console.error = error
20+
return server
21+
}

packages/vitest/src/node/workspace.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { promises as fs } from 'node:fs'
22
import fg from 'fast-glob'
33
import mm from 'micromatch'
44
import { dirname, relative, resolve, toNamespacedPath } from 'pathe'
5-
import { createServer } from 'vite'
65
import type { ViteDevServer, InlineConfig as ViteInlineConfig } from 'vite'
76
import { ViteNodeRunner } from 'vite-node/client'
87
import { ViteNodeServer } from 'vite-node/server'
@@ -14,6 +13,7 @@ import type { BrowserProvider } from '../types/browser'
1413
import { getBrowserProvider } from '../integrations/browser'
1514
import { isBrowserEnabled, resolveConfig } from './config'
1615
import { WorkspaceVitestPlugin } from './plugins/workspace'
16+
import { createViteServer } from './vite'
1717

1818
interface InitializeProjectOptions extends UserWorkspaceConfig {
1919
workspaceConfigPath: string
@@ -44,13 +44,7 @@ export async function initializeProject(workspacePath: string | number, ctx: Vit
4444
],
4545
}
4646

47-
const server = await createServer(config)
48-
49-
// optimizer needs .listen() to be called
50-
if (ctx.config.api?.port || project.config.deps?.optimizer?.web?.enabled || project.config.deps?.optimizer?.ssr?.enabled)
51-
await server.listen()
52-
else
53-
await server.pluginContainer.buildStart({})
47+
await createViteServer(config)
5448

5549
return project
5650
}

packages/vitest/src/types/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { AliasOptions, CommonServerOptions, DepOptimizationConfig } from 'vite'
1+
import type { AliasOptions, DepOptimizationConfig, ServerOptions } from 'vite'
22
import type { PrettyFormatOptions } from 'pretty-format'
33
import type { FakeTimerInstallOpts } from '@sinonjs/fake-timers'
44
import type { SequenceHooks, SequenceSetupFiles } from '@vitest/runner'
@@ -23,7 +23,7 @@ export type VitestEnvironment = BuiltinEnvironment | (string & Record<never, nev
2323
export type VitestPool = 'browser' | 'threads' | 'child_process' | 'experimentalVmThreads'
2424
export type CSSModuleScopeStrategy = 'stable' | 'scoped' | 'non-scoped'
2525

26-
export type ApiConfig = Pick<CommonServerOptions, 'port' | 'strictPort' | 'host'>
26+
export type ApiConfig = Pick<ServerOptions, 'port' | 'strictPort' | 'host' | 'middlewareMode'>
2727

2828
export type { JSDOMOptions, HappyDOMOptions }
2929

test/core/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"private": true,
44
"scripts": {
55
"test": "vitest",
6+
"dev": "vite",
67
"coverage": "vitest run --coverage"
78
},
89
"devDependencies": {

0 commit comments

Comments
 (0)