Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/vitest-dev/vscode. VS Code extension for Vitest vitest.dev/vscode
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194import type { SerializedProject, WorkerReadyMetadata, WorkerRunnerOptions, WorkerWSEventEmitter,} from 'vitest-vscode-shared'import type { Reporter, TestUserConfig } from 'vitest/node'import { Console } from 'node:console'import { Writable } from 'node:stream'import { toArray } from '@vitest/utils/helpers'import { resolve } from 'pathe'import { VSCodeReporter } from './reporter'import { ExtensionWorker } from './worker'
export async function initVitest( vitestModule: typeof import('vitest/node'), data: WorkerRunnerOptions, emitter: WorkerWSEventEmitter,) { const meta = data.meta const reporter = new VSCodeReporter(meta, data.debug)
let stdout: Writable | undefined let stderr: Writable | undefined
if (data.sendLog) { stdout = new Writable({ write(chunk, __, callback) { const log = chunk.toString() reporter.sendTerminalLog('stdout', log) callback() }, })
stderr = new Writable({ write(chunk, __, callback) { const log = chunk.toString() reporter.sendTerminalLog('stderr', log) callback() }, }) globalThis.console = new Console(stdout, stderr) }
const args = meta.arguments ? vitestModule.parseCLI(meta.arguments, { allowUnknownOptions: false, }).options : {} const options = data.debug ? { disableConsoleIntercept: true, fileParallelism: false, testTimeout: 0, hookTimeout: 0, } : {} const cliOptions: TestUserConfig = { config: meta.configFile, ...args, ...options, project: meta.projectFilter ?? args.project, watch: true, api: false, reporter: undefined, ui: false, includeTaskLocation: true, related: meta.related ? [meta.related] : undefined, experimental: { importDurations: { limit: Infinity, failOnDanger: false, print: false, }, }, } if (typeof data.debug === 'object') { const inspect = `${data.debug.host}:${data.debug.port}` if (data.debug.browser) { cliOptions.inspect = inspect } else { cliOptions.inspectBrk = inspect } } const vitest = await vitestModule.createVitest( 'test', cliOptions, { plugins: [ { name: 'vitest:vscode-extension', enforce: 'post', config(userConfig) { userConfig.test ??= {}
const testReporters = toArray(userConfig.test.reporters) if (!testReporters.length) { testReporters.push(['default', { isTTY: false }]) } testReporters.push(reporter as any) userConfig.test.reporters = testReporters
return { test: { printConsoleTrace: true, coverage: { enabled: !!data.coverage, reportOnFailure: true, reporter: [['json', { file: meta.finalCoverageFileName }]], }, }, } }, configResolved: { order: 'post', handler(config) { // stub a server so Vite doesn't start a websocket connection, // because we don't need it in the extension and it messes up Vite dev command config.server.hmr = { server: { on: () => {}, off: () => {}, } as any, } config.server.watch = null }, }, api: { vitest: { experimental: { ignoreFsModuleCache: true, }, }, }, }, ], }, { stderr, stdout, }, ) ;((vitest as any).reporters as Reporter[]).forEach((reporter) => { if (!(reporter instanceof VSCodeReporter)) { reporter.onUserConsoleLog = () => {} } })
const projects: SerializedProject[] = vitest.projects.map((project) => { const config = project.config return { config: project.vite.config.configFile, root: config.root, dir: config.dir, include: config.include, exclude: config.exclude, includeSource: config.includeSource, pool: project.isBrowserEnabled() ? 'browser' : config.pool, name: project.name, browser: project.isBrowserEnabled() ? { provider: config.browser.provider?.name || 'preview', name: config.browser.name, webRoot: config.root, } : undefined, } })
const workspaceSource: string | false = vitest.config.projects != null ? vitest.vite.config.configFile || false : false const metadata: WorkerReadyMetadata = { projects, workspaceSource } for (const reporter of vitest.config.reporters) { if (Array.isArray(reporter) && reporter[0] === 'html') { const options = reporter[1] as { outputDir?: string } metadata.htmlReportPath = resolve( vitest.config.root, options.outputDir || '.vitest', 'index.html', ) break } } return { vitest, reporter, metadata, meta, createWorker() { return new ExtensionWorker(vitest, !!data.debug, emitter) }, }}