/
setup.node.ts
80 lines (67 loc) · 2.46 KB
/
setup.node.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { createRequire } from 'node:module'
import { isatty } from 'node:tty'
import { installSourcemapsSupport } from 'vite-node/source-map'
import { createColors, setupColors } from '@vitest/utils'
import type { EnvironmentOptions, ResolvedConfig, ResolvedTestEnvironment, WorkerGlobalState } from '../types'
import { VitestSnapshotEnvironment } from '../integrations/snapshot/environments/node'
import { getSafeTimers, getWorkerState } from '../utils'
import * as VitestIndex from '../index'
import { expect } from '../integrations/chai'
import { setupCommonEnv } from './setup.common'
// this should only be used in Node
let globalSetup = false
export async function setupGlobalEnv(config: ResolvedConfig, { environment }: ResolvedTestEnvironment) {
await setupCommonEnv(config)
Object.defineProperty(globalThis, '__vitest_index__', {
value: VitestIndex,
enumerable: false,
})
const state = getWorkerState()
if (!state.config.snapshotOptions.snapshotEnvironment)
state.config.snapshotOptions.snapshotEnvironment = new VitestSnapshotEnvironment(state.rpc)
if (globalSetup)
return
globalSetup = true
setupColors(createColors(isatty(1)))
if (environment.transformMode === 'web') {
const _require = createRequire(import.meta.url)
// always mock "required" `css` files, because we cannot process them
_require.extensions['.css'] = () => ({})
_require.extensions['.scss'] = () => ({})
_require.extensions['.sass'] = () => ({})
_require.extensions['.less'] = () => ({})
process.env.SSR = ''
}
else {
process.env.SSR = '1'
}
installSourcemapsSupport({
getSourceMap: source => state.moduleCache.getSourceMap(source),
})
await setupConsoleLogSpy(state)
}
export async function setupConsoleLogSpy(state: WorkerGlobalState) {
const { createCustomConsole } = await import('./console')
globalThis.console = createCustomConsole(state)
}
export async function withEnv(
{ environment }: ResolvedTestEnvironment,
options: EnvironmentOptions,
fn: () => Promise<void>,
) {
// @ts-expect-error untyped global
globalThis.__vitest_environment__ = environment.name
expect.setState({
environment: environment.name,
})
const env = await environment.setup(globalThis, options)
try {
await fn()
}
finally {
// Run possible setTimeouts, e.g. the onces used by ConsoleLogSpy
const { setTimeout } = getSafeTimers()
await new Promise(resolve => setTimeout(resolve))
await env.teardown(globalThis)
}
}