From 6ee283807d4244bb9d251dd16ca55b18848a7615 Mon Sep 17 00:00:00 2001 From: Joao Victor Piga Lopes Date: Mon, 13 Jan 2025 09:21:49 -0300 Subject: [PATCH 1/6] fix (coverage-v8): add instance validation to resolve error --- packages/vitest/src/node/config/resolveConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/config/resolveConfig.ts b/packages/vitest/src/node/config/resolveConfig.ts index 24f1a59d8687..515c78aa7687 100644 --- a/packages/vitest/src/node/config/resolveConfig.ts +++ b/packages/vitest/src/node/config/resolveConfig.ts @@ -252,13 +252,13 @@ export function resolveConfig( } // Browser-mode "Playwright + Chromium" only features: - if (browser.enabled && !(browser.provider === 'playwright' && browser.name === 'chromium')) { + if (browser.enabled && !(browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.find(i => i.browser === 'chromium')))) { const browserConfig = { browser: { provider: browser.provider, name: browser.name } } if (resolved.coverage.enabled && resolved.coverage.provider === 'v8') { throw new Error( `@vitest/coverage-v8 does not work with\n${JSON.stringify(browserConfig, null, 2)}\n` - + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}` + + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}` + `\n\n...or change your coverage provider to:\n${JSON.stringify({ coverage: { provider: 'istanbul' } }, null, 2)}\n`, ) } From d808bb337ac1241f3d726f49f3ff608c8f6b17fc Mon Sep 17 00:00:00 2001 From: Joao Victor Piga Lopes Date: Mon, 13 Jan 2025 09:44:51 -0300 Subject: [PATCH 2/6] fix (coverage-v8): add instance validation to resolve error --- packages/vitest/src/node/config/resolveConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/config/resolveConfig.ts b/packages/vitest/src/node/config/resolveConfig.ts index 515c78aa7687..0a27c4b4d53f 100644 --- a/packages/vitest/src/node/config/resolveConfig.ts +++ b/packages/vitest/src/node/config/resolveConfig.ts @@ -252,13 +252,13 @@ export function resolveConfig( } // Browser-mode "Playwright + Chromium" only features: - if (browser.enabled && !(browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.find(i => i.browser === 'chromium')))) { + if (browser.enabled && !(browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.find(i => i?.browser === 'chromium')))) { const browserConfig = { browser: { provider: browser.provider, name: browser.name } } if (resolved.coverage.enabled && resolved.coverage.provider === 'v8') { throw new Error( `@vitest/coverage-v8 does not work with\n${JSON.stringify(browserConfig, null, 2)}\n` - + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}` + + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}` + `\n\n...or change your coverage provider to:\n${JSON.stringify({ coverage: { provider: 'istanbul' } }, null, 2)}\n`, ) } From 02c49d0508c66ef4b7a03349658d3931fde687fc Mon Sep 17 00:00:00 2001 From: Joao Victor Piga Lopes Date: Mon, 13 Jan 2025 10:32:34 -0300 Subject: [PATCH 3/6] feat: add new message in error --- docs/guide/debugging.md | 11 +++++------ packages/vitest/src/node/config/resolveConfig.ts | 2 +- test/config/test/failures.test.ts | 6 +++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/guide/debugging.md b/docs/guide/debugging.md index 9d0dc2054652..3c41d14736ca 100644 --- a/docs/guide/debugging.md +++ b/docs/guide/debugging.md @@ -55,12 +55,11 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { - inspectBrk: true, - fileParallelism: false, - browser: { - name: 'chromium', - provider: 'playwright', - }, + provider: 'playwright', + enabled: true, + instances: [ + { browser: 'chromium' }, + ], }, }) ``` diff --git a/packages/vitest/src/node/config/resolveConfig.ts b/packages/vitest/src/node/config/resolveConfig.ts index 0a27c4b4d53f..d8e033875af2 100644 --- a/packages/vitest/src/node/config/resolveConfig.ts +++ b/packages/vitest/src/node/config/resolveConfig.ts @@ -258,7 +258,7 @@ export function resolveConfig( if (resolved.coverage.enabled && resolved.coverage.provider === 'v8') { throw new Error( `@vitest/coverage-v8 does not work with\n${JSON.stringify(browserConfig, null, 2)}\n` - + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}` + + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}` + `\n\n...or change your coverage provider to:\n${JSON.stringify({ coverage: { provider: 'istanbul' } }, null, 2)}\n`, ) } diff --git a/test/config/test/failures.test.ts b/test/config/test/failures.test.ts index 74a42e121db2..c70b130d8bd1 100644 --- a/test/config/test/failures.test.ts +++ b/test/config/test/failures.test.ts @@ -152,7 +152,11 @@ Use either: { "browser": { "provider": "playwright", - "name": "chromium" + "instances": [ + { + "browser": "chromium" + } + ] } } From 583896e239f31c127957e48daa414a352a914268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Wed, 15 Jan 2025 11:00:02 +0200 Subject: [PATCH 4/6] fix: review --- .../vitest/src/node/config/resolveConfig.ts | 10 ++- packages/vitest/src/node/types/browser.ts | 4 +- .../browser/workspace-with-browser.ts | 2 +- test/config/test/failures.test.ts | 67 ++++++++++++++++++- 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/packages/vitest/src/node/config/resolveConfig.ts b/packages/vitest/src/node/config/resolveConfig.ts index d8e033875af2..26d484b68c5e 100644 --- a/packages/vitest/src/node/config/resolveConfig.ts +++ b/packages/vitest/src/node/config/resolveConfig.ts @@ -253,7 +253,13 @@ export function resolveConfig( // Browser-mode "Playwright + Chromium" only features: if (browser.enabled && !(browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.find(i => i?.browser === 'chromium')))) { - const browserConfig = { browser: { provider: browser.provider, name: browser.name } } + const browserConfig = { + browser: { + provider: browser.provider, + name: browser.name, + instances: browser.instances, + }, + } if (resolved.coverage.enabled && resolved.coverage.provider === 'v8') { throw new Error( @@ -268,7 +274,7 @@ export function resolveConfig( throw new Error( `${inspectOption} does not work with\n${JSON.stringify(browserConfig, null, 2)}\n` - + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}` + + `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}` + `\n\n...or disable ${inspectOption}\n`, ) } diff --git a/packages/vitest/src/node/types/browser.ts b/packages/vitest/src/node/types/browser.ts index 8ff550fbca6d..3c51fbd385bd 100644 --- a/packages/vitest/src/node/types/browser.ts +++ b/packages/vitest/src/node/types/browser.ts @@ -93,7 +93,7 @@ export interface BrowserConfigOptions { /** * Name of the browser - * @deprecated use `configs` instead. if both are defined, this will filter `configs` by name. + * @deprecated use `instances` instead. if both are defined, this will filter `instances` by name. */ name?: string @@ -118,7 +118,7 @@ export interface BrowserConfigOptions { * * @example * { playwright: { launch: { devtools: true } } - * @deprecated use `configs` instead + * @deprecated use `instances` instead */ providerOptions?: BrowserProviderOptions diff --git a/test/config/fixtures/workspace/browser/workspace-with-browser.ts b/test/config/fixtures/workspace/browser/workspace-with-browser.ts index 96764a79256c..0f3a52dcb9c7 100644 --- a/test/config/fixtures/workspace/browser/workspace-with-browser.ts +++ b/test/config/fixtures/workspace/browser/workspace-with-browser.ts @@ -7,7 +7,7 @@ export default defineWorkspace([ browser: { enabled: true, provider: 'webdriverio', - name: 'chrome' + instances: [{ browser: 'chrome' }] }, } } diff --git a/test/config/test/failures.test.ts b/test/config/test/failures.test.ts index c70b130d8bd1..0d73b39ffefe 100644 --- a/test/config/test/failures.test.ts +++ b/test/config/test/failures.test.ts @@ -111,7 +111,11 @@ Use either: { "browser": { "provider": "playwright", - "name": "chromium" + "instances": [ + { + "browser": "chromium" + } + ] } } @@ -122,7 +126,7 @@ Use either: } }) -test('v8 coverage provider throws when not playwright + chromium', async () => { +test('v8 coverage provider throws when not playwright + chromium (browser.name)', async () => { for (const { provider, name } of browsers) { if (provider === 'playwright' && name === 'chromium') { continue @@ -171,6 +175,59 @@ Use either: } }) +test('v8 coverage provider throws when not playwright + chromium (browser.instances)', async () => { + for (const { provider, name } of browsers) { + if (provider === 'playwright' && name === 'chromium') { + continue + } + + const { stderr } = await runVitest({ + coverage: { + enabled: true, + }, + browser: { + enabled: true, + provider, + instances: [{ browser: name }], + }, + }) + + expect(stderr).toMatch( + `Error: @vitest/coverage-v8 does not work with +{ + "browser": { + "provider": "${provider}", + "instances": [ + { + "browser": "${name}" + } + ] + } +} + +Use either: +{ + "browser": { + "provider": "playwright", + "instances": [ + { + "browser": "chromium" + } + ] + } +} + +...or change your coverage provider to: +{ + "coverage": { + "provider": "istanbul" + } +} +`, + ) + } +}) + test('v8 coverage provider cannot be used in workspace without playwright + chromium', async () => { const { stderr } = await runVitest({ coverage: { enabled: true }, workspace: './fixtures/workspace/browser/workspace-with-browser.ts' }) expect(stderr).toMatch( @@ -178,7 +235,11 @@ test('v8 coverage provider cannot be used in workspace without playwright + chro { "browser": { "provider": "webdriverio", - "name": "chrome" + "instances": [ + { + "browser": "chrome" + } + ] } }`, ) From 0edfd15cda21f8279e1bc8b0f2cdd45a07823ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Wed, 15 Jan 2025 11:17:39 +0200 Subject: [PATCH 5/6] fix: check all `browser.instances` browsers --- .../vitest/src/node/config/resolveConfig.ts | 4 +- test/config/test/failures.test.ts | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/node/config/resolveConfig.ts b/packages/vitest/src/node/config/resolveConfig.ts index 26d484b68c5e..f55d9d3ecbe3 100644 --- a/packages/vitest/src/node/config/resolveConfig.ts +++ b/packages/vitest/src/node/config/resolveConfig.ts @@ -251,8 +251,10 @@ export function resolveConfig( } } + const playwrightChromiumOnly = browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.every(i => i.browser === 'chromium')) + // Browser-mode "Playwright + Chromium" only features: - if (browser.enabled && !(browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.find(i => i?.browser === 'chromium')))) { + if (browser.enabled && !playwrightChromiumOnly) { const browserConfig = { browser: { provider: browser.provider, diff --git a/test/config/test/failures.test.ts b/test/config/test/failures.test.ts index 0d73b39ffefe..0e1d4cadf50e 100644 --- a/test/config/test/failures.test.ts +++ b/test/config/test/failures.test.ts @@ -228,6 +228,63 @@ Use either: } }) +test('v8 coverage provider throws when using chromium and other non-chromium browser', async () => { + const { stderr } = await runVitest({ + coverage: { + enabled: true, + }, + browser: { + enabled: true, + headless: true, + provider: 'playwright', + instances: [ + { browser: 'chromium' }, + { browser: 'firefox' }, + { browser: 'webkit' }, + ], + }, + }) + + expect(stderr).toMatch( + `Error: @vitest/coverage-v8 does not work with +{ + "browser": { + "provider": "playwright", + "instances": [ + { + "browser": "chromium" + }, + { + "browser": "firefox" + }, + { + "browser": "webkit" + } + ] + } +} + +Use either: +{ + "browser": { + "provider": "playwright", + "instances": [ + { + "browser": "chromium" + } + ] + } +} + +...or change your coverage provider to: +{ + "coverage": { + "provider": "istanbul" + } +}`, + ) +}) + test('v8 coverage provider cannot be used in workspace without playwright + chromium', async () => { const { stderr } = await runVitest({ coverage: { enabled: true }, workspace: './fixtures/workspace/browser/workspace-with-browser.ts' }) expect(stderr).toMatch( From 5c289e90ac878e2473bbd938b2c295ccf3fe05e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Wed, 15 Jan 2025 11:32:11 +0200 Subject: [PATCH 6/6] docs: revert debug info removal --- docs/guide/debugging.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/guide/debugging.md b/docs/guide/debugging.md index 3c41d14736ca..0e0fd934dd05 100644 --- a/docs/guide/debugging.md +++ b/docs/guide/debugging.md @@ -55,11 +55,12 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { - provider: 'playwright', - enabled: true, - instances: [ - { browser: 'chromium' }, - ], + inspectBrk: true, + fileParallelism: false, + browser: { + provider: 'playwright', + instances: [{ browser: 'chromium' }] + }, }, }) ```