Skip to content

Commit 3aab8a1

Browse files
authored
refactor: deprecate all config types from the main Vitest entrypoint, introduce SerializedConfig type (#6205)
1 parent 883f348 commit 3aab8a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+584
-264
lines changed

docs/guide/browser/context.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export const page: {
6767
/**
6868
* Serialized test config.
6969
*/
70-
config: ResolvedConfig
70+
config: SerializedConfig
7171
/**
7272
* Change the size of iframe's viewport.
7373
*/

packages/browser/context.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ResolvedConfig } from 'vitest'
1+
import type { SerializedConfig } from 'vitest'
22

33
export type BufferEncoding =
44
| 'ascii'
@@ -253,7 +253,7 @@ export interface BrowserPage {
253253
/**
254254
* Serialized test config.
255255
*/
256-
config: ResolvedConfig
256+
config: SerializedConfig
257257
/**
258258
* Change the size of iframe's viewport.
259259
*/

packages/browser/src/client/orchestrator.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import type { ResolvedConfig } from 'vitest'
21
import { channel, client } from '@vitest/browser/client'
32
import { generateHash } from '@vitest/runner/utils'
43
import { type GlobalChannelIncomingEvent, type IframeChannelEvent, type IframeChannelIncomingEvent, globalChannel } from '@vitest/browser/client'
54
import { relative } from 'pathe'
5+
import type { SerializedConfig } from 'vitest'
66
import { getBrowserState, getConfig } from './utils'
77
import { getUiAPI } from './ui'
88
import { createModuleMocker } from './tester/msw'
@@ -230,7 +230,7 @@ async function done() {
230230
await client.rpc.finishBrowserTests(getBrowserState().contextId)
231231
}
232232

233-
async function getContainer(config: ResolvedConfig): Promise<HTMLDivElement> {
233+
async function getContainer(config: SerializedConfig): Promise<HTMLDivElement> {
234234
if (config.browser.ui) {
235235
const element = document.querySelector('#tester-ui')
236236
if (!element) {

packages/browser/src/client/tester/runner.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CancelReason, File, Suite, Task, TaskResultPack, VitestRunner } from '@vitest/runner'
2-
import type { ResolvedConfig, WorkerGlobalState } from 'vitest'
2+
import type { SerializedConfig, WorkerGlobalState } from 'vitest'
33
import type { VitestExecutor } from 'vitest/execute'
44
import { NodeBenchmarkRunner, VitestTestRunner } from 'vitest/runners'
55
import { loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker } from 'vitest/browser'
@@ -12,7 +12,7 @@ import { rpc } from './rpc'
1212
import type { VitestBrowserClientMocker } from './mocker'
1313

1414
interface BrowserRunnerOptions {
15-
config: ResolvedConfig
15+
config: SerializedConfig
1616
}
1717

1818
export const browserHashMap = new Map<
@@ -25,13 +25,13 @@ interface CoverageHandler {
2525
}
2626

2727
export function createBrowserRunner(
28-
runnerClass: { new (config: ResolvedConfig): VitestRunner },
28+
runnerClass: { new (config: SerializedConfig): VitestRunner },
2929
mocker: VitestBrowserClientMocker,
3030
state: WorkerGlobalState,
3131
coverageModule: CoverageHandler | null,
3232
): { new (options: BrowserRunnerOptions): VitestRunner } {
3333
return class BrowserTestRunner extends runnerClass implements VitestRunner {
34-
public config: ResolvedConfig
34+
public config: SerializedConfig
3535
hashMap = browserHashMap
3636
public sourceMapCache = new Map<string, any>()
3737

@@ -140,7 +140,7 @@ let cachedRunner: VitestRunner | null = null
140140
export async function initiateRunner(
141141
state: WorkerGlobalState,
142142
mocker: VitestBrowserClientMocker,
143-
config: ResolvedConfig,
143+
config: SerializedConfig,
144144
) {
145145
if (cachedRunner) {
146146
return cachedRunner

packages/browser/src/client/utils.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ResolvedConfig, WorkerGlobalState } from 'vitest'
1+
import type { SerializedConfig, WorkerGlobalState } from 'vitest'
22

33
export async function importId(id: string) {
44
const name = `/@id/${id}`.replace(/\\/g, '/')
@@ -10,15 +10,15 @@ export async function importFs(id: string) {
1010
return getBrowserState().wrapModule(() => import(/* @vite-ignore */ name))
1111
}
1212

13-
export function getConfig(): ResolvedConfig {
13+
export function getConfig(): SerializedConfig {
1414
return getBrowserState().config
1515
}
1616

1717
export interface BrowserRunnerState {
1818
files: string[]
1919
runningFiles: string[]
2020
moduleCache: WorkerGlobalState['moduleCache']
21-
config: ResolvedConfig
21+
config: SerializedConfig
2222
provider: string
2323
viteConfig: {
2424
root: string

packages/browser/src/node/commands/screenshot.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { mkdir } from 'node:fs/promises'
22
import { normalize } from 'node:path'
3-
import type { BrowserCommand } from 'vitest/node'
3+
import type { BrowserCommand, ResolvedConfig } from 'vitest/node'
44
import { basename, dirname, relative, resolve } from 'pathe'
5-
import type { ResolvedConfig } from 'vitest'
65
import type { ScreenshotOptions } from '../../../context'
76
import { PlaywrightBrowserProvider } from '../providers/playwright'
87
import { WebdriverBrowserProvider } from '../providers/webdriver'

packages/browser/src/node/resolveMock.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import { existsSync, readFileSync, readdirSync } from 'node:fs'
22
import { builtinModules } from 'node:module'
33
import { basename, dirname, extname, isAbsolute, join, resolve } from 'pathe'
44
import type { PartialResolvedId } from 'rollup'
5-
import type { ResolvedConfig } from 'vitest'
5+
import type { ResolvedConfig, WorkspaceProject } from 'vitest/node'
66
import type { ResolvedConfig as ViteConfig } from 'vite'
7-
import type { WorkspaceProject } from 'vitest/node'
87

98
export async function resolveMock(
109
project: WorkspaceProject,

packages/browser/src/node/server.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import type {
1111
import { join, resolve } from 'pathe'
1212
import type { ErrorWithDiff } from '@vitest/utils'
1313
import { slash } from '@vitest/utils'
14-
import type { ResolvedConfig } from 'vitest'
1514
import { type StackTraceParserOptions, parseErrorStacktrace, parseStacktrace } from '@vitest/utils/source-map'
15+
import type { SerializedConfig } from 'vitest'
1616
import { BrowserServerState } from './state'
1717
import { getBrowserProvider } from './utils'
1818
import { BrowserServerCDPHandler } from './cdp'
@@ -224,7 +224,7 @@ export class BrowserServer implements IBrowserServer {
224224
}
225225
}
226226

227-
function wrapConfig(config: ResolvedConfig): ResolvedConfig {
227+
function wrapConfig(config: SerializedConfig): SerializedConfig {
228228
return {
229229
...config,
230230
// workaround RegExp serialization

packages/browser/src/node/serverOrchestrator.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ export async function resolveOrchestrator(
1717

1818
const files = server.state.getContext(contextId!)?.files ?? []
1919

20-
const config = server.getSerializableConfig()
2120
const injectorJs = typeof server.injectorJs === 'string'
2221
? server.injectorJs
2322
: await server.injectorJs
2423

2524
const injector = replacer(injectorJs, {
2625
__VITEST_PROVIDER__: JSON.stringify(server.provider.name),
27-
__VITEST_CONFIG__: JSON.stringify(config),
26+
__VITEST_CONFIG__: JSON.stringify(server.getSerializableConfig()),
2827
__VITEST_VITE_CONFIG__: JSON.stringify({
2928
root: server.vite.config.root,
3029
}),

packages/browser/src/node/serverTester.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,9 @@ export async function resolveTester(
3838
? server.injectorJs
3939
: await server.injectorJs
4040

41-
const config = server.getSerializableConfig()
42-
4341
const injector = replacer(injectorJs, {
4442
__VITEST_PROVIDER__: JSON.stringify(server.provider.name),
45-
__VITEST_CONFIG__: JSON.stringify(config),
43+
__VITEST_CONFIG__: JSON.stringify(server.getSerializableConfig()),
4644
__VITEST_FILES__: JSON.stringify(files),
4745
__VITEST_VITE_CONFIG__: JSON.stringify({
4846
root: server.vite.config.root,
@@ -57,7 +55,7 @@ export async function resolveTester(
5755
const testerScripts = await server.formatScripts(
5856
project.config.browser.testerScripts,
5957
)
60-
const clientScript = `<script type="module" src="${config.base || '/'}@vite/client"></script>`
58+
const clientScript = `<script type="module" src="${server.project.config.base || '/'}@vite/client"></script>`
6159
const stateJs = typeof server.stateJs === 'string'
6260
? server.stateJs
6361
: await server.stateJs

packages/runner/src/types/runner.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import type {
1414

1515
export interface VitestRunnerConfig {
1616
root: string
17-
setupFiles: string[] | string
18-
name: string
17+
setupFiles: string[]
18+
name?: string
1919
passWithNoTests: boolean
2020
testNamePattern?: RegExp
2121
allowOnly?: boolean

packages/runner/src/utils/collect.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ export function calculateSuiteHash(parent: Suite): void {
117117
export function createFileTask(
118118
filepath: string,
119119
root: string,
120-
projectName: string,
120+
projectName: string | undefined,
121121
pool?: string,
122122
): File {
123123
const path = relative(root, filepath)

packages/ui/client/composables/client/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createClient, getTasks } from '@vitest/ws-client'
22
import type { WebSocketStatus } from '@vueuse/core'
3-
import type { File, ResolvedConfig, TaskResultPack } from 'vitest'
3+
import type { File, SerializedConfig, TaskResultPack } from 'vitest'
44
import { reactive as reactiveVue } from 'vue'
55
import { createFileTask } from '@vitest/runner/utils'
66
import type { BrowserRunnerState } from '../../../types'
@@ -45,7 +45,7 @@ export const client = (function createVitestClient() {
4545
}
4646
})()
4747

48-
export const config = shallowRef<ResolvedConfig>({} as any)
48+
export const config = shallowRef<SerializedConfig>({} as any)
4949
export const status = ref<WebSocketStatus>('CONNECTING')
5050

5151
export const current = computed(() => {

packages/ui/client/composables/client/static.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { VitestClient } from '@vitest/ws-client'
33
import type {
44
File,
55
ModuleGraphData,
6-
ResolvedConfig,
6+
SerializedConfig,
77
WebSocketEvents,
88
WebSocketHandlers,
99
} from 'vitest'
@@ -14,7 +14,7 @@ import { StateManager } from '../../../../vitest/src/node/state'
1414
interface HTMLReportMetadata {
1515
paths: string[]
1616
files: File[]
17-
config: ResolvedConfig
17+
config: SerializedConfig
1818
moduleGraph: Record<string, Record<string, ModuleGraphData>>
1919
unhandledErrors: unknown[]
2020
// filename -> source

packages/ui/client/composables/navigation.ts

+4-12
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ export const coverageConfigured = computed(() => coverage.value?.enabled)
1212
export const coverageEnabled = computed(() => {
1313
return (
1414
coverageConfigured.value
15-
&& coverage.value.reporter
16-
.map(([reporterName]) => reporterName)
17-
.includes('html')
15+
&& !!coverage.value.htmlReporter
1816
)
1917
})
2018
export const detailSizes = useLocalStorage<[left: number, right: number]>(
@@ -31,16 +29,10 @@ export const detailSizes = useLocalStorage<[left: number, right: number]>(
3129
export const coverageUrl = computed(() => {
3230
if (coverageEnabled.value) {
3331
const idx = coverage.value!.reportsDirectory.lastIndexOf('/')
34-
const htmlReporter = coverage.value!.reporter.find((reporter) => {
35-
if (reporter[0] !== 'html') {
36-
return undefined
37-
}
38-
39-
return reporter
40-
})
41-
return htmlReporter && 'subdir' in htmlReporter[1]
32+
const htmlReporterSubdir = coverage.value!.htmlReporter?.subdir
33+
return htmlReporterSubdir
4234
? `/${coverage.value!.reportsDirectory.slice(idx + 1)}/${
43-
htmlReporter[1].subdir
35+
htmlReporterSubdir
4436
}/index.html`
4537
: `/${coverage.value!.reportsDirectory.slice(idx + 1)}/index.html`
4638
}

packages/ui/node/reporter.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type {
1010
File,
1111
ModuleGraphData,
1212
Reporter,
13-
ResolvedConfig,
13+
SerializedConfig,
1414
Vitest,
1515
} from 'vitest'
1616
import type { HTMLOptions } from 'vitest/node'
@@ -35,7 +35,7 @@ function getOutputFile(config: PotentialConfig | undefined) {
3535
interface HTMLReportData {
3636
paths: string[]
3737
files: File[]
38-
config: ResolvedConfig
38+
config: SerializedConfig
3939
moduleGraph: Record<string, Record<string, ModuleGraphData>>
4040
unhandledErrors: unknown[]
4141
// filename -> source
@@ -63,7 +63,7 @@ export default class HTMLReporter implements Reporter {
6363
const result: HTMLReportData = {
6464
paths: this.ctx.state.getPaths(),
6565
files: this.ctx.state.getFiles(),
66-
config: this.ctx.config,
66+
config: this.ctx.getCoreWorkspaceProject().getSerializableConfig(),
6767
unhandledErrors: this.ctx.state.getUnhandledErrors(),
6868
moduleGraph: {},
6969
sources: {},

packages/ui/types.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ResolvedConfig } from 'vitest'
1+
import type { SerializedConfig } from 'vitest'
22

33
export interface WSMessage {
44
/**
@@ -16,7 +16,7 @@ export type RunState = 'idle' | 'running'
1616

1717
export interface BrowserRunnerState {
1818
files: string[]
19-
config: ResolvedConfig
19+
config: SerializedConfig
2020
type: 'orchestrator'
2121
wrapModule: <T>(module: () => T) => T
2222
}

packages/vitest/src/api/setup.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function setup(ctx: Vitest, _server?: ViteDevServer) {
8383
await ctx.rerunFiles(files)
8484
},
8585
getConfig() {
86-
return ctx.config
86+
return ctx.getCoreWorkspaceProject().getSerializableConfig()
8787
},
8888
async getTransformResult(projectName: string, id, browser = false) {
8989
const project = ctx.getProjectByName(projectName)

packages/vitest/src/api/types.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import type {
44
File,
55
ModuleGraphData,
66
Reporter,
7-
ResolvedConfig,
7+
SerializableSpec,
8+
SerializedConfig,
89
TaskResultPack,
910
} from '../types'
1011

@@ -16,9 +17,9 @@ export interface WebSocketHandlers {
1617
onCollected: (files?: File[]) => Promise<void>
1718
onTaskUpdate: (packs: TaskResultPack[]) => void
1819
getFiles: () => File[]
19-
getTestFiles: () => Promise<[{ name: string; root: string }, file: string][]>
20+
getTestFiles: () => Promise<SerializableSpec[]>
2021
getPaths: () => string[]
21-
getConfig: () => ResolvedConfig
22+
getConfig: () => SerializedConfig
2223
getModuleGraph: (
2324
projectName: string,
2425
id: string,

packages/vitest/src/defaults.ts

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ const config = {
106106
clearMocks: false,
107107
restoreMocks: false,
108108
mockReset: false,
109+
unstubGlobals: false,
110+
unstubEnvs: false,
109111
include: defaultInclude,
110112
exclude: defaultExclude,
111113
teardownTimeout: 10000,

0 commit comments

Comments
 (0)