From c0606e5b1c7d9a85182f1faf8cf0caae00a5580e Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 27 Mar 2024 19:33:30 +0100 Subject: [PATCH] fix: correctly report errors if vitest failed to resolve --- package.json | 5 +++++ samples/basic/.skip/vitest.config.ts | 1 + src/api.ts | 33 +++++++++++++++++----------- src/extension.ts | 5 ++++- src/log.ts | 3 +++ src/utils.ts | 4 ++++ src/worker/worker.ts | 2 +- 7 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 samples/basic/.skip/vitest.config.ts diff --git a/package.json b/package.json index fbae2e1..e6ce810 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,11 @@ "title": "Update Snapshot", "command": "vitest.updateSnapshot", "category": "Vitest" + }, + { + "title": "Show Output Channel", + "command": "vitest.openOutput", + "category": "Vitest" } ], "menus": { diff --git a/samples/basic/.skip/vitest.config.ts b/samples/basic/.skip/vitest.config.ts new file mode 100644 index 0000000..9148068 --- /dev/null +++ b/samples/basic/.skip/vitest.config.ts @@ -0,0 +1 @@ +throw new Error('do not import') \ No newline at end of file diff --git a/src/api.ts b/src/api.ts index 3fb90b7..01f0975 100644 --- a/src/api.ts +++ b/src/api.ts @@ -9,9 +9,9 @@ import { workerPath } from './constants' import { getConfig } from './config' import type { BirpcEvents, VitestEvents, VitestRPC } from './api/rpc' import { createVitestRpc } from './api/rpc' -import type { TestTree } from './testTree' import type { WorkerRunnerOptions } from './worker/types' import type { VitestPackage } from './api/pkg' +import { pluralize } from './utils' export class VitestReporter { constructor( @@ -143,8 +143,8 @@ export class VitestFolderAPI extends VitestReporter { } } -export async function resolveVitestAPI(tree: TestTree, packages: VitestPackage[]) { - const vitest = await createVitestProcess(tree, packages) +export async function resolveVitestAPI(showWarning: boolean, packages: VitestPackage[]) { + const vitest = await createVitestProcess(showWarning, packages) const apis = packages.map(pkg => new VitestFolderAPI(pkg, vitest), ) @@ -167,7 +167,7 @@ interface ResolvedMeta { } } -function createChildVitestProcess(tree: TestTree, meta: VitestPackage[]) { +function createChildVitestProcess(showWarning: boolean, meta: VitestPackage[]) { const pnpLoaders = [ ...new Set(meta.map(meta => meta.loader).filter(Boolean) as string[]), ] @@ -218,15 +218,22 @@ function createChildVitestProcess(tree: TestTree, meta: VitestPackage[]) { vitest.off('message', ready) // started _some_ projects, but some failed - log them, this can only happen if there are multiple projects if (message.errors.length) { - message.errors.forEach(([configFile, error]: [string, string]) => { - const metaIndex = meta.findIndex(m => m.id === configFile) - const metaItem = meta[metaIndex] - const workspaceItem = tree.getOrCreateWorkspaceFolderItem(metaItem.folder.uri) - workspaceItem.error = error // display error message in the tree - workspaceItem.canResolveChildren = false + message.errors.forEach(([id, error]: [string, string]) => { + const metaIndex = meta.findIndex(m => m.id === id) meta.splice(metaIndex, 1) - log.error('[API]', `Vitest failed to start for ${configFile}: \n${error}`) + log.error('[API]', `Vitest failed to start for ${id}: \n${error}`) }) + if (showWarning) { + const errorsNumber = message.errors.length + const resultButton = errorsNumber > 1 ? 'See errors' : 'See error' + vscode.window.showWarningMessage( + `There ${errorsNumber > 1 ? 'were' : 'was'} ${pluralize(message.errors.length, 'error')} during Vitest startup. Check the output for more details.`, + resultButton, + ).then((result) => { + if (result === resultButton) + vscode.commands.executeCommand('vitest.openOutput') + }) + } } resolve(vitest) } @@ -254,10 +261,10 @@ function createChildVitestProcess(tree: TestTree, meta: VitestPackage[]) { }) } -export async function createVitestProcess(tree: TestTree, packages: VitestPackage[]): Promise { +export async function createVitestProcess(showWarning: boolean, packages: VitestPackage[]): Promise { log.info('[API]', `Running Vitest: ${packages.map(x => `v${x.version} (${x.id})`).join(', ')}`) - const vitest = await createChildVitestProcess(tree, packages) + const vitest = await createChildVitestProcess(showWarning, packages) log.info('[API]', `Vitest process ${vitest.pid} created`) diff --git a/src/extension.ts b/src/extension.ts index de62bf2..37c5fe6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -86,7 +86,7 @@ class VitestExtension { try { await this.api?.dispose() - this.api = await resolveVitestAPI(this.testTree, vitest) + this.api = await resolveVitestAPI(showWarning, vitest) for (const api of this.api.folderAPIs) { await this.testTree.watchTestFilesInWorkspace( @@ -168,6 +168,9 @@ class VitestExtension { if (event.affectsConfiguration('vitest.packagePath') || event.affectsConfiguration('vitest.nodeExecutable')) this.defineTestProfiles(false) }), + vscode.commands.registerCommand('vitest.openOutput', () => { + log.openOuput() + }), ] // if the config changes, re-define all test profiles diff --git a/src/log.ts b/src/log.ts index d3ae37e..b9cacf0 100644 --- a/src/log.ts +++ b/src/log.ts @@ -33,4 +33,7 @@ export const log = { workspaceError: (folder: string, ...args: any[]) => { log.error(`[Workspace ${folder}]`, ...args) }, + openOuput() { + _log.show() + }, } as const diff --git a/src/utils.ts b/src/utils.ts index a5c5d26..00471d7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -29,3 +29,7 @@ export default defineWorkspace([ await vscode.window.showInformationMessage('Created vitest.workspace.js. You might need to run \`npm i --save-dev vitest\` in the root folder to install Vitest.') } + +export function pluralize(count: number, singular: string) { + return `${count} ${singular}${count === 1 ? '' : 's'}` +} diff --git a/src/worker/worker.ts b/src/worker/worker.ts index f65783a..8223549 100644 --- a/src/worker/worker.ts +++ b/src/worker/worker.ts @@ -123,7 +123,7 @@ process.on('message', async function init(message: any) { vitest.push(await initVitest(meta)) } catch (err: any) { - errors.push([meta.configFile, err.stack]) + errors.push([meta.id, err.stack]) } } process.chdir(cwd) -- 2.51.2