From 70e7a9fe68f8aac1e7991c9b03caebbbad9407de Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Thu, 7 Aug 2025 17:14:31 +0200 Subject: [PATCH 01/20] chore: add a separate package --- eslint.config.mjs | 11 - packages/extension/package.json | 8 + {src => packages/extension/src}/api.ts | 10 +- .../extension/src}/api/child_process.ts | 0 {src => packages/extension/src}/api/pkg.ts | 0 .../extension/src}/api/resolve.ts | 0 {src => packages/extension/src}/api/rpc.ts | 53 +-- .../extension/src}/api/terminal.ts | 0 {src => packages/extension/src}/api/types.ts | 0 {src => packages/extension/src}/api/ws.ts | 0 {src => packages/extension/src}/config.ts | 0 {src => packages/extension/src}/constants.ts | 0 {src => packages/extension/src}/coverage.ts | 0 {src => packages/extension/src}/debug.ts | 0 {src => packages/extension/src}/diagnostic.ts | 0 {src => packages/extension/src}/extension.ts | 0 {src => packages/extension/src}/log.ts | 0 {src => packages/extension/src}/polyfills.ts | 0 {src => packages/extension/src}/runner.ts | 12 +- .../extension/src}/tagsManager.ts | 0 {src => packages/extension/src}/testTree.ts | 0 .../extension/src}/testTreeData.ts | 0 {src => packages/extension/src}/utils.ts | 0 {src => packages/extension/src}/watcher.ts | 0 .../extension/src}/worker/collect.ts | 0 .../extension/src}/worker/coverage.ts | 0 .../extension/src}/worker/emitter.ts | 0 .../extension/src}/worker/index.ts | 0 .../extension/src}/worker/init.ts | 0 .../extension/src}/worker/reporter.ts | 4 +- {src => packages/extension/src}/worker/rpc.ts | 0 .../extension/src}/worker/setupFile.ts | 0 .../extension/src}/worker/types.ts | 0 .../extension/src}/worker/utils.ts | 14 +- .../extension/src}/worker/watcher.ts | 0 .../extension/src}/worker/worker.ts | 0 packages/shared/package.json | 13 + packages/shared/src/index.ts | 90 ++++ packages/worker-v4/package.json | 13 + packages/worker-v4/src/index.ts | 3 + packages/worker-v4/src/init.ts | 134 ++++++ packages/worker-v4/src/reporter.ts | 83 ++++ packages/worker-v4/tsconfig.json | 18 + pnpm-lock.yaml | 400 +++++++++++++++++- pnpm-workspace.yaml | 1 + tsconfig.json | 2 +- 46 files changed, 780 insertions(+), 89 deletions(-) create mode 100644 packages/extension/package.json rename {src => packages/extension/src}/api.ts (97%) rename {src => packages/extension/src}/api/child_process.ts (100%) rename {src => packages/extension/src}/api/pkg.ts (100%) rename {src => packages/extension/src}/api/resolve.ts (100%) rename {src => packages/extension/src}/api/rpc.ts (57%) rename {src => packages/extension/src}/api/terminal.ts (100%) rename {src => packages/extension/src}/api/types.ts (100%) rename {src => packages/extension/src}/api/ws.ts (100%) rename {src => packages/extension/src}/config.ts (100%) rename {src => packages/extension/src}/constants.ts (100%) rename {src => packages/extension/src}/coverage.ts (100%) rename {src => packages/extension/src}/debug.ts (100%) rename {src => packages/extension/src}/diagnostic.ts (100%) rename {src => packages/extension/src}/extension.ts (100%) rename {src => packages/extension/src}/log.ts (100%) rename {src => packages/extension/src}/polyfills.ts (100%) rename {src => packages/extension/src}/runner.ts (98%) rename {src => packages/extension/src}/tagsManager.ts (100%) rename {src => packages/extension/src}/testTree.ts (100%) rename {src => packages/extension/src}/testTreeData.ts (100%) rename {src => packages/extension/src}/utils.ts (100%) rename {src => packages/extension/src}/watcher.ts (100%) rename {src => packages/extension/src}/worker/collect.ts (100%) rename {src => packages/extension/src}/worker/coverage.ts (100%) rename {src => packages/extension/src}/worker/emitter.ts (100%) rename {src => packages/extension/src}/worker/index.ts (100%) rename {src => packages/extension/src}/worker/init.ts (100%) rename {src => packages/extension/src}/worker/reporter.ts (97%) rename {src => packages/extension/src}/worker/rpc.ts (100%) rename {src => packages/extension/src}/worker/setupFile.ts (100%) rename {src => packages/extension/src}/worker/types.ts (100%) rename {src => packages/extension/src}/worker/utils.ts (85%) rename {src => packages/extension/src}/worker/watcher.ts (100%) rename {src => packages/extension/src}/worker/worker.ts (100%) create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts create mode 100644 packages/worker-v4/package.json create mode 100644 packages/worker-v4/src/index.ts create mode 100644 packages/worker-v4/src/init.ts create mode 100644 packages/worker-v4/src/reporter.ts create mode 100644 packages/worker-v4/tsconfig.json diff --git a/eslint.config.mjs b/eslint.config.mjs index fccad125..455246e5 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -52,17 +52,6 @@ export default antfu( 'antfu/no-import-dist': 'off', }, }, - { - files: [`packages/${GLOB_SRC}`], - rules: { - 'no-restricted-imports': [ - 'error', - { - paths: ['vitest', 'path'], - }, - ], - }, - }, { // these files define vitest as peer dependency files: [`packages/{coverage-*,ui,browser,web-worker}/${GLOB_SRC}`], diff --git a/packages/extension/package.json b/packages/extension/package.json new file mode 100644 index 00000000..57c1138e --- /dev/null +++ b/packages/extension/package.json @@ -0,0 +1,8 @@ +{ + "name": "vitest-vscode-extension", + "version": "0.0.0", + "private": true, + "dependencies": { + "vitest-vscode-shared": "workspace:*" + } +} diff --git a/src/api.ts b/packages/extension/src/api.ts similarity index 97% rename from src/api.ts rename to packages/extension/src/api.ts index f901fc77..bb64e7dc 100644 --- a/src/api.ts +++ b/packages/extension/src/api.ts @@ -1,5 +1,5 @@ import type { VitestPackage } from './api/pkg' -import type { ExtensionWorkerEvents, SerializedTestSpecification, VitestRPC } from './api/rpc' +import type { ExtensionWorkerEvents, SerializedTestSpecification, VitestExtensionRPC } from './api/rpc' import type { ExtensionWorkerProcess } from './api/types' import { dirname, isAbsolute } from 'node:path' import { normalize, relative } from 'pathe' @@ -207,7 +207,7 @@ export class VitestFolderAPI { onConsoleLog = this.createHandler('onConsoleLog') onTaskUpdate = this.createHandler('onTaskUpdate') - onFinished = this.createHandler('onFinished') + onTestRunEnd = this.createHandler('onTestRunEnd') onCollected = this.createHandler('onCollected') onWatcherStart = this.createHandler('onWatcherStart') onWatcherRerun = this.createHandler('onWatcherRerun') @@ -402,7 +402,7 @@ async function createVitestFolderAPI(usedConfigs: Set, pkg: VitestPackag } export interface ResolvedMeta { - rpc: VitestRPC + rpc: VitestExtensionRPC process: ExtensionWorkerProcess workspaceSource: string | false pkg: VitestPackage @@ -411,7 +411,7 @@ export interface ResolvedMeta { onStdout: (listener: (log: string) => void) => void onConsoleLog: (listener: ExtensionWorkerEvents['onConsoleLog']) => void onTaskUpdate: (listener: ExtensionWorkerEvents['onTaskUpdate']) => void - onFinished: (listener: ExtensionWorkerEvents['onFinished']) => void + onTestRunEnd: (listener: ExtensionWorkerEvents['onTestRunEnd']) => void onCollected: (listener: ExtensionWorkerEvents['onCollected']) => void onWatcherStart: (listener: ExtensionWorkerEvents['onWatcherStart']) => void onWatcherRerun: (listener: ExtensionWorkerEvents['onWatcherRerun']) => void @@ -428,6 +428,6 @@ function normalizeSpecs(specs?: string[] | SerializedTestSpecification[]) { if (typeof spec === 'string') { return normalize(spec) } - return [spec[0], normalize(spec[1])] as SerializedTestSpecification + return [spec[0], normalize(spec[1]), spec[2]] as SerializedTestSpecification }) as string[] | SerializedTestSpecification[] } diff --git a/src/api/child_process.ts b/packages/extension/src/api/child_process.ts similarity index 100% rename from src/api/child_process.ts rename to packages/extension/src/api/child_process.ts diff --git a/src/api/pkg.ts b/packages/extension/src/api/pkg.ts similarity index 100% rename from src/api/pkg.ts rename to packages/extension/src/api/pkg.ts diff --git a/src/api/resolve.ts b/packages/extension/src/api/resolve.ts similarity index 100% rename from src/api/resolve.ts rename to packages/extension/src/api/resolve.ts diff --git a/src/api/rpc.ts b/packages/extension/src/api/rpc.ts similarity index 57% rename from src/api/rpc.ts rename to packages/extension/src/api/rpc.ts index 0fae1442..4e47965f 100644 --- a/src/api/rpc.ts +++ b/packages/extension/src/api/rpc.ts @@ -1,47 +1,16 @@ -import type { RunnerTestFile, TaskResultPack, UserConsoleLog } from 'vitest' +import type { ExtensionWorkerEvents, ExtensionWorkerTransport } from 'vitest-vscode-shared' import { stripVTControlCharacters } from 'node:util' import v8 from 'node:v8' -import { type BirpcReturn, createBirpc } from 'birpc' +import { createBirpc } from 'birpc' import { log } from '../log' -export type SerializedTestSpecification = [ - project: { name: string | undefined }, - file: string, -] - -export interface ExtensionWorkerTransport { - getFiles: () => Promise<[project: string, file: string][]> - collectTests: (testFile: [project: string, filepath: string][]) => Promise - cancelRun: () => Promise - // accepts files with the project or folders (project doesn't matter for them) - runTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise - updateSnapshots: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise - - watchTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => void - unwatchTests: () => void - - invalidateIstanbulTestModules: (modules: string[] | null) => Promise - enableCoverage: () => void - disableCoverage: () => void - waitForCoverageReport: () => Promise - close: () => void - - onFilesCreated: (files: string[]) => void - onFilesChanged: (files: string[]) => void -} - -export interface ExtensionWorkerEvents { - onConsoleLog: (log: UserConsoleLog) => void - onTaskUpdate: (task: TaskResultPack[]) => void - onFinished: (files: RunnerTestFile[], unhandledError: string, collecting?: boolean) => void - onCollected: (files?: RunnerTestFile[], collecting?: boolean) => void - onWatcherStart: (files?: RunnerTestFile[], errors?: unknown[], collecting?: boolean) => void - onWatcherRerun: (files: string[], trigger?: string, collecting?: boolean) => void - - onProcessLog: (type: 'stdout' | 'stderr', log: string) => void -} - -export type VitestRPC = BirpcReturn +export type { SerializedTestSpecification } from 'vitest' +export type { + ExtensionWorkerEvents, + ExtensionWorkerTransport, + VitestExtensionRPC, + VitestWorkerRPC, +} from 'vitest-vscode-shared' function createHandler any>() { const handlers: T[] = [] @@ -62,7 +31,7 @@ export function createRpcOptions() { const handlers = { onConsoleLog: createHandler(), onTaskUpdate: createHandler(), - onFinished: createHandler(), + onFinished: createHandler(), onCollected: createHandler(), onWatcherRerun: createHandler(), onWatcherStart: createHandler(), @@ -70,7 +39,7 @@ export function createRpcOptions() { const events: Omit = { onConsoleLog: handlers.onConsoleLog.trigger, - onFinished: handlers.onFinished.trigger, + onTestRunEnd: handlers.onFinished.trigger, onTaskUpdate: handlers.onTaskUpdate.trigger, onCollected: handlers.onCollected.trigger, onWatcherRerun: handlers.onWatcherRerun.trigger, diff --git a/src/api/terminal.ts b/packages/extension/src/api/terminal.ts similarity index 100% rename from src/api/terminal.ts rename to packages/extension/src/api/terminal.ts diff --git a/src/api/types.ts b/packages/extension/src/api/types.ts similarity index 100% rename from src/api/types.ts rename to packages/extension/src/api/types.ts diff --git a/src/api/ws.ts b/packages/extension/src/api/ws.ts similarity index 100% rename from src/api/ws.ts rename to packages/extension/src/api/ws.ts diff --git a/src/config.ts b/packages/extension/src/config.ts similarity index 100% rename from src/config.ts rename to packages/extension/src/config.ts diff --git a/src/constants.ts b/packages/extension/src/constants.ts similarity index 100% rename from src/constants.ts rename to packages/extension/src/constants.ts diff --git a/src/coverage.ts b/packages/extension/src/coverage.ts similarity index 100% rename from src/coverage.ts rename to packages/extension/src/coverage.ts diff --git a/src/debug.ts b/packages/extension/src/debug.ts similarity index 100% rename from src/debug.ts rename to packages/extension/src/debug.ts diff --git a/src/diagnostic.ts b/packages/extension/src/diagnostic.ts similarity index 100% rename from src/diagnostic.ts rename to packages/extension/src/diagnostic.ts diff --git a/src/extension.ts b/packages/extension/src/extension.ts similarity index 100% rename from src/extension.ts rename to packages/extension/src/extension.ts diff --git a/src/log.ts b/packages/extension/src/log.ts similarity index 100% rename from src/log.ts rename to packages/extension/src/log.ts diff --git a/src/polyfills.ts b/packages/extension/src/polyfills.ts similarity index 100% rename from src/polyfills.ts rename to packages/extension/src/polyfills.ts diff --git a/src/runner.ts b/packages/extension/src/runner.ts similarity index 98% rename from src/runner.ts rename to packages/extension/src/runner.ts index 648246ef..8e3f73ec 100644 --- a/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -85,16 +85,12 @@ export class TestRunner extends vscode.Disposable { }) }) - api.onCollected((files, collecting) => { - if (!files || !files.length) { - log.verbose?.('No files to collect') - return - } - files.forEach(file => this.tree.collectFile(this.api, file)) + api.onCollected((file, collecting) => { + this.tree.collectFile(this.api, file) if (collecting) return - getTasks(files).forEach((task) => { + getTasks(file).forEach((task) => { const test = this.tree.getTestItemByTask(task) if (!test) { log.error(`Test data not found for "${task.name}"`) @@ -125,7 +121,7 @@ export class TestRunner extends vscode.Disposable { }) }) - api.onFinished(async (files = [], unhandledError, collecting) => { + api.onTestRunEnd(async (files = [], unhandledError, collecting) => { const testRun = this.testRun if (!testRun) { diff --git a/src/tagsManager.ts b/packages/extension/src/tagsManager.ts similarity index 100% rename from src/tagsManager.ts rename to packages/extension/src/tagsManager.ts diff --git a/src/testTree.ts b/packages/extension/src/testTree.ts similarity index 100% rename from src/testTree.ts rename to packages/extension/src/testTree.ts diff --git a/src/testTreeData.ts b/packages/extension/src/testTreeData.ts similarity index 100% rename from src/testTreeData.ts rename to packages/extension/src/testTreeData.ts diff --git a/src/utils.ts b/packages/extension/src/utils.ts similarity index 100% rename from src/utils.ts rename to packages/extension/src/utils.ts diff --git a/src/watcher.ts b/packages/extension/src/watcher.ts similarity index 100% rename from src/watcher.ts rename to packages/extension/src/watcher.ts diff --git a/src/worker/collect.ts b/packages/extension/src/worker/collect.ts similarity index 100% rename from src/worker/collect.ts rename to packages/extension/src/worker/collect.ts diff --git a/src/worker/coverage.ts b/packages/extension/src/worker/coverage.ts similarity index 100% rename from src/worker/coverage.ts rename to packages/extension/src/worker/coverage.ts diff --git a/src/worker/emitter.ts b/packages/extension/src/worker/emitter.ts similarity index 100% rename from src/worker/emitter.ts rename to packages/extension/src/worker/emitter.ts diff --git a/src/worker/index.ts b/packages/extension/src/worker/index.ts similarity index 100% rename from src/worker/index.ts rename to packages/extension/src/worker/index.ts diff --git a/src/worker/init.ts b/packages/extension/src/worker/init.ts similarity index 100% rename from src/worker/init.ts rename to packages/extension/src/worker/init.ts diff --git a/src/worker/reporter.ts b/packages/extension/src/worker/reporter.ts similarity index 97% rename from src/worker/reporter.ts rename to packages/extension/src/worker/reporter.ts index 5bd82957..0065d079 100644 --- a/src/worker/reporter.ts +++ b/packages/extension/src/worker/reporter.ts @@ -130,12 +130,12 @@ export class VSCodeReporter implements Reporter { this.vitest.logger.outputStream = outputStream } nextTick(() => { - this.rpc.onFinished(files || [], output, collecting) + this.rpc.onTestRunEnd(files || [], output, collecting) }) } onCollected(files?: RunnerTestFile[]) { - this.rpc.onCollected(files, this.collecting) + files?.forEach(file => this.rpc.onCollected(file, this.collecting)) } onWatcherStart(files?: RunnerTestFile[], errors?: unknown[]) { diff --git a/src/worker/rpc.ts b/packages/extension/src/worker/rpc.ts similarity index 100% rename from src/worker/rpc.ts rename to packages/extension/src/worker/rpc.ts diff --git a/src/worker/setupFile.ts b/packages/extension/src/worker/setupFile.ts similarity index 100% rename from src/worker/setupFile.ts rename to packages/extension/src/worker/setupFile.ts diff --git a/src/worker/types.ts b/packages/extension/src/worker/types.ts similarity index 100% rename from src/worker/types.ts rename to packages/extension/src/worker/types.ts diff --git a/src/worker/utils.ts b/packages/extension/src/worker/utils.ts similarity index 85% rename from src/worker/utils.ts rename to packages/extension/src/worker/utils.ts index 6eb70a6b..53b359f7 100644 --- a/src/worker/utils.ts +++ b/packages/extension/src/worker/utils.ts @@ -62,18 +62,10 @@ export function assert(condition: unknown, message: string | (() => string)): as } } +const driveLetter = process.platform === 'win32' ? __dirname[0] : null + export function normalizeDriveLetter(path: string) { - if (process.platform !== 'win32') + if (!driveLetter) return path - const currentDriveLetter = __dirname[0] - const letterCase = currentDriveLetter === currentDriveLetter.toUpperCase() - ? 'uppercase' - : 'lowercase' - const targetDriveLetter = path[0] - if (letterCase === 'lowercase') { - const driveLetter = targetDriveLetter.toLowerCase() - return driveLetter + path.slice(1) - } - const driveLetter = targetDriveLetter.toUpperCase() return driveLetter + path.slice(1) } diff --git a/src/worker/watcher.ts b/packages/extension/src/worker/watcher.ts similarity index 100% rename from src/worker/watcher.ts rename to packages/extension/src/worker/watcher.ts diff --git a/src/worker/worker.ts b/packages/extension/src/worker/worker.ts similarity index 100% rename from src/worker/worker.ts rename to packages/extension/src/worker/worker.ts diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 00000000..28625a41 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,13 @@ +{ + "name": "vitest-vscode-shared", + "type": "module", + "version": "0.0.0", + "private": true, + "exports": { + ".": "./src/index.ts" + }, + "devDependencies": { + "birpc": "2.4.0", + "vitest": "3.2.0" + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 00000000..ba76f997 --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,90 @@ +import type { BirpcReturn } from 'birpc' +import type { + RunnerTaskResultPack, + RunnerTestFile, + SerializedTestSpecification, + UserConsoleLog, +} from 'vitest' + +export interface ExtensionWorkerTransport { + getFiles: () => Promise<[project: string, file: string][]> + collectTests: (testFile: [project: string, filepath: string][]) => Promise + cancelRun: () => Promise + // accepts files with the project or folders (project doesn't matter for them) + runTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise + updateSnapshots: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise + + watchTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => void + unwatchTests: () => void + + invalidateIstanbulTestModules: (modules: string[] | null) => Promise + enableCoverage: () => void + disableCoverage: () => void + waitForCoverageReport: () => Promise + close: () => void + + onFilesCreated: (files: string[]) => void + onFilesChanged: (files: string[]) => void +} + +export interface ExtensionWorkerEvents { + onConsoleLog: (log: UserConsoleLog) => void + onTaskUpdate: (task: RunnerTaskResultPack[]) => void + onTestRunEnd: (files: RunnerTestFile[], unhandledError: string, collecting?: boolean) => void + onCollected: (file: RunnerTestFile, collecting?: boolean) => void + onWatcherStart: (files?: RunnerTestFile[], errors?: unknown[], collecting?: boolean) => void + onWatcherRerun: (files: string[], trigger?: string, collecting?: boolean) => void + + onProcessLog: (type: 'stdout' | 'stderr', log: string) => void +} + +export type VitestExtensionRPC = BirpcReturn +export type VitestWorkerRPC = BirpcReturn + +export interface WorkerInitMetadata { + vitestNodePath: string + id: string + cwd: string + arguments?: string + configFile?: string + workspaceFile?: string + env: Record | undefined + shellType: 'terminal' | 'child_process' + hasShellIntegration: boolean + pnpApi?: string + pnpLoader?: string + setupFilePath: string +} + +export interface WorkerRunnerOptions { + type: 'init' + meta: WorkerInitMetadata + debug: boolean + astCollect: boolean +} + +export interface EventReady { + type: 'ready' + configs: string[] + workspaceSource: string | false +} + +export interface EventDebug { + type: 'debug' + args: string[] +} + +export interface EventError { + type: 'error' + error: string +} + +export type WorkerEvent = EventReady | EventDebug | EventError + +const driveLetter = process.platform === 'win32' ? __dirname[0] : null + +export function normalizeDriveLetter(path: string) { + if (!driveLetter) + return path + return driveLetter + path.slice(1) +} diff --git a/packages/worker-v4/package.json b/packages/worker-v4/package.json new file mode 100644 index 00000000..bdfe8cfb --- /dev/null +++ b/packages/worker-v4/package.json @@ -0,0 +1,13 @@ +{ + "name": "vitest-vscode-worker-v4", + "type": "module", + "private": true, + "exports": { + ".": "./src/index.ts" + }, + "devDependencies": { + "@vitest/utils": "catalog:", + "vitest": "4.0.0-beta.5", + "vitest-vscode-shared": "workspace:*" + } +} diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts new file mode 100644 index 00000000..fc7eb5c5 --- /dev/null +++ b/packages/worker-v4/src/index.ts @@ -0,0 +1,3 @@ +import type { VitestExtensionRPC } from 'vitest-vscode-shared' + +type _T = VitestExtensionRPC diff --git a/packages/worker-v4/src/init.ts b/packages/worker-v4/src/init.ts new file mode 100644 index 00000000..6cc73511 --- /dev/null +++ b/packages/worker-v4/src/init.ts @@ -0,0 +1,134 @@ +import type { WorkerInitMetadata } from 'vitest-vscode-shared' +import type { TestUserConfig, WorkspaceProject } from 'vitest/node' +import { Console } from 'node:console' +import { Writable } from 'node:stream' +import { pathToFileURL } from 'node:url' +import { normalizeDriveLetter } from 'vitest-vscode-shared' +import { VSCodeReporter } from './reporter' + +export async function initVitest(meta: WorkerInitMetadata, options?: TestUserConfig) { + const reporter = new VSCodeReporter({ + setupFilePath: meta.setupFilePath, + }) + + let stdout: Writable | undefined + let stderr: Writable | undefined + + if (meta.shellType === 'terminal' && !meta.hasShellIntegration) { + stdout = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stdout', log).catch(() => {}) + } + process.stdout.write(log) + callback() + }, + }) + + stderr = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stderr', log).catch(() => {}) + } + process.stderr.write(log) + callback() + }, + }) + globalThis.console = new Console(stdout, stderr) + } + + const vitestModule = await import( + pathToFileURL(normalizeDriveLetter(meta.vitestNodePath)).toString() + ) as typeof import('vitest/node') + const pnpExecArgv = meta.pnpApi && meta.pnpLoader + ? [ + '--require', + meta.pnpApi, + '--experimental-loader', + meta.pnpLoader, + ] + : undefined + const args = meta.arguments + ? vitestModule.parseCLI(meta.arguments, { + allowUnknownOptions: false, + }).options + : {} + const cliOptions: TestUserConfig = { + config: meta.configFile, + ...(meta.workspaceFile ? { workspace: meta.workspaceFile } : {}), + ...args, + ...options, + watch: true, + api: false, + // @ts-expect-error private property + reporter: undefined, + reporters: [reporter], + ui: false, + includeTaskLocation: true, + poolOptions: meta.pnpApi && meta.pnpLoader + ? { + threads: { + execArgv: pnpExecArgv, + }, + forks: { + execArgv: pnpExecArgv, + }, + vmForks: { + execArgv: pnpExecArgv, + }, + vmThreads: { + execArgv: pnpExecArgv, + }, + } + : {}, + } + const vitest = await vitestModule.createVitest( + 'test', + cliOptions, + { + server: { + middlewareMode: true, + watch: null, + }, + plugins: [ + { + name: 'vitest:vscode-extension', + configResolved(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, + } + }, + }, + ], + }, + { + stderr, + stdout, + }, + ) + await (vitest as any).report('onInit', vitest) + const configs = ([ + // @ts-expect-error -- getRootProject in Vitest 3.0 + 'getRootProject' in vitest ? vitest.getRootProject() : vitest.getCoreWorkspaceProject(), + ...vitest.projects, + ] as WorkspaceProject[]).map(p => p.vite.config.configFile).filter(c => c != null) + const workspaceSource: string | false = meta.workspaceFile + ? meta.workspaceFile + : (vitest.config.projects != null) + ? vitest.vite.config.configFile || false + : false + return { + vitest, + reporter, + workspaceSource, + configs: Array.from(new Set(configs)), + meta, + } +} diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts new file mode 100644 index 00000000..c7c961d3 --- /dev/null +++ b/packages/worker-v4/src/reporter.ts @@ -0,0 +1,83 @@ +import type { RunnerTaskResultPack, UserConsoleLog } from 'vitest' +import type { VitestWorkerRPC } from 'vitest-vscode-shared' +import type { + Reporter, + RunnerTestFile, + TestModule, + TestProject, + Vite, + Vitest as VitestCore, +} from 'vitest/node' + +interface VSCodeReporterOptions { + setupFilePath: string +} + +export class VSCodeReporter implements Reporter { + public rpc!: VitestWorkerRPC + private vitest!: VitestCore + + private setupFilePath: string + + constructor(options: VSCodeReporterOptions) { + this.setupFilePath = options.setupFilePath + } + + private get collecting(): boolean { + return (this.vitest as any).configOverride.testNamePattern?.toString() === `/$a/` + } + + onInit(vitest: VitestCore) { + this.vitest = vitest + vitest.projects.forEach((project) => { + this.ensureSetupFileIsAllowed(project.vite.config) + }) + } + + initRpc(rpc: VitestWorkerRPC) { + this.rpc = rpc + } + + onBrowserInit(project: TestProject) { + const config = project.browser!.vite.config + this.ensureSetupFileIsAllowed(config) + } + + onUserConsoleLog(log: UserConsoleLog) { + this.rpc.onConsoleLog(log) + } + + onTaskUpdate(packs: RunnerTaskResultPack[]) { + this.rpc.onTaskUpdate(packs) + } + + onTestRunEnd(testModules: ReadonlyArray, unhandledErrors: ReadonlyArray) { + const files = testModules.map(m => getEntityJSONTask(m)) + + // TODO: remove "as unknown[]" + this.vitest.logger.printUnhandledErrors(unhandledErrors as unknown[]) + + // as any because Vitest types are different between v3 and v4, + // and shared packages uses the lowest Vitest version + this.rpc.onTestRunEnd(files as any, '', this.collecting) + } + + onTestModuleCollected(testModule: TestModule) { + // TODO: is it possible to make types happy with both V3 and V4? + this.rpc.onCollected(getEntityJSONTask(testModule) as any, this.collecting) + } + + ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { + if (!config.server.fs.allow.includes(this.setupFilePath)) { + config.server.fs.allow.push(this.setupFilePath) + } + } + + toJSON() { + return {} + } +} + +function getEntityJSONTask(entity: TestModule) { + return (entity as any).task as RunnerTestFile +} diff --git a/packages/worker-v4/tsconfig.json b/packages/worker-v4/tsconfig.json new file mode 100644 index 00000000..c9bb7b12 --- /dev/null +++ b/packages/worker-v4/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "noEmit": true, + "outDir": "dist" + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02d34a3d..7f6baa93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,33 @@ importers: specifier: ^8.16.0 version: 8.18.2 + packages/extension: + dependencies: + vitest-vscode-shared: + specifier: workspace:* + version: link:../shared + + packages/shared: + devDependencies: + birpc: + specifier: 2.4.0 + version: 2.4.0 + vitest: + specifier: 3.2.0 + version: 3.2.0(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + + packages/worker-v4: + devDependencies: + '@vitest/utils': + specifier: 'catalog:' + version: 3.2.3 + vitest: + specifier: 4.0.0-beta.5 + version: 4.0.0-beta.5(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest-vscode-shared: + specifier: workspace:* + version: link:../shared + samples/ast-collector: dependencies: birpc: @@ -229,7 +256,7 @@ importers: version: 6.6.3 imba: specifier: ^2.0.0-alpha.235 - version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.2)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) jsdom: specifier: ^24.0.0 version: 24.1.3 @@ -238,7 +265,7 @@ importers: version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-imba: specifier: ^0.10.3 - version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.2)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 'catalog:' version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -1492,9 +1519,26 @@ packages: vitest: optional: true + '@vitest/expect@3.2.0': + resolution: {integrity: sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA==} + '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + '@vitest/expect@4.0.0-beta.5': + resolution: {integrity: sha512-EVOgFbIbABU7KICgRRZMMH7934rfQZWXn97zRPMbls1csJcyZVgJonma3Xh7dUeqd9I9hIGJnjTwidRLZ7IMhA==} + + '@vitest/mocker@3.2.0': + resolution: {integrity: sha512-HFcW0lAMx3eN9vQqis63H0Pscv0QcVMo1Kv8BNysZbxcmHu3ZUYv59DS6BGYiGQ8F5lUkmsfMMlPm4DJFJdf/A==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@3.2.3': resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} peerDependencies: @@ -1506,21 +1550,62 @@ packages: vite: optional: true + '@vitest/mocker@4.0.0-beta.5': + resolution: {integrity: sha512-l8RAwsHDmgKtXLxSTPMM1KyPlWwvP4I/ri+ePJtnyN8XmuuzL3g5JP1evAGSf7p2Pt+zuGk/O49mOZ46Womf4w==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.0': + resolution: {integrity: sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw==} + '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + '@vitest/pretty-format@4.0.0-beta.5': + resolution: {integrity: sha512-XqyLvmjwx5S/+MENhyc+Q+PQlXzw8o/uiGGSQAjy4TZBGe4voeqtr4NZHXaWQhz9EdwQT4JFe29kfsljntl4XA==} + + '@vitest/runner@3.2.0': + resolution: {integrity: sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA==} + '@vitest/runner@3.2.3': resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} + '@vitest/runner@4.0.0-beta.5': + resolution: {integrity: sha512-l2DzseXHQ0bNCfqLDwth9qQv2FtfnTeg7txOBrbvxbNU7iHVCkmPF3sSZHxAXKavAZb+0u9cmnMHzpBjgsN0Iw==} + + '@vitest/snapshot@3.2.0': + resolution: {integrity: sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A==} + '@vitest/snapshot@3.2.3': resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} + '@vitest/snapshot@4.0.0-beta.5': + resolution: {integrity: sha512-c/lNlItk9cLHwoGdxKyahVJb94dDVpzJQQgBeU7hjlXkIUu4dGX28VjFvuc2MiqI5u6Vht1+8+HrpVEFhR4LBA==} + + '@vitest/spy@3.2.0': + resolution: {integrity: sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw==} + '@vitest/spy@3.2.3': resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + '@vitest/spy@4.0.0-beta.5': + resolution: {integrity: sha512-xUi9xl0QlPqCDGlUnc06r4yCDJNp+ADV6/H2BHGPJZWZeqvKPtN11S+afxgWTiBSvi732bz7gGvZDADXbjqZTQ==} + + '@vitest/utils@3.2.0': + resolution: {integrity: sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw==} + '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + '@vitest/utils@4.0.0-beta.5': + resolution: {integrity: sha512-xSCjh4KUPTJyEz1kO6XNCd9w6/Vde9iB5qFClkRPKnNVQdfSdNP5ZXkpzX7l9JPgQ20GtPZrnxN7EiNzBwnX0g==} + '@vscode/test-cli@0.0.6': resolution: {integrity: sha512-4i61OUv5PQr3GxhHOuUgHdgBDfIO/kXTPCsEyFiMaY4SOqQTgkTmyZLagHehjOgCfsXdcrJa3zgQ7zoc+Dh6hQ==} hasBin: true @@ -1872,6 +1957,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -2607,6 +2696,10 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} @@ -3419,6 +3512,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3992,6 +4088,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -4367,6 +4467,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -4576,6 +4677,10 @@ packages: resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -4785,6 +4890,11 @@ packages: resolution: {integrity: sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==} engines: {node: '>=4'} + vite-node@3.2.0: + resolution: {integrity: sha512-8Fc5Ko5Y4URIJkmMF/iFP1C0/OJyY+VGVe9Nw6WAdZyw4bTO+eVg9mwxWkQp/y8NnAoQY3o9KAvE1ZdA2v+Vmg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite-node@3.2.3: resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4847,6 +4957,34 @@ packages: peerDependencies: vitest: '>=0.16.0' + vitest@3.2.0: + resolution: {integrity: sha512-P7Nvwuli8WBNmeMHHek7PnGW4oAZl9za1fddfRVidZar8wDZRi7hpznLKQePQ8JPLwSBEYDK11g+++j7uFJV8Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.0 + '@vitest/ui': 3.2.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@3.2.3: resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4875,6 +5013,34 @@ packages: jsdom: optional: true + vitest@4.0.0-beta.5: + resolution: {integrity: sha512-JH+09JGgQr0gckdLWlsyqgduRgTqNAs5cZr2qPj7wgpgYSIWcSKr4gr98WVbh/xo+M2e/1XEQ+q5qbCPaKwqkA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 4.0.0-beta.5 + '@vitest/ui': 4.0.0-beta.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vue-component-type-helpers@2.2.10: resolution: {integrity: sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==} @@ -6276,6 +6442,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@3.2.0': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.0 + '@vitest/utils': 3.2.0 + chai: 5.2.1 + tinyrainbow: 2.0.0 + '@vitest/expect@3.2.3': dependencies: '@types/chai': 5.2.2 @@ -6284,6 +6458,23 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 + '@vitest/expect@4.0.0-beta.5': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.0-beta.5 + '@vitest/utils': 4.0.0-beta.5 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.0(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.0 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + '@vitest/mocker@3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.3 @@ -6293,30 +6484,90 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + '@vitest/mocker@4.0.0-beta.5(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 4.0.0-beta.5 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + + '@vitest/pretty-format@3.2.0': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/pretty-format@3.2.3': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.0-beta.5': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.0': + dependencies: + '@vitest/utils': 3.2.0 + pathe: 2.0.3 + '@vitest/runner@3.2.3': dependencies: '@vitest/utils': 3.2.3 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/runner@4.0.0-beta.5': + dependencies: + '@vitest/utils': 4.0.0-beta.5 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.0': + dependencies: + '@vitest/pretty-format': 3.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + '@vitest/snapshot@3.2.3': dependencies: '@vitest/pretty-format': 3.2.3 magic-string: 0.30.17 pathe: 2.0.3 + '@vitest/snapshot@4.0.0-beta.5': + dependencies: + '@vitest/pretty-format': 4.0.0-beta.5 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.0': + dependencies: + tinyspy: 4.0.3 + '@vitest/spy@3.2.3': dependencies: tinyspy: 4.0.3 + '@vitest/spy@4.0.0-beta.5': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.0': + dependencies: + '@vitest/pretty-format': 3.2.0 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + '@vitest/utils@3.2.3': dependencies: '@vitest/pretty-format': 3.2.3 - loupe: 3.1.3 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + + '@vitest/utils@4.0.0-beta.5': + dependencies: + '@vitest/pretty-format': 4.0.0-beta.5 + loupe: 3.2.0 tinyrainbow: 2.0.0 '@vscode/test-cli@0.0.6': @@ -6755,6 +7006,14 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -7606,6 +7865,8 @@ snapshots: expect-type@1.2.1: {} + expect-type@1.2.2: {} + exsolve@1.0.5: {} fast-deep-equal@3.1.3: {} @@ -7640,6 +7901,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -7976,7 +8241,7 @@ snapshots: ignore@7.0.5: {} - imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.2)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3): + imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3): dependencies: '@antfu/install-pkg': 0.1.1 chokidar: 3.6.0 @@ -7986,7 +8251,7 @@ snapshots: dotenv: 16.5.0 envinfo: 7.14.0 esbuild: 0.15.18 - fdir: 6.4.6(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.3) get-port: 5.1.1 local-pkg: 0.4.3 lodash.mergewith: 4.6.2 @@ -8443,6 +8708,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.2.0: {} + lru-cache@10.4.3: {} lru-cache@11.1.0: {} @@ -9210,6 +9477,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pirates@4.0.7: {} pkg-types@1.3.1: @@ -9877,11 +10146,13 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.0: {} + tinypool@1.1.1: {} + tinyrainbow@2.0.0: {} tinyspy@4.0.3: {} @@ -10078,6 +10349,27 @@ snapshots: version-range@4.14.0: {} + vite-node@3.2.0(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -10099,14 +10391,14 @@ snapshots: - tsx - yaml - vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.2)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): + vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 cross-env: 7.0.3 debug: 4.4.1(supports-color@8.1.1) deepmerge: 4.3.1 diff: 5.2.0 - imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.2)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) kleur: 4.1.5 magic-string: 0.26.7 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) @@ -10134,6 +10426,51 @@ snapshots: source-map-js: 1.2.1 vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest@3.2.0(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.0 + '@vitest/mocker': 3.2.0(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.0 + '@vitest/snapshot': 3.2.0 + '@vitest/spy': 3.2.0 + '@vitest/utils': 3.2.0 + chai: 5.2.1 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.0(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.0.0 + '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + happy-dom: 15.11.7 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 @@ -10269,6 +10606,51 @@ snapshots: - tsx - yaml + vitest@4.0.0-beta.5(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 4.0.0-beta.5 + '@vitest/mocker': 4.0.0-beta.5(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.0-beta.5 + '@vitest/runner': 4.0.0-beta.5 + '@vitest/snapshot': 4.0.0-beta.5 + '@vitest/spy': 4.0.0-beta.5 + '@vitest/utils': 4.0.0-beta.5 + chai: 5.2.1 + debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.0.0 + '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + happy-dom: 15.11.7 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vue-component-type-helpers@2.2.10: {} vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9c702c3f..d1cbe602 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - ./ + - ./packages/* - samples/* - samples/monorepo-vitest-workspace/packages/* diff --git a/tsconfig.json b/tsconfig.json index 4b959e8f..422de379 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,4 @@ { "extends": ["./tsconfig.base.json"], - "include": ["src", "./debug-shims.d.ts"] + "include": ["src", "./debug-shims.d.ts", "packages/**/*"] } From 0dfa028c83fcc93216b17b907c4cc614063cebb0 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 8 Aug 2025 15:46:30 +0200 Subject: [PATCH 02/20] chore: add more v4 apis --- packages/extension/src/api.ts | 19 +- packages/extension/src/api/resolve.ts | 2 +- packages/extension/src/api/rpc.ts | 13 +- packages/extension/src/api/ws.ts | 5 +- packages/extension/src/runner.ts | 17 +- packages/extension/src/worker/setupFile.ts | 7 +- packages/extension/src/worker/types.ts | 48 ---- packages/shared/package.json | 2 +- .../src/worker => shared/src}/emitter.ts | 2 +- packages/shared/src/index.ts | 32 +-- .../src/worker => shared/src}/rpc.ts | 7 +- .../src/worker => shared/src}/utils.ts | 0 packages/worker-old/package.json | 8 + .../src/worker => worker-old/src}/collect.ts | 0 .../src/worker => worker-old/src}/coverage.ts | 5 +- .../src/worker => worker-old/src}/index.ts | 13 +- .../src/worker => worker-old/src}/init.ts | 8 +- .../src/worker => worker-old/src}/reporter.ts | 35 +-- packages/worker-old/src/types.ts | 11 + .../src/worker => worker-old/src}/watcher.ts | 14 +- .../src/worker => worker-old/src}/worker.ts | 48 ++-- packages/worker-v4/package.json | 2 +- packages/worker-v4/src/coverage.ts | 91 +++++++ packages/worker-v4/src/index.ts | 63 ++++- packages/worker-v4/src/init.ts | 40 +++- packages/worker-v4/src/reporter.ts | 34 +-- packages/worker-v4/src/watcher.ts | 73 ++++++ packages/worker-v4/src/worker.ts | 129 ++++++++++ pnpm-lock.yaml | 222 ++---------------- 29 files changed, 579 insertions(+), 371 deletions(-) delete mode 100644 packages/extension/src/worker/types.ts rename packages/{extension/src/worker => shared/src}/emitter.ts (95%) rename packages/{extension/src/worker => shared/src}/rpc.ts (68%) rename packages/{extension/src/worker => shared/src}/utils.ts (100%) create mode 100644 packages/worker-old/package.json rename packages/{extension/src/worker => worker-old/src}/collect.ts (100%) rename packages/{extension/src/worker => worker-old/src}/coverage.ts (97%) rename packages/{extension/src/worker => worker-old/src}/index.ts (81%) rename packages/{extension/src/worker => worker-old/src}/init.ts (94%) rename packages/{extension/src/worker => worker-old/src}/reporter.ts (87%) create mode 100644 packages/worker-old/src/types.ts rename packages/{extension/src/worker => worker-old/src}/watcher.ts (89%) rename packages/{extension/src/worker => worker-old/src}/worker.ts (86%) create mode 100644 packages/worker-v4/src/coverage.ts create mode 100644 packages/worker-v4/src/watcher.ts create mode 100644 packages/worker-v4/src/worker.ts diff --git a/packages/extension/src/api.ts b/packages/extension/src/api.ts index bb64e7dc..38ae75f9 100644 --- a/packages/extension/src/api.ts +++ b/packages/extension/src/api.ts @@ -1,5 +1,6 @@ +import type { ExtensionTestSpecification } from 'vitest-vscode-shared' import type { VitestPackage } from './api/pkg' -import type { ExtensionWorkerEvents, SerializedTestSpecification, VitestExtensionRPC } from './api/rpc' +import type { ExtensionWorkerEvents, VitestExtensionRPC } from './api/rpc' import type { ExtensionWorkerProcess } from './api/types' import { dirname, isAbsolute } from 'node:path' import { normalize, relative } from 'pathe' @@ -110,11 +111,11 @@ export class VitestFolderAPI { return this.pkg } - async runFiles(specs?: SerializedTestSpecification[] | string[], testNamePatern?: string) { + async runFiles(specs?: ExtensionTestSpecification[] | string[], testNamePatern?: string) { await this.meta.rpc.runTests(normalizeSpecs(specs), testNamePatern) } - async updateSnapshots(specs?: SerializedTestSpecification[] | string[], testNamePatern?: string) { + async updateSnapshots(specs?: ExtensionTestSpecification[] | string[], testNamePatern?: string) { await this.meta.rpc.updateSnapshots(normalizeSpecs(specs), testNamePatern) } @@ -197,7 +198,7 @@ export class VitestFolderAPI { await this.meta.rpc.disableCoverage() } - async watchTests(files?: SerializedTestSpecification[] | string[], testNamePattern?: string) { + async watchTests(files?: ExtensionTestSpecification[] | string[], testNamePattern?: string) { await this.meta.rpc.watchTests(normalizeSpecs(files), testNamePattern) } @@ -208,8 +209,8 @@ export class VitestFolderAPI { onConsoleLog = this.createHandler('onConsoleLog') onTaskUpdate = this.createHandler('onTaskUpdate') onTestRunEnd = this.createHandler('onTestRunEnd') + onTestRunStart = this.createHandler('onTestRunStart') onCollected = this.createHandler('onCollected') - onWatcherStart = this.createHandler('onWatcherStart') onWatcherRerun = this.createHandler('onWatcherRerun') clearListeners(name?: Exclude) { @@ -412,15 +413,15 @@ export interface ResolvedMeta { onConsoleLog: (listener: ExtensionWorkerEvents['onConsoleLog']) => void onTaskUpdate: (listener: ExtensionWorkerEvents['onTaskUpdate']) => void onTestRunEnd: (listener: ExtensionWorkerEvents['onTestRunEnd']) => void + onTestRunStart: (listener: ExtensionWorkerEvents['onTestRunStart']) => void onCollected: (listener: ExtensionWorkerEvents['onCollected']) => void - onWatcherStart: (listener: ExtensionWorkerEvents['onWatcherStart']) => void onWatcherRerun: (listener: ExtensionWorkerEvents['onWatcherRerun']) => void clearListeners: () => void removeListener: (name: string, listener: any) => void } } -function normalizeSpecs(specs?: string[] | SerializedTestSpecification[]) { +function normalizeSpecs(specs?: string[] | ExtensionTestSpecification[]) { if (!specs) { return specs } @@ -428,6 +429,6 @@ function normalizeSpecs(specs?: string[] | SerializedTestSpecification[]) { if (typeof spec === 'string') { return normalize(spec) } - return [spec[0], normalize(spec[1]), spec[2]] as SerializedTestSpecification - }) as string[] | SerializedTestSpecification[] + return [spec[0], normalize(spec[1])] as ExtensionTestSpecification + }) as string[] | ExtensionTestSpecification[] } diff --git a/packages/extension/src/api/resolve.ts b/packages/extension/src/api/resolve.ts index 6312c6de..7a17f8de 100644 --- a/packages/extension/src/api/resolve.ts +++ b/packages/extension/src/api/resolve.ts @@ -1,8 +1,8 @@ import type * as vscode from 'vscode' import { findUpSync } from 'find-up' import { dirname, resolve } from 'pathe' +import { normalizeDriveLetter } from 'vitest-vscode-shared' import { getConfig } from '../config' -import { normalizeDriveLetter } from '../worker/utils' const _require = require diff --git a/packages/extension/src/api/rpc.ts b/packages/extension/src/api/rpc.ts index 4e47965f..55a8bdfe 100644 --- a/packages/extension/src/api/rpc.ts +++ b/packages/extension/src/api/rpc.ts @@ -4,7 +4,6 @@ import v8 from 'node:v8' import { createBirpc } from 'birpc' import { log } from '../log' -export type { SerializedTestSpecification } from 'vitest' export type { ExtensionWorkerEvents, ExtensionWorkerTransport, @@ -31,19 +30,19 @@ export function createRpcOptions() { const handlers = { onConsoleLog: createHandler(), onTaskUpdate: createHandler(), - onFinished: createHandler(), onCollected: createHandler(), onWatcherRerun: createHandler(), - onWatcherStart: createHandler(), + onTestRunStart: createHandler(), + onTestRunEnd: createHandler(), } const events: Omit = { onConsoleLog: handlers.onConsoleLog.trigger, - onTestRunEnd: handlers.onFinished.trigger, + onTestRunEnd: handlers.onTestRunEnd.trigger, onTaskUpdate: handlers.onTaskUpdate.trigger, onCollected: handlers.onCollected.trigger, onWatcherRerun: handlers.onWatcherRerun.trigger, - onWatcherStart: handlers.onWatcherStart.trigger, + onTestRunStart: handlers.onTestRunStart.trigger, onProcessLog(type, message) { log.worker(type === 'stderr' ? 'error' : 'info', stripVTControlCharacters(message)) }, @@ -54,10 +53,10 @@ export function createRpcOptions() { handlers: { onConsoleLog: handlers.onConsoleLog.register, onTaskUpdate: handlers.onTaskUpdate.register, - onFinished: handlers.onFinished.register, + onTestRunEnd: handlers.onTestRunEnd.register, onCollected: handlers.onCollected.register, onWatcherRerun: handlers.onWatcherRerun.register, - onWatcherStart: handlers.onWatcherStart.register, + onTestRunStart: handlers.onTestRunStart.register, removeListener(name: string, listener: any) { handlers[name as 'onCollected']?.remove(listener) }, diff --git a/packages/extension/src/api/ws.ts b/packages/extension/src/api/ws.ts index ad348976..4d4bf5a7 100644 --- a/packages/extension/src/api/ws.ts +++ b/packages/extension/src/api/ws.ts @@ -1,10 +1,11 @@ +import type { WorkerEvent, WorkerRunnerOptions } from 'vitest-vscode-shared' import type { WebSocket, WebSocketServer } from 'ws' import type { ResolvedMeta } from '../api' -import type { WorkerEvent, WorkerRunnerOptions } from '../worker/types' import type { VitestPackage } from './pkg' import { pathToFileURL } from 'node:url' import { gte } from 'semver' import { getConfig } from '../config' +import { finalCoverageFileName, setupFilePath } from '../constants' import { log } from '../log' import { createVitestRpc } from './rpc' @@ -131,6 +132,8 @@ export function onWsConnection( pnpLoader: pnpLoader && gte(process.version, '18.19.0') ? pathToFileURL(pnpLoader).toString() : undefined, + setupFilePath, + finalCoverageFileName }, debug, astCollect: getConfig(pkg.folder).experimentalStaticAstCollect, diff --git a/packages/extension/src/runner.ts b/packages/extension/src/runner.ts index 8e3f73ec..c08f60b0 100644 --- a/packages/extension/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -1,6 +1,5 @@ import type { ParsedStack, TaskResult, TestError } from 'vitest' import type { VitestFolderAPI } from './api' -import type { SerializedTestSpecification } from './api/rpc' import type { ExtensionDiagnostic } from './diagnostic' import type { TestTree } from './testTree' import { rm } from 'node:fs/promises' @@ -8,12 +7,12 @@ import path from 'node:path' import { inspect, stripVTControlCharacters } from 'node:util' import { getTasks } from '@vitest/runner/utils' import { basename, normalize, relative } from 'pathe' +import { type ExtensionTestSpecification, normalizeDriveLetter } from 'vitest-vscode-shared' import * as vscode from 'vscode' import { coverageContext, readCoverageReport } from './coverage' import { log } from './log' import { getTestData, TestCase, TestFile, TestFolder } from './testTreeData' import { showVitestError } from './utils' -import { normalizeDriveLetter } from './worker/utils' export class TestRunner extends vscode.Disposable { private continuousRequests = new Set() @@ -53,7 +52,7 @@ export class TestRunner extends vscode.Disposable { } }) - api.onWatcherRerun((files, _trigger, collecting) => { + api.onTestRunStart((files, collecting) => { if (collecting) { log.verbose?.('Not starting the runner because tests are being collected for', ...files.map(f => this.relative(f))) } @@ -121,7 +120,7 @@ export class TestRunner extends vscode.Disposable { }) }) - api.onTestRunEnd(async (files = [], unhandledError, collecting) => { + api.onTestRunEnd(async (files, unhandledError, collecting) => { const testRun = this.testRun if (!testRun) { @@ -287,7 +286,7 @@ export class TestRunner extends vscode.Disposable { }), ) - const runTests = (files?: SerializedTestSpecification[] | string[], testNamePatern?: string) => + const runTests = (files?: ExtensionTestSpecification[] | string[], testNamePatern?: string) => 'updateSnapshots' in request ? this.api.updateSnapshots(files, testNamePatern) : this.api.runFiles(files, testNamePatern) @@ -573,7 +572,7 @@ export class TestRunner extends vscode.Disposable { this.markTestCase(testRun, test, result) } - private relative(file: string | SerializedTestSpecification) { + private relative(file: string | ExtensionTestSpecification) { return relative(this.api.workspaceFolder.uri.fsPath, typeof file === 'string' ? file : file[1]) } } @@ -709,7 +708,7 @@ function setMessageStackFramesFromErrorStacks(testMessage: vscode.TestMessage, s (testMessage as any).stackTrace = frames } -function getTestFiles(tests: readonly vscode.TestItem[]): string[] | SerializedTestSpecification[] { +function getTestFiles(tests: readonly vscode.TestItem[]): string[] | ExtensionTestSpecification[] { // if there is a folder, we can't limit the tests to a specific project const hasFolder = tests.some(test => getTestData(test) instanceof TestFolder) if (hasFolder) { @@ -723,7 +722,7 @@ function getTestFiles(tests: readonly vscode.TestItem[]): string[] | SerializedT }).filter(Boolean) as string[]), ) } - const testSpecs: SerializedTestSpecification[] = [] + const testSpecs: ExtensionTestSpecification[] = [] const testFiles = new Set() for (const test of tests) { const fsPath = test.uri!.fsPath @@ -738,7 +737,7 @@ function getTestFiles(tests: readonly vscode.TestItem[]): string[] | SerializedT continue } testFiles.add(key) - testSpecs.push([{ name: project }, fsPath]) + testSpecs.push([project, fsPath]) } return testSpecs } diff --git a/packages/extension/src/worker/setupFile.ts b/packages/extension/src/worker/setupFile.ts index 6b776646..d458895e 100644 --- a/packages/extension/src/worker/setupFile.ts +++ b/packages/extension/src/worker/setupFile.ts @@ -1,6 +1,5 @@ import type { WorkerGlobalState } from 'vitest' import { inject } from 'vitest' -import { assert } from './utils' const { watchEveryFile, continuousFiles, rerunTriggered } = inject('__vscode') // @ts-expect-error injected global @@ -26,3 +25,9 @@ function testFileWatched() { return false }) } + +function assert(condition: unknown, message: string | (() => string)): asserts condition { + if (!condition) { + throw new Error(typeof message === 'string' ? message : message()) + } +} diff --git a/packages/extension/src/worker/types.ts b/packages/extension/src/worker/types.ts deleted file mode 100644 index cbd74638..00000000 --- a/packages/extension/src/worker/types.ts +++ /dev/null @@ -1,48 +0,0 @@ -export interface WorkerInitMetadata { - vitestNodePath: string - id: string - cwd: string - arguments?: string - configFile?: string - workspaceFile?: string - env: Record | undefined - shellType: 'terminal' | 'child_process' - hasShellIntegration: boolean - pnpApi?: string - pnpLoader?: string -} - -export interface WorkerRunnerOptions { - type: 'init' - meta: WorkerInitMetadata - debug: boolean - astCollect: boolean -} - -export interface EventReady { - type: 'ready' - configs: string[] - workspaceSource: string | false -} - -export interface EventDebug { - type: 'debug' - args: string[] -} - -export interface EventError { - type: 'error' - error: string -} - -export type WorkerEvent = EventReady | EventDebug | EventError - -declare module 'vitest' { - export interface ProvidedContext { - __vscode: { - continuousFiles: string[] - watchEveryFile: boolean - rerunTriggered: boolean - } - } -} diff --git a/packages/shared/package.json b/packages/shared/package.json index 28625a41..89456f2d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -8,6 +8,6 @@ }, "devDependencies": { "birpc": "2.4.0", - "vitest": "3.2.0" + "vitest": "catalog:" } } diff --git a/packages/extension/src/worker/emitter.ts b/packages/shared/src/emitter.ts similarity index 95% rename from packages/extension/src/worker/emitter.ts rename to packages/shared/src/emitter.ts index fc767996..1f06a010 100644 --- a/packages/extension/src/worker/emitter.ts +++ b/packages/shared/src/emitter.ts @@ -1,5 +1,5 @@ +import type { WorkerEvent } from 'vitest-vscode-shared' import type WebSocket from 'ws' -import type { WorkerEvent } from './types' abstract class WorkerEventEmitter { abstract name: string diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index ba76f997..63c59931 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -2,19 +2,27 @@ import type { BirpcReturn } from 'birpc' import type { RunnerTaskResultPack, RunnerTestFile, - SerializedTestSpecification, UserConsoleLog, } from 'vitest' +export { WorkerWSEventEmitter } from './emitter' +export { createWorkerRPC } from './rpc' +export { assert, limitConcurrency, normalizeDriveLetter } from './utils' + +export type ExtensionTestSpecification = [ + project: string, + file: string, +] + export interface ExtensionWorkerTransport { - getFiles: () => Promise<[project: string, file: string][]> - collectTests: (testFile: [project: string, filepath: string][]) => Promise + getFiles: () => Promise + collectTests: (testFile: ExtensionTestSpecification[]) => Promise cancelRun: () => Promise // accepts files with the project or folders (project doesn't matter for them) - runTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise - updateSnapshots: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => Promise + runTests: (filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string) => Promise + updateSnapshots: (filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string) => Promise - watchTests: (files?: SerializedTestSpecification[] | string[], testNamePattern?: string) => void + watchTests: (filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string) => void unwatchTests: () => void invalidateIstanbulTestModules: (modules: string[] | null) => Promise @@ -32,7 +40,8 @@ export interface ExtensionWorkerEvents { onTaskUpdate: (task: RunnerTaskResultPack[]) => void onTestRunEnd: (files: RunnerTestFile[], unhandledError: string, collecting?: boolean) => void onCollected: (file: RunnerTestFile, collecting?: boolean) => void - onWatcherStart: (files?: RunnerTestFile[], errors?: unknown[], collecting?: boolean) => void + onTestRunStart: (files: string[], collecting?: boolean) => void + /** @deprecated -- use onTestRunStart instead */ onWatcherRerun: (files: string[], trigger?: string, collecting?: boolean) => void onProcessLog: (type: 'stdout' | 'stderr', log: string) => void @@ -54,6 +63,7 @@ export interface WorkerInitMetadata { pnpApi?: string pnpLoader?: string setupFilePath: string + finalCoverageFileName: string } export interface WorkerRunnerOptions { @@ -80,11 +90,3 @@ export interface EventError { } export type WorkerEvent = EventReady | EventDebug | EventError - -const driveLetter = process.platform === 'win32' ? __dirname[0] : null - -export function normalizeDriveLetter(path: string) { - if (!driveLetter) - return path - return driveLetter + path.slice(1) -} diff --git a/packages/extension/src/worker/rpc.ts b/packages/shared/src/rpc.ts similarity index 68% rename from packages/extension/src/worker/rpc.ts rename to packages/shared/src/rpc.ts index 8f55147b..f2f0f0a3 100644 --- a/packages/extension/src/worker/rpc.ts +++ b/packages/shared/src/rpc.ts @@ -1,19 +1,16 @@ import type { ChannelOptions } from 'birpc' -import type { ExtensionWorkerEvents, ExtensionWorkerTransport } from '../api/rpc' -import type { ExtensionWorker } from './worker' +import type { ExtensionWorkerEvents, ExtensionWorkerTransport } from 'vitest-vscode-shared' import { createBirpc } from 'birpc' -export function createWorkerRPC(vitest: ExtensionWorker, channel: ChannelOptions) { +export function createWorkerRPC(vitest: ExtensionWorkerTransport, channel: ChannelOptions) { const rpc = createBirpc(vitest, { timeout: -1, bind: 'functions', eventNames: [ 'onConsoleLog', 'onTaskUpdate', - 'onFinished', 'onCollected', 'onWatcherRerun', - 'onWatcherStart', ], ...channel, }) diff --git a/packages/extension/src/worker/utils.ts b/packages/shared/src/utils.ts similarity index 100% rename from packages/extension/src/worker/utils.ts rename to packages/shared/src/utils.ts diff --git a/packages/worker-old/package.json b/packages/worker-old/package.json new file mode 100644 index 00000000..18e9eaa2 --- /dev/null +++ b/packages/worker-old/package.json @@ -0,0 +1,8 @@ +{ + "name": "vitest-vscode-worker-old", + "version": "0.0.0", + "private": true, + "dependencies": { + "vitest-vscode-shared": "workspace:*" + } +} diff --git a/packages/extension/src/worker/collect.ts b/packages/worker-old/src/collect.ts similarity index 100% rename from packages/extension/src/worker/collect.ts rename to packages/worker-old/src/collect.ts diff --git a/packages/extension/src/worker/coverage.ts b/packages/worker-old/src/coverage.ts similarity index 97% rename from packages/extension/src/worker/coverage.ts rename to packages/worker-old/src/coverage.ts index 8739e28a..8a6be75b 100644 --- a/packages/extension/src/worker/coverage.ts +++ b/packages/worker-old/src/coverage.ts @@ -4,7 +4,6 @@ import { randomUUID } from 'node:crypto' import { existsSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'pathe' -import { finalCoverageFileName } from '../constants' export class ExtensionCoverageManager { private _enabled = false @@ -14,6 +13,7 @@ export class ExtensionCoverageManager { constructor( private worker: ExtensionWorker, + private finalCoverageFileName: string, ) { this._config = worker.vitest.config.coverage const projects = new Set([...worker.vitest.projects, worker.getRootTestProject()]) @@ -27,6 +27,7 @@ export class ExtensionCoverageManager { }, }) }) + Object.defineProperty(worker.vitest, 'coverageProvider', { get: () => { if (this.enabled) @@ -63,7 +64,7 @@ export class ExtensionCoverageManager { this._config.reporter = [ ['json', { ...jsonReporter?.[1], - file: finalCoverageFileName, + file: this.finalCoverageFileName, }], ] this._config.reportOnFailure = true diff --git a/packages/extension/src/worker/index.ts b/packages/worker-old/src/index.ts similarity index 81% rename from packages/extension/src/worker/index.ts rename to packages/worker-old/src/index.ts index 893f1b17..bb384a43 100644 --- a/packages/extension/src/worker/index.ts +++ b/packages/worker-old/src/index.ts @@ -1,9 +1,8 @@ -import type { WorkerRunnerOptions } from './types' +import type { WorkerRunnerOptions } from 'vitest-vscode-shared' import v8 from 'node:v8' +import { createWorkerRPC, WorkerWSEventEmitter } from 'vitest-vscode-shared' import { WebSocket } from 'ws' -import { WorkerWSEventEmitter } from './emitter' import { initVitest } from './init' -import { createWorkerRPC } from './rpc' import { ExtensionWorker } from './worker' // this is the file that will be executed with "node " @@ -35,7 +34,13 @@ emitter.on('message', async function onMessage(message: any) { ) const rpc = createWorkerRPC( - new ExtensionWorker(vitest, data.debug, data.astCollect, emitter), + new ExtensionWorker( + vitest, + data.debug, + data.astCollect, + emitter, + data.meta.finalCoverageFileName, + ), { on(listener) { emitter.on('message', listener) diff --git a/packages/extension/src/worker/init.ts b/packages/worker-old/src/init.ts similarity index 94% rename from packages/extension/src/worker/init.ts rename to packages/worker-old/src/init.ts index 9a54229f..5dae2766 100644 --- a/packages/extension/src/worker/init.ts +++ b/packages/worker-old/src/init.ts @@ -1,13 +1,15 @@ +import type { WorkerInitMetadata } from 'vitest-vscode-shared' import type { UserConfig, WorkspaceProject } from 'vitest/node' -import type { WorkerInitMetadata } from './types' import { Console } from 'node:console' import { Writable } from 'node:stream' import { pathToFileURL } from 'node:url' +import { normalizeDriveLetter } from '../../shared/src/utils' import { VSCodeReporter } from './reporter' -import { normalizeDriveLetter } from './utils' export async function initVitest(meta: WorkerInitMetadata, options?: UserConfig) { - const reporter = new VSCodeReporter() + const reporter = new VSCodeReporter({ + setupFilePath: meta.setupFilePath, + }) let stdout: Writable | undefined let stderr: Writable | undefined diff --git a/packages/extension/src/worker/reporter.ts b/packages/worker-old/src/reporter.ts similarity index 87% rename from packages/extension/src/worker/reporter.ts rename to packages/worker-old/src/reporter.ts index 0065d079..47674e69 100644 --- a/packages/extension/src/worker/reporter.ts +++ b/packages/worker-old/src/reporter.ts @@ -1,18 +1,26 @@ import type { BirpcReturn } from 'birpc' import type { RunnerTestFile, TaskResultPack, UserConsoleLog } from 'vitest' +import type { ExtensionWorkerEvents, ExtensionWorkerTransport } from 'vitest-vscode-shared' import type { Vitest as VitestCore, WorkspaceProject } from 'vitest/node' import type { Reporter } from 'vitest/reporters' -import type { ExtensionWorkerEvents, ExtensionWorkerTransport } from '../api/rpc' import { Console } from 'node:console' import { nextTick } from 'node:process' import { Writable } from 'node:stream' import { parseErrorStacktrace } from '@vitest/utils/source-map' -import { setupFilePath } from '../constants' import { ExtensionWorker } from './worker' +interface VSCodeReporterOptions { + setupFilePath: string +} + export class VSCodeReporter implements Reporter { public rpc!: BirpcReturn private vitest!: VitestCore + private setupFilePath: string + + constructor(options: VSCodeReporterOptions) { + this.setupFilePath = options.setupFilePath + } private get collecting(): boolean { return (this.vitest as any).configOverride.testNamePattern?.toString() === `/${ExtensionWorker.COLLECT_NAME_PATTERN}/` @@ -21,16 +29,16 @@ export class VSCodeReporter implements Reporter { onInit(vitest: VitestCore) { this.vitest = vitest const server = vitest.server.config.server - if (!server.fs.allow.includes(setupFilePath)) - server.fs.allow.push(setupFilePath) + if (!server.fs.allow.includes(this.setupFilePath)) + server.fs.allow.push(this.setupFilePath) vitest.projects.forEach((project) => { project.config.setupFiles = [ ...project.config.setupFiles || [], - setupFilePath, + this.setupFilePath, ] const server = project.server.config.server - if (!server.fs.allow.includes(setupFilePath)) - server.fs.allow.push(setupFilePath) + if (!server.fs.allow.includes(this.setupFilePath)) + server.fs.allow.push(this.setupFilePath) // @ts-expect-error internal, Vitest 3 if (project._initBrowserProvider) { this.overrideInitBrowserProvider(project, '_initBrowserProvider') @@ -44,14 +52,15 @@ export class VSCodeReporter implements Reporter { return } const config = 'vite' in browser ? browser.vite.config.server : browser.config.server - if (!config.fs.allow.includes(setupFilePath)) - config.fs.allow.push(setupFilePath) + if (!config.fs.allow.includes(this.setupFilePath)) + config.fs.allow.push(this.setupFilePath) }) } overrideInitBrowserProvider(project: WorkspaceProject, name: string) { // @ts-expect-error internal const original = project[name].bind(project) + const setupFilePath = this.setupFilePath // @ts-expect-error internal project[name] = async function _initBrowserProvider(this: WorkspaceProject) { await original() @@ -138,12 +147,8 @@ export class VSCodeReporter implements Reporter { files?.forEach(file => this.rpc.onCollected(file, this.collecting)) } - onWatcherStart(files?: RunnerTestFile[], errors?: unknown[]) { - this.rpc.onWatcherStart(files, errors, this.collecting) - } - - onWatcherRerun(files: string[], trigger?: string) { - this.rpc.onWatcherRerun(files, trigger, this.collecting) + onWatcherRerun(files: string[]) { + this.rpc.onTestRunStart(files, this.collecting) } toJSON() { diff --git a/packages/worker-old/src/types.ts b/packages/worker-old/src/types.ts new file mode 100644 index 00000000..cec0bb28 --- /dev/null +++ b/packages/worker-old/src/types.ts @@ -0,0 +1,11 @@ +declare module 'vitest' { + export interface ProvidedContext { + __vscode: { + continuousFiles: string[] + watchEveryFile: boolean + rerunTriggered: boolean + } + } +} + +export {} diff --git a/packages/extension/src/worker/watcher.ts b/packages/worker-old/src/watcher.ts similarity index 89% rename from packages/extension/src/worker/watcher.ts rename to packages/worker-old/src/watcher.ts index bb395036..2cbc8a10 100644 --- a/packages/extension/src/worker/watcher.ts +++ b/packages/worker-old/src/watcher.ts @@ -11,11 +11,11 @@ export class ExtensionWorkerWatcher { private enabled = false - constructor(extension: ExtensionWorker) { + constructor(worker: ExtensionWorker) { // eslint-disable-next-line ts/no-this-alias const state = this - const vitest = extension.vitest - ;(extension.getRootTestProject().provide as (key: T, value: ProvidedContext[T]) => void)('__vscode', { + const vitest = worker.vitest + ;(worker.getRootTestProject().provide as (key: T, value: ProvidedContext[T]) => void)('__vscode', { get continuousFiles() { return state.files || [] }, @@ -49,17 +49,17 @@ export class ExtensionWorkerWatcher { const astSpecs: [project: WorkspaceProject, file: string][] = [] for (const [project, file] of specs) { - if (extension.alwaysAstCollect || project.config.browser.enabled) { + if (worker.alwaysAstCollect || project.config.browser.enabled) { astSpecs.push([project, file]) } } - extension.setGlobalTestNamePattern(ExtensionWorker.COLLECT_NAME_PATTERN) + worker.setGlobalTestNamePattern(ExtensionWorker.COLLECT_NAME_PATTERN) vitest.logger.log('Collecting tests due to file changes:', ...files.map(f => relative(vitest.config.root, f))) if (astSpecs.length) { vitest.logger.log('Collecting using AST explorer...') - await extension.astCollect(astSpecs) + await worker.astCollect(astSpecs) this.changedTests.clear() return await originalScheduleRerun.call(this, []) } @@ -70,7 +70,7 @@ export class ExtensionWorkerWatcher { state.rerunTriggered = true const namePattern = state.testNamePattern ? new RegExp(state.testNamePattern) : undefined - extension.setGlobalTestNamePattern(namePattern) + worker.setGlobalTestNamePattern(namePattern) if (state.watchEveryFile) { vitest.logger.log( 'Rerunning all tests due to file changes:', diff --git a/packages/extension/src/worker/worker.ts b/packages/worker-old/src/worker.ts similarity index 86% rename from packages/extension/src/worker/worker.ts rename to packages/worker-old/src/worker.ts index 5d32e364..141673c3 100644 --- a/packages/extension/src/worker/worker.ts +++ b/packages/worker-old/src/worker.ts @@ -1,13 +1,13 @@ import type { ArgumentsType } from 'vitest' +import type { ExtensionTestSpecification, ExtensionWorkerTransport } from 'vitest-vscode-shared' import type { Reporter, ResolvedConfig, TestSpecification, Vitest as VitestCore, WorkspaceProject } from 'vitest/node' -import type { ExtensionWorkerTransport, SerializedTestSpecification } from '../api/rpc' -import type { WorkerWSEventEmitter } from './emitter' +import type { WorkerWSEventEmitter } from '../../shared/src/emitter' import { readFileSync } from 'node:fs' import mm from 'micromatch' import { relative } from 'pathe' +import { assert, limitConcurrency } from '../../shared/src/utils' import { astCollectTests, createFailedFileTask } from './collect' import { ExtensionCoverageManager } from './coverage' -import { assert, limitConcurrency } from './utils' import { ExtensionWorkerWatcher } from './watcher' export class ExtensionWorker implements ExtensionWorkerTransport { @@ -21,9 +21,10 @@ export class ExtensionWorker implements ExtensionWorkerTransport { private readonly debug = false, public readonly alwaysAstCollect = false, private emitter: WorkerWSEventEmitter, + finalCoverageFileName: string, ) { this.watcher = new ExtensionWorkerWatcher(this) - this.coverage = new ExtensionCoverageManager(this) + this.coverage = new ExtensionCoverageManager(this, finalCoverageFileName) } public get collecting() { @@ -83,8 +84,12 @@ export class ExtensionWorker implements ExtensionWorkerTransport { })(), (async () => { if (otherTests.length) { - const files = otherTests.map( - ([project, filepath]) => [{ name: project.getName() }, filepath], + const files = otherTests.map( + ([project, filepath]) => [ + { name: project.getName(), root: project.config.root }, + filepath, + { pool: project.config.pool }, + ], ) try { @@ -114,7 +119,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { this.setTestNamePattern(undefined) } - public async updateSnapshots(files?: SerializedTestSpecification[] | string[] | undefined, testNamePattern?: string | undefined) { + public async updateSnapshots(files?: ExtensionTestSpecification[] | string[] | undefined, testNamePattern?: string | undefined) { this.configOverride.snapshotOptions = { updateSnapshot: 'all', // environment is resolved inside a worker thread @@ -128,17 +133,28 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } } - async resolveTestSpecs(specs: string[] | SerializedTestSpecification[] | undefined): Promise { + async resolveTestSpecs(specs: string[] | ExtensionTestSpecification[] | undefined): Promise { if (!specs || typeof specs[0] === 'string') { const files = await this.globTestSpecifications(specs as string[] | undefined) - return files.map(([project, file]) => { - return [{ name: typeof project === 'string' ? project : project.getName() }, file as string] - }) + return files.map(([project, file]) => { + if (typeof project === 'string') { + return undefined + } + + return [ + { + name: project.getName(), + root: project.config.root, + }, + file as string, + { pool: project.config.pool }, + ] + }).filter(r => r != null) } - return (specs || []) as SerializedTestSpecification[] + return (specs || []) as ExtensionTestSpecification[] } - public async runTests(specsOrPaths: SerializedTestSpecification[] | string[] | undefined, testNamePattern?: string) { + public async runTests(specsOrPaths: ExtensionTestSpecification[] | string[] | undefined, testNamePattern?: string) { // @ts-expect-error private method in Vitest <=2.1.5 await this.vitest.initBrowserProviders?.() @@ -188,7 +204,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { }) } - private async runTestFiles(specs: SerializedTestSpecification[], testNamePattern?: string | undefined, runAllFiles = false) { + private async runTestFiles(specs: ExtensionTestSpecification[], testNamePattern?: string | undefined, runAllFiles = false) { await (this.vitest as any).runningPromise this.watcher.markRerun(false) @@ -205,7 +221,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { this.configOverride.testNamePattern = pattern ? new RegExp(pattern) : undefined } - private async rerunTests(specs: SerializedTestSpecification[], runAllFiles = false) { + private async rerunTests(specs: ExtensionTestSpecification[], runAllFiles = false) { const paths = specs.map(spec => spec[1]) const specsToRun = specs.flatMap((spec) => { @@ -325,7 +341,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { return this.watcher.stopTracking() } - watchTests(files?: SerializedTestSpecification[] | string[] | undefined, testNamePatern?: string) { + watchTests(files?: ExtensionTestSpecification[] | string[] | undefined, testNamePatern?: string) { if (files) this.watcher.trackTests(files.map(f => typeof f === 'string' ? f : f[1]), testNamePatern) else diff --git a/packages/worker-v4/package.json b/packages/worker-v4/package.json index bdfe8cfb..be0c9376 100644 --- a/packages/worker-v4/package.json +++ b/packages/worker-v4/package.json @@ -6,7 +6,7 @@ ".": "./src/index.ts" }, "devDependencies": { - "@vitest/utils": "catalog:", + "@vitest/utils": "4.0.0-beta.5", "vitest": "4.0.0-beta.5", "vitest-vscode-shared": "workspace:*" } diff --git a/packages/worker-v4/src/coverage.ts b/packages/worker-v4/src/coverage.ts new file mode 100644 index 00000000..1471f541 --- /dev/null +++ b/packages/worker-v4/src/coverage.ts @@ -0,0 +1,91 @@ +import type { CoverageProvider, ResolvedCoverageOptions, Vitest } from 'vitest/node' +import { existsSync } from 'node:fs' + +export class ExtensionCoverageManager { + private _enabled = false + private _provider: CoverageProvider | null | undefined = undefined + + private _config: ResolvedCoverageOptions + + constructor(private vitest: Vitest) { + this._config = vitest.config.coverage + const projects = new Set([ + ...vitest.projects, + vitest.getRootProject(), + ]) + projects.forEach((project) => { + Object.defineProperty(project.config, 'coverage', { + get: () => { + return this.config + }, + set: (coverage: ResolvedCoverageOptions) => { + this._config = coverage + }, + }) + }) + + Object.defineProperty(vitest, 'coverageProvider', { + get: () => { + if (this.enabled) + return this._provider + + return null + }, + set: (provider: CoverageProvider | null) => { + this._provider = provider + }, + }) + } + + public get config(): ResolvedCoverageOptions { + return { + ...this._config, + enabled: this.enabled, + } + } + + public get enabled() { + return this._enabled + } + + public async enable() { + const vitest = this.vitest + this._enabled = true + + vitest.logger.log('Running coverage with configuration:', this.config) + + if (!this._provider) { + // @ts-expect-error private method + await vitest.initCoverageProvider() + await this.coverageProvider?.clean(this._config.clean) + } + else { + await this._provider.clean(this._config.clean) + } + } + + private get coverageProvider() { + return (this.vitest as any).coverageProvider as CoverageProvider | null | undefined + } + + public disable() { + this._enabled = false + } + + async waitForReport() { + if (!this.enabled) + return null + const vitest = this.vitest + const coverage = vitest.config.coverage + if (!this._provider) + return null + vitest.logger.error(`Waiting for the coverage report to generate: ${coverage.reportsDirectory}`) + await (vitest as any).runningPromise + if (existsSync(coverage.reportsDirectory)) { + vitest.logger.error(`Coverage reports retrieved: ${coverage.reportsDirectory}`) + return coverage.reportsDirectory + } + vitest.logger.error(`Coverage reports directory not found: ${coverage.reportsDirectory}`) + return null + } +} diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts index fc7eb5c5..bb384a43 100644 --- a/packages/worker-v4/src/index.ts +++ b/packages/worker-v4/src/index.ts @@ -1,3 +1,62 @@ -import type { VitestExtensionRPC } from 'vitest-vscode-shared' +import type { WorkerRunnerOptions } from 'vitest-vscode-shared' +import v8 from 'node:v8' +import { createWorkerRPC, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import { WebSocket } from 'ws' +import { initVitest } from './init' +import { ExtensionWorker } from './worker' -type _T = VitestExtensionRPC +// this is the file that will be executed with "node " + +const emitter = new WorkerWSEventEmitter( + new WebSocket(process.env.VITEST_WS_ADDRESS!), +) + +emitter.on('message', async function onMessage(message: any) { + if (emitter.name === 'ws') { + message = JSON.parse(message.toString()) + } + + if (message.type === 'init') { + emitter.off('message', onMessage) + const data = message as WorkerRunnerOptions + + try { + const { reporter, vitest, configs, workspaceSource } = await initVitest( + data.meta, + data.debug + ? { + disableConsoleIntercept: true, + fileParallelism: false, + testTimeout: 0, + hookTimeout: 0, + } + : {}, + ) + + const rpc = createWorkerRPC( + new ExtensionWorker( + vitest, + data.debug, + data.astCollect, + emitter, + data.meta.finalCoverageFileName, + ), + { + on(listener) { + emitter.on('message', listener) + }, + post(message) { + emitter.send(message) + }, + serialize: v8.serialize, + deserialize: v => v8.deserialize(Buffer.from(v) as any), + }, + ) + reporter.initRpc(rpc) + emitter.ready(configs, workspaceSource) + } + catch (err: any) { + emitter.error(err) + } + } +}) diff --git a/packages/worker-v4/src/init.ts b/packages/worker-v4/src/init.ts index 6cc73511..8c7fcaa1 100644 --- a/packages/worker-v4/src/init.ts +++ b/packages/worker-v4/src/init.ts @@ -1,8 +1,11 @@ import type { WorkerInitMetadata } from 'vitest-vscode-shared' -import type { TestUserConfig, WorkspaceProject } from 'vitest/node' +import type { TestUserConfig } from 'vitest/node' import { Console } from 'node:console' +import { randomUUID } from 'node:crypto' +import { tmpdir } from 'node:os' import { Writable } from 'node:stream' import { pathToFileURL } from 'node:url' +import { join } from 'pathe' import { normalizeDriveLetter } from 'vitest-vscode-shared' import { VSCodeReporter } from './reporter' @@ -95,6 +98,26 @@ export async function initVitest(meta: WorkerInitMetadata, options?: TestUserCon plugins: [ { name: 'vitest:vscode-extension', + config(userConfig) { + const testConfig = userConfig.test ?? {} + const coverageOptions = testConfig.coverage ?? {} + if (coverageOptions.provider !== 'custom') { + const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] + const jsonReporter = reporters.find(r => r && r[0] === 'json') + const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} + coverageOptions.reporter = [ + ['json', { ...jsonReporterOptions, file: meta.finalCoverageFileName }], + ] + } + return { + test: { + coverage: { + reportOnFailure: true, + reportsDirectory: join(tmpdir(), `vitest-coverage-${randomUUID()}`), + }, + }, + } + }, configResolved(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 @@ -114,16 +137,13 @@ export async function initVitest(meta: WorkerInitMetadata, options?: TestUserCon }, ) await (vitest as any).report('onInit', vitest) - const configs = ([ - // @ts-expect-error -- getRootProject in Vitest 3.0 - 'getRootProject' in vitest ? vitest.getRootProject() : vitest.getCoreWorkspaceProject(), + const configs = [ + vitest.getRootProject(), ...vitest.projects, - ] as WorkspaceProject[]).map(p => p.vite.config.configFile).filter(c => c != null) - const workspaceSource: string | false = meta.workspaceFile - ? meta.workspaceFile - : (vitest.config.projects != null) - ? vitest.vite.config.configFile || false - : false + ].map(p => p.vite.config.configFile).filter(c => c != null) + const workspaceSource: string | false = (vitest.config.projects != null) + ? vitest.vite.config.configFile || false + : false return { vitest, reporter, diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts index c7c961d3..19023005 100644 --- a/packages/worker-v4/src/reporter.ts +++ b/packages/worker-v4/src/reporter.ts @@ -4,8 +4,9 @@ import type { Reporter, RunnerTestFile, TestModule, - TestProject, - Vite, + // TestProject, + TestSpecification, + // Vite, Vitest as VitestCore, } from 'vitest/node' @@ -29,19 +30,19 @@ export class VSCodeReporter implements Reporter { onInit(vitest: VitestCore) { this.vitest = vitest - vitest.projects.forEach((project) => { - this.ensureSetupFileIsAllowed(project.vite.config) - }) + // vitest.projects.forEach((project) => { + // this.ensureSetupFileIsAllowed(project.vite.config) + // }) } initRpc(rpc: VitestWorkerRPC) { this.rpc = rpc } - onBrowserInit(project: TestProject) { - const config = project.browser!.vite.config - this.ensureSetupFileIsAllowed(config) - } + // onBrowserInit(project: TestProject) { + // const config = project.browser!.vite.config + // this.ensureSetupFileIsAllowed(config) + // } onUserConsoleLog(log: UserConsoleLog) { this.rpc.onConsoleLog(log) @@ -51,6 +52,11 @@ export class VSCodeReporter implements Reporter { this.rpc.onTaskUpdate(packs) } + onTestRunStart(specifications: ReadonlyArray) { + const files = specifications.map(spec => spec.moduleId) + this.rpc.onTestRunStart(Array.from(new Set(files)), this.collecting) + } + onTestRunEnd(testModules: ReadonlyArray, unhandledErrors: ReadonlyArray) { const files = testModules.map(m => getEntityJSONTask(m)) @@ -67,11 +73,11 @@ export class VSCodeReporter implements Reporter { this.rpc.onCollected(getEntityJSONTask(testModule) as any, this.collecting) } - ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { - if (!config.server.fs.allow.includes(this.setupFilePath)) { - config.server.fs.allow.push(this.setupFilePath) - } - } + // ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { + // if (!config.server.fs.allow.includes(this.setupFilePath)) { + // config.server.fs.allow.push(this.setupFilePath) + // } + // } toJSON() { return {} diff --git a/packages/worker-v4/src/watcher.ts b/packages/worker-v4/src/watcher.ts new file mode 100644 index 00000000..140de5e6 --- /dev/null +++ b/packages/worker-v4/src/watcher.ts @@ -0,0 +1,73 @@ +import type { ExtensionTestSpecification } from 'vitest-vscode-shared' +import type { Vitest } from 'vitest/node' + +export class ExtensionWorkerWatcher { + private enabled = false + private trackingEveryFile = false + private trackedTestItems: Record = {} + private trackedDirectories: string[] = [] + + constructor(vitest: Vitest) { + vitest.onFilterWatchedSpecification((specification) => { + if (this.enabled) { + return false + } + + if (this.trackingEveryFile) { + return true + } + + if (this.isTestFileWatched(specification.moduleId, this.trackedDirectories)) { + return true + } + + const project = specification.project.name + const files = this.trackedTestItems[project] + if (!files?.length) { + return false + } + + return files.includes(specification.moduleId) + }) + } + + trackTestItems(filesOrDirectories: ExtensionTestSpecification[] | string[]) { + this.enabled = true + if (typeof filesOrDirectories[0] === 'string') { + this.trackedDirectories = filesOrDirectories as string[] + } + else { + for (const [project, file] of filesOrDirectories) { + if (!this.trackedTestItems[project]) { + this.trackedTestItems[project] = [] + } + this.trackedTestItems[project].push(file) + } + } + } + + trackEveryFile(): void { + this.enabled = true + this.trackingEveryFile = true + } + + stopTracking() { + this.enabled = false + this.trackingEveryFile = false + this.trackedTestItems = {} + this.trackedDirectories = [] + } + + private isTestFileWatched(testFile: string, files: string[]) { + if (!files?.length) + return false + + return files.some((file) => { + if (file === testFile) + return true + if (file[file.length - 1] === '/') + return testFile.startsWith(file) + return false + }) + } +} diff --git a/packages/worker-v4/src/worker.ts b/packages/worker-v4/src/worker.ts new file mode 100644 index 00000000..ef885aea --- /dev/null +++ b/packages/worker-v4/src/worker.ts @@ -0,0 +1,129 @@ +import type { ExtensionTestSpecification, ExtensionWorkerTransport, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import type { TestSpecification, Vitest as VitestCore } from 'vitest/node' +import { ExtensionCoverageManager } from './coverage' +import { ExtensionWorkerWatcher } from './watcher' + +export class ExtensionWorker implements ExtensionWorkerTransport { + private readonly watcher: ExtensionWorkerWatcher + private readonly coverage: ExtensionCoverageManager + + constructor( + public readonly vitest: VitestCore, + private readonly debug = false, + public readonly alwaysAstCollect = false, + private emitter: WorkerWSEventEmitter, + ) { + this.watcher = new ExtensionWorkerWatcher(vitest) + this.coverage = new ExtensionCoverageManager(vitest) + } + + async getFiles(): Promise { + this.vitest.clearSpecificationsCache() + const specifications = await this.vitest.globTestSpecifications() + return specifications.map(spec => [spec.project.name, spec.moduleId]) + } + + async collectTests(testFile: ExtensionTestSpecification[]): Promise { + // + } + + cancelRun() { + return this.vitest.cancelCurrentRun('keyboard-input') + } + + async runTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { + if (testNamePattern) { + this.vitest.setGlobalTestNamePattern(testNamePattern) + } + + if (!filesOrDirectories || this.isDirectories(filesOrDirectories)) { + const specifications = await this.vitest.getRelevantTestSpecifications(filesOrDirectories) + await this.vitest.rerunTestSpecifications(specifications, true) + } + else { + const specifications = await this.resolveTestSpecifications(filesOrDirectories) + await this.vitest.rerunTestSpecifications(specifications, false) + } + + // debugger never runs in watch mode + if (this.debug) { + await this.vitest.close() + this.emitter.close() + } + } + + async resolveTestSpecifications(filesOrDirectories: ExtensionTestSpecification[]): Promise { + const specifications: TestSpecification[] = [] + filesOrDirectories.forEach((file) => { + const [projectName, filepath] = file + const project = this.vitest.getProjectByName(projectName) + specifications.push(project.createSpecification(filepath)) + }) + return specifications + } + + async updateSnapshots(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { + this.vitest.enableSnapshotUpdate() + try { + return await this.runTests(filesOrDirectories, testNamePattern) + } + finally { + this.vitest.resetSnapshotUpdate() + } + } + + watchTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): void { + if (testNamePattern) { + this.vitest.setGlobalTestNamePattern(testNamePattern) + } + + if (!filesOrDirectories) { + this.watcher.trackEveryFile() + } + else { + this.watcher.trackTestItems(filesOrDirectories) + } + } + + unwatchTests() { + this.watcher.stopTracking() + } + + async invalidateIstanbulTestModules(): Promise { + // do nothing, because Vitest 4 supports this out of the box + } + + async enableCoverage(): Promise { + await this.coverage.enable() + } + + disableCoverage(): void { + this.coverage.disable() + } + + waitForCoverageReport(): Promise { + return this.coverage.waitForReport() + } + + onFilesChanged(files: string[]): void { + // TODO + } + + onFilesCreated(files: string[]): void { + // TODO + } + + dispose() { + this.coverage.disable() + this.watcher.stopTracking() + return this.vitest.close() + } + + close() { + return this.dispose() + } + + private isDirectories(filesOrDirectories: ExtensionTestSpecification[] | string[]): filesOrDirectories is string[] { + return typeof filesOrDirectories[0] === 'string' + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f6baa93..2fa45807 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,14 +165,20 @@ importers: specifier: 2.4.0 version: 2.4.0 vitest: - specifier: 3.2.0 - version: 3.2.0(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: 'catalog:' + version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + + packages/worker-old: + dependencies: + vitest-vscode-shared: + specifier: workspace:* + version: link:../shared packages/worker-v4: devDependencies: '@vitest/utils': - specifier: 'catalog:' - version: 3.2.3 + specifier: 4.0.0-beta.5 + version: 4.0.0-beta.5 vitest: specifier: 4.0.0-beta.5 version: 4.0.0-beta.5(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -1519,26 +1525,12 @@ packages: vitest: optional: true - '@vitest/expect@3.2.0': - resolution: {integrity: sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA==} - '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} '@vitest/expect@4.0.0-beta.5': resolution: {integrity: sha512-EVOgFbIbABU7KICgRRZMMH7934rfQZWXn97zRPMbls1csJcyZVgJonma3Xh7dUeqd9I9hIGJnjTwidRLZ7IMhA==} - '@vitest/mocker@3.2.0': - resolution: {integrity: sha512-HFcW0lAMx3eN9vQqis63H0Pscv0QcVMo1Kv8BNysZbxcmHu3ZUYv59DS6BGYiGQ8F5lUkmsfMMlPm4DJFJdf/A==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@3.2.3': resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} peerDependencies: @@ -1561,45 +1553,30 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.0': - resolution: {integrity: sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw==} - '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} '@vitest/pretty-format@4.0.0-beta.5': resolution: {integrity: sha512-XqyLvmjwx5S/+MENhyc+Q+PQlXzw8o/uiGGSQAjy4TZBGe4voeqtr4NZHXaWQhz9EdwQT4JFe29kfsljntl4XA==} - '@vitest/runner@3.2.0': - resolution: {integrity: sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA==} - '@vitest/runner@3.2.3': resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} '@vitest/runner@4.0.0-beta.5': resolution: {integrity: sha512-l2DzseXHQ0bNCfqLDwth9qQv2FtfnTeg7txOBrbvxbNU7iHVCkmPF3sSZHxAXKavAZb+0u9cmnMHzpBjgsN0Iw==} - '@vitest/snapshot@3.2.0': - resolution: {integrity: sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A==} - '@vitest/snapshot@3.2.3': resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} '@vitest/snapshot@4.0.0-beta.5': resolution: {integrity: sha512-c/lNlItk9cLHwoGdxKyahVJb94dDVpzJQQgBeU7hjlXkIUu4dGX28VjFvuc2MiqI5u6Vht1+8+HrpVEFhR4LBA==} - '@vitest/spy@3.2.0': - resolution: {integrity: sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw==} - '@vitest/spy@3.2.3': resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} '@vitest/spy@4.0.0-beta.5': resolution: {integrity: sha512-xUi9xl0QlPqCDGlUnc06r4yCDJNp+ADV6/H2BHGPJZWZeqvKPtN11S+afxgWTiBSvi732bz7gGvZDADXbjqZTQ==} - '@vitest/utils@3.2.0': - resolution: {integrity: sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw==} - '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} @@ -2692,10 +2669,6 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} - expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} @@ -4673,10 +4646,6 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.0: - resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} - engines: {node: ^18.0.0 || >=20.0.0} - tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4890,11 +4859,6 @@ packages: resolution: {integrity: sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==} engines: {node: '>=4'} - vite-node@3.2.0: - resolution: {integrity: sha512-8Fc5Ko5Y4URIJkmMF/iFP1C0/OJyY+VGVe9Nw6WAdZyw4bTO+eVg9mwxWkQp/y8NnAoQY3o9KAvE1ZdA2v+Vmg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-node@3.2.3: resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4957,34 +4921,6 @@ packages: peerDependencies: vitest: '>=0.16.0' - vitest@3.2.0: - resolution: {integrity: sha512-P7Nvwuli8WBNmeMHHek7PnGW4oAZl9za1fddfRVidZar8wDZRi7hpznLKQePQ8JPLwSBEYDK11g+++j7uFJV8Q==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.0 - '@vitest/ui': 3.2.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@3.2.3: resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -6442,20 +6378,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.0': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.0 - '@vitest/utils': 3.2.0 - chai: 5.2.1 - tinyrainbow: 2.0.0 - '@vitest/expect@3.2.3': dependencies: '@types/chai': 5.2.2 '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 - chai: 5.2.0 + chai: 5.2.1 tinyrainbow: 2.0.0 '@vitest/expect@4.0.0-beta.5': @@ -6466,15 +6394,6 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.0(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': - dependencies: - '@vitest/spy': 3.2.0 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.3 @@ -6493,10 +6412,6 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/pretty-format@3.2.0': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.2.3': dependencies: tinyrainbow: 2.0.0 @@ -6505,11 +6420,6 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.0': - dependencies: - '@vitest/utils': 3.2.0 - pathe: 2.0.3 - '@vitest/runner@3.2.3': dependencies: '@vitest/utils': 3.2.3 @@ -6522,12 +6432,6 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/snapshot@3.2.0': - dependencies: - '@vitest/pretty-format': 3.2.0 - magic-string: 0.30.17 - pathe: 2.0.3 - '@vitest/snapshot@3.2.3': dependencies: '@vitest/pretty-format': 3.2.3 @@ -6540,10 +6444,6 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.2.0': - dependencies: - tinyspy: 4.0.3 - '@vitest/spy@3.2.3': dependencies: tinyspy: 4.0.3 @@ -6552,12 +6452,6 @@ snapshots: dependencies: tinyspy: 4.0.3 - '@vitest/utils@3.2.0': - dependencies: - '@vitest/pretty-format': 3.2.0 - loupe: 3.2.0 - tinyrainbow: 2.0.0 - '@vitest/utils@3.2.3': dependencies: '@vitest/pretty-format': 3.2.3 @@ -7863,8 +7757,6 @@ snapshots: expand-template@2.0.3: optional: true - expect-type@1.2.1: {} - expect-type@1.2.2: {} exsolve@1.0.5: {} @@ -10149,8 +10041,6 @@ snapshots: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.0: {} - tinypool@1.1.1: {} tinyrainbow@2.0.0: {} @@ -10349,27 +10239,6 @@ snapshots: version-range@4.14.0: {} - vite-node@3.2.0(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): - dependencies: - cac: 6.7.14 - debug: 4.4.1(supports-color@8.1.1) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -10426,51 +10295,6 @@ snapshots: source-map-js: 1.2.1 vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - vitest@3.2.0(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.0 - '@vitest/mocker': 3.2.0(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.0 - '@vitest/snapshot': 3.2.0 - '@vitest/spy': 3.2.0 - '@vitest/utils': 3.2.0 - chai: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.0(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.0.0 - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) - happy-dom: 15.11.7 - jsdom: 26.1.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 @@ -10481,17 +10305,17 @@ snapshots: '@vitest/snapshot': 3.2.3 '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 - chai: 5.2.0 + chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 - tinypool: 1.1.0 + tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) @@ -10526,17 +10350,17 @@ snapshots: '@vitest/snapshot': 3.2.3 '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 - chai: 5.2.0 + chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 - tinypool: 1.1.0 + tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) @@ -10571,17 +10395,17 @@ snapshots: '@vitest/snapshot': 3.2.3 '@vitest/spy': 3.2.3 '@vitest/utils': 3.2.3 - chai: 5.2.0 + chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 - tinypool: 1.1.0 + tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) From 928d794853631f2a77c821da2e03e61d33616c25 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 8 Aug 2025 16:38:27 +0200 Subject: [PATCH 03/20] feat: build files --- package.json | 2 +- packages/extension/src/worker/index.ts | 61 ++++++++ packages/shared/src/index.ts | 2 + packages/shared/src/rpc.ts | 2 + packages/worker-old/src/index.ts | 199 +++++++++++++++++------ packages/worker-old/src/init.ts | 143 ----------------- packages/worker-old/src/worker.ts | 4 + packages/worker-v4/package.json | 4 +- packages/worker-v4/src/index.ts | 208 +++++++++++++++++++------ packages/worker-v4/src/init.ts | 154 ------------------ packages/worker-v4/src/reporter.ts | 6 +- packages/worker-v4/src/worker.ts | 37 ++++- pnpm-lock.yaml | 88 +++++------ tsup.config.ts | 13 +- 14 files changed, 465 insertions(+), 458 deletions(-) create mode 100644 packages/extension/src/worker/index.ts delete mode 100644 packages/worker-old/src/init.ts delete mode 100644 packages/worker-v4/src/init.ts diff --git a/package.json b/package.json index cd0c57c2..e314a591 100644 --- a/package.json +++ b/package.json @@ -258,7 +258,7 @@ "scripts": { "vscode:prepublish": "pnpm build", "release": "tsx ./scripts/release.mts && git update-ref refs/heads/release refs/heads/main && git push origin release", - "build": "tsup --minify --clean", + "build": "tsup --clean", "package": "vsce package --no-dependencies", "dev": "EXTENSION_NODE_ENV=dev tsup --watch --sourcemap", "test": "vscode-test", diff --git a/packages/extension/src/worker/index.ts b/packages/extension/src/worker/index.ts new file mode 100644 index 00000000..2be16fac --- /dev/null +++ b/packages/extension/src/worker/index.ts @@ -0,0 +1,61 @@ +import type { WorkerRunnerOptions } from 'vitest-vscode-shared' +import { join } from 'node:path' +import { pathToFileURL } from 'node:url' +import v8 from 'node:v8' +import { createWorkerRPC, normalizeDriveLetter, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import { WebSocket } from 'ws' + +// this is the file that will be executed with "node " + +const emitter = new WorkerWSEventEmitter( + new WebSocket(process.env.VITEST_WS_ADDRESS!), +) + +emitter.on('message', async function onMessage(message: any) { + if (emitter.name === 'ws') { + message = JSON.parse(message.toString()) + } + + if (message.type === 'init') { + emitter.off('message', onMessage) + const data = message as WorkerRunnerOptions + + try { + const vitestModule = await import( + pathToFileURL(normalizeDriveLetter(data.meta.vitestNodePath)).toString() + ) as typeof import('vitest/node') + + const isOld = Number(vitestModule.version[1]) < 4 + const workerPath = pathToFileURL(join(__dirname, isOld ? './workerOld.js' : './workerNew.js')) + const initModule = await import(workerPath.toString()) + + const { createWorker, reporter, configs, workspaceSource } = await initModule.initVitest( + vitestModule, + data, + emitter, + ) + + const worker = createWorker() + + const rpc = createWorkerRPC( + worker, + { + on(listener) { + emitter.on('message', listener) + }, + post(message) { + emitter.send(message) + }, + serialize: v8.serialize, + deserialize: v => v8.deserialize(Buffer.from(v) as any), + }, + ) + worker.initRpc(rpc) + reporter.initRpc(rpc) + emitter.ready(configs, workspaceSource) + } + catch (err: any) { + emitter.error(err) + } + } +}) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 63c59931..9755ed92 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -33,6 +33,8 @@ export interface ExtensionWorkerTransport { onFilesCreated: (files: string[]) => void onFilesChanged: (files: string[]) => void + + initRpc: (rpc: VitestWorkerRPC) => void } export interface ExtensionWorkerEvents { diff --git a/packages/shared/src/rpc.ts b/packages/shared/src/rpc.ts index f2f0f0a3..d7179634 100644 --- a/packages/shared/src/rpc.ts +++ b/packages/shared/src/rpc.ts @@ -11,6 +11,8 @@ export function createWorkerRPC(vitest: ExtensionWorkerTransport, channel: Chann 'onTaskUpdate', 'onCollected', 'onWatcherRerun', + 'onTestRunStart', + 'onTestRunEnd', ], ...channel, }) diff --git a/packages/worker-old/src/index.ts b/packages/worker-old/src/index.ts index bb384a43..35d1b909 100644 --- a/packages/worker-old/src/index.ts +++ b/packages/worker-old/src/index.ts @@ -1,62 +1,161 @@ -import type { WorkerRunnerOptions } from 'vitest-vscode-shared' -import v8 from 'node:v8' -import { createWorkerRPC, WorkerWSEventEmitter } from 'vitest-vscode-shared' -import { WebSocket } from 'ws' -import { initVitest } from './init' +import type { WorkerRunnerOptions, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import type { UserConfig, WorkspaceProject } from 'vitest/node' +import { Console } from 'node:console' +import { Writable } from 'node:stream' +import { VSCodeReporter } from './reporter' import { ExtensionWorker } from './worker' -// this is the file that will be executed with "node " +export async function initVitest( + vitestModule: typeof import('vitest/node'), + data: WorkerRunnerOptions, + emitter: WorkerWSEventEmitter, +) { + const meta = data.meta + const reporter = new VSCodeReporter({ + setupFilePath: meta.setupFilePath, + }) -const emitter = new WorkerWSEventEmitter( - new WebSocket(process.env.VITEST_WS_ADDRESS!), -) + let stdout: Writable | undefined + let stderr: Writable | undefined -emitter.on('message', async function onMessage(message: any) { - if (emitter.name === 'ws') { - message = JSON.parse(message.toString()) - } - - if (message.type === 'init') { - emitter.off('message', onMessage) - const data = message as WorkerRunnerOptions + if (meta.shellType === 'terminal' && !meta.hasShellIntegration) { + stdout = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stdout', log).catch(() => {}) + } + process.stdout.write(log) + callback() + }, + }) - try { - const { reporter, vitest, configs, workspaceSource } = await initVitest( - data.meta, - data.debug - ? { - disableConsoleIntercept: true, - fileParallelism: false, - testTimeout: 0, - hookTimeout: 0, - } - : {}, - ) + stderr = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stderr', log).catch(() => {}) + } + process.stderr.write(log) + callback() + }, + }) + globalThis.console = new Console(stdout, stderr) + } - const rpc = createWorkerRPC( - new ExtensionWorker( - vitest, - data.debug, - data.astCollect, - emitter, - data.meta.finalCoverageFileName, - ), + const pnpExecArgv = meta.pnpApi && meta.pnpLoader + ? [ + '--require', + meta.pnpApi, + '--experimental-loader', + meta.pnpLoader, + ] + : undefined + 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: UserConfig = { + config: meta.configFile, + ...(meta.workspaceFile ? { workspace: meta.workspaceFile } : {}), + ...args, + ...options, + watch: true, + api: false, + // @ts-expect-error private property + reporter: undefined, + reporters: [reporter], + ui: false, + includeTaskLocation: true, + poolOptions: meta.pnpApi && meta.pnpLoader + ? { + threads: { + execArgv: pnpExecArgv, + }, + forks: { + execArgv: pnpExecArgv, + }, + vmForks: { + execArgv: pnpExecArgv, + }, + vmThreads: { + execArgv: pnpExecArgv, + }, + } + : {}, + } + const vitest = await vitestModule.createVitest( + 'test', + cliOptions, + { + server: { + middlewareMode: true, + // when support for Vite 4 is dropped, set to `null` + watch: { + usePolling: true, + ignored: ['**/*'], + depth: 0, + followSymlinks: false, + }, + }, + plugins: [ { - on(listener) { - emitter.on('message', listener) + name: 'vitest:vscode-extension', + configureServer(server) { + server.watcher.close() }, - post(message) { - emitter.send(message) + configResolved(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, + } }, - serialize: v8.serialize, - deserialize: v => v8.deserialize(Buffer.from(v) as any), }, + ], + }, + { + stderr, + stdout, + }, + ) + await (vitest as any).report('onInit', vitest) + const configs = ([ + // @ts-expect-error -- getRootProject in Vitest 3.0 + 'getRootProject' in vitest ? vitest.getRootProject() : vitest.getCoreWorkspaceProject(), + ...vitest.projects, + ] as WorkspaceProject[]).map(p => p.server.config.configFile).filter(c => c != null) + const workspaceSource: string | false = meta.workspaceFile + ? meta.workspaceFile + : (vitest.config.workspace != null || vitest.config.projects != null) + ? vitest.server.config.configFile || false + : false + return { + vitest, + reporter, + workspaceSource, + configs: Array.from(new Set(configs)), + meta, + createWorker() { + return new ExtensionWorker( + vitest, + data.debug, + data.astCollect, + emitter, + data.meta.finalCoverageFileName, ) - reporter.initRpc(rpc) - emitter.ready(configs, workspaceSource) - } - catch (err: any) { - emitter.error(err) - } + }, } -}) +} diff --git a/packages/worker-old/src/init.ts b/packages/worker-old/src/init.ts deleted file mode 100644 index 5dae2766..00000000 --- a/packages/worker-old/src/init.ts +++ /dev/null @@ -1,143 +0,0 @@ -import type { WorkerInitMetadata } from 'vitest-vscode-shared' -import type { UserConfig, WorkspaceProject } from 'vitest/node' -import { Console } from 'node:console' -import { Writable } from 'node:stream' -import { pathToFileURL } from 'node:url' -import { normalizeDriveLetter } from '../../shared/src/utils' -import { VSCodeReporter } from './reporter' - -export async function initVitest(meta: WorkerInitMetadata, options?: UserConfig) { - const reporter = new VSCodeReporter({ - setupFilePath: meta.setupFilePath, - }) - - let stdout: Writable | undefined - let stderr: Writable | undefined - - if (meta.shellType === 'terminal' && !meta.hasShellIntegration) { - stdout = new Writable({ - write(chunk, __, callback) { - const log = chunk.toString() - if (reporter.rpc) { - reporter.rpc.onProcessLog('stdout', log).catch(() => {}) - } - process.stdout.write(log) - callback() - }, - }) - - stderr = new Writable({ - write(chunk, __, callback) { - const log = chunk.toString() - if (reporter.rpc) { - reporter.rpc.onProcessLog('stderr', log).catch(() => {}) - } - process.stderr.write(log) - callback() - }, - }) - globalThis.console = new Console(stdout, stderr) - } - - const vitestModule = await import( - pathToFileURL(normalizeDriveLetter(meta.vitestNodePath)).toString() - ) as typeof import('vitest/node') - const pnpExecArgv = meta.pnpApi && meta.pnpLoader - ? [ - '--require', - meta.pnpApi, - '--experimental-loader', - meta.pnpLoader, - ] - : undefined - const args = meta.arguments - ? vitestModule.parseCLI(meta.arguments, { - allowUnknownOptions: false, - }).options - : {} - const cliOptions: UserConfig = { - config: meta.configFile, - ...(meta.workspaceFile ? { workspace: meta.workspaceFile } : {}), - ...args, - ...options, - watch: true, - api: false, - // @ts-expect-error private property - reporter: undefined, - reporters: [reporter], - ui: false, - includeTaskLocation: true, - poolOptions: meta.pnpApi && meta.pnpLoader - ? { - threads: { - execArgv: pnpExecArgv, - }, - forks: { - execArgv: pnpExecArgv, - }, - vmForks: { - execArgv: pnpExecArgv, - }, - vmThreads: { - execArgv: pnpExecArgv, - }, - } - : {}, - } - const vitest = await vitestModule.createVitest( - 'test', - cliOptions, - { - server: { - middlewareMode: true, - // when support for Vite 4 is dropped, set to `null` - watch: { - usePolling: true, - ignored: ['**/*'], - depth: 0, - followSymlinks: false, - }, - }, - plugins: [ - { - name: 'vitest:vscode-extension', - configureServer(server) { - server.watcher.close() - }, - configResolved(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, - } - }, - }, - ], - }, - { - stderr, - stdout, - }, - ) - await (vitest as any).report('onInit', vitest) - const configs = ([ - // @ts-expect-error -- getRootProject in Vitest 3.0 - 'getRootProject' in vitest ? vitest.getRootProject() : vitest.getCoreWorkspaceProject(), - ...vitest.projects, - ] as WorkspaceProject[]).map(p => p.server.config.configFile).filter(c => c != null) - const workspaceSource: string | false = meta.workspaceFile - ? meta.workspaceFile - : (vitest.config.workspace != null || vitest.config.projects != null) - ? vitest.server.config.configFile || false - : false - return { - vitest, - reporter, - workspaceSource, - configs: Array.from(new Set(configs)), - meta, - } -} diff --git a/packages/worker-old/src/worker.ts b/packages/worker-old/src/worker.ts index 141673c3..4380dd1e 100644 --- a/packages/worker-old/src/worker.ts +++ b/packages/worker-old/src/worker.ts @@ -390,4 +390,8 @@ export class ExtensionWorker implements ExtensionWorkerTransport { report(name: T, ...args: ArgumentsType) { return (this.vitest as any).report(name, ...args) } + + initRpc() { + // ignore + } } diff --git a/packages/worker-v4/package.json b/packages/worker-v4/package.json index be0c9376..0c5fa3a4 100644 --- a/packages/worker-v4/package.json +++ b/packages/worker-v4/package.json @@ -6,8 +6,8 @@ ".": "./src/index.ts" }, "devDependencies": { - "@vitest/utils": "4.0.0-beta.5", - "vitest": "4.0.0-beta.5", + "@vitest/utils": "4.0.0-beta.7", + "vitest": "4.0.0-beta.7", "vitest-vscode-shared": "workspace:*" } } diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts index bb384a43..fb795689 100644 --- a/packages/worker-v4/src/index.ts +++ b/packages/worker-v4/src/index.ts @@ -1,62 +1,172 @@ import type { WorkerRunnerOptions } from 'vitest-vscode-shared' -import v8 from 'node:v8' -import { createWorkerRPC, WorkerWSEventEmitter } from 'vitest-vscode-shared' -import { WebSocket } from 'ws' -import { initVitest } from './init' +import type { WorkerWSEventEmitter } from 'vitest-vscode-shared' +import type { TestUserConfig } from 'vitest/dist/node.js' +import { Console } from 'node:console' +import { randomUUID } from 'node:crypto' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { Writable } from 'node:stream' +import { VSCodeReporter } from './reporter' import { ExtensionWorker } from './worker' -// this is the file that will be executed with "node " +export async function initVitest( + vitestModule: typeof import('vitest/node'), + data: WorkerRunnerOptions, + emitter: WorkerWSEventEmitter, +) { + const meta = data.meta + const reporter = new VSCodeReporter({ + setupFilePath: meta.setupFilePath, + }) -const emitter = new WorkerWSEventEmitter( - new WebSocket(process.env.VITEST_WS_ADDRESS!), -) + let stdout: Writable | undefined + let stderr: Writable | undefined -emitter.on('message', async function onMessage(message: any) { - if (emitter.name === 'ws') { - message = JSON.parse(message.toString()) - } - - if (message.type === 'init') { - emitter.off('message', onMessage) - const data = message as WorkerRunnerOptions + if (meta.shellType === 'terminal' && !meta.hasShellIntegration) { + stdout = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stdout', log).catch(() => {}) + } + process.stdout.write(log) + callback() + }, + }) - try { - const { reporter, vitest, configs, workspaceSource } = await initVitest( - data.meta, - data.debug - ? { - disableConsoleIntercept: true, - fileParallelism: false, - testTimeout: 0, - hookTimeout: 0, - } - : {}, - ) + stderr = new Writable({ + write(chunk, __, callback) { + const log = chunk.toString() + if (reporter.rpc) { + reporter.rpc.onProcessLog('stderr', log).catch(() => {}) + } + process.stderr.write(log) + callback() + }, + }) + globalThis.console = new Console(stdout, stderr) + } - const rpc = createWorkerRPC( - new ExtensionWorker( - vitest, - data.debug, - data.astCollect, - emitter, - data.meta.finalCoverageFileName, - ), + const pnpExecArgv = meta.pnpApi && meta.pnpLoader + ? [ + '--require', + meta.pnpApi, + '--experimental-loader', + meta.pnpLoader, + ] + : undefined + 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, + ...(meta.workspaceFile ? { workspace: meta.workspaceFile } : {}), + ...args, + ...options, + watch: true, + api: false, + // @ts-expect-error private property + reporter: undefined, + reporters: [reporter], + ui: false, + includeTaskLocation: true, + poolOptions: meta.pnpApi && meta.pnpLoader + ? { + threads: { + execArgv: pnpExecArgv, + }, + forks: { + execArgv: pnpExecArgv, + }, + vmForks: { + execArgv: pnpExecArgv, + }, + vmThreads: { + execArgv: pnpExecArgv, + }, + } + : {}, + } + const vitest = await vitestModule.createVitest( + 'test', + cliOptions, + { + server: { + middlewareMode: true, + watch: null, + }, + plugins: [ { - on(listener) { - emitter.on('message', listener) + name: 'vitest:vscode-extension', + config(userConfig) { + const testConfig = userConfig.test ?? {} + const coverageOptions = testConfig.coverage ?? {} + if (coverageOptions.provider !== 'custom') { + const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] + const jsonReporter = reporters.find(r => r && r[0] === 'json') + const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} + coverageOptions.reporter = [ + ['json', { ...jsonReporterOptions, file: meta.finalCoverageFileName }], + ] + } + return { + test: { + coverage: { + reportOnFailure: true, + reportsDirectory: join(tmpdir(), `vitest-coverage-${randomUUID()}`), + }, + }, + } }, - post(message) { - emitter.send(message) + configResolved(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, + } }, - serialize: v8.serialize, - deserialize: v => v8.deserialize(Buffer.from(v) as any), }, + ], + }, + { + stderr, + stdout, + }, + ) + await (vitest as any).report('onInit', vitest) + const configs = [ + vitest.getRootProject(), + ...vitest.projects, + ].map(p => p.vite.config.configFile).filter(c => c != null) + const workspaceSource: string | false = (vitest.config.projects != null) + ? vitest.vite.config.configFile || false + : false + return { + vitest, + reporter, + workspaceSource, + configs: Array.from(new Set(configs)), + meta, + createWorker() { + return new ExtensionWorker( + vitest, + data.debug, + data.astCollect, + emitter, ) - reporter.initRpc(rpc) - emitter.ready(configs, workspaceSource) - } - catch (err: any) { - emitter.error(err) - } + }, } -}) +} diff --git a/packages/worker-v4/src/init.ts b/packages/worker-v4/src/init.ts deleted file mode 100644 index 8c7fcaa1..00000000 --- a/packages/worker-v4/src/init.ts +++ /dev/null @@ -1,154 +0,0 @@ -import type { WorkerInitMetadata } from 'vitest-vscode-shared' -import type { TestUserConfig } from 'vitest/node' -import { Console } from 'node:console' -import { randomUUID } from 'node:crypto' -import { tmpdir } from 'node:os' -import { Writable } from 'node:stream' -import { pathToFileURL } from 'node:url' -import { join } from 'pathe' -import { normalizeDriveLetter } from 'vitest-vscode-shared' -import { VSCodeReporter } from './reporter' - -export async function initVitest(meta: WorkerInitMetadata, options?: TestUserConfig) { - const reporter = new VSCodeReporter({ - setupFilePath: meta.setupFilePath, - }) - - let stdout: Writable | undefined - let stderr: Writable | undefined - - if (meta.shellType === 'terminal' && !meta.hasShellIntegration) { - stdout = new Writable({ - write(chunk, __, callback) { - const log = chunk.toString() - if (reporter.rpc) { - reporter.rpc.onProcessLog('stdout', log).catch(() => {}) - } - process.stdout.write(log) - callback() - }, - }) - - stderr = new Writable({ - write(chunk, __, callback) { - const log = chunk.toString() - if (reporter.rpc) { - reporter.rpc.onProcessLog('stderr', log).catch(() => {}) - } - process.stderr.write(log) - callback() - }, - }) - globalThis.console = new Console(stdout, stderr) - } - - const vitestModule = await import( - pathToFileURL(normalizeDriveLetter(meta.vitestNodePath)).toString() - ) as typeof import('vitest/node') - const pnpExecArgv = meta.pnpApi && meta.pnpLoader - ? [ - '--require', - meta.pnpApi, - '--experimental-loader', - meta.pnpLoader, - ] - : undefined - const args = meta.arguments - ? vitestModule.parseCLI(meta.arguments, { - allowUnknownOptions: false, - }).options - : {} - const cliOptions: TestUserConfig = { - config: meta.configFile, - ...(meta.workspaceFile ? { workspace: meta.workspaceFile } : {}), - ...args, - ...options, - watch: true, - api: false, - // @ts-expect-error private property - reporter: undefined, - reporters: [reporter], - ui: false, - includeTaskLocation: true, - poolOptions: meta.pnpApi && meta.pnpLoader - ? { - threads: { - execArgv: pnpExecArgv, - }, - forks: { - execArgv: pnpExecArgv, - }, - vmForks: { - execArgv: pnpExecArgv, - }, - vmThreads: { - execArgv: pnpExecArgv, - }, - } - : {}, - } - const vitest = await vitestModule.createVitest( - 'test', - cliOptions, - { - server: { - middlewareMode: true, - watch: null, - }, - plugins: [ - { - name: 'vitest:vscode-extension', - config(userConfig) { - const testConfig = userConfig.test ?? {} - const coverageOptions = testConfig.coverage ?? {} - if (coverageOptions.provider !== 'custom') { - const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] - const jsonReporter = reporters.find(r => r && r[0] === 'json') - const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} - coverageOptions.reporter = [ - ['json', { ...jsonReporterOptions, file: meta.finalCoverageFileName }], - ] - } - return { - test: { - coverage: { - reportOnFailure: true, - reportsDirectory: join(tmpdir(), `vitest-coverage-${randomUUID()}`), - }, - }, - } - }, - configResolved(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, - } - }, - }, - ], - }, - { - stderr, - stdout, - }, - ) - await (vitest as any).report('onInit', vitest) - const configs = [ - vitest.getRootProject(), - ...vitest.projects, - ].map(p => p.vite.config.configFile).filter(c => c != null) - const workspaceSource: string | false = (vitest.config.projects != null) - ? vitest.vite.config.configFile || false - : false - return { - vitest, - reporter, - workspaceSource, - configs: Array.from(new Set(configs)), - meta, - } -} diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts index 19023005..01a80b27 100644 --- a/packages/worker-v4/src/reporter.ts +++ b/packages/worker-v4/src/reporter.ts @@ -54,7 +54,7 @@ export class VSCodeReporter implements Reporter { onTestRunStart(specifications: ReadonlyArray) { const files = specifications.map(spec => spec.moduleId) - this.rpc.onTestRunStart(Array.from(new Set(files)), this.collecting) + this.rpc.onTestRunStart(Array.from(new Set(files)), false) } onTestRunEnd(testModules: ReadonlyArray, unhandledErrors: ReadonlyArray) { @@ -65,12 +65,12 @@ export class VSCodeReporter implements Reporter { // as any because Vitest types are different between v3 and v4, // and shared packages uses the lowest Vitest version - this.rpc.onTestRunEnd(files as any, '', this.collecting) + this.rpc.onTestRunEnd(files as any, '', false) } onTestModuleCollected(testModule: TestModule) { // TODO: is it possible to make types happy with both V3 and V4? - this.rpc.onCollected(getEntityJSONTask(testModule) as any, this.collecting) + this.rpc.onCollected(getEntityJSONTask(testModule) as any, false) } // ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { diff --git a/packages/worker-v4/src/worker.ts b/packages/worker-v4/src/worker.ts index ef885aea..300b5bbc 100644 --- a/packages/worker-v4/src/worker.ts +++ b/packages/worker-v4/src/worker.ts @@ -1,4 +1,9 @@ -import type { ExtensionTestSpecification, ExtensionWorkerTransport, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import type { + ExtensionTestSpecification, + ExtensionWorkerTransport, + VitestWorkerRPC, + WorkerWSEventEmitter, +} from 'vitest-vscode-shared' import type { TestSpecification, Vitest as VitestCore } from 'vitest/node' import { ExtensionCoverageManager } from './coverage' import { ExtensionWorkerWatcher } from './watcher' @@ -7,6 +12,8 @@ export class ExtensionWorker implements ExtensionWorkerTransport { private readonly watcher: ExtensionWorkerWatcher private readonly coverage: ExtensionCoverageManager + private rpc!: VitestWorkerRPC + constructor( public readonly vitest: VitestCore, private readonly debug = false, @@ -23,11 +30,17 @@ export class ExtensionWorker implements ExtensionWorkerTransport { return specifications.map(spec => [spec.project.name, spec.moduleId]) } - async collectTests(testFile: ExtensionTestSpecification[]): Promise { - // + async collectTests(testFiles: ExtensionTestSpecification[]): Promise { + const specifications = await this.resolveTestSpecifications(testFiles) + const testModules = await this.vitest.experimental_parseSpecifications(specifications) + const promises = testModules.map(module => + // TODO: fix "as any" + this.rpc.onCollected((module as any).task, true), + ) + await Promise.all(promises) } - cancelRun() { + cancelRun(): Promise { return this.vitest.cancelCurrentRun('keyboard-input') } @@ -52,9 +65,9 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } } - async resolveTestSpecifications(filesOrDirectories: ExtensionTestSpecification[]): Promise { + async resolveTestSpecifications(files: ExtensionTestSpecification[]): Promise { const specifications: TestSpecification[] = [] - filesOrDirectories.forEach((file) => { + files.forEach((file) => { const [projectName, filepath] = file const project = this.vitest.getProjectByName(projectName) specifications.push(project.createSpecification(filepath)) @@ -106,11 +119,15 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } onFilesChanged(files: string[]): void { - // TODO + files.forEach((file) => { + this.vitest.watcher.onFileChange(file) + }) } onFilesCreated(files: string[]): void { - // TODO + files.forEach((file) => { + this.vitest.watcher.onFileCreate(file) + }) } dispose() { @@ -123,6 +140,10 @@ export class ExtensionWorker implements ExtensionWorkerTransport { return this.dispose() } + initRpc(rpc: VitestWorkerRPC) { + this.rpc = rpc + } + private isDirectories(filesOrDirectories: ExtensionTestSpecification[] | string[]): filesOrDirectories is string[] { return typeof filesOrDirectories[0] === 'string' } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fa45807..d78e35e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,11 +177,11 @@ importers: packages/worker-v4: devDependencies: '@vitest/utils': - specifier: 4.0.0-beta.5 - version: 4.0.0-beta.5 + specifier: 4.0.0-beta.7 + version: 4.0.0-beta.7 vitest: - specifier: 4.0.0-beta.5 - version: 4.0.0-beta.5(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: 4.0.0-beta.7 + version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared @@ -1528,8 +1528,8 @@ packages: '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - '@vitest/expect@4.0.0-beta.5': - resolution: {integrity: sha512-EVOgFbIbABU7KICgRRZMMH7934rfQZWXn97zRPMbls1csJcyZVgJonma3Xh7dUeqd9I9hIGJnjTwidRLZ7IMhA==} + '@vitest/expect@4.0.0-beta.7': + resolution: {integrity: sha512-/j35T4vsUqofdZVzWCnL6VckWHTMhR3gze0n5qAOJI404tLaasyV4sP4GhVgIXuj2h//IS4r4TxuHNCp4wB9Yw==} '@vitest/mocker@3.2.3': resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} @@ -1542,8 +1542,8 @@ packages: vite: optional: true - '@vitest/mocker@4.0.0-beta.5': - resolution: {integrity: sha512-l8RAwsHDmgKtXLxSTPMM1KyPlWwvP4I/ri+ePJtnyN8XmuuzL3g5JP1evAGSf7p2Pt+zuGk/O49mOZ46Womf4w==} + '@vitest/mocker@4.0.0-beta.7': + resolution: {integrity: sha512-9aNne4m5268l4I1mU7DyI+iHzf+LJ256cKyUQDX0fiQjWvLoAHRV8bZLWPF9OHLv+d0QBSy8T3EhVwyysH/Q0Q==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1556,32 +1556,32 @@ packages: '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - '@vitest/pretty-format@4.0.0-beta.5': - resolution: {integrity: sha512-XqyLvmjwx5S/+MENhyc+Q+PQlXzw8o/uiGGSQAjy4TZBGe4voeqtr4NZHXaWQhz9EdwQT4JFe29kfsljntl4XA==} + '@vitest/pretty-format@4.0.0-beta.7': + resolution: {integrity: sha512-2H/+4s4pIvJhXhYxtwI37CE5Xw4DEDvjzQUfKbX/hLtYcTa5lryzkTnv4NEnvwZki4+OqBaXaDK97c8lUicYYQ==} '@vitest/runner@3.2.3': resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - '@vitest/runner@4.0.0-beta.5': - resolution: {integrity: sha512-l2DzseXHQ0bNCfqLDwth9qQv2FtfnTeg7txOBrbvxbNU7iHVCkmPF3sSZHxAXKavAZb+0u9cmnMHzpBjgsN0Iw==} + '@vitest/runner@4.0.0-beta.7': + resolution: {integrity: sha512-3IORggCJ88rERBJC01hr1aqCUOzKQHFd37jDvgmPQfIp1DNoOkpX4tQvKNRerxrGhCD6J9H5L1e2KY66rusyUQ==} '@vitest/snapshot@3.2.3': resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - '@vitest/snapshot@4.0.0-beta.5': - resolution: {integrity: sha512-c/lNlItk9cLHwoGdxKyahVJb94dDVpzJQQgBeU7hjlXkIUu4dGX28VjFvuc2MiqI5u6Vht1+8+HrpVEFhR4LBA==} + '@vitest/snapshot@4.0.0-beta.7': + resolution: {integrity: sha512-yGzzorV5zg9/nj+keTnkLmscwxx4/NdTUhT2npmNb4b0PmBtqfAr5/2v2T6dNlccQ+UDP0+7II9qNG+BOfxjTg==} '@vitest/spy@3.2.3': resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - '@vitest/spy@4.0.0-beta.5': - resolution: {integrity: sha512-xUi9xl0QlPqCDGlUnc06r4yCDJNp+ADV6/H2BHGPJZWZeqvKPtN11S+afxgWTiBSvi732bz7gGvZDADXbjqZTQ==} + '@vitest/spy@4.0.0-beta.7': + resolution: {integrity: sha512-QPfvZROJ1Im1TC7AqW9vFKwJnfLoJgnFbhDvXAQP5fQqoLgeTsfKSZ5T9TKZNDZ8qPVF2YPLy1A6papqGKYt+Q==} '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} - '@vitest/utils@4.0.0-beta.5': - resolution: {integrity: sha512-xSCjh4KUPTJyEz1kO6XNCd9w6/Vde9iB5qFClkRPKnNVQdfSdNP5ZXkpzX7l9JPgQ20GtPZrnxN7EiNzBwnX0g==} + '@vitest/utils@4.0.0-beta.7': + resolution: {integrity: sha512-TpdNnxcmET8K7fhCcbEuuVvYk8yGhi+orcN72vqKuTEyek5I7tsQ2rKEsBagQCZeMAOqq9L0Y46K8WvIWVdWAA==} '@vscode/test-cli@0.0.6': resolution: {integrity: sha512-4i61OUv5PQr3GxhHOuUgHdgBDfIO/kXTPCsEyFiMaY4SOqQTgkTmyZLagHehjOgCfsXdcrJa3zgQ7zoc+Dh6hQ==} @@ -4949,16 +4949,16 @@ packages: jsdom: optional: true - vitest@4.0.0-beta.5: - resolution: {integrity: sha512-JH+09JGgQr0gckdLWlsyqgduRgTqNAs5cZr2qPj7wgpgYSIWcSKr4gr98WVbh/xo+M2e/1XEQ+q5qbCPaKwqkA==} + vitest@4.0.0-beta.7: + resolution: {integrity: sha512-42OaywPYPuE+OjzNzvGVHH/GeoPENFO5YAbFn349iVxn+Y6/doVfZkov0tTjkE2/lYoFAD1fmU2TG8Culo/fZQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 4.0.0-beta.5 - '@vitest/ui': 4.0.0-beta.5 + '@vitest/browser': 4.0.0-beta.7 + '@vitest/ui': 4.0.0-beta.7 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6386,11 +6386,11 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/expect@4.0.0-beta.5': + '@vitest/expect@4.0.0-beta.7': dependencies: '@types/chai': 5.2.2 - '@vitest/spy': 4.0.0-beta.5 - '@vitest/utils': 4.0.0-beta.5 + '@vitest/spy': 4.0.0-beta.7 + '@vitest/utils': 4.0.0-beta.7 chai: 5.2.1 tinyrainbow: 2.0.0 @@ -6403,9 +6403,9 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@4.0.0-beta.5(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 4.0.0-beta.5 + '@vitest/spy': 4.0.0-beta.7 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -6416,7 +6416,7 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.0-beta.5': + '@vitest/pretty-format@4.0.0-beta.7': dependencies: tinyrainbow: 2.0.0 @@ -6426,9 +6426,9 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/runner@4.0.0-beta.5': + '@vitest/runner@4.0.0-beta.7': dependencies: - '@vitest/utils': 4.0.0-beta.5 + '@vitest/utils': 4.0.0-beta.7 pathe: 2.0.3 strip-literal: 3.0.0 @@ -6438,9 +6438,9 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/snapshot@4.0.0-beta.5': + '@vitest/snapshot@4.0.0-beta.7': dependencies: - '@vitest/pretty-format': 4.0.0-beta.5 + '@vitest/pretty-format': 4.0.0-beta.7 magic-string: 0.30.17 pathe: 2.0.3 @@ -6448,9 +6448,7 @@ snapshots: dependencies: tinyspy: 4.0.3 - '@vitest/spy@4.0.0-beta.5': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.0.0-beta.7': {} '@vitest/utils@3.2.3': dependencies: @@ -6458,9 +6456,9 @@ snapshots: loupe: 3.2.0 tinyrainbow: 2.0.0 - '@vitest/utils@4.0.0-beta.5': + '@vitest/utils@4.0.0-beta.7': dependencies: - '@vitest/pretty-format': 4.0.0-beta.5 + '@vitest/pretty-format': 4.0.0-beta.7 loupe: 3.2.0 tinyrainbow: 2.0.0 @@ -10430,16 +10428,16 @@ snapshots: - tsx - yaml - vitest@4.0.0-beta.5(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + vitest@4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 4.0.0-beta.5 - '@vitest/mocker': 4.0.0-beta.5(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 4.0.0-beta.5 - '@vitest/runner': 4.0.0-beta.5 - '@vitest/snapshot': 4.0.0-beta.5 - '@vitest/spy': 4.0.0-beta.5 - '@vitest/utils': 4.0.0-beta.5 + '@vitest/expect': 4.0.0-beta.7 + '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.0-beta.7 + '@vitest/runner': 4.0.0-beta.7 + '@vitest/snapshot': 4.0.0-beta.7 + '@vitest/spy': 4.0.0-beta.7 + '@vitest/utils': 4.0.0-beta.7 chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 diff --git a/tsup.config.ts b/tsup.config.ts index 0c85244f..0bd8ec78 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'tsup' export default defineConfig([ { - entry: ['./src/extension.ts'], + entry: ['./packages/extension/src/extension.ts'], external: ['vscode'], format: 'cjs', define: { @@ -11,12 +11,19 @@ export default defineConfig([ }, { entry: { - worker: './src/worker/index.ts', + worker: './packages/extension/src/worker/index.ts', }, format: 'cjs', }, { - entry: ['./src/worker/setupFile.ts'], + entry: { + workerOld: './packages/worker-old/src/index.ts', + workerNew: './packages/worker-v4/src/index.ts', + }, + format: 'cjs', + }, + { + entry: ['./packages/extension/src/worker/setupFile.ts'], external: ['vitest'], format: 'esm', }, From aa7163757c57aa79182362ca4a694fb110adaec9 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 12 Aug 2025 15:36:42 +0200 Subject: [PATCH 04/20] fix: correctly run the older version --- packages/extension/src/worker/index.ts | 5 +-- packages/worker-old/src/worker.ts | 43 ++++++++++++++------------ packages/worker-v4/src/index.ts | 18 +++++------ 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/packages/extension/src/worker/index.ts b/packages/extension/src/worker/index.ts index 2be16fac..8cb12ef3 100644 --- a/packages/extension/src/worker/index.ts +++ b/packages/extension/src/worker/index.ts @@ -25,8 +25,9 @@ emitter.on('message', async function onMessage(message: any) { pathToFileURL(normalizeDriveLetter(data.meta.vitestNodePath)).toString() ) as typeof import('vitest/node') - const isOld = Number(vitestModule.version[1]) < 4 - const workerPath = pathToFileURL(join(__dirname, isOld ? './workerOld.js' : './workerNew.js')) + const isOld = Number(vitestModule.version[0]) < 4 + const workerName = isOld ? './workerOld.js' : './workerNew.js' + const workerPath = pathToFileURL(join(__dirname, workerName)) const initModule = await import(workerPath.toString()) const { createWorker, reporter, configs, workspaceSource } = await initModule.initVitest( diff --git a/packages/worker-old/src/worker.ts b/packages/worker-old/src/worker.ts index 4380dd1e..cd3453c0 100644 --- a/packages/worker-old/src/worker.ts +++ b/packages/worker-old/src/worker.ts @@ -1,6 +1,11 @@ -import type { ArgumentsType } from 'vitest' import type { ExtensionTestSpecification, ExtensionWorkerTransport } from 'vitest-vscode-shared' -import type { Reporter, ResolvedConfig, TestSpecification, Vitest as VitestCore, WorkspaceProject } from 'vitest/node' +import type { + Reporter, + ResolvedConfig, + TestSpecification, + Vitest as VitestCore, + WorkspaceProject, +} from 'vitest/node' import type { WorkerWSEventEmitter } from '../../shared/src/emitter' import { readFileSync } from 'node:fs' import mm from 'micromatch' @@ -10,6 +15,8 @@ import { astCollectTests, createFailedFileTask } from './collect' import { ExtensionCoverageManager } from './coverage' import { ExtensionWorkerWatcher } from './watcher' +type ArgumentsType = T extends (...args: infer U) => any ? U : never + export class ExtensionWorker implements ExtensionWorkerTransport { private readonly watcher: ExtensionWorkerWatcher private readonly coverage: ExtensionCoverageManager @@ -86,10 +93,9 @@ export class ExtensionWorker implements ExtensionWorkerTransport { if (otherTests.length) { const files = otherTests.map( ([project, filepath]) => [ - { name: project.getName(), root: project.config.root }, + project.getName(), filepath, - { pool: project.config.pool }, - ], + ] as const, ) try { @@ -136,22 +142,17 @@ export class ExtensionWorker implements ExtensionWorkerTransport { async resolveTestSpecs(specs: string[] | ExtensionTestSpecification[] | undefined): Promise { if (!specs || typeof specs[0] === 'string') { const files = await this.globTestSpecifications(specs as string[] | undefined) - return files.map(([project, file]) => { - if (typeof project === 'string') { - return undefined - } + return files.map((spec) => { + const project = spec[0] + const file = spec[1] return [ - { - name: project.getName(), - root: project.config.root, - }, - file as string, - { pool: project.config.pool }, + project.getName(), + file, ] - }).filter(r => r != null) + }) } - return (specs || []) as ExtensionTestSpecification[] + return (specs as ExtensionTestSpecification[] || []) } public async runTests(specsOrPaths: ExtensionTestSpecification[] | string[] | undefined, testNamePattern?: string) { @@ -233,7 +234,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { if (!fileSpecs.length) { return [] } - return fileSpecs.filter(s => s[0].getName() === spec[0].name) + return fileSpecs.filter(s => s[0].getName() === spec[0]) }) await Promise.all([ this.report('onWatcherRerun', paths), @@ -242,7 +243,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { ...((this.vitest as any)._onUserTestsRerun || []).map((fn: any) => fn(specs)), ]) - await (this.vitest as any).runFiles(specsToRun, runAllFiles) + await this.runFiles(specsToRun, runAllFiles) await this.report('onWatcherStart', this.vitest.state.getFiles(paths)) } @@ -256,6 +257,10 @@ export class ExtensionWorker implements ExtensionWorkerTransport { return ctx.handleFileChanged(file) } + private async runFiles(specs: TestSpecification[], runAllFiles: boolean) { + await (this.vitest as any).runFiles(specs, runAllFiles) + } + private scheduleRerun(files: string[]): Promise { return (this.vitest as any).scheduleRerun(files) } diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts index fb795689..436a4148 100644 --- a/packages/worker-v4/src/index.ts +++ b/packages/worker-v4/src/index.ts @@ -1,6 +1,6 @@ import type { WorkerRunnerOptions } from 'vitest-vscode-shared' import type { WorkerWSEventEmitter } from 'vitest-vscode-shared' -import type { TestUserConfig } from 'vitest/dist/node.js' +import type { CoverageIstanbulOptions, TestUserConfig } from 'vitest/node' import { Console } from 'node:console' import { randomUUID } from 'node:crypto' import { tmpdir } from 'node:os' @@ -110,15 +110,13 @@ export async function initVitest( name: 'vitest:vscode-extension', config(userConfig) { const testConfig = userConfig.test ?? {} - const coverageOptions = testConfig.coverage ?? {} - if (coverageOptions.provider !== 'custom') { - const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] - const jsonReporter = reporters.find(r => r && r[0] === 'json') - const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} - coverageOptions.reporter = [ - ['json', { ...jsonReporterOptions, file: meta.finalCoverageFileName }], - ] - } + const coverageOptions = (testConfig.coverage ?? {}) as CoverageIstanbulOptions + const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] + const jsonReporter = reporters.find(r => r && r[0] === 'json') + const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} + coverageOptions.reporter = [ + ['json', { ...jsonReporterOptions, file: meta.finalCoverageFileName }], + ] return { test: { coverage: { From a30a1843035c3b45b73e944d02a3da85f10130b2 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 12 Aug 2025 16:07:11 +0200 Subject: [PATCH 05/20] refactor: rename function --- packages/extension/src/runner.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/extension/src/runner.ts b/packages/extension/src/runner.ts index c08f60b0..42db5ac0 100644 --- a/packages/extension/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -179,7 +179,7 @@ export class TestRunner extends vscode.Disposable { this.disposables.push( token.onCancellationRequested(() => { - log.verbose?.('Continuous test run for', join(request.include), 'was cancelled') + log.verbose?.('Continuous test run for', labelTestItems(request.include), 'was cancelled') this.continuousRequests.delete(request) if (!this.continuousRequests.size) { @@ -228,7 +228,7 @@ export class TestRunner extends vscode.Disposable { this.disposables.push( token.onCancellationRequested(() => { - log.verbose?.('Coverage for', join(request.include), 'was manually stopped') + log.verbose?.('Coverage for', labelTestItems(request.include), 'was manually stopped') this.api.disableCoverage() }), ) @@ -281,7 +281,7 @@ export class TestRunner extends vscode.Disposable { this.nonContinuousRequest = undefined this.endTestRun() }) - log.verbose?.('Test run was cancelled manually for', join(request.include)) + log.verbose?.('Test run was cancelled manually for', labelTestItems(request.include)) } }), ) @@ -759,7 +759,7 @@ function formatTestOutput(output: string) { return output.replace(/(?' return items.map(p => `"${p.label}"`).join(', ') From 937901a40166c68e60193aec0a613da033f37148 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 12 Aug 2025 16:54:11 +0200 Subject: [PATCH 06/20] chore: add basic-v4 sample --- pnpm-lock.yaml | 444 +++++++++++++++++- pnpm-workspace.yaml | 7 + samples/basic-v4/.skip/vitest.config.ts | 1 + samples/basic-v4/.vscode/settings.json | 9 + samples/basic-v4/package.json | 17 + samples/basic-v4/src/add.ts | 17 + samples/basic-v4/src/should_included_test.ts | 5 + samples/basic-v4/test/.gitignore | 1 + samples/basic-v4/test/add.test.ts | 52 ++ samples/basic-v4/test/bug.test.ts | 4 + samples/basic-v4/test/console.test.ts | 25 + .../basic-v4/test/deep/deeper/deep.test.ts | 5 + samples/basic-v4/test/duplicated.test.ts | 8 + samples/basic-v4/test/each.test.ts | 84 ++++ samples/basic-v4/test/env.test.ts | 9 + samples/basic-v4/test/fail_to_run.test.ts | 1 + samples/basic-v4/test/ignored.test.ts | 5 + samples/basic-v4/test/mul.test.ts | 6 + samples/basic-v4/test/snapshot.test.ts | 11 + samples/basic-v4/test/throw.test.ts | 12 + samples/basic-v4/test/using.test.ts | 43 ++ samples/basic-v4/vite.config.ts | 3 + samples/basic-v4/vitest.config.d.ts | 4 + samples/basic-v4/vitest.config.ts | 15 + 24 files changed, 779 insertions(+), 9 deletions(-) create mode 100644 samples/basic-v4/.skip/vitest.config.ts create mode 100644 samples/basic-v4/.vscode/settings.json create mode 100644 samples/basic-v4/package.json create mode 100644 samples/basic-v4/src/add.ts create mode 100644 samples/basic-v4/src/should_included_test.ts create mode 100644 samples/basic-v4/test/.gitignore create mode 100644 samples/basic-v4/test/add.test.ts create mode 100644 samples/basic-v4/test/bug.test.ts create mode 100644 samples/basic-v4/test/console.test.ts create mode 100644 samples/basic-v4/test/deep/deeper/deep.test.ts create mode 100644 samples/basic-v4/test/duplicated.test.ts create mode 100644 samples/basic-v4/test/each.test.ts create mode 100644 samples/basic-v4/test/env.test.ts create mode 100644 samples/basic-v4/test/fail_to_run.test.ts create mode 100644 samples/basic-v4/test/ignored.test.ts create mode 100644 samples/basic-v4/test/mul.test.ts create mode 100644 samples/basic-v4/test/snapshot.test.ts create mode 100644 samples/basic-v4/test/throw.test.ts create mode 100644 samples/basic-v4/test/using.test.ts create mode 100644 samples/basic-v4/vite.config.ts create mode 100644 samples/basic-v4/vitest.config.d.ts create mode 100644 samples/basic-v4/vitest.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d78e35e5..6b57b496 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,19 @@ catalogs: vitest: specifier: ^3.2.2 version: 3.2.3 + latest: + '@vitest/browser': + specifier: ^4.0.0-beta.7 + version: 4.0.0-beta.7 + '@vitest/coverage-v8': + specifier: ^4.0.0-beta.7 + version: 4.0.0-beta.7 + vite: + specifier: ^7.1.0 + version: 7.1.2 + vitest: + specifier: ^4.0.0-beta.7 + version: 4.0.0-beta.7 importers: @@ -136,7 +149,7 @@ importers: version: 7.7.2 tsup: specifier: ^8.0.1 - version: 8.5.0(@swc/core@1.3.107(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0) + version: 8.5.0(@swc/core@1.3.107(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0) tsx: specifier: ^4.7.1 version: 4.19.4 @@ -181,7 +194,7 @@ importers: version: 4.0.0-beta.7 vitest: specifier: 4.0.0-beta.7 - version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared @@ -218,6 +231,21 @@ importers: specifier: 'catalog:' version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + samples/basic-v4: + devDependencies: + '@vitest/browser': + specifier: catalog:latest + version: 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) + '@vitest/coverage-v8': + specifier: catalog:latest + version: 4.0.0-beta.7(@vitest/browser@4.0.0-beta.7)(vitest@4.0.0-beta.7) + vite: + specifier: catalog:latest + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vitest: + specifier: catalog:latest + version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + samples/browser: dependencies: birpc: @@ -1042,101 +1070,201 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.42.0': resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.42.0': resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.42.0': resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.42.0': resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.42.0': resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.42.0': resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.42.0': resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.42.0': resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.42.0': resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.42.0': resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.42.0': resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.42.0': resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.42.0': resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.42.0': resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.42.0': resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.42.0': resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -1281,6 +1409,10 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + '@testing-library/dom@9.3.4': resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -1504,6 +1636,21 @@ packages: webdriverio: optional: true + '@vitest/browser@4.0.0-beta.7': + resolution: {integrity: sha512-xn+BcR6Nk/LlrgBBJJ6InbIButQzqptfzvEpvKJLfzzwxbrFknCJgtinG5DEbJ4YoUDNvIjoYct8YLcUhLqC4A==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 4.0.0-beta.7 + webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + '@vitest/coverage-v8@3.2.3': resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} peerDependencies: @@ -1513,6 +1660,15 @@ packages: '@vitest/browser': optional: true + '@vitest/coverage-v8@4.0.0-beta.7': + resolution: {integrity: sha512-aTiGI4YaqlrOHFC9g3butxSkKYdp6KOv02+mhWcKpH4e5v7yo7l+M2WWSm8sYcl/I47gcMg/6vTldJ2CwHEGoQ==} + peerDependencies: + '@vitest/browser': 4.0.0-beta.7 + vitest: 4.0.0-beta.7 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/eslint-plugin@1.2.1': resolution: {integrity: sha512-JQr1jdVcrsoS7Sdzn83h9sq4DvREf9Q/onTZbJCqTVlv/76qb+TZrLv/9VhjnjSMHweQH5FdpMDeCR6aDe2fgw==} peerDependencies: @@ -4069,6 +4225,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4092,6 +4252,10 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + pnpm-workspace-yaml@0.3.1: resolution: {integrity: sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==} @@ -4125,6 +4289,10 @@ packages: resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -4303,6 +4471,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} @@ -4915,6 +5088,46 @@ packages: yaml: optional: true + vite@7.1.2: + resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest-github-actions-reporter-temp@0.8.3: resolution: {integrity: sha512-JnBZW20iSnt9cwadfeL1E5UXmsSucsCWNC2mvppjPOXAXdS76WvwQW2VKahoAuyB5iQOREVO3pkzmID+yK6orQ==} engines: {node: '>=14'} @@ -5095,6 +5308,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -5837,63 +6062,123 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.42.0': optional: true + '@rollup/rollup-android-arm-eabi@4.46.2': + optional: true + '@rollup/rollup-android-arm64@4.42.0': optional: true + '@rollup/rollup-android-arm64@4.46.2': + optional: true + '@rollup/rollup-darwin-arm64@4.42.0': optional: true + '@rollup/rollup-darwin-arm64@4.46.2': + optional: true + '@rollup/rollup-darwin-x64@4.42.0': optional: true + '@rollup/rollup-darwin-x64@4.46.2': + optional: true + '@rollup/rollup-freebsd-arm64@4.42.0': optional: true + '@rollup/rollup-freebsd-arm64@4.46.2': + optional: true + '@rollup/rollup-freebsd-x64@4.42.0': optional: true + '@rollup/rollup-freebsd-x64@4.46.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.42.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.42.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.42.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.46.2': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.42.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.42.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.46.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.42.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.42.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.46.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.42.0': optional: true + '@rollup/rollup-linux-x64-musl@4.46.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.42.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.46.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.42.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.46.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.42.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.46.2': + optional: true + '@sec-ant/readable-stream@0.4.1': {} '@secretlint/config-creator@9.3.4': @@ -6058,6 +6343,17 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + '@testing-library/dom@9.3.4': dependencies: '@babel/code-frame': 7.27.1 @@ -6083,6 +6379,10 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@textlint/ast-node-types@14.8.0': {} '@textlint/linter-formatter@14.8.0': @@ -6347,6 +6647,49 @@ snapshots: - utf-8-validate - vite + '@vitest/browser@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7)': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.0-beta.7 + magic-string: 0.30.17 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.3 + optionalDependencies: + playwright: 1.52.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + + '@vitest/browser@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7)': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.0-beta.7 + magic-string: 0.30.17 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.3 + optionalDependencies: + playwright: 1.52.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + '@vitest/coverage-v8@3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3)': dependencies: '@ampproject/remapping': 2.3.0 @@ -6368,6 +6711,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@4.0.0-beta.7(@vitest/browser@4.0.0-beta.7)(vitest@4.0.0-beta.7)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.0-beta.7 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magicast: 0.3.5 + std-env: 3.9.0 + tinyrainbow: 2.0.0 + vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + optionalDependencies: + '@vitest/browser': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) + transitivePeerDependencies: + - supports-color + '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.3)': dependencies: '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) @@ -6412,6 +6774,15 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + '@vitest/mocker@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 4.0.0-beta.7 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + '@vitest/pretty-format@3.2.3': dependencies: tinyrainbow: 2.0.0 @@ -9371,6 +9742,10 @@ snapshots: pirates@4.0.7: {} + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -9395,18 +9770,20 @@ snapshots: pluralize@8.0.0: {} + pngjs@7.0.0: {} + pnpm-workspace-yaml@0.3.1: dependencies: yaml: 2.8.0 possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(yaml@2.8.0): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.19.4)(yaml@2.8.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.4 + postcss: 8.5.6 tsx: 4.19.4 yaml: 2.8.0 @@ -9421,6 +9798,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.4 @@ -9649,6 +10032,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.42.0 fsevents: 2.3.3 + rollup@4.46.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 + fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} rrweb-cssom@0.8.0: {} @@ -10099,7 +10508,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(@swc/core@1.3.107(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0): + tsup@8.5.0(@swc/core@1.3.107(@swc/helpers@0.5.17))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.5) cac: 6.7.14 @@ -10110,7 +10519,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(yaml@2.8.0) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.19.4)(yaml@2.8.0) resolve-from: 5.0.0 rollup: 4.42.0 source-map: 0.8.0-beta.0 @@ -10120,7 +10529,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.3.107(@swc/helpers@0.5.17) - postcss: 8.5.4 + postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: - jiti @@ -10287,6 +10696,21 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 + vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.0 + fsevents: 2.3.3 + jiti: 2.4.2 + tsx: 4.19.4 + yaml: 2.8.0 + vitest-github-actions-reporter-temp@0.8.3(vitest@3.2.3): dependencies: '@actions/core': 1.11.1 @@ -10428,7 +10852,7 @@ snapshots: - tsx - yaml - vitest@4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + vitest@4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 4.0.0-beta.7 @@ -10456,7 +10880,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/browser': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) happy-dom: 15.11.7 jsdom: 26.1.0 transitivePeerDependencies: @@ -10601,6 +11025,8 @@ snapshots: ws@8.18.2: {} + ws@8.18.3: {} + xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d1cbe602..11672af8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,3 +12,10 @@ catalog: '@vitest/utils': ^3.2.2 vite: ^6.3.5 vitest: ^3.2.2 + +catalogs: + latest: + '@vitest/browser': ^4.0.0-beta.7 + '@vitest/coverage-v8': ^4.0.0-beta.7 + vite: ^7.1.0 + vitest: ^4.0.0-beta.7 diff --git a/samples/basic-v4/.skip/vitest.config.ts b/samples/basic-v4/.skip/vitest.config.ts new file mode 100644 index 00000000..91480683 --- /dev/null +++ b/samples/basic-v4/.skip/vitest.config.ts @@ -0,0 +1 @@ +throw new Error('do not import') \ No newline at end of file diff --git a/samples/basic-v4/.vscode/settings.json b/samples/basic-v4/.vscode/settings.json new file mode 100644 index 00000000..0842d6a8 --- /dev/null +++ b/samples/basic-v4/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "vitest.nodeEnv": { + "TEST_CUSTOM_ENV": "hello" + }, + "vitest.experimentalStaticAstCollect": true, + "[typescript]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint" + } +} diff --git a/samples/basic-v4/package.json b/samples/basic-v4/package.json new file mode 100644 index 00000000..2e2a52c7 --- /dev/null +++ b/samples/basic-v4/package.json @@ -0,0 +1,17 @@ +{ + "name": "basic-v4", + "version": "1.0.0", + "private": true, + "description": "", + "author": "", + "license": "ISC", + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "@vitest/browser": "catalog:latest", + "@vitest/coverage-v8": "catalog:latest", + "vite": "catalog:latest", + "vitest": "catalog:latest" + } +} diff --git a/samples/basic-v4/src/add.ts b/samples/basic-v4/src/add.ts new file mode 100644 index 00000000..a0e19156 --- /dev/null +++ b/samples/basic-v4/src/add.ts @@ -0,0 +1,17 @@ + +export function add(a: number, b: number) { + return a + b +} + +export function sum(from: number, to: number) { + return (from + to) * (to - from + 1) / 2 +} + +export function addError(from: number, to: number) { + doSomething() + return add(from, to) +} + +function doSomething() { + throw new Error('Something went wrong'); +} diff --git a/samples/basic-v4/src/should_included_test.ts b/samples/basic-v4/src/should_included_test.ts new file mode 100644 index 00000000..eb51c768 --- /dev/null +++ b/samples/basic-v4/src/should_included_test.ts @@ -0,0 +1,5 @@ +import { describe, it } from 'vitest' + +describe('should included', () => { + it('is included because of workspace plugin setting', () => {}) +}) diff --git a/samples/basic-v4/test/.gitignore b/samples/basic-v4/test/.gitignore new file mode 100644 index 00000000..b05c2dfa --- /dev/null +++ b/samples/basic-v4/test/.gitignore @@ -0,0 +1 @@ +__snapshots__ diff --git a/samples/basic-v4/test/add.test.ts b/samples/basic-v4/test/add.test.ts new file mode 100644 index 00000000..2517c278 --- /dev/null +++ b/samples/basic-v4/test/add.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, it } from 'vitest' +import { add, sum } from '../src/add' + +describe('addition', () => { + it('add', () => { + expect(add(1, 1)).toBe(2) + }) + + it('sum', () => { + expect(sum(0, 10)).toBe(55) + }) + + it.skip('skipped', () => { + expect(1 + 2).toBe(3) + }) + + it.todo('todo') + it('async task', async () => { + await new Promise(resolve => setTimeout(resolve, 100)) + }) + + it('async task 0.5s', async () => { + await new Promise(resolve => setTimeout(resolve, 500)) + }) + + it('async task 1s', async () => { + await new Promise(resolve => setTimeout(resolve, 1000)) + }) + + it('long task', () => { + let sum = 0 + for (let i = 0; i < 2e8; i++) + sum += i + + expect(sum).toBeGreaterThan(1) + }) +}) + +describe('testing', () => { + it('run', () => { + const a = 10 + expect(a).toBe(10) + }) + + it('mul', () => { + expect(5 * 5).toBe(25) + }) + + it("mul fail", () => { + expect(5 * 5).toBe(25) + }) +}) diff --git a/samples/basic-v4/test/bug.test.ts b/samples/basic-v4/test/bug.test.ts new file mode 100644 index 00000000..aba9a462 --- /dev/null +++ b/samples/basic-v4/test/bug.test.ts @@ -0,0 +1,4 @@ +import { expect, test } from 'vitest'; +test('fail', () => { + expect(1).toEqual(2); +}) \ No newline at end of file diff --git a/samples/basic-v4/test/console.test.ts b/samples/basic-v4/test/console.test.ts new file mode 100644 index 00000000..4efe8f6a --- /dev/null +++ b/samples/basic-v4/test/console.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from 'vitest' + +const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) + +describe('console', () => { + it('basic', () => { + console.log([ + 'string', + { hello: 'world' }, + 1234, + /regex/g, + true, + false, + null, + ]) + }) + + it('async', async () => { + console.log('1st') + await sleep(200) + console.log('2nd') + await sleep(200) + console.log('3rd') + }) +}) diff --git a/samples/basic-v4/test/deep/deeper/deep.test.ts b/samples/basic-v4/test/deep/deeper/deep.test.ts new file mode 100644 index 00000000..64456cdf --- /dev/null +++ b/samples/basic-v4/test/deep/deeper/deep.test.ts @@ -0,0 +1,5 @@ +import { expect, it } from 'vitest' + +it('test', () => { + expect(1).toBe(1) +}) \ No newline at end of file diff --git a/samples/basic-v4/test/duplicated.test.ts b/samples/basic-v4/test/duplicated.test.ts new file mode 100644 index 00000000..8f839ba0 --- /dev/null +++ b/samples/basic-v4/test/duplicated.test.ts @@ -0,0 +1,8 @@ +import { describe, test } from "vitest"; + +describe("testing", () => { + test("number 1", () => { }) +}); +describe("testing", () => { + test("number 2", () => { }) +}); diff --git a/samples/basic-v4/test/each.test.ts b/samples/basic-v4/test/each.test.ts new file mode 100644 index 00000000..f7cff915 --- /dev/null +++ b/samples/basic-v4/test/each.test.ts @@ -0,0 +1,84 @@ +import { describe, expect, it, test, } from 'vitest' + +describe('testing', (a) => { + it.each([ + [1, 1], [2, 2], [3, 3] + ])(`all pass: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + [1, 1], [2, 1], [3, 1] + ])(`first pass: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + [1, 1], [2, 2], [3, 1] + ])(`last pass: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + [1, 1], [2, 2], [3, 1] + ])(`first fail: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + [1, 1], [2, 2], [3, 1] + ])(`last fail: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + [1, 0], [2, 0], [3, 0] + ])(`all fail: %i => %i`, (a, b) => { + expect(a).toBe(b) + }) + it.each([ + 1, 2, 3 + ])('run %i', (a) => { + expect(a).toBe(a) + }) + it.each([ + [1, 1], [2, 4], [3, 9] + ])('run mul %i', (a,b) => { + expect(a * a).toBe(b) + }) + test.each([ + ["test1", 1], + ["test2", 2], + ["test3", 3], + ])(`%s => %i`, (a, b) => { + expect(a.at(-1)).toBe(`${b}`) + }) + test.each` + a | b | expected + ${1} | ${1} | ${2} + ${'a'} | ${'b'} | ${'ab'} + ${[]} | ${'b'} | ${'b'} + ${{}} | ${'b'} | ${'[object Object]b'} + ${{ asd: 1 }} | ${'b'} | ${'[object Object]b'} + `('table1: returns $expected when $a is added $b', ({ a, b, expected }) => { + expect(a + b).toBe(expected) + }) + test.each` + a | b | expected + ${{v: 1}} | ${{v: 1}} | ${2} + `('table2: returns $expected when $a.v is added $b.v', ({ a, b, expected }) => { + expect(a.v + b.v).toBe(expected) + }) + test.each([ + { input: 1, add: 1, sum: 2 }, + { input: 2, add: 2, sum: 4 }, + ])('$input + $add = $sum', ({ input, add, sum }) => { + expect(input + add).toBe(sum) + }) +}) + +// 'Test result not fourd' error occurs as both .each patterns are matched +// TODO: Fix this +describe("over matched test patterns", () => { + test.each(['1', '2'])('run %s', (a) => { + expect(a).toBe(String(a)) + }) + test.each(['1', '2'])('run for %s', (a) => { + expect(a).toBe(String(a)) + }) +}) diff --git a/samples/basic-v4/test/env.test.ts b/samples/basic-v4/test/env.test.ts new file mode 100644 index 00000000..07b88808 --- /dev/null +++ b/samples/basic-v4/test/env.test.ts @@ -0,0 +1,9 @@ +import { test, expect } from "vitest"; + +test('process.env', () => { + expect(process.env.TEST).toBe('true'); + expect(process.env.VITEST).toBe('true'); + expect(process.env.NODE_ENV).toBe('test'); + expect(process.env.VITEST_VSCODE).toBe('true'); + expect(process.env.TEST_CUSTOM_ENV).toBe('hello'); +}); diff --git a/samples/basic-v4/test/fail_to_run.test.ts b/samples/basic-v4/test/fail_to_run.test.ts new file mode 100644 index 00000000..13900e21 --- /dev/null +++ b/samples/basic-v4/test/fail_to_run.test.ts @@ -0,0 +1 @@ +test('aaaaaa', () => {}) diff --git a/samples/basic-v4/test/ignored.test.ts b/samples/basic-v4/test/ignored.test.ts new file mode 100644 index 00000000..ff1c9074 --- /dev/null +++ b/samples/basic-v4/test/ignored.test.ts @@ -0,0 +1,5 @@ +import { describe, it } from 'vitest' + +describe('ignored test', () => { + it('is ignored because of vitest plugin setting', () => {}) +}) diff --git a/samples/basic-v4/test/mul.test.ts b/samples/basic-v4/test/mul.test.ts new file mode 100644 index 00000000..b1a6e21e --- /dev/null +++ b/samples/basic-v4/test/mul.test.ts @@ -0,0 +1,6 @@ +import { describe, it } from 'vitest' + +describe('mul', () => { + it.skip('run 1', () => {}) + it('run', () => {}) +}) diff --git a/samples/basic-v4/test/snapshot.test.ts b/samples/basic-v4/test/snapshot.test.ts new file mode 100644 index 00000000..2944c559 --- /dev/null +++ b/samples/basic-v4/test/snapshot.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from 'vitest' + +describe('snapshots', () => { + it('string', () => { + expect('bc').toMatchSnapshot() + }) + it('async', async () => { + await new Promise(resolve => setTimeout(resolve, 200)) + expect('bc').toMatchSnapshot() + }) +}) diff --git a/samples/basic-v4/test/throw.test.ts b/samples/basic-v4/test/throw.test.ts new file mode 100644 index 00000000..73f8e547 --- /dev/null +++ b/samples/basic-v4/test/throw.test.ts @@ -0,0 +1,12 @@ +import { describe, expect, it } from 'vitest'; +import { addError } from '../src/add'; + +describe('throw error', () => { + it('passes expecting an error to be thrown', () => { + expect(()=>addError(1, 1)).toThrow() + }) + + it('fails with error thrown', () => { + expect(addError(1, 1)).toBe(2) + }) +}) diff --git a/samples/basic-v4/test/using.test.ts b/samples/basic-v4/test/using.test.ts new file mode 100644 index 00000000..d7e13a31 --- /dev/null +++ b/samples/basic-v4/test/using.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest'; + +(Symbol as any).dispose ??= Symbol('Symbol.dispose'); +(Symbol as any).asyncDispose ??= Symbol('Symbol.asyncDispose') + +describe('using keyword', () => { + it('dispose', () => { + function getDisposableResource() { + using resource = new SomeDisposableResource() + return resource + } + + const resource = getDisposableResource() + expect(resource.isDisposed).toBe(true) + }) + + it('asyncDispose', async () => { + async function getAsyncDisposableResource() { + await using resource = new SomeAsyncDisposableResource() + return resource + } + + const resource = await getAsyncDisposableResource() + expect(resource.isDisposed).toBe(true) + }) +}) + +class SomeDisposableResource implements Disposable { + public isDisposed = false; + + [Symbol.dispose](): void { + this.isDisposed = true + } +} + +class SomeAsyncDisposableResource implements AsyncDisposable { + public isDisposed = false + + async [Symbol.asyncDispose](): Promise { + await new Promise(resolve => setTimeout(resolve, 0)) + this.isDisposed = true + } +} diff --git a/samples/basic-v4/vite.config.ts b/samples/basic-v4/vite.config.ts new file mode 100644 index 00000000..c55daa96 --- /dev/null +++ b/samples/basic-v4/vite.config.ts @@ -0,0 +1,3 @@ +export default function () { + throw new Error('This file should not be executed') +} \ No newline at end of file diff --git a/samples/basic-v4/vitest.config.d.ts b/samples/basic-v4/vitest.config.d.ts new file mode 100644 index 00000000..5576c97e --- /dev/null +++ b/samples/basic-v4/vitest.config.d.ts @@ -0,0 +1,4 @@ +declare const ts: true + +// @ts-expect-error this is just a test +throw new Error('This file should not be included by default.') diff --git a/samples/basic-v4/vitest.config.ts b/samples/basic-v4/vitest.config.ts new file mode 100644 index 00000000..eeae7f53 --- /dev/null +++ b/samples/basic-v4/vitest.config.ts @@ -0,0 +1,15 @@ +/// + +// Configure Vitest (https://vitest.dev/config) + +import { defineConfig } from 'vite' + +export default defineConfig({ + esbuild: { + target: 'es2022', + }, + test: { + include: ['src/should_included_test.ts', 'test/**/*.test.ts'], + exclude: ['test/ignored.test.ts'], + }, +}) From 68132fd5341d9a4ae8d8be315f1d7ecdafe4f5f1 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Thu, 14 Aug 2025 14:23:16 +0200 Subject: [PATCH 07/20] chore: cleanup --- .vscode/launch.json | 10 ++ packages/extension/src/api.ts | 2 - packages/extension/src/api/rpc.ts | 3 - packages/extension/src/runner.ts | 9 ++ packages/shared/src/index.ts | 2 - packages/shared/src/rpc.ts | 1 - packages/worker-v4/package.json | 4 +- packages/worker-v4/src/coverage.ts | 75 ++----------- packages/worker-v4/src/index.ts | 7 +- packages/worker-v4/src/reporter.ts | 6 +- packages/worker-v4/src/worker.ts | 18 ++- pnpm-lock.yaml | 172 ++++++++++++----------------- pnpm-workspace.yaml | 7 +- 13 files changed, 122 insertions(+), 194 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index ec8d9442..2fb99341 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,6 +15,16 @@ ], "outFiles": ["${workspaceFolder}/dist/**/*.js"] }, + { + "name": "Run Extension Basic V4 Sample", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/samples/basic-v4" + ], + "outFiles": ["${workspaceFolder}/dist/**/*.js"] + }, { "name": "Run Extension Browser Sample", "type": "extensionHost", diff --git a/packages/extension/src/api.ts b/packages/extension/src/api.ts index 38ae75f9..73a10b23 100644 --- a/packages/extension/src/api.ts +++ b/packages/extension/src/api.ts @@ -211,7 +211,6 @@ export class VitestFolderAPI { onTestRunEnd = this.createHandler('onTestRunEnd') onTestRunStart = this.createHandler('onTestRunStart') onCollected = this.createHandler('onCollected') - onWatcherRerun = this.createHandler('onWatcherRerun') clearListeners(name?: Exclude) { if (name) @@ -415,7 +414,6 @@ export interface ResolvedMeta { onTestRunEnd: (listener: ExtensionWorkerEvents['onTestRunEnd']) => void onTestRunStart: (listener: ExtensionWorkerEvents['onTestRunStart']) => void onCollected: (listener: ExtensionWorkerEvents['onCollected']) => void - onWatcherRerun: (listener: ExtensionWorkerEvents['onWatcherRerun']) => void clearListeners: () => void removeListener: (name: string, listener: any) => void } diff --git a/packages/extension/src/api/rpc.ts b/packages/extension/src/api/rpc.ts index 55a8bdfe..b2a23b9d 100644 --- a/packages/extension/src/api/rpc.ts +++ b/packages/extension/src/api/rpc.ts @@ -31,7 +31,6 @@ export function createRpcOptions() { onConsoleLog: createHandler(), onTaskUpdate: createHandler(), onCollected: createHandler(), - onWatcherRerun: createHandler(), onTestRunStart: createHandler(), onTestRunEnd: createHandler(), } @@ -41,7 +40,6 @@ export function createRpcOptions() { onTestRunEnd: handlers.onTestRunEnd.trigger, onTaskUpdate: handlers.onTaskUpdate.trigger, onCollected: handlers.onCollected.trigger, - onWatcherRerun: handlers.onWatcherRerun.trigger, onTestRunStart: handlers.onTestRunStart.trigger, onProcessLog(type, message) { log.worker(type === 'stderr' ? 'error' : 'info', stripVTControlCharacters(message)) @@ -55,7 +53,6 @@ export function createRpcOptions() { onTaskUpdate: handlers.onTaskUpdate.register, onTestRunEnd: handlers.onTestRunEnd.register, onCollected: handlers.onCollected.register, - onWatcherRerun: handlers.onWatcherRerun.register, onTestRunStart: handlers.onTestRunStart.register, removeListener(name: string, listener: any) { handlers[name as 'onCollected']?.remove(listener) diff --git a/packages/extension/src/runner.ts b/packages/extension/src/runner.ts index 42db5ac0..98c89026 100644 --- a/packages/extension/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -53,6 +53,10 @@ export class TestRunner extends vscode.Disposable { }) api.onTestRunStart((files, collecting) => { + if (!files.length) { + return + } + if (collecting) { log.verbose?.('Not starting the runner because tests are being collected for', ...files.map(f => this.relative(f))) } @@ -391,6 +395,11 @@ export class TestRunner extends vscode.Disposable { private async startTestRun(files: string[], primaryRequest?: vscode.TestRunRequest) { const request = primaryRequest || this.nonContinuousRequest || this.createContinuousRequest() + if (!files.length) { + log.verbose?.('Started an empty test run. This should not happen...') + return + } + if (!request) { log.verbose?.('No test run request found for', ...files.map(f => this.relative(f))) return diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 9755ed92..b7b3d9fe 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -43,8 +43,6 @@ export interface ExtensionWorkerEvents { onTestRunEnd: (files: RunnerTestFile[], unhandledError: string, collecting?: boolean) => void onCollected: (file: RunnerTestFile, collecting?: boolean) => void onTestRunStart: (files: string[], collecting?: boolean) => void - /** @deprecated -- use onTestRunStart instead */ - onWatcherRerun: (files: string[], trigger?: string, collecting?: boolean) => void onProcessLog: (type: 'stdout' | 'stderr', log: string) => void } diff --git a/packages/shared/src/rpc.ts b/packages/shared/src/rpc.ts index d7179634..930b8774 100644 --- a/packages/shared/src/rpc.ts +++ b/packages/shared/src/rpc.ts @@ -10,7 +10,6 @@ export function createWorkerRPC(vitest: ExtensionWorkerTransport, channel: Chann 'onConsoleLog', 'onTaskUpdate', 'onCollected', - 'onWatcherRerun', 'onTestRunStart', 'onTestRunEnd', ], diff --git a/packages/worker-v4/package.json b/packages/worker-v4/package.json index 0c5fa3a4..6dfc2cc3 100644 --- a/packages/worker-v4/package.json +++ b/packages/worker-v4/package.json @@ -6,8 +6,8 @@ ".": "./src/index.ts" }, "devDependencies": { - "@vitest/utils": "4.0.0-beta.7", - "vitest": "4.0.0-beta.7", + "@vitest/utils": "catalog:latest", + "vitest": "catalog:latest", "vitest-vscode-shared": "workspace:*" } } diff --git a/packages/worker-v4/src/coverage.ts b/packages/worker-v4/src/coverage.ts index 1471f541..2436a55b 100644 --- a/packages/worker-v4/src/coverage.ts +++ b/packages/worker-v4/src/coverage.ts @@ -1,86 +1,29 @@ -import type { CoverageProvider, ResolvedCoverageOptions, Vitest } from 'vitest/node' +import type { Vitest } from 'vitest/node' import { existsSync } from 'node:fs' export class ExtensionCoverageManager { private _enabled = false - private _provider: CoverageProvider | null | undefined = undefined - private _config: ResolvedCoverageOptions + constructor(private vitest: Vitest) {} - constructor(private vitest: Vitest) { - this._config = vitest.config.coverage - const projects = new Set([ - ...vitest.projects, - vitest.getRootProject(), - ]) - projects.forEach((project) => { - Object.defineProperty(project.config, 'coverage', { - get: () => { - return this.config - }, - set: (coverage: ResolvedCoverageOptions) => { - this._config = coverage - }, - }) - }) - - Object.defineProperty(vitest, 'coverageProvider', { - get: () => { - if (this.enabled) - return this._provider - - return null - }, - set: (provider: CoverageProvider | null) => { - this._provider = provider - }, - }) - } - - public get config(): ResolvedCoverageOptions { - return { - ...this._config, - enabled: this.enabled, - } - } - - public get enabled() { - return this._enabled - } - - public async enable() { - const vitest = this.vitest + async enableCoverage() { + await this.vitest.enableCoverage() this._enabled = true - - vitest.logger.log('Running coverage with configuration:', this.config) - - if (!this._provider) { - // @ts-expect-error private method - await vitest.initCoverageProvider() - await this.coverageProvider?.clean(this._config.clean) - } - else { - await this._provider.clean(this._config.clean) - } - } - - private get coverageProvider() { - return (this.vitest as any).coverageProvider as CoverageProvider | null | undefined } - public disable() { + disableCoverage() { this._enabled = false + this.vitest.disableCoverage() } async waitForReport() { - if (!this.enabled) + if (!this._enabled) return null const vitest = this.vitest const coverage = vitest.config.coverage - if (!this._provider) - return null + // TODO: use verbose logger instead vitest.logger.error(`Waiting for the coverage report to generate: ${coverage.reportsDirectory}`) - await (vitest as any).runningPromise + await vitest.waitForTestRunEnd() if (existsSync(coverage.reportsDirectory)) { vitest.logger.error(`Coverage reports retrieved: ${coverage.reportsDirectory}`) return coverage.reportsDirectory diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts index 436a4148..fb217e30 100644 --- a/packages/worker-v4/src/index.ts +++ b/packages/worker-v4/src/index.ts @@ -111,7 +111,9 @@ export async function initVitest( config(userConfig) { const testConfig = userConfig.test ?? {} const coverageOptions = (testConfig.coverage ?? {}) as CoverageIstanbulOptions - const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter : [coverageOptions.reporter] + const reporters = Array.isArray(coverageOptions.reporter) + ? coverageOptions.reporter + : [coverageOptions.reporter] const jsonReporter = reporters.find(r => r && r[0] === 'json') const jsonReporterOptions = typeof jsonReporter?.[1] === 'object' ? jsonReporter[1] : {} coverageOptions.reporter = [ @@ -124,7 +126,8 @@ export async function initVitest( reportsDirectory: join(tmpdir(), `vitest-coverage-${randomUUID()}`), }, }, - } + // TODO: type is not augmented + } as any }, configResolved(config) { // stub a server so Vite doesn't start a websocket connection, diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts index 01a80b27..88905a2f 100644 --- a/packages/worker-v4/src/reporter.ts +++ b/packages/worker-v4/src/reporter.ts @@ -60,8 +60,10 @@ export class VSCodeReporter implements Reporter { onTestRunEnd(testModules: ReadonlyArray, unhandledErrors: ReadonlyArray) { const files = testModules.map(m => getEntityJSONTask(m)) - // TODO: remove "as unknown[]" - this.vitest.logger.printUnhandledErrors(unhandledErrors as unknown[]) + if (unhandledErrors.length) { + // TODO: remove "as unknown[]" + this.vitest.logger.printUnhandledErrors(unhandledErrors as unknown[]) + } // as any because Vitest types are different between v3 and v4, // and shared packages uses the lowest Vitest version diff --git a/packages/worker-v4/src/worker.ts b/packages/worker-v4/src/worker.ts index 300b5bbc..5626642b 100644 --- a/packages/worker-v4/src/worker.ts +++ b/packages/worker-v4/src/worker.ts @@ -49,7 +49,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { this.vitest.setGlobalTestNamePattern(testNamePattern) } - if (!filesOrDirectories || this.isDirectories(filesOrDirectories)) { + if (!filesOrDirectories || this.isOnlyDirectories(filesOrDirectories)) { const specifications = await this.vitest.getRelevantTestSpecifications(filesOrDirectories) await this.vitest.rerunTestSpecifications(specifications, true) } @@ -107,11 +107,11 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } async enableCoverage(): Promise { - await this.coverage.enable() + await this.coverage.enableCoverage() } disableCoverage(): void { - this.coverage.disable() + this.coverage.disableCoverage() } waitForCoverageReport(): Promise { @@ -119,19 +119,15 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } onFilesChanged(files: string[]): void { - files.forEach((file) => { - this.vitest.watcher.onFileChange(file) - }) + files.forEach(file => this.vitest.watcher.onFileChange(file)) } onFilesCreated(files: string[]): void { - files.forEach((file) => { - this.vitest.watcher.onFileCreate(file) - }) + files.forEach(file => this.vitest.watcher.onFileCreate(file)) } dispose() { - this.coverage.disable() + this.coverage.disableCoverage() this.watcher.stopTracking() return this.vitest.close() } @@ -144,7 +140,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { this.rpc = rpc } - private isDirectories(filesOrDirectories: ExtensionTestSpecification[] | string[]): filesOrDirectories is string[] { + private isOnlyDirectories(filesOrDirectories: ExtensionTestSpecification[] | string[]): filesOrDirectories is string[] { return typeof filesOrDirectories[0] === 'string' } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b57b496..51b98d36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,17 +26,20 @@ catalogs: version: 3.2.3 latest: '@vitest/browser': - specifier: ^4.0.0-beta.7 - version: 4.0.0-beta.7 + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8 '@vitest/coverage-v8': - specifier: ^4.0.0-beta.7 - version: 4.0.0-beta.7 + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8 + '@vitest/utils': + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8 vite: specifier: ^7.1.0 version: 7.1.2 vitest: - specifier: ^4.0.0-beta.7 - version: 4.0.0-beta.7 + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8 importers: @@ -190,11 +193,11 @@ importers: packages/worker-v4: devDependencies: '@vitest/utils': - specifier: 4.0.0-beta.7 - version: 4.0.0-beta.7 + specifier: catalog:latest + version: 4.0.0-beta.8 vitest: - specifier: 4.0.0-beta.7 - version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: catalog:latest + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared @@ -235,16 +238,16 @@ importers: devDependencies: '@vitest/browser': specifier: catalog:latest - version: 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) + version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) '@vitest/coverage-v8': specifier: catalog:latest - version: 4.0.0-beta.7(@vitest/browser@4.0.0-beta.7)(vitest@4.0.0-beta.7) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: specifier: catalog:latest version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: catalog:latest - version: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/browser: dependencies: @@ -1636,12 +1639,12 @@ packages: webdriverio: optional: true - '@vitest/browser@4.0.0-beta.7': - resolution: {integrity: sha512-xn+BcR6Nk/LlrgBBJJ6InbIButQzqptfzvEpvKJLfzzwxbrFknCJgtinG5DEbJ4YoUDNvIjoYct8YLcUhLqC4A==} + '@vitest/browser@4.0.0-beta.8': + resolution: {integrity: sha512-xFMdlTkOT5ml2YYkWIxryH/UQjerLdBA81GeiIoOdxxbupFLzQ+z27XU4uqzzmliHx/BTzG6Hb9XfWbvsjmlZA==} peerDependencies: playwright: '*' safaridriver: '*' - vitest: 4.0.0-beta.7 + vitest: 4.0.0-beta.8 webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 peerDependenciesMeta: playwright: @@ -1660,11 +1663,11 @@ packages: '@vitest/browser': optional: true - '@vitest/coverage-v8@4.0.0-beta.7': - resolution: {integrity: sha512-aTiGI4YaqlrOHFC9g3butxSkKYdp6KOv02+mhWcKpH4e5v7yo7l+M2WWSm8sYcl/I47gcMg/6vTldJ2CwHEGoQ==} + '@vitest/coverage-v8@4.0.0-beta.8': + resolution: {integrity: sha512-vd8D6P/PWtHXjH5Sot8PuGKchYC7Uns46Dpr1fg57kD8SOdXJybxtg/EdYvD5/OUW2q0iQCFes79WbH+LelwaA==} peerDependencies: - '@vitest/browser': 4.0.0-beta.7 - vitest: 4.0.0-beta.7 + '@vitest/browser': 4.0.0-beta.8 + vitest: 4.0.0-beta.8 peerDependenciesMeta: '@vitest/browser': optional: true @@ -1684,8 +1687,8 @@ packages: '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - '@vitest/expect@4.0.0-beta.7': - resolution: {integrity: sha512-/j35T4vsUqofdZVzWCnL6VckWHTMhR3gze0n5qAOJI404tLaasyV4sP4GhVgIXuj2h//IS4r4TxuHNCp4wB9Yw==} + '@vitest/expect@4.0.0-beta.8': + resolution: {integrity: sha512-40DZ7nl5AkASkDNaVR7TqsbeJCs5D+dyQNM5cIvgjG3KK+ATeWxtXJbmRNqgdbq+FL3v/pchnrJM1R9BFkTdUQ==} '@vitest/mocker@3.2.3': resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} @@ -1698,8 +1701,8 @@ packages: vite: optional: true - '@vitest/mocker@4.0.0-beta.7': - resolution: {integrity: sha512-9aNne4m5268l4I1mU7DyI+iHzf+LJ256cKyUQDX0fiQjWvLoAHRV8bZLWPF9OHLv+d0QBSy8T3EhVwyysH/Q0Q==} + '@vitest/mocker@4.0.0-beta.8': + resolution: {integrity: sha512-a5ynR/Fsrciuq17i8lzS5NH3ICxwFZMlQ4bXPzGV+KlIcVHu20a/8q6KekqUaVBxCbmohORLFXFx9IptHS9gXA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1712,32 +1715,32 @@ packages: '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - '@vitest/pretty-format@4.0.0-beta.7': - resolution: {integrity: sha512-2H/+4s4pIvJhXhYxtwI37CE5Xw4DEDvjzQUfKbX/hLtYcTa5lryzkTnv4NEnvwZki4+OqBaXaDK97c8lUicYYQ==} + '@vitest/pretty-format@4.0.0-beta.8': + resolution: {integrity: sha512-sr5HPeeRff4gTpDwI2Kvz8dS2CmDCCZ1PRu3IOeLTcSJjhEWmk3IJILjqaA8yyj+QzWjnqAxr2rmZNpO0h/5Vw==} '@vitest/runner@3.2.3': resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - '@vitest/runner@4.0.0-beta.7': - resolution: {integrity: sha512-3IORggCJ88rERBJC01hr1aqCUOzKQHFd37jDvgmPQfIp1DNoOkpX4tQvKNRerxrGhCD6J9H5L1e2KY66rusyUQ==} + '@vitest/runner@4.0.0-beta.8': + resolution: {integrity: sha512-m7jrT+KMEgONclBI7y3ptUD+/uhRzzHLblws84fo+WesCjS8WT8q7RoPMgqymj5kmzIF5sTh6NOvrNEE5LaLCQ==} '@vitest/snapshot@3.2.3': resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - '@vitest/snapshot@4.0.0-beta.7': - resolution: {integrity: sha512-yGzzorV5zg9/nj+keTnkLmscwxx4/NdTUhT2npmNb4b0PmBtqfAr5/2v2T6dNlccQ+UDP0+7II9qNG+BOfxjTg==} + '@vitest/snapshot@4.0.0-beta.8': + resolution: {integrity: sha512-2hzc/ksGlZ8Rcg11VD/AhTwSaPEsdtrNA+TCV4w6tuZ7I2X+XJXimfk/Cehz5zMgfFuV8tFmGimb/BpyIbNiMg==} '@vitest/spy@3.2.3': resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - '@vitest/spy@4.0.0-beta.7': - resolution: {integrity: sha512-QPfvZROJ1Im1TC7AqW9vFKwJnfLoJgnFbhDvXAQP5fQqoLgeTsfKSZ5T9TKZNDZ8qPVF2YPLy1A6papqGKYt+Q==} + '@vitest/spy@4.0.0-beta.8': + resolution: {integrity: sha512-WfHF35GCf5xx3B1oRrhWMVAfcBBYO4WHAYLbeeaZ1ZSW5/VBXJ/M37bLxRRKnXcgffwcsWA7xpjWnL0dQ1q5NA==} '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} - '@vitest/utils@4.0.0-beta.7': - resolution: {integrity: sha512-TpdNnxcmET8K7fhCcbEuuVvYk8yGhi+orcN72vqKuTEyek5I7tsQ2rKEsBagQCZeMAOqq9L0Y46K8WvIWVdWAA==} + '@vitest/utils@4.0.0-beta.8': + resolution: {integrity: sha512-+eV3yrDooGMnHHVQ1aqzPJIBlxEsaQg/5BVFRSkbBgfiKqM9HZbqYK736s0D8tfdMLOjeB+7u7Tw0emd/h3MlQ==} '@vscode/test-cli@0.0.6': resolution: {integrity: sha512-4i61OUv5PQr3GxhHOuUgHdgBDfIO/kXTPCsEyFiMaY4SOqQTgkTmyZLagHehjOgCfsXdcrJa3zgQ7zoc+Dh6hQ==} @@ -5162,16 +5165,16 @@ packages: jsdom: optional: true - vitest@4.0.0-beta.7: - resolution: {integrity: sha512-42OaywPYPuE+OjzNzvGVHH/GeoPENFO5YAbFn349iVxn+Y6/doVfZkov0tTjkE2/lYoFAD1fmU2TG8Culo/fZQ==} + vitest@4.0.0-beta.8: + resolution: {integrity: sha512-wN/RDeCd5uXHV6tELw4AJzeP5rxR4YWXN3ems+59ZummmiovNjlfwG+CEZp5GitlxDQu7muoY4VPrSUxPzzKiQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 4.0.0-beta.7 - '@vitest/ui': 4.0.0-beta.7 + '@vitest/browser': 4.0.0-beta.8 + '@vitest/ui': 4.0.0-beta.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6647,40 +6650,18 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7)': - dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/utils': 4.0.0-beta.7 - magic-string: 0.30.17 - pixelmatch: 7.1.0 - pngjs: 7.0.0 - sirv: 3.0.1 - tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - ws: 8.18.3 - optionalDependencies: - playwright: 1.52.0 - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - - '@vitest/browser@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7)': + '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/utils': 4.0.0-beta.7 + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.0-beta.8 magic-string: 0.30.17 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) ws: 8.18.3 optionalDependencies: playwright: 1.52.0 @@ -6711,10 +6692,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.0-beta.7(@vitest/browser@4.0.0-beta.7)(vitest@4.0.0-beta.7)': + '@vitest/coverage-v8@4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.0-beta.7 + '@vitest/utils': 4.0.0-beta.8 ast-v8-to-istanbul: 0.3.3 debug: 4.4.1(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 @@ -6724,9 +6705,9 @@ snapshots: magicast: 0.3.5 std-env: 3.9.0 tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: - '@vitest/browser': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) transitivePeerDependencies: - supports-color @@ -6748,11 +6729,11 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/expect@4.0.0-beta.7': + '@vitest/expect@4.0.0-beta.8': dependencies: '@types/chai': 5.2.2 - '@vitest/spy': 4.0.0-beta.7 - '@vitest/utils': 4.0.0-beta.7 + '@vitest/spy': 4.0.0-beta.8 + '@vitest/utils': 4.0.0-beta.8 chai: 5.2.1 tinyrainbow: 2.0.0 @@ -6765,18 +6746,9 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 4.0.0-beta.7 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - - '@vitest/mocker@4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': - dependencies: - '@vitest/spy': 4.0.0-beta.7 + '@vitest/spy': 4.0.0-beta.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -6787,7 +6759,7 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.0-beta.7': + '@vitest/pretty-format@4.0.0-beta.8': dependencies: tinyrainbow: 2.0.0 @@ -6797,9 +6769,9 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/runner@4.0.0-beta.7': + '@vitest/runner@4.0.0-beta.8': dependencies: - '@vitest/utils': 4.0.0-beta.7 + '@vitest/utils': 4.0.0-beta.8 pathe: 2.0.3 strip-literal: 3.0.0 @@ -6809,9 +6781,9 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/snapshot@4.0.0-beta.7': + '@vitest/snapshot@4.0.0-beta.8': dependencies: - '@vitest/pretty-format': 4.0.0-beta.7 + '@vitest/pretty-format': 4.0.0-beta.8 magic-string: 0.30.17 pathe: 2.0.3 @@ -6819,7 +6791,7 @@ snapshots: dependencies: tinyspy: 4.0.3 - '@vitest/spy@4.0.0-beta.7': {} + '@vitest/spy@4.0.0-beta.8': {} '@vitest/utils@3.2.3': dependencies: @@ -6827,9 +6799,9 @@ snapshots: loupe: 3.2.0 tinyrainbow: 2.0.0 - '@vitest/utils@4.0.0-beta.7': + '@vitest/utils@4.0.0-beta.8': dependencies: - '@vitest/pretty-format': 4.0.0-beta.7 + '@vitest/pretty-format': 4.0.0-beta.8 loupe: 3.2.0 tinyrainbow: 2.0.0 @@ -10852,16 +10824,16 @@ snapshots: - tsx - yaml - vitest@4.0.0-beta.7(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.7)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + vitest@4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 4.0.0-beta.7 - '@vitest/mocker': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 4.0.0-beta.7 - '@vitest/runner': 4.0.0-beta.7 - '@vitest/snapshot': 4.0.0-beta.7 - '@vitest/spy': 4.0.0-beta.7 - '@vitest/utils': 4.0.0-beta.7 + '@vitest/expect': 4.0.0-beta.8 + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.0-beta.8 + '@vitest/runner': 4.0.0-beta.8 + '@vitest/snapshot': 4.0.0-beta.8 + '@vitest/spy': 4.0.0-beta.8 + '@vitest/utils': 4.0.0-beta.8 chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 @@ -10875,12 +10847,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 4.0.0-beta.7(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.7) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) happy-dom: 15.11.7 jsdom: 26.1.0 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 11672af8..3ec3d268 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -15,7 +15,8 @@ catalog: catalogs: latest: - '@vitest/browser': ^4.0.0-beta.7 - '@vitest/coverage-v8': ^4.0.0-beta.7 + '@vitest/browser': ^4.0.0-beta.8 + '@vitest/coverage-v8': ^4.0.0-beta.8 + '@vitest/utils': ^4.0.0-beta.8 vite: ^7.1.0 - vitest: ^4.0.0-beta.7 + vitest: ^4.0.0-beta.8 From f0caa41dc78d6d9287caec8849a7f08255eca28a Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 11:39:16 +0200 Subject: [PATCH 08/20] fix: correct watcher --- packages/worker-v4/src/watcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/worker-v4/src/watcher.ts b/packages/worker-v4/src/watcher.ts index 140de5e6..049d9402 100644 --- a/packages/worker-v4/src/watcher.ts +++ b/packages/worker-v4/src/watcher.ts @@ -9,7 +9,7 @@ export class ExtensionWorkerWatcher { constructor(vitest: Vitest) { vitest.onFilterWatchedSpecification((specification) => { - if (this.enabled) { + if (!this.enabled) { return false } From 93e5a86dc6ef4964cce152520219c70e6467ad33 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 11:51:52 +0200 Subject: [PATCH 09/20] fix: send correct state in onTaskUpdate --- packages/worker-v4/src/reporter.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts index 88905a2f..e59c3767 100644 --- a/packages/worker-v4/src/reporter.ts +++ b/packages/worker-v4/src/reporter.ts @@ -49,7 +49,23 @@ export class VSCodeReporter implements Reporter { } onTaskUpdate(packs: RunnerTaskResultPack[]) { - this.rpc.onTaskUpdate(packs) + this.rpc.onTaskUpdate( + // remove the meta because it is not used, + // mark todo tests with a result, because + // it is not set if the test was skipped during collection + packs.map((pack) => { + const task = this.vitest.state.idMap.get(pack[0]) + if (pack[1] || !task) { + return [pack[0], pack[1], {}] + } + + if (task.mode === 'todo' || task.mode === 'skip') { + return [pack[0], { state: task.mode }, {}] + } + + return [pack[0], pack[1], {}] + }), + ) } onTestRunStart(specifications: ReadonlyArray) { From 35be8f662ee6da95944011e1c3e60868e33671c6 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 12:06:53 +0200 Subject: [PATCH 10/20] chore: cleanup --- packages/worker-v4/src/coverage.ts | 14 ++++++++++---- packages/worker-v4/src/index.ts | 2 +- packages/worker-v4/src/reporter.ts | 30 ++++++++++++++---------------- packages/worker-v4/src/worker.ts | 13 +++++++++++++ 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/worker-v4/src/coverage.ts b/packages/worker-v4/src/coverage.ts index 2436a55b..060e0c28 100644 --- a/packages/worker-v4/src/coverage.ts +++ b/packages/worker-v4/src/coverage.ts @@ -1,6 +1,13 @@ import type { Vitest } from 'vitest/node' import { existsSync } from 'node:fs' +const verbose = process.env.VITEST_VSCODE_LOG === 'verbose' + ? (...args: any[]) => { + // eslint-disable-next-line no-console + console.info(...args) + } + : undefined + export class ExtensionCoverageManager { private _enabled = false @@ -21,14 +28,13 @@ export class ExtensionCoverageManager { return null const vitest = this.vitest const coverage = vitest.config.coverage - // TODO: use verbose logger instead - vitest.logger.error(`Waiting for the coverage report to generate: ${coverage.reportsDirectory}`) + verbose?.(`Waiting for the coverage report to generate: ${coverage.reportsDirectory}`) await vitest.waitForTestRunEnd() if (existsSync(coverage.reportsDirectory)) { - vitest.logger.error(`Coverage reports retrieved: ${coverage.reportsDirectory}`) + verbose?.(`Coverage reports retrieved: ${coverage.reportsDirectory}`) return coverage.reportsDirectory } - vitest.logger.error(`Coverage reports directory not found: ${coverage.reportsDirectory}`) + verbose?.(`Coverage reports directory not found: ${coverage.reportsDirectory}`) return null } } diff --git a/packages/worker-v4/src/index.ts b/packages/worker-v4/src/index.ts index fb217e30..f5e686e4 100644 --- a/packages/worker-v4/src/index.ts +++ b/packages/worker-v4/src/index.ts @@ -109,7 +109,7 @@ export async function initVitest( { name: 'vitest:vscode-extension', config(userConfig) { - const testConfig = userConfig.test ?? {} + const testConfig = (userConfig as any).test ?? {} const coverageOptions = (testConfig.coverage ?? {}) as CoverageIstanbulOptions const reporters = Array.isArray(coverageOptions.reporter) ? coverageOptions.reporter diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker-v4/src/reporter.ts index e59c3767..a3e606b1 100644 --- a/packages/worker-v4/src/reporter.ts +++ b/packages/worker-v4/src/reporter.ts @@ -4,8 +4,10 @@ import type { Reporter, RunnerTestFile, TestModule, + TestProject, // TestProject, TestSpecification, + Vite, // Vite, Vitest as VitestCore, } from 'vitest/node' @@ -24,25 +26,21 @@ export class VSCodeReporter implements Reporter { this.setupFilePath = options.setupFilePath } - private get collecting(): boolean { - return (this.vitest as any).configOverride.testNamePattern?.toString() === `/$a/` - } - onInit(vitest: VitestCore) { this.vitest = vitest - // vitest.projects.forEach((project) => { - // this.ensureSetupFileIsAllowed(project.vite.config) - // }) + vitest.projects.forEach((project) => { + this.ensureSetupFileIsAllowed(project.vite.config) + }) } initRpc(rpc: VitestWorkerRPC) { this.rpc = rpc } - // onBrowserInit(project: TestProject) { - // const config = project.browser!.vite.config - // this.ensureSetupFileIsAllowed(config) - // } + onBrowserInit(project: TestProject) { + const config = project.browser!.vite.config + this.ensureSetupFileIsAllowed(config) + } onUserConsoleLog(log: UserConsoleLog) { this.rpc.onConsoleLog(log) @@ -91,11 +89,11 @@ export class VSCodeReporter implements Reporter { this.rpc.onCollected(getEntityJSONTask(testModule) as any, false) } - // ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { - // if (!config.server.fs.allow.includes(this.setupFilePath)) { - // config.server.fs.allow.push(this.setupFilePath) - // } - // } + ensureSetupFileIsAllowed(config: Vite.ResolvedConfig) { + if (!config.server.fs.allow.includes(this.setupFilePath)) { + config.server.fs.allow.push(this.setupFilePath) + } + } toJSON() { return {} diff --git a/packages/worker-v4/src/worker.ts b/packages/worker-v4/src/worker.ts index 5626642b..d4637e67 100644 --- a/packages/worker-v4/src/worker.ts +++ b/packages/worker-v4/src/worker.ts @@ -45,6 +45,7 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } async runTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { + const currentTestNamePattern = this.getGlobalTestNamePattern() if (testNamePattern) { this.vitest.setGlobalTestNamePattern(testNamePattern) } @@ -63,6 +64,18 @@ export class ExtensionWorker implements ExtensionWorkerTransport { await this.vitest.close() this.emitter.close() } + + if (currentTestNamePattern) { + this.vitest.setGlobalTestNamePattern(currentTestNamePattern) + } + } + + // TODO: use vitest.getGlobalTestNamePattern when merged + private getGlobalTestNamePattern(): RegExp | undefined { + if ((this.vitest as any).configOverride.testNamePattern != null) { + return (this.vitest as any).configOverride.testNamePattern + } + return this.vitest.config.testNamePattern } async resolveTestSpecifications(files: ExtensionTestSpecification[]): Promise { From 53b8d06c3fa0a798d84d491a19f44c248ed222e6 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 12:13:11 +0200 Subject: [PATCH 11/20] chore: lint --- packages/extension/src/api/ws.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/api/ws.ts b/packages/extension/src/api/ws.ts index 4d4bf5a7..ee423c08 100644 --- a/packages/extension/src/api/ws.ts +++ b/packages/extension/src/api/ws.ts @@ -133,7 +133,7 @@ export function onWsConnection( ? pathToFileURL(pnpLoader).toString() : undefined, setupFilePath, - finalCoverageFileName + finalCoverageFileName, }, debug, astCollect: getConfig(pkg.folder).experimentalStaticAstCollect, From 60fb65ba77cf5519eb9e2dd43a320436a4815177 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 12:15:37 +0200 Subject: [PATCH 12/20] test: fix paths --- test/unit/TestData.test.ts | 2 +- test/unit/config.test.ts | 2 +- test/unit/pkg.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/TestData.test.ts b/test/unit/TestData.test.ts index b32f237d..b8112214 100644 --- a/test/unit/TestData.test.ts +++ b/test/unit/TestData.test.ts @@ -1,7 +1,7 @@ import * as path from 'node:path' import * as vscode from 'vscode' import { expect } from 'chai' -import { TestCase, TestFile, TestFolder, TestSuite, getTestData } from '../../src/testTreeData' +import { TestCase, TestFile, TestFolder, TestSuite, getTestData } from '../../packages/extension/src/testTreeData' describe('TestData', () => { const ctrl = vscode.tests.createTestController('mocha', 'Vitest') diff --git a/test/unit/config.test.ts b/test/unit/config.test.ts index 05d5aec9..5aa6f55f 100644 --- a/test/unit/config.test.ts +++ b/test/unit/config.test.ts @@ -1,7 +1,7 @@ import { resolve } from 'node:path' import { homedir } from 'node:os' import { expect } from 'chai' -import { resolveConfigPath } from '../../src/config' +import { resolveConfigPath } from '../../packages/extension/src/config' it('correctly resolves ~', () => { expect(resolveConfigPath('~/test')).to.equal( diff --git a/test/unit/pkg.test.ts b/test/unit/pkg.test.ts index 7dc21aef..dcc16798 100644 --- a/test/unit/pkg.test.ts +++ b/test/unit/pkg.test.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { findFirstUniqueFolderNames } from '../../src/api/pkg' +import { findFirstUniqueFolderNames } from '../../packages/extension/src/api/pkg' it('correctly makes prefixes unique', () => { expect(findFirstUniqueFolderNames([ From 86435a8728016d5a0d80e689633e4b412c6a57d3 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 12:20:45 +0200 Subject: [PATCH 13/20] chore: rename --- packages/extension/src/worker/index.ts | 2 +- packages/{worker-old => worker-legacy}/package.json | 2 +- packages/{worker-old => worker-legacy}/src/collect.ts | 0 packages/{worker-old => worker-legacy}/src/coverage.ts | 0 packages/{worker-old => worker-legacy}/src/index.ts | 0 packages/{worker-old => worker-legacy}/src/reporter.ts | 0 packages/{worker-old => worker-legacy}/src/types.ts | 0 packages/{worker-old => worker-legacy}/src/watcher.ts | 0 packages/{worker-old => worker-legacy}/src/worker.ts | 0 packages/{worker-v4 => worker}/package.json | 2 +- packages/{worker-v4 => worker}/src/coverage.ts | 0 packages/{worker-v4 => worker}/src/index.ts | 0 packages/{worker-v4 => worker}/src/reporter.ts | 0 packages/{worker-v4 => worker}/src/watcher.ts | 0 packages/{worker-v4 => worker}/src/worker.ts | 0 packages/{worker-v4 => worker}/tsconfig.json | 0 pnpm-lock.yaml | 4 ++-- test/e2e/discovery.test.ts | 2 +- tsup.config.ts | 4 ++-- 19 files changed, 8 insertions(+), 8 deletions(-) rename packages/{worker-old => worker-legacy}/package.json (73%) rename packages/{worker-old => worker-legacy}/src/collect.ts (100%) rename packages/{worker-old => worker-legacy}/src/coverage.ts (100%) rename packages/{worker-old => worker-legacy}/src/index.ts (100%) rename packages/{worker-old => worker-legacy}/src/reporter.ts (100%) rename packages/{worker-old => worker-legacy}/src/types.ts (100%) rename packages/{worker-old => worker-legacy}/src/watcher.ts (100%) rename packages/{worker-old => worker-legacy}/src/worker.ts (100%) rename packages/{worker-v4 => worker}/package.json (86%) rename packages/{worker-v4 => worker}/src/coverage.ts (100%) rename packages/{worker-v4 => worker}/src/index.ts (100%) rename packages/{worker-v4 => worker}/src/reporter.ts (100%) rename packages/{worker-v4 => worker}/src/watcher.ts (100%) rename packages/{worker-v4 => worker}/src/worker.ts (100%) rename packages/{worker-v4 => worker}/tsconfig.json (100%) diff --git a/packages/extension/src/worker/index.ts b/packages/extension/src/worker/index.ts index 8cb12ef3..ab52f0b0 100644 --- a/packages/extension/src/worker/index.ts +++ b/packages/extension/src/worker/index.ts @@ -26,7 +26,7 @@ emitter.on('message', async function onMessage(message: any) { ) as typeof import('vitest/node') const isOld = Number(vitestModule.version[0]) < 4 - const workerName = isOld ? './workerOld.js' : './workerNew.js' + const workerName = isOld ? './workerLegacy.js' : './workerNew.js' const workerPath = pathToFileURL(join(__dirname, workerName)) const initModule = await import(workerPath.toString()) diff --git a/packages/worker-old/package.json b/packages/worker-legacy/package.json similarity index 73% rename from packages/worker-old/package.json rename to packages/worker-legacy/package.json index 18e9eaa2..84a1e717 100644 --- a/packages/worker-old/package.json +++ b/packages/worker-legacy/package.json @@ -1,5 +1,5 @@ { - "name": "vitest-vscode-worker-old", + "name": "vitest-vscode-worker-legacy", "version": "0.0.0", "private": true, "dependencies": { diff --git a/packages/worker-old/src/collect.ts b/packages/worker-legacy/src/collect.ts similarity index 100% rename from packages/worker-old/src/collect.ts rename to packages/worker-legacy/src/collect.ts diff --git a/packages/worker-old/src/coverage.ts b/packages/worker-legacy/src/coverage.ts similarity index 100% rename from packages/worker-old/src/coverage.ts rename to packages/worker-legacy/src/coverage.ts diff --git a/packages/worker-old/src/index.ts b/packages/worker-legacy/src/index.ts similarity index 100% rename from packages/worker-old/src/index.ts rename to packages/worker-legacy/src/index.ts diff --git a/packages/worker-old/src/reporter.ts b/packages/worker-legacy/src/reporter.ts similarity index 100% rename from packages/worker-old/src/reporter.ts rename to packages/worker-legacy/src/reporter.ts diff --git a/packages/worker-old/src/types.ts b/packages/worker-legacy/src/types.ts similarity index 100% rename from packages/worker-old/src/types.ts rename to packages/worker-legacy/src/types.ts diff --git a/packages/worker-old/src/watcher.ts b/packages/worker-legacy/src/watcher.ts similarity index 100% rename from packages/worker-old/src/watcher.ts rename to packages/worker-legacy/src/watcher.ts diff --git a/packages/worker-old/src/worker.ts b/packages/worker-legacy/src/worker.ts similarity index 100% rename from packages/worker-old/src/worker.ts rename to packages/worker-legacy/src/worker.ts diff --git a/packages/worker-v4/package.json b/packages/worker/package.json similarity index 86% rename from packages/worker-v4/package.json rename to packages/worker/package.json index 6dfc2cc3..dfeb65a0 100644 --- a/packages/worker-v4/package.json +++ b/packages/worker/package.json @@ -1,5 +1,5 @@ { - "name": "vitest-vscode-worker-v4", + "name": "vitest-vscode-worker", "type": "module", "private": true, "exports": { diff --git a/packages/worker-v4/src/coverage.ts b/packages/worker/src/coverage.ts similarity index 100% rename from packages/worker-v4/src/coverage.ts rename to packages/worker/src/coverage.ts diff --git a/packages/worker-v4/src/index.ts b/packages/worker/src/index.ts similarity index 100% rename from packages/worker-v4/src/index.ts rename to packages/worker/src/index.ts diff --git a/packages/worker-v4/src/reporter.ts b/packages/worker/src/reporter.ts similarity index 100% rename from packages/worker-v4/src/reporter.ts rename to packages/worker/src/reporter.ts diff --git a/packages/worker-v4/src/watcher.ts b/packages/worker/src/watcher.ts similarity index 100% rename from packages/worker-v4/src/watcher.ts rename to packages/worker/src/watcher.ts diff --git a/packages/worker-v4/src/worker.ts b/packages/worker/src/worker.ts similarity index 100% rename from packages/worker-v4/src/worker.ts rename to packages/worker/src/worker.ts diff --git a/packages/worker-v4/tsconfig.json b/packages/worker/tsconfig.json similarity index 100% rename from packages/worker-v4/tsconfig.json rename to packages/worker/tsconfig.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51b98d36..0c290752 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,13 +184,13 @@ importers: specifier: 'catalog:' version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - packages/worker-old: + packages/worker-legacy: dependencies: vitest-vscode-shared: specifier: workspace:* version: link:../shared - packages/worker-v4: + packages/worker: devDependencies: '@vitest/utils': specifier: catalog:latest diff --git a/test/e2e/discovery.test.ts b/test/e2e/discovery.test.ts index 0309ec02..99be05e8 100644 --- a/test/e2e/discovery.test.ts +++ b/test/e2e/discovery.test.ts @@ -2,7 +2,7 @@ import { resolve } from 'node:path' import type { RunnerTestCase, RunnerTestSuite } from 'vitest' import { describe, expect, it, onTestFinished } from 'vitest' import { createVitest } from 'vitest/node' -import { astCollectTests } from '../../src/worker/collect' +import { astCollectTests } from '../../packages/worker-legacy/src/collect' const variableFixture = 'test-from-vitest-variable.ts' diff --git a/tsup.config.ts b/tsup.config.ts index 0bd8ec78..66b0bcae 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -17,8 +17,8 @@ export default defineConfig([ }, { entry: { - workerOld: './packages/worker-old/src/index.ts', - workerNew: './packages/worker-v4/src/index.ts', + workerLegacy: './packages/worker-legacy/src/index.ts', + workerNew: './packages/worker/src/index.ts', }, format: 'cjs', }, From 36c58917328080a74893908749a52e65593f41f7 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 12:21:23 +0200 Subject: [PATCH 14/20] chore: add minify tag --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e314a591..cd0c57c2 100644 --- a/package.json +++ b/package.json @@ -258,7 +258,7 @@ "scripts": { "vscode:prepublish": "pnpm build", "release": "tsx ./scripts/release.mts && git update-ref refs/heads/release refs/heads/main && git push origin release", - "build": "tsup --clean", + "build": "tsup --minify --clean", "package": "vsce package --no-dependencies", "dev": "EXTENSION_NODE_ENV=dev tsup --watch --sourcemap", "test": "vscode-test", From a598aec32c7133de8e57fcda3b516f4178ae66a6 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 15:21:47 +0200 Subject: [PATCH 15/20] chore: cleanup --- packages/worker/src/reporter.ts | 2 -- test/e2e/tester.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/worker/src/reporter.ts b/packages/worker/src/reporter.ts index a3e606b1..b8969333 100644 --- a/packages/worker/src/reporter.ts +++ b/packages/worker/src/reporter.ts @@ -5,10 +5,8 @@ import type { RunnerTestFile, TestModule, TestProject, - // TestProject, TestSpecification, Vite, - // Vite, Vitest as VitestCore, } from 'vitest/node' diff --git a/test/e2e/tester.ts b/test/e2e/tester.ts index 00f0cbe1..a2b85a99 100644 --- a/test/e2e/tester.ts +++ b/test/e2e/tester.ts @@ -57,7 +57,7 @@ class TesterTree { const state = await locator.getAttribute('aria-expanded') if (state === 'true') continue - await locator.click() + await locator.click({ force: true }) } } } From 2a5040b46b8b28e7559135a54600da54cf87f066 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 15:30:48 +0200 Subject: [PATCH 16/20] refactor: cleanup test folder --- package.json | 7 + pnpm-lock.yaml | 375 ++++++--------------- test/e2e/discovery.test.ts | 4 +- test/e2e/{basic.test.ts => runner.test.ts} | 4 +- test/e2e/{ => utils}/assertions.ts | 0 test/e2e/{ => utils}/downloadSetup.ts | 0 test/e2e/{ => utils}/helper.ts | 5 +- test/e2e/{ => utils}/tester.ts | 0 test/e2e/vitest.config.ts | 4 +- 9 files changed, 125 insertions(+), 274 deletions(-) rename test/e2e/{basic.test.ts => runner.test.ts} (98%) rename test/e2e/{ => utils}/assertions.ts (100%) rename test/e2e/{ => utils}/downloadSetup.ts (100%) rename test/e2e/{ => utils}/helper.ts (95%) rename test/e2e/{ => utils}/tester.ts (100%) diff --git a/package.json b/package.json index cd0c57c2..3e159b16 100644 --- a/package.json +++ b/package.json @@ -313,6 +313,13 @@ "which": "^4.0.0", "ws": "^8.16.0" }, + "pnpm": { + "overrides": { + "@vitest/browser": "^4.0.0-beta.8", + "@vitest/coverage": "^4.0.0-beta.8", + "vitest": "^4.0.0-beta.8" + } + }, "lint-staged": { "*.{js,ts,tsx,vue,md}": [ "eslint --fix" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c290752..96dd5ac3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,9 +6,6 @@ settings: catalogs: default: - '@vitest/browser': - specifier: ^3.2.2 - version: 3.2.3 '@vitest/coverage-v8': specifier: ^3.2.2 version: 3.2.3 @@ -21,13 +18,7 @@ catalogs: vite: specifier: ^6.3.5 version: 6.3.5 - vitest: - specifier: ^3.2.2 - version: 3.2.3 latest: - '@vitest/browser': - specifier: ^4.0.0-beta.8 - version: 4.0.0-beta.8 '@vitest/coverage-v8': specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8 @@ -37,9 +28,11 @@ catalogs: vite: specifier: ^7.1.0 version: 7.1.2 - vitest: - specifier: ^4.0.0-beta.8 - version: 4.0.0-beta.8 + +overrides: + '@vitest/browser': ^4.0.0-beta.8 + '@vitest/coverage': ^4.0.0-beta.8 + vitest: ^4.0.0-beta.8 importers: @@ -47,7 +40,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^4.14.1 - version: 4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.3) + version: 4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@4.0.0-beta.8) '@playwright/test': specifier: ^1.42.1 version: 1.52.0 @@ -160,8 +153,8 @@ importers: specifier: ^5.6.2 version: 5.8.3 vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) which: specifier: ^4.0.0 version: 4.0.0 @@ -181,14 +174,8 @@ importers: specifier: 2.4.0 version: 2.4.0 vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - - packages/worker-legacy: - dependencies: - vitest-vscode-shared: - specifier: workspace:* - version: link:../shared + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) packages/worker: devDependencies: @@ -196,12 +183,18 @@ importers: specifier: catalog:latest version: 4.0.0-beta.8 vitest: - specifier: catalog:latest + specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared + packages/worker-legacy: + dependencies: + vitest-vscode-shared: + specifier: workspace:* + version: link:../shared + samples/ast-collector: dependencies: birpc: @@ -210,13 +203,13 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) + version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: specifier: 'catalog:' version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/basic: dependencies: @@ -226,18 +219,18 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) + version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: specifier: 'catalog:' version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/basic-v4: devDependencies: '@vitest/browser': - specifier: catalog:latest + specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) '@vitest/coverage-v8': specifier: catalog:latest @@ -246,7 +239,7 @@ importers: specifier: catalog:latest version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: catalog:latest + specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/browser: @@ -256,11 +249,11 @@ importers: version: 0.2.19 devDependencies: '@vitest/browser': - specifier: 'catalog:' - version: 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) + version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) playwright: specifier: ^1.47.0 version: 1.52.0 @@ -268,20 +261,20 @@ importers: specifier: 'catalog:' version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/continuous: devDependencies: vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/e2e: devDependencies: vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/imba: devDependencies: @@ -293,7 +286,7 @@ importers: version: 6.6.3 imba: specifier: ^2.0.0-alpha.235 - version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) jsdom: specifier: ^24.0.0 version: 24.1.3 @@ -302,13 +295,13 @@ importers: version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-imba: specifier: ^0.10.3 - version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-github-actions-reporter-temp: specifier: ^0.8.3 - version: 0.8.3(vitest@3.2.3) + version: 0.8.3(vitest@4.0.0-beta.8) samples/in-source: devDependencies: @@ -316,20 +309,20 @@ importers: specifier: 'catalog:' version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/monorepo-vitest-workspace: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) + version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) happy-dom: specifier: ^15.7.4 version: 15.11.7 vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/monorepo-vitest-workspace/packages/react: dependencies: @@ -384,20 +377,20 @@ importers: samples/multiple-configs: dependencies: vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/no-config: devDependencies: vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/readme: devDependencies: vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) samples/vue: dependencies: @@ -410,7 +403,7 @@ importers: version: 5.2.4(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3) + version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) '@vue/test-utils': specifier: ^2.4.5 version: 2.4.6 @@ -421,8 +414,8 @@ importers: specifier: 'catalog:' version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: - specifier: 'catalog:' - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) packages: @@ -1408,10 +1401,6 @@ packages: '@swc/types@0.1.22': resolution: {integrity: sha512-D13mY/ZA4PPEFSy6acki9eBT/3WgjMoRqNcdpIvjaYLQ44Xk5BdaL7UkDxAh6Z9UOe7tCCp67BVmZCojYp9owg==} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} - '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -1624,27 +1613,12 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/browser@3.2.3': - resolution: {integrity: sha512-5HpUb0ixGF8JWSAjb/P1x/VPuTYUkL4pL0+YO6DJiuvQgqJN3PREaUEcXwfXjU4nBc37EahfpRbAwdE9pHs9lQ==} - peerDependencies: - playwright: '*' - safaridriver: '*' - vitest: 3.2.3 - webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - '@vitest/browser@4.0.0-beta.8': resolution: {integrity: sha512-xFMdlTkOT5ml2YYkWIxryH/UQjerLdBA81GeiIoOdxxbupFLzQ+z27XU4uqzzmliHx/BTzG6Hb9XfWbvsjmlZA==} peerDependencies: playwright: '*' safaridriver: '*' - vitest: 4.0.0-beta.8 + vitest: ^4.0.0-beta.8 webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 peerDependenciesMeta: playwright: @@ -1657,8 +1631,8 @@ packages: '@vitest/coverage-v8@3.2.3': resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} peerDependencies: - '@vitest/browser': 3.2.3 - vitest: 3.2.3 + '@vitest/browser': ^4.0.0-beta.8 + vitest: ^4.0.0-beta.8 peerDependenciesMeta: '@vitest/browser': optional: true @@ -1666,8 +1640,8 @@ packages: '@vitest/coverage-v8@4.0.0-beta.8': resolution: {integrity: sha512-vd8D6P/PWtHXjH5Sot8PuGKchYC7Uns46Dpr1fg57kD8SOdXJybxtg/EdYvD5/OUW2q0iQCFes79WbH+LelwaA==} peerDependencies: - '@vitest/browser': 4.0.0-beta.8 - vitest: 4.0.0-beta.8 + '@vitest/browser': ^4.0.0-beta.8 + vitest: ^4.0.0-beta.8 peerDependenciesMeta: '@vitest/browser': optional: true @@ -1677,30 +1651,16 @@ packages: peerDependencies: eslint: '>= 8.57.0' typescript: '>= 5.0.0' - vitest: '*' + vitest: ^4.0.0-beta.8 peerDependenciesMeta: typescript: optional: true vitest: optional: true - '@vitest/expect@3.2.3': - resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - '@vitest/expect@4.0.0-beta.8': resolution: {integrity: sha512-40DZ7nl5AkASkDNaVR7TqsbeJCs5D+dyQNM5cIvgjG3KK+ATeWxtXJbmRNqgdbq+FL3v/pchnrJM1R9BFkTdUQ==} - '@vitest/mocker@3.2.3': - resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@4.0.0-beta.8': resolution: {integrity: sha512-a5ynR/Fsrciuq17i8lzS5NH3ICxwFZMlQ4bXPzGV+KlIcVHu20a/8q6KekqUaVBxCbmohORLFXFx9IptHS9gXA==} peerDependencies: @@ -1724,15 +1684,9 @@ packages: '@vitest/runner@4.0.0-beta.8': resolution: {integrity: sha512-m7jrT+KMEgONclBI7y3ptUD+/uhRzzHLblws84fo+WesCjS8WT8q7RoPMgqymj5kmzIF5sTh6NOvrNEE5LaLCQ==} - '@vitest/snapshot@3.2.3': - resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - '@vitest/snapshot@4.0.0-beta.8': resolution: {integrity: sha512-2hzc/ksGlZ8Rcg11VD/AhTwSaPEsdtrNA+TCV4w6tuZ7I2X+XJXimfk/Cehz5zMgfFuV8tFmGimb/BpyIbNiMg==} - '@vitest/spy@3.2.3': - resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - '@vitest/spy@4.0.0-beta.8': resolution: {integrity: sha512-WfHF35GCf5xx3B1oRrhWMVAfcBBYO4WHAYLbeeaZ1ZSW5/VBXJ/M37bLxRRKnXcgffwcsWA7xpjWnL0dQ1q5NA==} @@ -3184,7 +3138,7 @@ packages: '@testing-library/jest-dom': '*' vite: '*' vite-node: '*' - vitest: '*' + vitest: ^4.0.0-beta.8 peerDependenciesMeta: '@testing-library/dom': optional: true @@ -4830,10 +4784,6 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} - tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -5135,35 +5085,7 @@ packages: resolution: {integrity: sha512-JnBZW20iSnt9cwadfeL1E5UXmsSucsCWNC2mvppjPOXAXdS76WvwQW2VKahoAuyB5iQOREVO3pkzmID+yK6orQ==} engines: {node: '>=14'} peerDependencies: - vitest: '>=0.16.0' - - vitest@3.2.3: - resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.3 - '@vitest/ui': 3.2.3 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest: ^4.0.0-beta.8 vitest@4.0.0-beta.8: resolution: {integrity: sha512-wN/RDeCd5uXHV6tELw4AJzeP5rxR4YWXN3ems+59ZummmiovNjlfwG+CEZp5GitlxDQu7muoY4VPrSUxPzzKiQ==} @@ -5173,7 +5095,7 @@ packages: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 4.0.0-beta.8 + '@vitest/browser': ^4.0.0-beta.8 '@vitest/ui': 4.0.0-beta.8 happy-dom: '*' jsdom: '*' @@ -5431,7 +5353,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.3)': + '@antfu/eslint-config@4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@4.0.0-beta.8)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 @@ -5440,7 +5362,7 @@ snapshots: '@stylistic/eslint-plugin': 5.0.0-beta.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.3) + '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@4.0.0-beta.8) ansis: 4.1.0 cac: 6.7.14 eslint: 9.28.0(jiti@2.4.2) @@ -6335,17 +6257,6 @@ snapshots: '@swc/counter': 0.1.3 optional: true - '@testing-library/dom@10.4.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 @@ -6378,10 +6289,6 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 @@ -6631,17 +6538,19 @@ snapshots: vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vue: 3.5.16(typescript@5.8.3) - '@vitest/browser@3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3)': + '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8)': dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/utils': 3.2.3 + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.0-beta.8 magic-string: 0.30.17 + pixelmatch: 7.1.0 + pngjs: 7.0.0 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - ws: 8.18.2 + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.3 optionalDependencies: playwright: 1.52.0 transitivePeerDependencies: @@ -6671,7 +6580,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@3.2.3(@vitest/browser@3.2.3)(vitest@3.2.3)': + '@vitest/coverage-v8@3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -6686,9 +6595,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) transitivePeerDependencies: - supports-color @@ -6711,24 +6620,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.3)': + '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@4.0.0-beta.8)': dependencies: '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.28.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.3 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.3': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - chai: 5.2.1 - tinyrainbow: 2.0.0 - '@vitest/expect@4.0.0-beta.8': dependencies: '@types/chai': 5.2.2 @@ -6737,9 +6638,9 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.2.3 + '@vitest/spy': 4.0.0-beta.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: @@ -6775,22 +6676,12 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/snapshot@3.2.3': - dependencies: - '@vitest/pretty-format': 3.2.3 - magic-string: 0.30.17 - pathe: 2.0.3 - '@vitest/snapshot@4.0.0-beta.8': dependencies: '@vitest/pretty-format': 4.0.0-beta.8 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.2.3': - dependencies: - tinyspy: 4.0.3 - '@vitest/spy@4.0.0-beta.8': {} '@vitest/utils@3.2.3': @@ -8474,7 +8365,7 @@ snapshots: ignore@7.0.5: {} - imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3): + imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8): dependencies: '@antfu/install-pkg': 0.1.1 chokidar: 3.6.0 @@ -8494,7 +8385,7 @@ snapshots: '@testing-library/jest-dom': 6.6.3 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - picomatch - supports-color @@ -10424,8 +10315,6 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} - tldts-core@6.1.86: {} tldts@6.1.86: @@ -10624,7 +10513,7 @@ snapshots: debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10638,15 +10527,16 @@ snapshots: - terser - tsx - yaml + optional: true - vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): + vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 cross-env: 7.0.3 debug: 4.4.1(supports-color@8.1.1) deepmerge: 4.3.1 diff: 5.2.0 - imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) kleur: 4.1.5 magic-string: 0.26.7 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) @@ -10683,24 +10573,25 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vitest-github-actions-reporter-temp@0.8.3(vitest@3.2.3): + vitest-github-actions-reporter-temp@0.8.3(vitest@4.0.0-beta.8): dependencies: '@actions/core': 1.11.1 source-map-js: 1.2.1 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + vitest@4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.3 - '@vitest/snapshot': 3.2.3 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 + '@vitest/expect': 4.0.0-beta.8 + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.0-beta.8 + '@vitest/runner': 4.0.0-beta.8 + '@vitest/snapshot': 4.0.0-beta.8 + '@vitest/spy': 4.0.0-beta.8 + '@vitest/utils': 4.0.0-beta.8 chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 @@ -10711,13 +10602,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) happy-dom: 14.7.1 jsdom: 26.1.0 transitivePeerDependencies: @@ -10734,18 +10624,19 @@ snapshots: - tsx - yaml - vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + vitest@4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.3 - '@vitest/snapshot': 3.2.3 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 + '@vitest/expect': 4.0.0-beta.8 + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.0-beta.8 + '@vitest/runner': 4.0.0-beta.8 + '@vitest/snapshot': 4.0.0-beta.8 + '@vitest/spy': 4.0.0-beta.8 + '@vitest/utils': 4.0.0-beta.8 chai: 5.2.1 debug: 4.4.1(supports-color@8.1.1) + es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 @@ -10756,13 +10647,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) happy-dom: 15.11.7 jsdom: 24.1.3 transitivePeerDependencies: @@ -10779,51 +10669,6 @@ snapshots: - tsx - yaml - vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@3.2.3)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.3 - '@vitest/snapshot': 3.2.3 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - chai: 5.2.1 - debug: 4.4.1(supports-color@8.1.1) - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.0.0 - '@vitest/browser': 3.2.3(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.3) - happy-dom: 15.11.7 - jsdom: 26.1.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 diff --git a/test/e2e/discovery.test.ts b/test/e2e/discovery.test.ts index 99be05e8..d3e449f6 100644 --- a/test/e2e/discovery.test.ts +++ b/test/e2e/discovery.test.ts @@ -15,7 +15,7 @@ describe('can discover tests', () => { const vitest = await createVitest('test', { config: false }) onTestFinished(() => vitest.close()) const file = await astCollectTests( - vitest.getCoreWorkspaceProject(), + vitest.getRootProject(), resolve(`test/e2e/fixtures/collect/${fixture}`), ) expect(file.filepath).toBe(resolve(`test/e2e/fixtures/collect/${fixture}`)) @@ -68,7 +68,7 @@ describe('can discover tests', () => { const vitest = await createVitest('test', { config: false }) onTestFinished(() => vitest.close()) const file = await astCollectTests( - vitest.getCoreWorkspaceProject(), + vitest.getRootProject(), resolve(`test/e2e/fixtures/collect/method-names.ts`), ) diff --git a/test/e2e/basic.test.ts b/test/e2e/runner.test.ts similarity index 98% rename from test/e2e/basic.test.ts rename to test/e2e/runner.test.ts index 5591fa69..8febc551 100644 --- a/test/e2e/basic.test.ts +++ b/test/e2e/runner.test.ts @@ -1,8 +1,8 @@ import { readFileSync, rmSync } from 'node:fs' import { beforeAll, beforeEach, describe, onTestFailed } from 'vitest' import { expect } from '@playwright/test' -import { test } from './helper' -import { editFile } from './tester' +import { test } from './utils/helper' +import { editFile } from './utils/tester' // Vitst extension doesn't work with CI flag beforeAll(() => { diff --git a/test/e2e/assertions.ts b/test/e2e/utils/assertions.ts similarity index 100% rename from test/e2e/assertions.ts rename to test/e2e/utils/assertions.ts diff --git a/test/e2e/downloadSetup.ts b/test/e2e/utils/downloadSetup.ts similarity index 100% rename from test/e2e/downloadSetup.ts rename to test/e2e/utils/downloadSetup.ts diff --git a/test/e2e/helper.ts b/test/e2e/utils/helper.ts similarity index 95% rename from test/e2e/helper.ts rename to test/e2e/utils/helper.ts index e99455ce..f424594e 100644 --- a/test/e2e/helper.ts +++ b/test/e2e/utils/helper.ts @@ -3,7 +3,6 @@ import os from 'node:os' import path, { resolve } from 'node:path' import { _electron } from '@playwright/test' import type { Page } from '@playwright/test' -import type { Awaitable } from 'vitest' import { test as baseTest, inject } from 'vitest' import { VSCodeTester } from './tester' @@ -20,7 +19,7 @@ type LaunchFixture = (options: { workspacePath?: string trace?: 'on' | 'off' }) => Promise Awaitable) => Promise + step: (name: string, fn: (context: Context) => void | Promise) => Promise }> const defaultConfig = process.env as { @@ -78,7 +77,7 @@ export const test = baseTest.extend<{ launch: LaunchFixture; taskName: string; l const tester = new VSCodeTester(page) - async function step(name: string, fn: (context: Context) => Awaitable) { + async function step(name: string, fn: (context: Context) => Promise | void) { await page.reload() try { await fn({ page, tester }) diff --git a/test/e2e/tester.ts b/test/e2e/utils/tester.ts similarity index 100% rename from test/e2e/tester.ts rename to test/e2e/utils/tester.ts diff --git a/test/e2e/vitest.config.ts b/test/e2e/vitest.config.ts index 003a1bfc..6f738863 100644 --- a/test/e2e/vitest.config.ts +++ b/test/e2e/vitest.config.ts @@ -10,10 +10,10 @@ export default defineConfig({ VSCODE_E2E_TRACE: 'on', }, setupFiles: [ - './assertions.ts', + './utils/assertions.ts', ], globalSetup: [ - './downloadSetup.ts', + './utils/downloadSetup.ts', ], }, }) From 9fc085fe386b3389c982fffa8265d8404cc9be82 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 15:58:32 +0200 Subject: [PATCH 17/20] fix: update test names after code change --- packages/extension/src/api.ts | 24 +------- packages/shared/src/index.ts | 2 +- packages/shared/src/utils.ts | 22 +++++++ packages/worker/src/index.ts | 1 - packages/worker/src/runner.ts | 109 +++++++++++++++++++++++++++++++++ packages/worker/src/watcher.ts | 50 +++++++++------ packages/worker/src/worker.ts | 84 ++++--------------------- 7 files changed, 178 insertions(+), 114 deletions(-) create mode 100644 packages/worker/src/runner.ts diff --git a/packages/extension/src/api.ts b/packages/extension/src/api.ts index 73a10b23..153ec046 100644 --- a/packages/extension/src/api.ts +++ b/packages/extension/src/api.ts @@ -1,9 +1,9 @@ -import type { ExtensionTestSpecification } from 'vitest-vscode-shared' import type { VitestPackage } from './api/pkg' import type { ExtensionWorkerEvents, VitestExtensionRPC } from './api/rpc' import type { ExtensionWorkerProcess } from './api/types' import { dirname, isAbsolute } from 'node:path' import { normalize, relative } from 'pathe' +import { createQueuedHandler, type ExtensionTestSpecification } from 'vitest-vscode-shared' import * as vscode from 'vscode' import { createVitestProcess } from './api/child_process' import { createVitestTerminalProcess } from './api/terminal' @@ -230,28 +230,6 @@ export class VitestFolderAPI { } } -function createQueuedHandler(resolver: (value: T[]) => Promise) { - const cached = new Set() - let promise: Promise | null = null - let timer: NodeJS.Timeout | null = null - return (value: T) => { - cached.add(value) - if (timer) { - clearTimeout(timer) - } - timer = setTimeout(() => { - if (promise) { - return - } - const values = Array.from(cached) - cached.clear() - promise = resolver(values).finally(() => { - promise = null - }) - }, 50) - } -} - export async function resolveVitestAPI(workspaceConfigs: VitestPackage[], configs: VitestPackage[]) { const usedConfigs = new Set() const workspacePromises = workspaceConfigs.map(pkg => createVitestFolderAPI(usedConfigs, pkg)) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index b7b3d9fe..5b8f31e9 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -7,7 +7,7 @@ import type { export { WorkerWSEventEmitter } from './emitter' export { createWorkerRPC } from './rpc' -export { assert, limitConcurrency, normalizeDriveLetter } from './utils' +export { assert, createQueuedHandler, limitConcurrency, normalizeDriveLetter } from './utils' export type ExtensionTestSpecification = [ project: string, diff --git a/packages/shared/src/utils.ts b/packages/shared/src/utils.ts index 53b359f7..3b954c57 100644 --- a/packages/shared/src/utils.ts +++ b/packages/shared/src/utils.ts @@ -69,3 +69,25 @@ export function normalizeDriveLetter(path: string) { return path return driveLetter + path.slice(1) } + +export function createQueuedHandler(resolver: (value: T[]) => Promise) { + const cached = new Set() + let promise: Promise | null = null + let timer: NodeJS.Timeout | null = null + return (value: T) => { + cached.add(value) + if (timer) { + clearTimeout(timer) + } + timer = setTimeout(() => { + if (promise) { + return + } + const values = Array.from(cached) + cached.clear() + promise = resolver(values).finally(() => { + promise = null + }) + }, 50) + } +} diff --git a/packages/worker/src/index.ts b/packages/worker/src/index.ts index f5e686e4..e2530fe9 100644 --- a/packages/worker/src/index.ts +++ b/packages/worker/src/index.ts @@ -165,7 +165,6 @@ export async function initVitest( return new ExtensionWorker( vitest, data.debug, - data.astCollect, emitter, ) }, diff --git a/packages/worker/src/runner.ts b/packages/worker/src/runner.ts new file mode 100644 index 00000000..91a10f09 --- /dev/null +++ b/packages/worker/src/runner.ts @@ -0,0 +1,109 @@ +import type { ExtensionTestSpecification, VitestWorkerRPC, WorkerWSEventEmitter } from 'vitest-vscode-shared' +import type { TestSpecification, Vitest as VitestCore } from 'vitest/node' + +export class ExtensionWorkerRunner { + private rpc!: VitestWorkerRPC + + constructor( + public readonly vitest: VitestCore, + private readonly debug = false, + private emitter: WorkerWSEventEmitter, + ) {} + + async getFiles(): Promise { + this.vitest.clearSpecificationsCache() + const specifications = await this.vitest.globTestSpecifications() + return specifications.map(spec => [spec.project.name, spec.moduleId]) + } + + async collectTests(testFiles: ExtensionTestSpecification[]): Promise { + const specifications = await this.resolveTestSpecifications(testFiles) + await this.collectSpecifications(specifications) + } + + public async collectSpecifications(specifications: TestSpecification[]): Promise { + const testModules = await this.vitest.experimental_parseSpecifications(specifications) + const promises = testModules.map(module => + // TODO: fix "as any" + this.rpc.onCollected((module as any).task, true), + ) + await Promise.all(promises) + } + + initRpc(rpc: VitestWorkerRPC) { + this.rpc = rpc + } + + cancelRun(): Promise { + return this.vitest.cancelCurrentRun('keyboard-input') + } + + async runTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { + const currentTestNamePattern = this.getGlobalTestNamePattern() + if (testNamePattern) { + this.vitest.setGlobalTestNamePattern(testNamePattern) + } + + if (!filesOrDirectories || this.isOnlyDirectories(filesOrDirectories)) { + const specifications = await this.vitest.getRelevantTestSpecifications(filesOrDirectories) + await this.vitest.rerunTestSpecifications(specifications, true) + } + else { + const specifications = await this.resolveTestSpecifications(filesOrDirectories) + await this.vitest.rerunTestSpecifications(specifications, false) + } + + // debugger never runs in watch mode + if (this.debug) { + await this.vitest.close() + this.emitter.close() + } + + if (currentTestNamePattern) { + this.vitest.setGlobalTestNamePattern(currentTestNamePattern) + } + else { + this.vitest.resetGlobalTestNamePattern() + } + } + + // TODO: use vitest.getGlobalTestNamePattern when merged + private getGlobalTestNamePattern(): RegExp | undefined { + if ((this.vitest as any).configOverride.testNamePattern != null) { + return (this.vitest as any).configOverride.testNamePattern + } + return this.vitest.config.testNamePattern + } + + async resolveTestSpecifications(files: ExtensionTestSpecification[]): Promise { + const specifications: TestSpecification[] = [] + files.forEach((file) => { + const [projectName, filepath] = file + const project = this.vitest.getProjectByName(projectName) + specifications.push(project.createSpecification(filepath)) + }) + return specifications + } + + async updateSnapshots(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { + const currentTestNamePattern = this.getGlobalTestNamePattern() + this.vitest.enableSnapshotUpdate() + try { + return await this.runTests(filesOrDirectories, testNamePattern) + } + finally { + if (currentTestNamePattern) { + this.vitest.setGlobalTestNamePattern(currentTestNamePattern) + } + else { + this.vitest.resetSnapshotUpdate() + } + } + } + + private isOnlyDirectories( + filesOrDirectories: ExtensionTestSpecification[] | string[], + ): filesOrDirectories is string[] { + return typeof filesOrDirectories[0] === 'string' + } +} diff --git a/packages/worker/src/watcher.ts b/packages/worker/src/watcher.ts index 049d9402..8183423a 100644 --- a/packages/worker/src/watcher.ts +++ b/packages/worker/src/watcher.ts @@ -1,5 +1,6 @@ -import type { ExtensionTestSpecification } from 'vitest-vscode-shared' -import type { Vitest } from 'vitest/node' +import type { TestSpecification, Vitest } from 'vitest/node' +import type { ExtensionWorkerRunner } from './runner' +import { createQueuedHandler, type ExtensionTestSpecification } from 'vitest-vscode-shared' export class ExtensionWorkerWatcher { private enabled = false @@ -7,28 +8,41 @@ export class ExtensionWorkerWatcher { private trackedTestItems: Record = {} private trackedDirectories: string[] = [] - constructor(vitest: Vitest) { + constructor(vitest: Vitest, private runner: ExtensionWorkerRunner) { vitest.onFilterWatchedSpecification((specification) => { - if (!this.enabled) { - return false - } - - if (this.trackingEveryFile) { + const shouldRun = this.shouldRunSpecification(specification) + if (shouldRun) { return true } + this.scheduleAstCollection(specification) + return false + }) + } - if (this.isTestFileWatched(specification.moduleId, this.trackedDirectories)) { - return true - } + private scheduleAstCollection = createQueuedHandler(async (specifications) => { + await this.runner.collectSpecifications(specifications) + }) - const project = specification.project.name - const files = this.trackedTestItems[project] - if (!files?.length) { - return false - } + private shouldRunSpecification(specification: TestSpecification) { + if (!this.enabled) { + return false + } - return files.includes(specification.moduleId) - }) + if (this.trackingEveryFile) { + return true + } + + if (this.isTestFileWatched(specification.moduleId, this.trackedDirectories)) { + return true + } + + const project = specification.project.name + const files = this.trackedTestItems[project] + if (!files?.length) { + return false + } + + return files.includes(specification.moduleId) } trackTestItems(filesOrDirectories: ExtensionTestSpecification[] | string[]) { diff --git a/packages/worker/src/worker.ts b/packages/worker/src/worker.ts index d4637e67..52548d2e 100644 --- a/packages/worker/src/worker.ts +++ b/packages/worker/src/worker.ts @@ -4,98 +4,44 @@ import type { VitestWorkerRPC, WorkerWSEventEmitter, } from 'vitest-vscode-shared' -import type { TestSpecification, Vitest as VitestCore } from 'vitest/node' +import type { Vitest as VitestCore } from 'vitest/node' import { ExtensionCoverageManager } from './coverage' +import { ExtensionWorkerRunner } from './runner' import { ExtensionWorkerWatcher } from './watcher' export class ExtensionWorker implements ExtensionWorkerTransport { private readonly watcher: ExtensionWorkerWatcher private readonly coverage: ExtensionCoverageManager - - private rpc!: VitestWorkerRPC + private readonly runner: ExtensionWorkerRunner constructor( public readonly vitest: VitestCore, - private readonly debug = false, - public readonly alwaysAstCollect = false, - private emitter: WorkerWSEventEmitter, + debug = false, + emitter: WorkerWSEventEmitter, ) { - this.watcher = new ExtensionWorkerWatcher(vitest) + this.runner = new ExtensionWorkerRunner(vitest, debug, emitter) + this.watcher = new ExtensionWorkerWatcher(vitest, this.runner) this.coverage = new ExtensionCoverageManager(vitest) } async getFiles(): Promise { - this.vitest.clearSpecificationsCache() - const specifications = await this.vitest.globTestSpecifications() - return specifications.map(spec => [spec.project.name, spec.moduleId]) + return this.runner.getFiles() } async collectTests(testFiles: ExtensionTestSpecification[]): Promise { - const specifications = await this.resolveTestSpecifications(testFiles) - const testModules = await this.vitest.experimental_parseSpecifications(specifications) - const promises = testModules.map(module => - // TODO: fix "as any" - this.rpc.onCollected((module as any).task, true), - ) - await Promise.all(promises) + return this.runner.collectTests(testFiles) } cancelRun(): Promise { - return this.vitest.cancelCurrentRun('keyboard-input') + return this.runner.cancelRun() } async runTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { - const currentTestNamePattern = this.getGlobalTestNamePattern() - if (testNamePattern) { - this.vitest.setGlobalTestNamePattern(testNamePattern) - } - - if (!filesOrDirectories || this.isOnlyDirectories(filesOrDirectories)) { - const specifications = await this.vitest.getRelevantTestSpecifications(filesOrDirectories) - await this.vitest.rerunTestSpecifications(specifications, true) - } - else { - const specifications = await this.resolveTestSpecifications(filesOrDirectories) - await this.vitest.rerunTestSpecifications(specifications, false) - } - - // debugger never runs in watch mode - if (this.debug) { - await this.vitest.close() - this.emitter.close() - } - - if (currentTestNamePattern) { - this.vitest.setGlobalTestNamePattern(currentTestNamePattern) - } - } - - // TODO: use vitest.getGlobalTestNamePattern when merged - private getGlobalTestNamePattern(): RegExp | undefined { - if ((this.vitest as any).configOverride.testNamePattern != null) { - return (this.vitest as any).configOverride.testNamePattern - } - return this.vitest.config.testNamePattern - } - - async resolveTestSpecifications(files: ExtensionTestSpecification[]): Promise { - const specifications: TestSpecification[] = [] - files.forEach((file) => { - const [projectName, filepath] = file - const project = this.vitest.getProjectByName(projectName) - specifications.push(project.createSpecification(filepath)) - }) - return specifications + await this.runner.runTests(filesOrDirectories, testNamePattern) } async updateSnapshots(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): Promise { - this.vitest.enableSnapshotUpdate() - try { - return await this.runTests(filesOrDirectories, testNamePattern) - } - finally { - this.vitest.resetSnapshotUpdate() - } + return this.runner.updateSnapshots(filesOrDirectories, testNamePattern) } watchTests(filesOrDirectories?: ExtensionTestSpecification[] | string[], testNamePattern?: string): void { @@ -150,10 +96,6 @@ export class ExtensionWorker implements ExtensionWorkerTransport { } initRpc(rpc: VitestWorkerRPC) { - this.rpc = rpc - } - - private isOnlyDirectories(filesOrDirectories: ExtensionTestSpecification[] | string[]): filesOrDirectories is string[] { - return typeof filesOrDirectories[0] === 'string' + this.runner.initRpc(rpc) } } From c8abc891ec887c359ba70cbede95a47689b7d24d Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 16:06:30 +0200 Subject: [PATCH 18/20] chore: test ci --- .github/workflows/ci.yml | 7 +++++++ scripts/lower-vitest-version.js | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 scripts/lower-vitest-version.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 336d925b..e3faddaa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,13 @@ jobs: - name: test-e2e run: pnpm test-e2e --retry 2 + - name: vitest 3.2 + run: node ./scripts/lower-vitest-version.js + - run: pnpm install --no-frozen-lockfile + + - name: test-e2e-legacy + run: pnpm test-e2e --retry 2 + - uses: actions/upload-artifact@v4 if: always() with: diff --git a/scripts/lower-vitest-version.js b/scripts/lower-vitest-version.js new file mode 100644 index 00000000..691c2178 --- /dev/null +++ b/scripts/lower-vitest-version.js @@ -0,0 +1,11 @@ +const { readFileSync, writeFileSync } = require('node:fs') + +const pkg = JSON.parse(readFileSync('./package.json', 'utf-8')) +pkg.pnpm = { + overrides: { + '@vitest/browser': '^3.2.4', + '@vitest/coverage': '^3.2.4', + 'vitest': '^3.2.4', + }, +} +writeFileSync('./package.json', JSON.stringify(pkg, null, 2) + '\n', 'utf-8') From b846946336869e40ac1252636d1e80004d1bc28a Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 16:16:25 +0200 Subject: [PATCH 19/20] refactor: update versions --- package.json | 15 +- packages/extension/package.json | 1 + packages/extension/src/runner.ts | 8 +- packages/shared/package.json | 2 +- packages/worker-legacy/package.json | 1 + pnpm-lock.yaml | 220 ++++++++++++++++++++++++---- scripts/lower-vitest-version.js | 2 +- tsconfig.tsbuildinfo | 2 +- 8 files changed, 218 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 3e159b16..21a116e5 100644 --- a/package.json +++ b/package.json @@ -317,7 +317,20 @@ "overrides": { "@vitest/browser": "^4.0.0-beta.8", "@vitest/coverage": "^4.0.0-beta.8", - "vitest": "^4.0.0-beta.8" + "@vitest/runner": "^4.0.0-beta.8", + "vitest": "^4.0.0-beta.8", + "vitest-vscode-extension>@vitest/browser": "^3.2.0", + "vitest-vscode-extension>@vitest/coverage": "^3.2.0", + "vitest-vscode-extension>@vitest/runner": "^3.2.0", + "vitest-vscode-extension>vitest": "^3.2.0", + "vitest-vscode-shared>@vitest/browser": "^3.2.0", + "vitest-vscode-shared>@vitest/coverage": "^3.2.0", + "vitest-vscode-shared>@vitest/runner": "^3.2.0", + "vitest-vscode-shared>vitest": "^3.2.0", + "vitest-vscode-worker-legacy>@vitest/browser": "^3.2.0", + "vitest-vscode-worker-legacy>@vitest/coverage": "^3.2.0", + "vitest-vscode-worker-legacy>@vitest/runner": "^3.2.0", + "vitest-vscode-worker-legacy>vitest": "^3.2.0" } }, "lint-staged": { diff --git a/packages/extension/package.json b/packages/extension/package.json index 57c1138e..4e9847d5 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -3,6 +3,7 @@ "version": "0.0.0", "private": true, "dependencies": { + "vitest": "$vitest", "vitest-vscode-shared": "workspace:*" } } diff --git a/packages/extension/src/runner.ts b/packages/extension/src/runner.ts index 98c89026..c388efb5 100644 --- a/packages/extension/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -1,4 +1,4 @@ -import type { ParsedStack, TaskResult, TestError } from 'vitest' +import type { ParsedStack, RunnerTaskResult, TestError } from 'vitest' import type { VitestFolderAPI } from './api' import type { ExtensionDiagnostic } from './diagnostic' import type { TestTree } from './testTree' @@ -504,7 +504,7 @@ export class TestRunner extends vscode.Disposable { private markTestCase( testRun: vscode.TestRun, test: vscode.TestItem, - result: TaskResult, + result: RunnerTaskResult, ) { switch (result.state) { case 'fail': { @@ -546,7 +546,7 @@ export class TestRunner extends vscode.Disposable { // we only change the state of test cases to keep the correct test count // ignoring test files, test folders and suites - these only report syntax errors - private markNonTestCase(test: vscode.TestItem, result?: TaskResult) { + private markNonTestCase(test: vscode.TestItem, result?: RunnerTaskResult) { if (!result) { log.verbose?.(`No task result for "${test.label}", ignoring`) return @@ -564,7 +564,7 @@ export class TestRunner extends vscode.Disposable { test.error = errors.join('\n') } - private markResult(testRun: vscode.TestRun, test: vscode.TestItem, result?: TaskResult) { + private markResult(testRun: vscode.TestRun, test: vscode.TestItem, result?: RunnerTaskResult) { const isTestCase = getTestData(test) instanceof TestCase if (!isTestCase) { diff --git a/packages/shared/package.json b/packages/shared/package.json index 89456f2d..344b08f7 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -8,6 +8,6 @@ }, "devDependencies": { "birpc": "2.4.0", - "vitest": "catalog:" + "vitest": "$vitest" } } diff --git a/packages/worker-legacy/package.json b/packages/worker-legacy/package.json index 84a1e717..6d4a3cea 100644 --- a/packages/worker-legacy/package.json +++ b/packages/worker-legacy/package.json @@ -3,6 +3,7 @@ "version": "0.0.0", "private": true, "dependencies": { + "vitest": "$vitest", "vitest-vscode-shared": "workspace:*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96dd5ac3..01f10974 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,9 +9,6 @@ catalogs: '@vitest/coverage-v8': specifier: ^3.2.2 version: 3.2.3 - '@vitest/runner': - specifier: ^3.2.2 - version: 3.2.3 '@vitest/utils': specifier: ^3.2.2 version: 3.2.3 @@ -32,7 +29,20 @@ catalogs: overrides: '@vitest/browser': ^4.0.0-beta.8 '@vitest/coverage': ^4.0.0-beta.8 + '@vitest/runner': ^4.0.0-beta.8 vitest: ^4.0.0-beta.8 + vitest-vscode-extension>@vitest/browser: ^3.2.0 + vitest-vscode-extension>@vitest/coverage: ^3.2.0 + vitest-vscode-extension>@vitest/runner: ^3.2.0 + vitest-vscode-extension>vitest: ^3.2.0 + vitest-vscode-shared>@vitest/browser: ^3.2.0 + vitest-vscode-shared>@vitest/coverage: ^3.2.0 + vitest-vscode-shared>@vitest/runner: ^3.2.0 + vitest-vscode-shared>vitest: ^3.2.0 + vitest-vscode-worker-legacy>@vitest/browser: ^3.2.0 + vitest-vscode-worker-legacy>@vitest/coverage: ^3.2.0 + vitest-vscode-worker-legacy>@vitest/runner: ^3.2.0 + vitest-vscode-worker-legacy>vitest: ^3.2.0 importers: @@ -72,8 +82,8 @@ importers: specifier: ^8.5.10 version: 8.18.1 '@vitest/runner': - specifier: 'catalog:' - version: 3.2.3 + specifier: ^4.0.0-beta.8 + version: 4.0.0-beta.8 '@vitest/utils': specifier: 'catalog:' version: 3.2.3 @@ -164,6 +174,9 @@ importers: packages/extension: dependencies: + vitest: + specifier: ^3.2.0 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared @@ -174,8 +187,8 @@ importers: specifier: 2.4.0 version: 2.4.0 vitest: - specifier: ^4.0.0-beta.8 - version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + specifier: ^3.2.0 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) packages/worker: devDependencies: @@ -191,6 +204,9 @@ importers: packages/worker-legacy: dependencies: + vitest: + specifier: ^3.2.0 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) vitest-vscode-shared: specifier: workspace:* version: link:../shared @@ -286,7 +302,7 @@ importers: version: 6.6.3 imba: specifier: ^2.0.0-alpha.235 - version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) jsdom: specifier: ^24.0.0 version: 24.1.3 @@ -295,7 +311,7 @@ importers: version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-imba: specifier: ^0.10.3 - version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -1658,9 +1674,23 @@ packages: vitest: optional: true + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.0-beta.8': resolution: {integrity: sha512-40DZ7nl5AkASkDNaVR7TqsbeJCs5D+dyQNM5cIvgjG3KK+ATeWxtXJbmRNqgdbq+FL3v/pchnrJM1R9BFkTdUQ==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/mocker@4.0.0-beta.8': resolution: {integrity: sha512-a5ynR/Fsrciuq17i8lzS5NH3ICxwFZMlQ4bXPzGV+KlIcVHu20a/8q6KekqUaVBxCbmohORLFXFx9IptHS9gXA==} peerDependencies: @@ -1675,24 +1705,33 @@ packages: '@vitest/pretty-format@3.2.3': resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.0-beta.8': resolution: {integrity: sha512-sr5HPeeRff4gTpDwI2Kvz8dS2CmDCCZ1PRu3IOeLTcSJjhEWmk3IJILjqaA8yyj+QzWjnqAxr2rmZNpO0h/5Vw==} - '@vitest/runner@3.2.3': - resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - '@vitest/runner@4.0.0-beta.8': resolution: {integrity: sha512-m7jrT+KMEgONclBI7y3ptUD+/uhRzzHLblws84fo+WesCjS8WT8q7RoPMgqymj5kmzIF5sTh6NOvrNEE5LaLCQ==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.0-beta.8': resolution: {integrity: sha512-2hzc/ksGlZ8Rcg11VD/AhTwSaPEsdtrNA+TCV4w6tuZ7I2X+XJXimfk/Cehz5zMgfFuV8tFmGimb/BpyIbNiMg==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.0-beta.8': resolution: {integrity: sha512-WfHF35GCf5xx3B1oRrhWMVAfcBBYO4WHAYLbeeaZ1ZSW5/VBXJ/M37bLxRRKnXcgffwcsWA7xpjWnL0dQ1q5NA==} '@vitest/utils@3.2.3': resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.0-beta.8': resolution: {integrity: sha512-+eV3yrDooGMnHHVQ1aqzPJIBlxEsaQg/5BVFRSkbBgfiKqM9HZbqYK736s0D8tfdMLOjeB+7u7Tw0emd/h3MlQ==} @@ -4784,6 +4823,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -4985,8 +5028,8 @@ packages: resolution: {integrity: sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==} engines: {node: '>=4'} - vite-node@3.2.3: - resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -5087,6 +5130,34 @@ packages: peerDependencies: vitest: ^4.0.0-beta.8 + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': ^4.0.0-beta.8 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@4.0.0-beta.8: resolution: {integrity: sha512-wN/RDeCd5uXHV6tELw4AJzeP5rxR4YWXN3ems+59ZummmiovNjlfwG+CEZp5GitlxDQu7muoY4VPrSUxPzzKiQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -6559,6 +6630,28 @@ snapshots: - utf-8-validate - vite + '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.4)': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.0-beta.8 + magic-string: 0.30.17 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + ws: 8.18.3 + optionalDependencies: + playwright: 1.52.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8)': dependencies: '@testing-library/dom': 10.4.1 @@ -6630,6 +6723,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + '@vitest/expect@4.0.0-beta.8': dependencies: '@types/chai': 5.2.2 @@ -6638,6 +6739,15 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + '@vitest/mocker@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 4.0.0-beta.8 @@ -6660,15 +6770,13 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.0-beta.8': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.3': + '@vitest/pretty-format@4.0.0-beta.8': dependencies: - '@vitest/utils': 3.2.3 - pathe: 2.0.3 - strip-literal: 3.0.0 + tinyrainbow: 2.0.0 '@vitest/runner@4.0.0-beta.8': dependencies: @@ -6676,12 +6784,22 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + '@vitest/snapshot@4.0.0-beta.8': dependencies: '@vitest/pretty-format': 4.0.0-beta.8 magic-string: 0.30.17 pathe: 2.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + '@vitest/spy@4.0.0-beta.8': {} '@vitest/utils@3.2.3': @@ -6690,6 +6808,12 @@ snapshots: loupe: 3.2.0 tinyrainbow: 2.0.0 + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + '@vitest/utils@4.0.0-beta.8': dependencies: '@vitest/pretty-format': 4.0.0-beta.8 @@ -8365,7 +8489,7 @@ snapshots: ignore@7.0.5: {} - imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8): + imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8): dependencies: '@antfu/install-pkg': 0.1.1 chokidar: 3.6.0 @@ -8384,7 +8508,7 @@ snapshots: '@testing-library/dom': 9.3.4 '@testing-library/jest-dom': 6.6.3 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - picomatch @@ -10315,6 +10439,8 @@ snapshots: tinyrainbow@2.0.0: {} + tinyspy@4.0.3: {} + tldts-core@6.1.86: {} tldts@6.1.86: @@ -10507,7 +10633,7 @@ snapshots: version-range@4.14.0: {} - vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) @@ -10527,16 +10653,15 @@ snapshots: - terser - tsx - yaml - optional: true - vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): + vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 cross-env: 7.0.3 debug: 4.4.1(supports-color@8.1.1) deepmerge: 4.3.1 diff: 5.2.0 - imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.3(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) kleur: 4.1.5 magic-string: 0.26.7 vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) @@ -10579,6 +10704,51 @@ snapshots: source-map-js: 1.2.1 vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 4.0.0-beta.8 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.0.0 + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.4) + happy-dom: 15.11.7 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 diff --git a/scripts/lower-vitest-version.js b/scripts/lower-vitest-version.js index 691c2178..21e16b2a 100644 --- a/scripts/lower-vitest-version.js +++ b/scripts/lower-vitest-version.js @@ -8,4 +8,4 @@ pkg.pnpm = { 'vitest': '^3.2.4', }, } -writeFileSync('./package.json', JSON.stringify(pkg, null, 2) + '\n', 'utf-8') +writeFileSync('./package.json', `${JSON.stringify(pkg, null, 2)}\n`, 'utf-8') diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index be461f5c..ceda5908 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/api.ts","./src/config.ts","./src/constants.ts","./src/coverage.ts","./src/debug.ts","./src/diagnostic.ts","./src/extension.ts","./src/log.ts","./src/polyfills.ts","./src/runner.ts","./src/tagsmanager.ts","./src/testtree.ts","./src/testtreedata.ts","./src/utils.ts","./src/watcher.ts","./src/api/child_process.ts","./src/api/pkg.ts","./src/api/resolve.ts","./src/api/rpc.ts","./src/api/terminal.ts","./src/api/types.ts","./src/api/ws.ts","./src/worker/collect.ts","./src/worker/coverage.ts","./src/worker/emitter.ts","./src/worker/index.ts","./src/worker/init.ts","./src/worker/reporter.ts","./src/worker/rpc.ts","./src/worker/setupfile.ts","./src/worker/types.ts","./src/worker/utils.ts","./src/worker/watcher.ts","./src/worker/worker.ts","./debug-shims.d.ts"],"version":"5.8.3"} \ No newline at end of file +{"root":["./debug-shims.d.ts","./packages/extension/src/api.ts","./packages/extension/src/config.ts","./packages/extension/src/constants.ts","./packages/extension/src/coverage.ts","./packages/extension/src/debug.ts","./packages/extension/src/diagnostic.ts","./packages/extension/src/extension.ts","./packages/extension/src/log.ts","./packages/extension/src/polyfills.ts","./packages/extension/src/runner.ts","./packages/extension/src/tagsmanager.ts","./packages/extension/src/testtree.ts","./packages/extension/src/testtreedata.ts","./packages/extension/src/utils.ts","./packages/extension/src/watcher.ts","./packages/extension/src/api/child_process.ts","./packages/extension/src/api/pkg.ts","./packages/extension/src/api/resolve.ts","./packages/extension/src/api/rpc.ts","./packages/extension/src/api/terminal.ts","./packages/extension/src/api/types.ts","./packages/extension/src/api/ws.ts","./packages/extension/src/worker/index.ts","./packages/extension/src/worker/setupfile.ts","./packages/shared/src/emitter.ts","./packages/shared/src/index.ts","./packages/shared/src/rpc.ts","./packages/shared/src/utils.ts","./packages/worker/src/coverage.ts","./packages/worker/src/index.ts","./packages/worker/src/reporter.ts","./packages/worker/src/runner.ts","./packages/worker/src/watcher.ts","./packages/worker/src/worker.ts","./packages/worker-legacy/src/collect.ts","./packages/worker-legacy/src/coverage.ts","./packages/worker-legacy/src/index.ts","./packages/worker-legacy/src/reporter.ts","./packages/worker-legacy/src/types.ts","./packages/worker-legacy/src/watcher.ts","./packages/worker-legacy/src/worker.ts"],"version":"5.8.3"} \ No newline at end of file From 362d1716a33a73cfcdf1a0d27e53f3ed8c67ee90 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 15 Aug 2025 16:21:59 +0200 Subject: [PATCH 20/20] chore: simplify catalog --- packages/worker/package.json | 4 +- pnpm-lock.yaml | 211 +++++----------------------------- pnpm-workspace.yaml | 20 +--- samples/basic-v4/package.json | 8 +- 4 files changed, 40 insertions(+), 203 deletions(-) diff --git a/packages/worker/package.json b/packages/worker/package.json index dfeb65a0..58ec159e 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -6,8 +6,8 @@ ".": "./src/index.ts" }, "devDependencies": { - "@vitest/utils": "catalog:latest", - "vitest": "catalog:latest", + "@vitest/utils": "catalog:", + "vitest": "catalog:", "vitest-vscode-shared": "workspace:*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 01f10974..6cac75f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,16 +6,6 @@ settings: catalogs: default: - '@vitest/coverage-v8': - specifier: ^3.2.2 - version: 3.2.3 - '@vitest/utils': - specifier: ^3.2.2 - version: 3.2.3 - vite: - specifier: ^6.3.5 - version: 6.3.5 - latest: '@vitest/coverage-v8': specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8 @@ -86,7 +76,7 @@ importers: version: 4.0.0-beta.8 '@vitest/utils': specifier: 'catalog:' - version: 3.2.3 + version: 4.0.0-beta.8 '@vscode/test-cli': specifier: ^0.0.6 version: 0.0.6 @@ -193,7 +183,7 @@ importers: packages/worker: devDependencies: '@vitest/utils': - specifier: catalog:latest + specifier: 'catalog:' version: 4.0.0-beta.8 vitest: specifier: ^4.0.0-beta.8 @@ -219,10 +209,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -235,10 +225,10 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -249,10 +239,10 @@ importers: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) '@vitest/coverage-v8': - specifier: catalog:latest + specifier: 'catalog:' version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) vite: - specifier: catalog:latest + specifier: 'catalog:' version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 @@ -266,16 +256,16 @@ importers: devDependencies: '@vitest/browser': specifier: ^4.0.0-beta.8 - version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) playwright: specifier: ^1.47.0 version: 1.52.0 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -302,16 +292,16 @@ importers: version: 6.6.3 imba: specifier: ^2.0.0-alpha.235 - version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + version: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) jsdom: specifier: ^24.0.0 version: 24.1.3 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-imba: specifier: ^0.10.3 - version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) + version: 0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -323,7 +313,7 @@ importers: devDependencies: vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -332,7 +322,7 @@ importers: devDependencies: '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) happy-dom: specifier: ^15.7.4 version: 15.11.7 @@ -416,10 +406,10 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.2.4(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)) + version: 5.2.4(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) + version: 4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8) '@vue/test-utils': specifier: ^2.4.5 version: 2.4.6 @@ -428,7 +418,7 @@ importers: version: 14.7.1 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + version: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^4.0.0-beta.8 version: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@14.7.1)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) @@ -1644,15 +1634,6 @@ packages: webdriverio: optional: true - '@vitest/coverage-v8@3.2.3': - resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} - peerDependencies: - '@vitest/browser': ^4.0.0-beta.8 - vitest: ^4.0.0-beta.8 - peerDependenciesMeta: - '@vitest/browser': - optional: true - '@vitest/coverage-v8@4.0.0-beta.8': resolution: {integrity: sha512-vd8D6P/PWtHXjH5Sot8PuGKchYC7Uns46Dpr1fg57kD8SOdXJybxtg/EdYvD5/OUW2q0iQCFes79WbH+LelwaA==} peerDependencies: @@ -1702,9 +1683,6 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.3': - resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} @@ -1726,9 +1704,6 @@ packages: '@vitest/spy@4.0.0-beta.8': resolution: {integrity: sha512-WfHF35GCf5xx3B1oRrhWMVAfcBBYO4WHAYLbeeaZ1ZSW5/VBXJ/M37bLxRRKnXcgffwcsWA7xpjWnL0dQ1q5NA==} - '@vitest/utils@3.2.3': - resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} - '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} @@ -4780,10 +4755,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5044,46 +5015,6 @@ packages: diff-match-patch: optional: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.1.2: resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6604,32 +6535,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))': dependencies: - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vue: 3.5.16(typescript@5.8.3) - '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8)': - dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)) - '@vitest/utils': 4.0.0-beta.8 - magic-string: 0.30.17 - pixelmatch: 7.1.0 - pngjs: 7.0.0 - sirv: 3.0.1 - tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - ws: 8.18.3 - optionalDependencies: - playwright: 1.52.0 - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - '@vitest/browser@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 @@ -6673,27 +6583,6 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@3.2.3(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@26.1.0)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) - optionalDependencies: - '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) - transitivePeerDependencies: - - supports-color - '@vitest/coverage-v8@4.0.0-beta.8(@vitest/browser@4.0.0-beta.8)(vitest@4.0.0-beta.8)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -6748,15 +6637,6 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': - dependencies: - '@vitest/spy': 4.0.0-beta.8 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 4.0.0-beta.8 @@ -6766,10 +6646,6 @@ snapshots: msw: 2.10.2(@types/node@24.0.0)(typescript@5.8.3) vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/pretty-format@3.2.3': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -6802,12 +6678,6 @@ snapshots: '@vitest/spy@4.0.0-beta.8': {} - '@vitest/utils@3.2.3': - dependencies: - '@vitest/pretty-format': 3.2.3 - loupe: 3.2.0 - tinyrainbow: 2.0.0 - '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 @@ -8145,10 +8015,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.6(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -8489,7 +8355,7 @@ snapshots: ignore@7.0.5: {} - imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8): + imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8): dependencies: '@antfu/install-pkg': 0.1.1 chokidar: 3.6.0 @@ -8507,7 +8373,7 @@ snapshots: optionalDependencies: '@testing-library/dom': 9.3.4 '@testing-library/jest-dom': 6.6.3 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vite-node: 3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) vitest: 4.0.0-beta.8(@types/debug@4.1.12)(@types/node@24.0.0)(@vitest/browser@4.0.0-beta.8)(happy-dom@15.11.7)(jiti@2.4.2)(jsdom@24.1.3)(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: @@ -10390,12 +10256,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - text-table@0.2.0: {} textextensions@6.11.0: @@ -10654,35 +10514,20 @@ snapshots: - tsx - yaml - vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): + vite-plugin-imba@0.10.3(imba@2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 cross-env: 7.0.3 debug: 4.4.1(supports-color@8.1.1) deepmerge: 4.3.1 diff: 5.2.0 - imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + imba: 2.0.0-alpha.247(@testing-library/dom@9.3.4)(@testing-library/jest-dom@6.6.3)(picomatch@4.0.3)(vite-node@3.2.4(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) kleur: 4.1.5 magic-string: 0.26.7 - vite: 6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.4 - rollup: 4.42.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 24.0.0 - fsevents: 2.3.3 - jiti: 2.4.2 - tsx: 4.19.4 - yaml: 2.8.0 - vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 @@ -10777,7 +10622,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) happy-dom: 14.7.1 jsdom: 26.1.0 transitivePeerDependencies: @@ -10822,7 +10667,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.0.0 - '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@6.3.5(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) + '@vitest/browser': 4.0.0-beta.8(msw@2.10.2(@types/node@24.0.0)(typescript@5.8.3))(playwright@1.52.0)(vite@7.1.2(@types/node@24.0.0)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.8.0))(vitest@4.0.0-beta.8) happy-dom: 15.11.7 jsdom: 24.1.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ec3d268..c0e317bd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,18 +5,10 @@ packages: - samples/monorepo-vitest-workspace/packages/* catalog: - '@vitest/browser': ^3.2.2 - '@vitest/coverage-istanbul': ^3.2.2 - '@vitest/coverage-v8': ^3.2.2 - '@vitest/runner': ^3.2.2 - '@vitest/utils': ^3.2.2 - vite: ^6.3.5 + '@vitest/browser': ^4.0.0-beta.8 + '@vitest/coverage-istanbul': ^4.0.0-beta.8 + '@vitest/coverage-v8': ^4.0.0-beta.8 + '@vitest/runner': ^4.0.0-beta.8 + '@vitest/utils': ^4.0.0-beta.8 + vite: ^7.1.0 vitest: ^3.2.2 - -catalogs: - latest: - '@vitest/browser': ^4.0.0-beta.8 - '@vitest/coverage-v8': ^4.0.0-beta.8 - '@vitest/utils': ^4.0.0-beta.8 - vite: ^7.1.0 - vitest: ^4.0.0-beta.8 diff --git a/samples/basic-v4/package.json b/samples/basic-v4/package.json index 2e2a52c7..0291b284 100644 --- a/samples/basic-v4/package.json +++ b/samples/basic-v4/package.json @@ -9,9 +9,9 @@ "test": "vitest run" }, "devDependencies": { - "@vitest/browser": "catalog:latest", - "@vitest/coverage-v8": "catalog:latest", - "vite": "catalog:latest", - "vitest": "catalog:latest" + "@vitest/browser": "catalog:", + "@vitest/coverage-v8": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" } }