/
cli-api.ts
122 lines (99 loc) · 3.66 KB
/
cli-api.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { resolve } from 'pathe'
import type { UserConfig as ViteUserConfig } from 'vite'
import { EXIT_CODE_RESTART } from '../constants'
import { CoverageProviderMap } from '../integrations/coverage'
import { getEnvPackageName } from '../integrations/env'
import type { UserConfig, Vitest, VitestRunMode } from '../types'
import { ensurePackageInstalled } from './pkg'
import { createVitest } from './create'
import { registerConsoleShortcuts } from './stdin'
export interface CliOptions extends UserConfig {
/**
* Override the watch mode
*/
run?: boolean
}
/**
* Start Vitest programmatically
*
* Returns a Vitest instance if initialized successfully.
*/
export async function startVitest(
mode: VitestRunMode,
cliFilters: string[] = [],
options: CliOptions = {},
viteOverrides?: ViteUserConfig,
): Promise<Vitest | undefined> {
process.env.TEST = 'true'
process.env.VITEST = 'true'
process.env.NODE_ENV ??= options.mode || 'test'
if (options.run)
options.watch = false
// this shouldn't affect _application root_ that can be changed inside config
const root = resolve(options.root || process.cwd())
if (!await ensurePackageInstalled('vite', root)) {
process.exitCode = 1
return
}
if (typeof options.coverage === 'boolean')
options.coverage = { enabled: options.coverage }
// running "vitest --browser", assumes browser name is set in the config
if (typeof options.browser === 'boolean')
options.browser = { enabled: options.browser } as any
// running "vitest --browser=chrome"
if (typeof options.browser === 'string')
options.browser = { enabled: true, name: options.browser }
// running "vitest --browser.headless"
if (typeof options.browser === 'object' && !('enabled' in options.browser))
options.browser.enabled = true
const ctx = await createVitest(mode, options, viteOverrides)
if (mode === 'test' && ctx.config.coverage.enabled) {
const provider = ctx.config.coverage.provider || 'v8'
const requiredPackages = CoverageProviderMap[provider]
if (requiredPackages) {
// Remove this message once support for @vitest/coverage-c8 has been removed completely
const defaultProviderInfo = 'Default coverage provider has changed from "c8" to "v8". '
+ 'New package is required to be installed. '
+ 'To use the old deprecated coverage provider use "--coverage.provider c8" option.\n'
+ 'See https://github.com/vitest-dev/vitest/pull/3339 for more information.\n\n'
const isUsingDefaultProvider
= ctx.server.config.test?.coverage?.provider === undefined
&& options.coverage?.provider === undefined
if (!await ensurePackageInstalled(requiredPackages, root, isUsingDefaultProvider ? defaultProviderInfo : undefined)) {
process.exitCode = 1
return ctx
}
}
}
const environmentPackage = getEnvPackageName(ctx.config.environment)
if (environmentPackage && !await ensurePackageInstalled(environmentPackage, root)) {
process.exitCode = 1
return ctx
}
let stdinCleanup
if (process.stdin.isTTY)
stdinCleanup = registerConsoleShortcuts(ctx)
ctx.onServerRestart((reason) => {
ctx.report('onServerRestart', reason)
// if it's in a CLI wrapper, exit with a special code to request restart
if (process.env.VITEST_CLI_WRAPPER)
process.exit(EXIT_CODE_RESTART)
})
ctx.onAfterSetServer(() => {
ctx.start(cliFilters)
})
try {
await ctx.start(cliFilters)
}
catch (e) {
process.exitCode = 1
await ctx.logger.printError(e, true, 'Unhandled Error')
ctx.logger.error('\n\n')
return ctx
}
if (ctx.shouldKeepServer())
return ctx
stdinCleanup?.()
await ctx.close()
return ctx
}