diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5056a27eed4d..40f16d68efae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -125,20 +125,23 @@ jobs: - uses: browser-actions/setup-chrome@v1 - uses: browser-actions/setup-firefox@v1 - uses: browser-actions/setup-edge@v1 + id: setup-edge with: - edge-version: beta + edge-version: stable - name: Install run: pnpm i - name: Install Playwright Dependencies - run: pnpx playwright install-deps + run: pnpx playwright install --with-deps - name: Build run: pnpm run build - name: Test Browser (webdriverio) run: pnpm run test:browser:webdriverio + env: + EDGEDRIVER_VERSION: ${{ steps.setup-edge.outputs.edge-version }} - name: Test Browser (playwright) run: pnpm run test:browser:playwright @@ -169,7 +172,7 @@ jobs: run: pnpm i - name: Install Playwright Dependencies - run: pnpx playwright install-deps + run: pnpx playwright install --with-deps - name: Build run: pnpm run build @@ -181,29 +184,3 @@ jobs: run: pnpm run test:browser:playwright env: BROWSER: ${{ matrix.browser[1] }} - - test-browser-safari: - runs-on: macos-latest - timeout-minutes: 30 - - steps: - - uses: actions/checkout@v4 - - - uses: ./.github/actions/setup-and-cache - with: - node-version: 20 - - - name: Install - run: sudo pnpm i --frozen-lockfile - - - name: Build - run: sudo pnpm run build - - - name: Enable - run: sudo safaridriver --enable - - - name: Test Browser (webdriverio) - run: sudo BROWSER=safari pnpm run test:browser:webdriverio - - - name: Test Browser (playwright) - run: sudo BROWSER=webkit pnpm run test:browser:playwright diff --git a/docs/config/index.md b/docs/config/index.md index c7141fa35a4f..e5585da5d37c 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1332,7 +1332,7 @@ Path to a provider that will be used when running browser tests. Vitest provides export interface BrowserProvider { name: string getSupportedBrowsers(): readonly string[] - initialize(ctx: Vitest, options: { browser: string }): Awaitable + initialize(ctx: Vitest, options: { browser: string; options?: BrowserProviderOptions }): Awaitable openPage(url: string): Awaitable close(): Awaitable } @@ -1342,6 +1342,42 @@ export interface BrowserProvider { This is an advanced API for library authors. If you just need to run tests in a browser, use the [browser](/config/#browser) option. ::: +#### browser.providerOptions + +- **Type:** `BrowserProviderOptions` +- **Version:** Since Vitest 1.0.0-beta.3 + +Options that will be passed down to provider when calling `provider.initialize`. + +```ts +export default defineConfig({ + test: { + browser: { + providerOptions: { + launch: { + devtools: true, + } + } + } + } +}) +``` + +::: tip +To have a better type safety when using built-in providers, you can add one of these types (for provider that you are using) to your tsconfig's `compilerOptions.types` field: + +```json +{ + "compilerOptions": { + "types": [ + "@vitest/browser/providers/webdriverio", + "@vitest/browser/providers/playwright" + ] + } +} +``` +::: + #### browser.slowHijackESM - **Type:** `boolean` diff --git a/examples/playwright/package.json b/examples/playwright/package.json index 7a5058edd8c4..c8adcc436e27 100644 --- a/examples/playwright/package.json +++ b/examples/playwright/package.json @@ -7,9 +7,9 @@ "test:ui": "vite build && vitest --ui" }, "devDependencies": { - "@playwright/test": "^1.28.0", + "@playwright/test": "^1.39.0", "@vitest/ui": "latest", - "playwright": "^1.28.0", + "playwright": "^1.39.0", "vite": "latest", "vitest": "latest" } diff --git a/packages/browser/package.json b/packages/browser/package.json index 03c51af97593..1b942145bdf0 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -20,6 +20,16 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js" }, + "./providers": { + "types": "./providers.d.ts", + "import": "./dist/providers.js" + }, + "./providers/webdriverio": { + "types": "./dist/providers/webdriverio.d.ts" + }, + "./providers/playwright": { + "types": "./dist/providers/playwright.d.ts" + }, "./*": "./*" }, "main": "./dist/index.js", @@ -27,7 +37,7 @@ "types": "./dist/index.d.ts", "files": [ "dist", - "stubs" + "providers" ], "scripts": { "build": "rimraf dist && pnpm build:node && pnpm build:client", @@ -39,7 +49,21 @@ "prepublishOnly": "pnpm build" }, "peerDependencies": { - "vitest": "^1.0.0-0" + "playwright": "*", + "safaridriver": "*", + "vitest": "^1.0.0-0", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "webdriverio": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "playwright": { + "optional": true + } }, "dependencies": { "estree-walker": "^3.0.3", @@ -52,7 +76,12 @@ "@vitest/runner": "workspace:*", "@vitest/ui": "workspace:*", "@vitest/ws-client": "workspace:*", + "@wdio/protocols": "^8.18.0", "periscopic": "^3.1.0", - "vitest": "workspace:*" + "playwright": "^1.39.0", + "playwright-core": "^1.39.0", + "safaridriver": "^0.1.0", + "vitest": "workspace:*", + "webdriverio": "^8.20.0" } } diff --git a/packages/browser/providers.d.ts b/packages/browser/providers.d.ts new file mode 100644 index 000000000000..b2b8f375cd26 --- /dev/null +++ b/packages/browser/providers.d.ts @@ -0,0 +1,6 @@ +import type { BrowserProvider } from 'vitest/nide' + +declare var webdriverio: BrowserProvider +declare var playwright: BrowserProvider + +export { webdriverio, playwright } diff --git a/packages/browser/providers/playwright.d.ts b/packages/browser/providers/playwright.d.ts new file mode 100644 index 000000000000..0c2c99266b27 --- /dev/null +++ b/packages/browser/providers/playwright.d.ts @@ -0,0 +1,8 @@ +import type { Browser, LaunchOptions } from 'playwright' + +declare module 'vitest/node' { + interface BrowserProviderOptions { + launch?: LaunchOptions + page?: Parameters[0] + } +} diff --git a/packages/browser/providers/webdriverio.d.ts b/packages/browser/providers/webdriverio.d.ts new file mode 100644 index 000000000000..06550f11162a --- /dev/null +++ b/packages/browser/providers/webdriverio.d.ts @@ -0,0 +1,5 @@ +import type { RemoteOptions } from 'webdriverio' + +declare module 'vitest/node' { + interface BrowserProviderOptions extends RemoteOptions {} +} diff --git a/packages/browser/rollup.config.js b/packages/browser/rollup.config.js index 5f7481420fe6..26315b52112e 100644 --- a/packages/browser/rollup.config.js +++ b/packages/browser/rollup.config.js @@ -8,6 +8,8 @@ import pkg from './package.json' assert { type: 'json' } const external = [ ...Object.keys(pkg.dependencies), ...Object.keys(pkg.peerDependencies || {}), + 'vitest/node', + 'vitest', 'worker_threads', 'node:worker_threads', ] @@ -23,11 +25,14 @@ const plugins = [ }), ] +const input = { + index: './src/node/index.ts', + providers: './src/node/providers/index.ts', +} + export default () => [ { - input: [ - './src/node/index.ts', - ], + input, output: { dir: 'dist', format: 'esm', @@ -36,7 +41,7 @@ export default () => [ plugins, }, { - input: './src/node/index.ts', + input: input.index, output: { file: 'dist/index.d.ts', format: 'esm', diff --git a/packages/browser/src/client/main.ts b/packages/browser/src/client/main.ts index 7a5344ac1cb2..841858af8735 100644 --- a/packages/browser/src/client/main.ts +++ b/packages/browser/src/client/main.ts @@ -70,6 +70,8 @@ async function defaultErrorReport(type: string, unhandledError: any) { message: unhandledError.message, stack: unhandledError.stack, } + if (testId !== 'no-isolate') + error.VITEST_TEST_PATH = testId await client.rpc.onUnhandledError(error, type) await client.rpc.onDone(testId) } @@ -81,7 +83,10 @@ let runningTests = false async function reportUnexpectedError(rpc: typeof client.rpc, type: string, error: any) { const { processError } = await importId('vitest/browser') as typeof import('vitest/browser') - await rpc.onUnhandledError(processError(error), type) + const processedError = processError(error) + if (testId !== 'no-isolate') + error.VITEST_TEST_PATH = testId + await rpc.onUnhandledError(processedError, type) if (!runningTests) await rpc.onDone(testId) } diff --git a/packages/browser/src/node/providers/index.ts b/packages/browser/src/node/providers/index.ts new file mode 100644 index 000000000000..26f3c240c5e0 --- /dev/null +++ b/packages/browser/src/node/providers/index.ts @@ -0,0 +1,5 @@ +import { PlaywrightBrowserProvider } from './playwright' +import { WebdriverBrowserProvider } from './webdriver' + +export const webdriverio = WebdriverBrowserProvider +export const playwright = PlaywrightBrowserProvider diff --git a/packages/browser/src/node/providers/playwright.ts b/packages/browser/src/node/providers/playwright.ts new file mode 100644 index 000000000000..a1e389066756 --- /dev/null +++ b/packages/browser/src/node/providers/playwright.ts @@ -0,0 +1,80 @@ +import type { Browser, LaunchOptions, Page } from 'playwright' +import type { BrowserProvider, BrowserProviderInitializationOptions, WorkspaceProject } from 'vitest/node' +import { ensurePackageInstalled } from 'vitest/node' + +type Awaitable = T | PromiseLike + +export const playwrightBrowsers = ['firefox', 'webkit', 'chromium'] as const +export type PlaywrightBrowser = typeof playwrightBrowsers[number] + +export interface PlaywrightProviderOptions extends BrowserProviderInitializationOptions { + browser: PlaywrightBrowser +} + +export class PlaywrightBrowserProvider implements BrowserProvider { + public name = 'playwright' + + private cachedBrowser: Browser | null = null + private cachedPage: Page | null = null + private browser!: PlaywrightBrowser + private ctx!: WorkspaceProject + + private options?: { + launch?: LaunchOptions + page?: Parameters[0] + } + + getSupportedBrowsers() { + return playwrightBrowsers + } + + async initialize(ctx: WorkspaceProject, { browser, options }: PlaywrightProviderOptions) { + this.ctx = ctx + this.browser = browser + this.options = options as any + + const root = this.ctx.config.root + + if (!await ensurePackageInstalled('playwright', root)) + throw new Error('Cannot find "playwright" package. Please install it manually.') + } + + private async openBrowserPage() { + if (this.cachedPage) + return this.cachedPage + + const options = this.ctx.config.browser + + const playwright = await import('playwright') + + const browser = await playwright[this.browser].launch({ + ...this.options?.launch, + headless: options.headless, + }) + this.cachedBrowser = browser + this.cachedPage = await browser.newPage(this.options?.page) + + this.cachedPage.on('close', () => { + browser.close() + }) + + return this.cachedPage + } + + catchError(cb: (error: Error) => Awaitable) { + this.cachedPage?.on('pageerror', cb) + return () => { + this.cachedPage?.off('pageerror', cb) + } + } + + async openPage(url: string) { + const browserPage = await this.openBrowserPage() + await browserPage.goto(url) + } + + async close() { + await this.cachedPage?.close() + await this.cachedBrowser?.close() + } +} diff --git a/packages/vitest/src/node/browser/webdriver.ts b/packages/browser/src/node/providers/webdriver.ts similarity index 52% rename from packages/vitest/src/node/browser/webdriver.ts rename to packages/browser/src/node/providers/webdriver.ts index 29aa8a2f959c..463edeeb1b37 100644 --- a/packages/vitest/src/node/browser/webdriver.ts +++ b/packages/browser/src/node/providers/webdriver.ts @@ -1,30 +1,34 @@ -import type { Awaitable } from '@vitest/utils' -import type { BrowserProvider, BrowserProviderOptions } from '../../types/browser' -import { ensurePackageInstalled } from '../pkg' -import type { WorkspaceProject } from '../workspace' +import type { BrowserProvider, BrowserProviderInitializationOptions, WorkspaceProject } from 'vitest/node' +import { ensurePackageInstalled } from 'vitest/node' +import type { Browser, RemoteOptions } from 'webdriverio' -export const webdriverBrowsers = ['firefox', 'chrome', 'edge', 'safari'] as const -export type WebdriverBrowser = typeof webdriverBrowsers[number] +type Awaitable = T | PromiseLike -export interface WebdriverProviderOptions extends BrowserProviderOptions { +const webdriverBrowsers = ['firefox', 'chrome', 'edge', 'safari'] as const +type WebdriverBrowser = typeof webdriverBrowsers[number] + +interface WebdriverProviderOptions extends BrowserProviderInitializationOptions { browser: WebdriverBrowser } export class WebdriverBrowserProvider implements BrowserProvider { public name = 'webdriverio' - private cachedBrowser: WebdriverIO.Browser | null = null + private cachedBrowser: Browser | null = null private stopSafari: () => void = () => {} private browser!: WebdriverBrowser private ctx!: WorkspaceProject + private options?: RemoteOptions + getSupportedBrowsers() { return webdriverBrowsers } - async initialize(ctx: WorkspaceProject, { browser }: WebdriverProviderOptions) { + async initialize(ctx: WorkspaceProject, { browser, options }: WebdriverProviderOptions) { this.ctx = ctx this.browser = browser + this.options = options as RemoteOptions const root = this.ctx.config.root @@ -42,6 +46,9 @@ export class WebdriverBrowserProvider implements BrowserProvider { const options = this.ctx.config.browser if (this.browser === 'safari') { + if (options.headless) + throw new Error('You\'ve enabled headless mode for Safari but it doesn\'t currently support it.') + const safaridriver = await import('safaridriver') safaridriver.start({ diagnose: true }) this.stopSafari = () => safaridriver.stop() @@ -55,16 +62,38 @@ export class WebdriverBrowserProvider implements BrowserProvider { // TODO: close everything, if browser is closed from the outside this.cachedBrowser = await remote({ + ...this.options, logLevel: 'error', - capabilities: { - 'browserName': this.browser, - 'wdio:devtoolsOptions': { headless: options.headless }, - }, + capabilities: this.buildCapabilities(), }) return this.cachedBrowser } + private buildCapabilities() { + const capabilities: RemoteOptions['capabilities'] = { + ...this.options?.capabilities, + browserName: this.browser, + } + + const headlessMap = { + chrome: ['goog:chromeOptions', ['headless', 'disable-gpu']], + firefox: ['moz:firefoxOptions', ['-headless']], + edge: ['ms:edgeOptions', ['--headless']], + } as const + + const options = this.ctx.config.browser + const browser = this.browser + if (browser !== 'safari' && options.headless) { + const [key, args] = headlessMap[browser] + const currentValues = (this.options?.capabilities as any)?.[key] || {} + const newArgs = [...currentValues.args || [], ...args] + capabilities[key] = { ...currentValues, args: newArgs as any } + } + + return capabilities + } + async openPage(url: string) { const browserInstance = await this.openBrowser() await browserInstance.url(url) diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 7c85ff2c45e8..b5fa7421548d 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -111,10 +111,7 @@ "@vitest/browser": "*", "@vitest/ui": "*", "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" + "jsdom": "*" }, "peerDependenciesMeta": { "@types/node": { @@ -132,15 +129,6 @@ "jsdom": { "optional": true }, - "webdriverio": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "playwright": { - "optional": true - }, "@edge-runtime/vm": { "optional": true } @@ -198,12 +186,9 @@ "mlly": "^1.4.0", "p-limit": "^4.0.0", "pkg-types": "^1.0.3", - "playwright": "^1.35.1", "pretty-format": "^29.5.0", "prompts": "^2.4.2", - "safaridriver": "^0.0.5", "strip-ansi": "^7.1.0", - "webdriverio": "^8.11.2", "ws": "^8.13.0" } } diff --git a/packages/vitest/rollup.config.js b/packages/vitest/rollup.config.js index e7aa8793cda7..c825f72ef6e9 100644 --- a/packages/vitest/rollup.config.js +++ b/packages/vitest/rollup.config.js @@ -59,9 +59,6 @@ const external = [ 'rollup', 'node:vm', 'inspector', - 'webdriverio', - 'safaridriver', - 'playwright', 'vite-node/source-map', 'vite-node/client', 'vite-node/server', @@ -92,6 +89,7 @@ const plugins = [ export default ({ watch }) => defineConfig([ { input: entries, + treeshake: true, output: { dir: 'dist', format: 'esm', diff --git a/packages/vitest/src/integrations/browser.ts b/packages/vitest/src/integrations/browser.ts index ee0b3820a452..d0d25db12074 100644 --- a/packages/vitest/src/integrations/browser.ts +++ b/packages/vitest/src/integrations/browser.ts @@ -1,28 +1,26 @@ -import { PlaywrightBrowserProvider } from '../node/browser/playwright' -import { WebdriverBrowserProvider } from '../node/browser/webdriver' +import { ensurePackageInstalled } from '../node/pkg' import type { BrowserProviderModule, ResolvedBrowserOptions } from '../types/browser' interface Loader { - executeId: (id: string) => Promise<{ default: BrowserProviderModule }> + root: string + executeId: (id: string) => any } export async function getBrowserProvider(options: ResolvedBrowserOptions, loader: Loader): Promise { - switch (options.provider) { - case undefined: - case 'webdriverio': - return WebdriverBrowserProvider - - case 'playwright': - return PlaywrightBrowserProvider - - default: - break + if (options.provider == null || options.provider === 'webdriverio' || options.provider === 'playwright') { + await ensurePackageInstalled('@vitest/browser', loader.root) + const providers = await loader.executeId('@vitest/browser/providers') as { + webdriverio: BrowserProviderModule + playwright: BrowserProviderModule + } + const provider = (options.provider || 'webdriverio') as 'webdriverio' | 'playwright' + return providers[provider] } let customProviderModule try { - customProviderModule = await loader.executeId(options.provider) + customProviderModule = await loader.executeId(options.provider) as { default: BrowserProviderModule } } catch (error) { throw new Error(`Failed to load custom BrowserProvider from ${options.provider}`, { cause: error }) diff --git a/packages/vitest/src/integrations/env/index.ts b/packages/vitest/src/integrations/env/index.ts index c6636b30455a..1f2b10f207a1 100644 --- a/packages/vitest/src/integrations/env/index.ts +++ b/packages/vitest/src/integrations/env/index.ts @@ -1,9 +1,4 @@ -import { normalize, resolve } from 'pathe' -import { resolvePath } from 'mlly' -import { ViteNodeRunner } from 'vite-node/client' -import type { ViteNodeRunnerOptions } from 'vite-node' -import type { BuiltinEnvironment, VitestEnvironment } from '../../types/config' -import type { Environment } from '../../types' +import type { VitestEnvironment } from '../../types/config' import node from './node' import jsdom from './jsdom' import happy from './happy-dom' @@ -24,10 +19,6 @@ export const envPackageNames: Record, 'edge-runtime': '@edge-runtime/vm', } -function isBuiltinEnvironment(env: VitestEnvironment): env is BuiltinEnvironment { - return env in environments -} - export function getEnvPackageName(env: VitestEnvironment) { if (env === 'node') return null @@ -37,39 +28,3 @@ export function getEnvPackageName(env: VitestEnvironment) { return null return `vitest-environment-${env}` } - -const _loaders = new Map() - -export async function createEnvironmentLoader(options: ViteNodeRunnerOptions) { - if (!_loaders.has(options.root)) { - const loader = new ViteNodeRunner(options) - await loader.executeId('/@vite/env') - _loaders.set(options.root, loader) - } - return _loaders.get(options.root)! -} - -export async function loadEnvironment(name: VitestEnvironment, options: ViteNodeRunnerOptions): Promise { - if (isBuiltinEnvironment(name)) - return environments[name] - const loader = await createEnvironmentLoader(options) - const root = loader.root - const packageId = name[0] === '.' || name[0] === '/' - ? resolve(root, name) - : await resolvePath(`vitest-environment-${name}`, { url: [root] }) ?? resolve(root, name) - const pkg = await loader.executeId(normalize(packageId)) - if (!pkg || !pkg.default || typeof pkg.default !== 'object') { - throw new TypeError( - `Environment "${name}" is not a valid environment. ` - + `Path "${packageId}" should export default object with a "setup" or/and "setupVM" method.`, - ) - } - const environment = pkg.default - if (environment.transformMode !== 'web' && environment.transformMode !== 'ssr') { - throw new TypeError( - `Environment "${name}" is not a valid environment. ` - + `Path "${packageId}" should export default object with a "transformMode" method equal to "ssr" or "web".`, - ) - } - return environment -} diff --git a/packages/vitest/src/integrations/env/loader.ts b/packages/vitest/src/integrations/env/loader.ts new file mode 100644 index 000000000000..f5b67b21eb31 --- /dev/null +++ b/packages/vitest/src/integrations/env/loader.ts @@ -0,0 +1,47 @@ +import { normalize, resolve } from 'pathe' +import { resolvePath } from 'mlly' +import { ViteNodeRunner } from 'vite-node/client' +import type { ViteNodeRunnerOptions } from 'vite-node' +import type { BuiltinEnvironment, VitestEnvironment } from '../../types/config' +import type { Environment } from '../../types' +import { environments } from './index' + +function isBuiltinEnvironment(env: VitestEnvironment): env is BuiltinEnvironment { + return env in environments +} + +const _loaders = new Map() + +export async function createEnvironmentLoader(options: ViteNodeRunnerOptions) { + if (!_loaders.has(options.root)) { + const loader = new ViteNodeRunner(options) + await loader.executeId('/@vite/env') + _loaders.set(options.root, loader) + } + return _loaders.get(options.root)! +} + +export async function loadEnvironment(name: VitestEnvironment, options: ViteNodeRunnerOptions): Promise { + if (isBuiltinEnvironment(name)) + return environments[name] + const loader = await createEnvironmentLoader(options) + const root = loader.root + const packageId = name[0] === '.' || name[0] === '/' + ? resolve(root, name) + : await resolvePath(`vitest-environment-${name}`, { url: [root] }) ?? resolve(root, name) + const pkg = await loader.executeId(normalize(packageId)) + if (!pkg || !pkg.default || typeof pkg.default !== 'object') { + throw new TypeError( + `Environment "${name}" is not a valid environment. ` + + `Path "${packageId}" should export default object with a "setup" or/and "setupVM" method.`, + ) + } + const environment = pkg.default + if (environment.transformMode !== 'web' && environment.transformMode !== 'ssr') { + throw new TypeError( + `Environment "${name}" is not a valid environment. ` + + `Path "${packageId}" should export default object with a "transformMode" method equal to "ssr" or "web".`, + ) + } + return environment +} diff --git a/packages/vitest/src/node/browser/playwright.ts b/packages/vitest/src/node/browser/playwright.ts deleted file mode 100644 index 3c8feb3f121d..000000000000 --- a/packages/vitest/src/node/browser/playwright.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { Page } from 'playwright' -import type { BrowserProvider, BrowserProviderOptions } from '../../types/browser' -import { ensurePackageInstalled } from '../pkg' -import type { WorkspaceProject } from '../workspace' -import type { Awaitable } from '../../types' - -export const playwrightBrowsers = ['firefox', 'webkit', 'chromium'] as const -export type PlaywrightBrowser = typeof playwrightBrowsers[number] - -export interface PlaywrightProviderOptions extends BrowserProviderOptions { - browser: PlaywrightBrowser -} - -export class PlaywrightBrowserProvider implements BrowserProvider { - public name = 'playwright' - - private cachedBrowser: Page | null = null - private browser!: PlaywrightBrowser - private ctx!: WorkspaceProject - - getSupportedBrowsers() { - return playwrightBrowsers - } - - async initialize(ctx: WorkspaceProject, { browser }: PlaywrightProviderOptions) { - this.ctx = ctx - this.browser = browser - - const root = this.ctx.config.root - - if (!await ensurePackageInstalled('playwright', root)) - throw new Error('Cannot find "playwright" package. Please install it manually.') - } - - async openBrowser() { - if (this.cachedBrowser) - return this.cachedBrowser - - const options = this.ctx.config.browser - - const playwright = await import('playwright') - - const playwrightInstance = await playwright[this.browser].launch({ headless: options.headless }) - this.cachedBrowser = await playwrightInstance.newPage() - - this.cachedBrowser.on('close', () => { - playwrightInstance.close() - }) - - return this.cachedBrowser - } - - catchError(cb: (error: Error) => Awaitable) { - this.cachedBrowser?.on('pageerror', cb) - return () => { - this.cachedBrowser?.off('pageerror', cb) - } - } - - async openPage(url: string) { - const browserInstance = await this.openBrowser() - await browserInstance.goto(url) - } - - async close() { - await this.cachedBrowser?.close() - // TODO: right now process can only exit with timeout, if we use browser - // needs investigating - process.exit() - } -} diff --git a/packages/vitest/src/node/index.ts b/packages/vitest/src/node/index.ts index bddc19919dba..faf1941661fd 100644 --- a/packages/vitest/src/node/index.ts +++ b/packages/vitest/src/node/index.ts @@ -1,5 +1,5 @@ export type { Vitest } from './core' -export type { WorkspaceProject as VitestWorkspace } from './workspace' +export type { WorkspaceProject } from './workspace' export { createVitest } from './create' export { VitestPlugin } from './plugins' export { startVitest } from './cli-api' @@ -8,3 +8,6 @@ export type { WorkspaceSpec } from './pool' export type { TestSequencer, TestSequencerConstructor } from './sequencers/types' export { BaseSequencer } from './sequencers/BaseSequencer' + +export { ensurePackageInstalled } from './pkg' +export type { BrowserProviderInitializationOptions, BrowserProvider, BrowserProviderOptions } from '../types/browser' diff --git a/packages/vitest/src/node/pools/rpc.ts b/packages/vitest/src/node/pools/rpc.ts index 6ca1c736c1f9..fca27d780c75 100644 --- a/packages/vitest/src/node/pools/rpc.ts +++ b/packages/vitest/src/node/pools/rpc.ts @@ -6,7 +6,7 @@ export function createMethodsRPC(project: WorkspaceProject): RuntimeRPC { const ctx = project.ctx return { async onWorkerExit(error, code) { - await ctx.logger.printError(error, { type: 'Unexpected Exit' }) + await ctx.logger.printError(error, { type: 'Unexpected Exit', fullStack: true }) process.exit(code || 1) }, snapshotSaved(snapshot) { diff --git a/packages/vitest/src/node/workspace.ts b/packages/vitest/src/node/workspace.ts index 65d62c372f12..8ce64bed966c 100644 --- a/packages/vitest/src/node/workspace.ts +++ b/packages/vitest/src/node/workspace.ts @@ -356,6 +356,7 @@ export class WorkspaceProject { throw new Error(`[${this.getName()}] Browser name is required. Please, set \`test.browser.name\` option manually.`) if (!supportedBrowsers.includes(browser)) throw new Error(`[${this.getName()}] Browser "${browser}" is not supported by the browser provider "${this.browserProvider.name}". Supported browsers: ${supportedBrowsers.join(', ')}.`) - await this.browserProvider.initialize(this, { browser }) + const providerOptions = this.config.browser.providerOptions + await this.browserProvider.initialize(this, { browser, options: providerOptions }) } } diff --git a/packages/vitest/src/runtime/child.ts b/packages/vitest/src/runtime/child.ts index a01bf5cb8779..78cb84707b8d 100644 --- a/packages/vitest/src/runtime/child.ts +++ b/packages/vitest/src/runtime/child.ts @@ -8,7 +8,7 @@ import type { CancelReason } from '@vitest/runner' import type { ResolvedConfig, WorkerGlobalState } from '../types' import type { RunnerRPC, RuntimeRPC } from '../types/rpc' import type { ChildContext } from '../types/child' -import { loadEnvironment } from '../integrations/env' +import { loadEnvironment } from '../integrations/env/loader' import { mockMap, moduleCache, startViteNode } from './execute' import { createSafeRpc, rpcDone } from './rpc' import { setupInspect } from './inspector' diff --git a/packages/vitest/src/runtime/vm.ts b/packages/vitest/src/runtime/vm.ts index 3dd0729a6408..15d30c982164 100644 --- a/packages/vitest/src/runtime/vm.ts +++ b/packages/vitest/src/runtime/vm.ts @@ -9,7 +9,7 @@ import { installSourcemapsSupport } from 'vite-node/source-map' import type { CancelReason } from '@vitest/runner' import type { RunnerRPC, RuntimeRPC, WorkerContext, WorkerGlobalState } from '../types' import { distDir } from '../paths' -import { loadEnvironment } from '../integrations/env' +import { loadEnvironment } from '../integrations/env/loader' import { startVitestExecutor } from './execute' import { createCustomConsole } from './console' import { createSafeRpc } from './rpc' diff --git a/packages/vitest/src/runtime/worker.ts b/packages/vitest/src/runtime/worker.ts index 979a478ebbf7..93f82ebfd776 100644 --- a/packages/vitest/src/runtime/worker.ts +++ b/packages/vitest/src/runtime/worker.ts @@ -4,7 +4,7 @@ import { workerId as poolId } from 'tinypool' import type { CancelReason } from '@vitest/runner' import type { RunnerRPC, RuntimeRPC, WorkerContext, WorkerGlobalState } from '../types' import { getWorkerState } from '../utils/global' -import { loadEnvironment } from '../integrations/env' +import { loadEnvironment } from '../integrations/env/loader' import { mockMap, moduleCache, startViteNode } from './execute' import { setupInspect } from './inspector' import { createSafeRpc, rpcDone } from './rpc' diff --git a/packages/vitest/src/types/browser.ts b/packages/vitest/src/types/browser.ts index f497eecd578e..1a464f046c05 100644 --- a/packages/vitest/src/types/browser.ts +++ b/packages/vitest/src/types/browser.ts @@ -2,14 +2,15 @@ import type { Awaitable } from '@vitest/utils' import type { WorkspaceProject } from '../node/workspace' import type { ApiConfig } from './config' -export interface BrowserProviderOptions { +export interface BrowserProviderInitializationOptions { browser: string + options?: BrowserProviderOptions } export interface BrowserProvider { name: string getSupportedBrowsers(): readonly string[] - initialize(ctx: WorkspaceProject, options: BrowserProviderOptions): Awaitable + initialize(ctx: WorkspaceProject, options: BrowserProviderInitializationOptions): Awaitable openPage(url: string): Awaitable catchError(cb: (error: Error) => Awaitable): () => Awaitable close(): Awaitable @@ -19,6 +20,8 @@ export interface BrowserProviderModule { new (): BrowserProvider } +export interface BrowserProviderOptions {} + export interface BrowserConfigOptions { /** * if running tests in the browser should be the default @@ -33,12 +36,24 @@ export interface BrowserConfigOptions { name: string /** - * browser provider + * Browser provider * * @default 'webdriverio' */ provider?: 'webdriverio' | 'playwright' | (string & {}) + /** + * Options that are passed down to a browser provider. + * To support type hinting, add one of the types to your tsconfig.json "compilerOptions.types" field: + * + * - for webdriverio: `@vitest/browser/providers/webdriverio` + * - for playwright: `@vitest/browser/providers/playwright` + * + * @example + * { playwright: { launch: { devtools: true } } + */ + providerOptions?: BrowserProviderOptions + /** * enable headless mode * diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dd05ae6979b..08eac208a9cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -359,14 +359,14 @@ importers: examples/playwright: devDependencies: '@playwright/test': - specifier: ^1.28.0 - version: 1.28.0 + specifier: ^1.39.0 + version: 1.39.0 '@vitest/ui': specifier: latest version: link:../../packages/ui playwright: - specifier: ^1.28.0 - version: 1.28.0 + specifier: ^1.39.0 + version: 1.39.0 vite: specifier: ^4.5.0 version: 4.5.0(@types/node@18.16.19)(less@4.1.3) @@ -976,12 +976,27 @@ importers: '@vitest/ws-client': specifier: workspace:* version: link:../ws-client + '@wdio/protocols': + specifier: ^8.18.0 + version: 8.18.0 periscopic: specifier: ^3.1.0 version: 3.1.0 + playwright: + specifier: ^1.39.0 + version: 1.39.0 + playwright-core: + specifier: ^1.39.0 + version: 1.39.0 + safaridriver: + specifier: ^0.1.0 + version: 0.1.0 vitest: specifier: workspace:* version: link:../vitest + webdriverio: + specifier: ^8.20.0 + version: 8.20.0(typescript@5.1.6) packages/coverage-istanbul: dependencies: @@ -1470,24 +1485,15 @@ importers: pkg-types: specifier: ^1.0.3 version: 1.0.3 - playwright: - specifier: ^1.35.1 - version: 1.35.1 pretty-format: specifier: ^29.5.0 version: 29.5.0 prompts: specifier: ^2.4.2 version: 2.4.2 - safaridriver: - specifier: ^0.0.5 - version: 0.0.5 strip-ansi: specifier: ^7.1.0 version: 7.1.0 - webdriverio: - specifier: ^8.11.2 - version: 8.12.1(typescript@5.1.6) ws: specifier: ^8.13.0 version: 8.13.0 @@ -1972,8 +1978,8 @@ importers: specifier: ^10.1.0 version: 10.1.0 playwright-chromium: - specifier: ^1.27.0 - version: 1.30.0 + specifier: ^1.39.0 + version: 1.39.0 vitest: specifier: workspace:* version: link:../../packages/vitest @@ -7393,7 +7399,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.18.6 + '@types/node': 20.8.8 '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -7416,7 +7422,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.18.6 + '@types/node': 20.8.8 '@types/yargs': 17.0.12 chalk: 4.1.2 dev: true @@ -8129,13 +8135,12 @@ packages: dev: true optional: true - /@playwright/test@1.28.0: - resolution: {integrity: sha512-vrHs5DFTPwYox5SGKq/7TDn/S4q6RA1zArd7uhO6EyP9hj3XgZBBM12ktMbnDQNxh/fL1IUKsTNLxihmsU38lQ==} - engines: {node: '>=14'} + /@playwright/test@1.39.0: + resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} + engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.8.2 - playwright-core: 1.28.0 + playwright: 1.39.0 dev: true /@pmmmwh/react-refresh-webpack-plugin@0.5.7(react-refresh@0.11.0)(webpack@5.74.0): @@ -8246,30 +8251,6 @@ packages: - supports-color dev: true - /@puppeteer/browsers@1.3.0(typescript@5.1.6): - resolution: {integrity: sha512-an3QdbNPkuU6qpxpbssxAbjRLJcF+eP4L8UqIY3+6n0sbaVxw5pz7PiCLy9g32XEZuoamUlV5ZQPnA6FxvkIHA==} - engines: {node: '>=16.0.0'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - extract-zip: 2.0.1(supports-color@8.1.1) - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - progress: 2.0.3 - proxy-from-env: 1.1.0 - tar-fs: 2.1.1 - typescript: 5.1.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.1 - transitivePeerDependencies: - - supports-color - dev: true - /@puppeteer/browsers@1.4.6(typescript@5.1.6): resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} engines: {node: '>=16.3.0'} @@ -9391,7 +9372,7 @@ packages: globby: 11.1.0 ip: 2.0.0 lodash: 4.17.21 - node-fetch: 2.6.11 + node-fetch: 2.7.0 open: 8.4.0 pretty-hrtime: 1.0.3 prompts: 2.4.2 @@ -9565,7 +9546,7 @@ packages: find-up: 5.0.0 fs-extra: 9.1.0 html-webpack-plugin: 4.5.2(webpack@4.46.0) - node-fetch: 2.6.11 + node-fetch: 2.7.0 pnp-webpack-plugin: 1.6.4(typescript@4.8.4) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -10414,7 +10395,7 @@ packages: /@types/cheerio@0.22.31: resolution: {integrity: sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 dev: true /@types/codemirror@5.60.8: @@ -10537,7 +10518,7 @@ packages: /@types/fs-extra@8.1.3: resolution: {integrity: sha512-7IdV01N0u/CaVO0fuY1YmEg14HQN3+EW8mpNgg6NEfxEl/lzCa5OxlBu3iFsCAdamnYOcTQ7oEi43Xc/67Rgzw==} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 dev: true /@types/fs-extra@9.0.13: @@ -10550,20 +10531,20 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.1 - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true /@types/glob@8.0.0: resolution: {integrity: sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==} dependencies: '@types/minimatch': 5.1.1 - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true /@types/graceful-fs@4.1.8: @@ -10677,7 +10658,7 @@ packages: /@types/jsonfile@6.1.1: resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 dev: true /@types/lodash@4.14.195: @@ -10719,7 +10700,7 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 form-data: 3.0.1 dev: true @@ -10749,6 +10730,12 @@ packages: resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} dev: true + /@types/node@20.8.8: + resolution: {integrity: sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==} + dependencies: + undici-types: 5.25.3 + dev: true + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -10904,7 +10891,7 @@ packages: /@types/set-cookie-parser@2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -10950,7 +10937,7 @@ packages: /@types/through@0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true /@types/tough-cookie@4.0.2: @@ -10988,7 +10975,7 @@ packages: /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 '@types/source-list-map': 0.1.2 source-map: 0.7.4 dev: true @@ -10996,7 +10983,7 @@ packages: /@types/webpack@4.41.32: resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 '@types/tapable': 1.0.8 '@types/uglify-js': 3.17.0 '@types/webpack-sources': 3.2.0 @@ -11044,7 +11031,7 @@ packages: resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 dev: true optional: true @@ -12000,20 +11987,6 @@ packages: vue-demi: 0.14.0(vue@3.2.39) dev: false - /@wdio/config@8.12.1: - resolution: {integrity: sha512-6DfTU+5Ugg6HKMSqVNCLEgdFd7l+QnaMoDe2/tZ8zoYNdJlFu0NfClXLL4qnTCCjebmz3eu0/O+aRPJyxo6GGQ==} - engines: {node: ^16.13 || >=18} - dependencies: - '@wdio/logger': 8.11.0 - '@wdio/types': 8.10.4 - '@wdio/utils': 8.12.1 - decamelize: 6.0.0 - deepmerge-ts: 5.0.0 - glob: 10.3.10 - import-meta-resolve: 3.0.0 - read-pkg-up: 9.1.0 - dev: true - /@wdio/config@8.16.20: resolution: {integrity: sha512-JFD7aYs3nGF2kNhc0eV03mWFQMJku42NCBl+aedb1jzP3z6tBWV3n1a0ETS4MTLps8lFXBDZWvWEnl+ZvVrHZw==} engines: {node: ^16.13 || >=18} @@ -12030,14 +12003,20 @@ packages: - supports-color dev: true - /@wdio/logger@8.11.0: - resolution: {integrity: sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==} + /@wdio/config@8.20.0: + resolution: {integrity: sha512-ODsafHlxEawyYa6IyIdXJMV2plPFyrDbGrXLNKNFBQVfB/FmoHUiiOTh+4Gu+sUXzpn2YNH5O199qHxHw61uUw==} engines: {node: ^16.13 || >=18} dependencies: - chalk: 5.2.0 - loglevel: 1.8.1 - loglevel-plugin-prefix: 0.8.4 - strip-ansi: 7.1.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.20.0 + '@wdio/utils': 8.20.0 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + glob: 10.3.10 + import-meta-resolve: 3.0.0 + read-pkg-up: 10.1.0 + transitivePeerDependencies: + - supports-color dev: true /@wdio/logger@8.16.17: @@ -12050,43 +12029,33 @@ packages: strip-ansi: 7.1.0 dev: true - /@wdio/protocols@8.11.0: - resolution: {integrity: sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==} - dev: true - /@wdio/protocols@8.16.5: resolution: {integrity: sha512-u9I57hIqmcOgrDH327ZCc2GTXv2YFN5bg6UaA3OUoJU7eJgGYHFB6RrjiNjLXer68iIx07wwVM70V/1xzijd3Q==} dev: true - /@wdio/repl@8.10.1: - resolution: {integrity: sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==} - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': 20.8.2 + /@wdio/protocols@8.18.0: + resolution: {integrity: sha512-TABA0mksHvu5tE8qNYYDR0fDyo90NCANeghbGAtsI8TUsJzgH0dwpos3WSSiB97J9HRSZuWIMa7YuABEkBIjWQ==} dev: true - /@wdio/types@8.10.4: - resolution: {integrity: sha512-aLJ1QQW+hhALeRK3bvMLjIrlUVyhOs3Od+91pR4Z4pLwyeNG1bJZCJRD5bAJK/mm7CnFa0NsdixPS9jJxZcRrw==} + /@wdio/repl@8.10.1: + resolution: {integrity: sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 dev: true /@wdio/types@8.16.12: resolution: {integrity: sha512-TjCZJ3P9ual21G0dRv0lC9QgHGd3Igv+guEINevBKf/oD4/N84PvQ2eZG1nSbZ3xh8X/dvi+O64A6VEv43gx2w==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 dev: true - /@wdio/utils@8.12.1: - resolution: {integrity: sha512-VmF6O++84FTH3AKaVFyqn0MJA65/1G6dbm6p61KBqkD25LxaWo4398lCCbt264hzBIobtXRZoQ87bSxdfnlUKQ==} + /@wdio/types@8.20.0: + resolution: {integrity: sha512-y0En5V5PPF48IHJMetaNYQobhCr3ddsgp2aX/crLL51UccWqnFpCL8pCh6cP01gRgCchCasa2JCBMB+PucbYmA==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/logger': 8.11.0 - '@wdio/types': 8.10.4 - import-meta-resolve: 3.0.0 - p-iteration: 1.1.8 + '@types/node': 20.8.8 dev: true /@wdio/utils@8.16.17: @@ -12111,6 +12080,28 @@ packages: - supports-color dev: true + /@wdio/utils@8.20.0: + resolution: {integrity: sha512-nZ5QF5lPyZNJG9YaSrRuVfkVeg80yRrUQT42D0mUDDjmUIh2pAXDMu4HxgxocuQSOyLacg4Vpg3Sju9NFipxIA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@puppeteer/browsers': 1.7.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.20.0 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + edgedriver: 5.3.6 + geckodriver: 4.2.0 + get-port: 7.0.0 + got: 13.0.0 + import-meta-resolve: 3.0.0 + locate-app: 2.1.0 + safaridriver: 0.1.0 + split2: 4.2.0 + wait-port: 1.0.4 + transitivePeerDependencies: + - supports-color + dev: true + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: @@ -12900,22 +12891,6 @@ packages: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.7 - dev: true - /archiver-utils@4.0.1: resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==} engines: {node: '>= 12.0.0'} @@ -12928,19 +12903,6 @@ packages: readable-stream: 3.6.0 dev: true - /archiver@5.3.1: - resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 2.1.0 - async: 3.2.4 - buffer-crc32: 0.2.13 - readable-stream: 3.6.0 - readdir-glob: 1.1.2 - tar-stream: 2.2.0 - zip-stream: 4.1.0 - dev: true - /archiver@6.0.1: resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==} engines: {node: '>= 12.0.0'} @@ -14360,19 +14322,6 @@ packages: engines: {node: '>=10'} dev: true - /chrome-launcher@0.15.1: - resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} - engines: {node: '>=12.13.0'} - hasBin: true - dependencies: - '@types/node': 18.18.6 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -14387,15 +14336,6 @@ packages: mitt: 3.0.0 dev: true - /chromium-bidi@0.4.9(devtools-protocol@0.0.1120988): - resolution: {integrity: sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==} - peerDependencies: - devtools-protocol: '*' - dependencies: - devtools-protocol: 0.0.1120988 - mitt: 3.0.0 - dev: true - /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true @@ -14702,16 +14642,6 @@ packages: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compress-commons@4.1.1: - resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} - engines: {node: '>= 10'} - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.2 - normalize-path: 3.0.0 - readable-stream: 3.6.0 - dev: true - /compress-commons@5.0.1: resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==} engines: {node: '>= 12.0.0'} @@ -14949,14 +14879,6 @@ packages: hasBin: true dev: true - /crc32-stream@4.0.2: - resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} - engines: {node: '>= 10'} - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.0 - dev: true - /crc32-stream@5.0.0: resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==} engines: {node: '>= 12.0.0'} @@ -15000,14 +14922,6 @@ packages: transitivePeerDependencies: - encoding - /cross-fetch@3.1.6: - resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} - dependencies: - node-fetch: 2.6.11 - transitivePeerDependencies: - - encoding - dev: true - /cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: @@ -15564,11 +15478,6 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge-ts@5.0.0: - resolution: {integrity: sha512-esq9xUO8+CQCG63IlpkoOBNlpm1m4WBm0NRLFrGL/dcgzqWi1tmTLfG7QTvffqYt6T+dS+xaxrHxdexqGWkV1g==} - engines: {node: '>=16.0.0'} - dev: true - /deepmerge-ts@5.1.0: resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} engines: {node: '>=16.0.0'} @@ -15753,50 +15662,20 @@ packages: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true - /devtools-protocol@0.0.1120988: - resolution: {integrity: sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==} - dev: true - /devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} dev: true - /devtools-protocol@0.0.1161598: - resolution: {integrity: sha512-MQNeVRDiJ9yAfHUlumx7OCweu15GgMIqEIvz/DTZwpZKjT7oGo9FcwUqS7PyH0mDJsWnuJIn41BZ4SPoQbZfew==} - dev: true - /devtools-protocol@0.0.1203626: resolution: {integrity: sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==} dev: true - /devtools-protocol@0.0.981744: - resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} + /devtools-protocol@0.0.1209236: + resolution: {integrity: sha512-z4eehc+fhmptqhxwreLcg9iydszZGU4Q5FzaaElXVGp3KyfXbjtXeUCmo4l8FxBJbyXtCz4VRIJsGW2ekApyUQ==} dev: true - /devtools@8.12.1(typescript@5.1.6): - resolution: {integrity: sha512-R72raQLN1lDSqbr2DVj9SRh07JRyojzmrcLa33VBa2nw3cf5ZyHOHe0DgxlJ/5c2Dfs1+wGNJy16gWKGBq+xgg==} - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': 20.8.2 - '@wdio/config': 8.12.1 - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 - '@wdio/types': 8.10.4 - '@wdio/utils': 8.12.1 - chrome-launcher: 0.15.1 - edge-paths: 3.0.5 - import-meta-resolve: 3.0.0 - puppeteer-core: 20.3.0(typescript@5.1.6) - query-selector-shadow-dom: 1.0.1 - ua-parser-js: 1.0.34 - uuid: 9.0.0 - which: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate + /devtools-protocol@0.0.981744: + resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} dev: true /dezalgo@1.0.3: @@ -18070,6 +17949,14 @@ packages: dev: true optional: true + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -18388,7 +18275,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.1 + minimatch: 5.1.6 once: 1.4.0 dev: true @@ -18831,13 +18718,6 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - /hosted-git-info@7.0.0: resolution: {integrity: sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -20141,7 +20021,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 18.18.6 + '@types/node': 20.8.8 anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -20402,7 +20282,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 graceful-fs: 4.2.11 dev: true @@ -20449,7 +20329,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 18.18.6 + '@types/node': 20.8.8 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -20473,7 +20353,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.0.1 - '@types/node': 18.18.6 + '@types/node': 20.8.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -20509,7 +20389,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -20518,7 +20398,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.8 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -21062,15 +20942,6 @@ packages: set-cookie-parser: 2.5.1 dev: true - /lighthouse-logger@1.3.0: - resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==} - dependencies: - debug: 2.6.9 - marky: 1.2.5 - transitivePeerDependencies: - - supports-color - dev: true - /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -21279,22 +21150,10 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: true - - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: true - /lodash.escape@4.0.1: resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} dev: true - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true - /lodash.flattendeep@4.4.0: resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} dev: true @@ -21303,10 +21162,6 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -21319,10 +21174,6 @@ packages: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: true - /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -21551,10 +21402,6 @@ packages: - supports-color dev: true - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} - dev: true - /match-sorter@6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: @@ -21829,13 +21676,6 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.1: - resolution: {integrity: sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -22292,18 +22132,6 @@ packages: resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} dev: true - /node-fetch@2.6.11: - resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -22388,16 +22216,6 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.0 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@6.0.0: resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} engines: {node: ^16.14.0 || >=18.0.0} @@ -22827,11 +22645,6 @@ packages: engines: {node: '>=4'} dev: true - /p-iteration@1.1.8: - resolution: {integrity: sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==} - engines: {node: '>=8.0.0'} - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -23287,7 +23100,7 @@ packages: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: readable-stream: 4.1.0 - split2: 4.1.0 + split2: 4.2.0 dev: true /pino-std-serializers@6.0.0: @@ -23351,49 +23164,29 @@ packages: mlly: 1.4.0 pathe: 1.1.1 - /playwright-chromium@1.30.0: - resolution: {integrity: sha512-ZfqjYdFuxnZxK02mDZtHFK/Mi0+cjCVn51RmwLwLLHA8PkCExk0odmZH2REx+LjqX8tDLGnmf6vDnPAirdSY0g==} - engines: {node: '>=14'} + /playwright-chromium@1.39.0: + resolution: {integrity: sha512-0WVmvn9ppPbcyb2PQherIpzsvJlyjqziCZiAiexTEYSz8k6/+/3wljmFaMRMP1lcv2xKyHDn9yWd/lHb7IzYyA==} + engines: {node: '>=16'} hasBin: true requiresBuild: true dependencies: - playwright-core: 1.30.0 - dev: true - - /playwright-core@1.28.0: - resolution: {integrity: sha512-nJLknd28kPBiCNTbqpu6Wmkrh63OEqJSFw9xOfL9qxfNwody7h6/L3O2dZoWQ6Oxcm0VOHjWmGiCUGkc0X3VZA==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /playwright-core@1.30.0: - resolution: {integrity: sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==} - engines: {node: '>=14'} - hasBin: true + playwright-core: 1.39.0 dev: true - /playwright-core@1.35.1: - resolution: {integrity: sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==} + /playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.28.0: - resolution: {integrity: sha512-kyOXGc5y1mgi+hgEcCIyE1P1+JumLrxS09nFHo5sdJNzrucxPRAGwM4A2X3u3SDOfdgJqx61yIoR6Av+5plJPg==} - engines: {node: '>=14'} - hasBin: true - requiresBuild: true - dependencies: - playwright-core: 1.28.0 - dev: true - - /playwright@1.35.1: - resolution: {integrity: sha512-NbwBeGJLu5m7VGM0+xtlmLAH9VUfWwYOhUi/lSEDyGg46r1CA9RWlvoc5yywxR9AzQb0mOCm7bWtOXV7/w43ZA==} + /playwright@1.39.0: + resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} engines: {node: '>=16'} hasBin: true - requiresBuild: true dependencies: - playwright-core: 1.35.1 + playwright-core: 1.39.0 + optionalDependencies: + fsevents: 2.3.2 dev: true /pluralize@8.0.0: @@ -23804,29 +23597,6 @@ packages: engines: {node: '>=6'} dev: true - /puppeteer-core@20.3.0(typescript@5.1.6): - resolution: {integrity: sha512-264pBrIui5bO6NJeOcbJrLa0OCwmA4+WK00JMrLIKTfRiqe2gx8KWTzLsjyw/bizErp3TKS7vt/I0i5fTC+mAw==} - engines: {node: '>=16.0.0'} - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@puppeteer/browsers': 1.3.0(typescript@5.1.6) - chromium-bidi: 0.4.9(devtools-protocol@0.0.1120988) - cross-fetch: 3.1.6 - debug: 4.3.4(supports-color@8.1.1) - devtools-protocol: 0.0.1120988 - typescript: 5.1.6 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - /puppeteer-core@20.9.0(typescript@5.1.6): resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} engines: {node: '>=16.3.0'} @@ -24345,15 +24115,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg-up@9.1.0: - resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - find-up: 6.3.0 - read-pkg: 7.1.0 - type-fest: 2.19.0 - dev: true - /read-pkg@1.1.0: resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} engines: {node: '>=0.10.0'} @@ -24384,16 +24145,6 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg@7.1.0: - resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} - engines: {node: '>=12.20'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 2.19.0 - dev: true - /read-pkg@8.1.0: resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} engines: {node: '>=16'} @@ -25062,10 +24813,6 @@ packages: resolution: {integrity: sha512-EgK9Vc2Bk4WaECq1E7ti9GyeQ6JKKQNs40vNOE/b5Ul5dDEt429G0Kj5Nzs4FRS5ZIVa7nBck1TyHuinOYdz2Q==} dev: true - /safaridriver@0.0.5: - resolution: {integrity: sha512-997HUPVHdOk0019Yz2qbX/B47bC0LcUxMrHU2PDY8IOO7hiT1uhBQEeEAF1BeCrZKFgx5cmsbWYmFgFN0TfqNA==} - dev: true - /safaridriver@0.1.0: resolution: {integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==} dev: true @@ -25324,13 +25071,6 @@ packages: type-fest: 2.19.0 dev: true - /serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} - dependencies: - type-fest: 0.20.2 - dev: true - /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: @@ -25829,11 +25569,6 @@ packages: extend-shallow: 3.0.2 dev: true - /split2@4.1.0: - resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} - engines: {node: '>= 10.x'} - dev: true - /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -27192,10 +26927,6 @@ packages: hasBin: true dev: true - /ua-parser-js@1.0.34: - resolution: {integrity: sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==} - dev: true - /ufo@1.1.2: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} @@ -27241,6 +26972,10 @@ packages: jiti: 1.18.2 dev: true + /undici-types@5.25.3: + resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + dev: true + /undici@5.22.1: resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} engines: {node: '>=14.0'} @@ -27853,11 +27588,6 @@ packages: hasBin: true dev: true - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: true - /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true @@ -28392,37 +28122,38 @@ packages: engines: {node: '>= 8'} dev: true - /webdriver@8.12.1: - resolution: {integrity: sha512-Ca+MUYUXfl5gsnX40xAIUgfoa76qQsfX7REGFzMl09Cb7vHKtM17bEOGDaTbXIX4kbkXylyUSAuBpe3gCtDDKg==} + /webdriver@8.16.20: + resolution: {integrity: sha512-3Dynj9pfTqmbDadqmMmD/sQgGFwho92zQPGgpAqLUMebE/qEkraoIfRWdbi2tw1ityiThOJVPTXfwsY/bpvknw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 '@types/ws': 8.5.5 - '@wdio/config': 8.12.1 - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 - '@wdio/types': 8.10.4 - '@wdio/utils': 8.12.1 - deepmerge-ts: 5.0.0 + '@wdio/config': 8.16.20 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.16.5 + '@wdio/types': 8.16.12 + '@wdio/utils': 8.16.17 + deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 ws: 8.13.0 transitivePeerDependencies: - bufferutil + - supports-color - utf-8-validate dev: true - /webdriver@8.16.20: - resolution: {integrity: sha512-3Dynj9pfTqmbDadqmMmD/sQgGFwho92zQPGgpAqLUMebE/qEkraoIfRWdbi2tw1ityiThOJVPTXfwsY/bpvknw==} + /webdriver@8.20.0: + resolution: {integrity: sha512-U/sej7yljVf/enEWR9L2AtOntrd3lqtkEtHeuSWU2FPp5cWvoMEe7vQiG0WJA74VE2e7uwd8S1LfCgQD1wY3Bg==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.8 '@types/ws': 8.5.5 - '@wdio/config': 8.16.20 + '@wdio/config': 8.20.0 '@wdio/logger': 8.16.17 - '@wdio/protocols': 8.16.5 - '@wdio/types': 8.16.12 - '@wdio/utils': 8.16.17 + '@wdio/protocols': 8.18.0 + '@wdio/types': 8.20.0 + '@wdio/utils': 8.20.0 deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 @@ -28433,35 +28164,39 @@ packages: - utf-8-validate dev: true - /webdriverio@8.12.1(typescript@5.1.6): - resolution: {integrity: sha512-lW0Qo3fy64cVbYWWAZbXxLIOK0pbTARgpY89J+0Sr6zh2K2NKtd/0D11k3WfMeYxd0b0he7E7XC1b6M6w4h75A==} + /webdriverio@8.16.20(typescript@5.1.6): + resolution: {integrity: sha512-2xSJDrMxwPF1kucB/r7Wc8yF689GGi7iSKrog7vkkoIiRY25vd3U129iN2mTYgNDyM6SM0kw+GP5W1s73khpYw==} engines: {node: ^16.13 || >=18} + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true dependencies: '@types/node': 20.8.2 - '@wdio/config': 8.12.1 - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 + '@wdio/config': 8.16.20 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.16.5 '@wdio/repl': 8.10.1 - '@wdio/types': 8.10.4 - '@wdio/utils': 8.12.1 - archiver: 5.3.1 + '@wdio/types': 8.16.12 + '@wdio/utils': 8.16.17 + archiver: 6.0.1 aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools: 8.12.1(typescript@5.1.6) - devtools-protocol: 0.0.1161598 + devtools-protocol: 0.0.1203626 grapheme-splitter: 1.0.4 import-meta-resolve: 3.0.0 is-plain-obj: 4.1.0 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 minimatch: 9.0.3 - puppeteer-core: 20.3.0(typescript@5.1.6) + puppeteer-core: 20.9.0(typescript@5.1.6) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 - serialize-error: 8.1.0 - webdriver: 8.12.1 + serialize-error: 11.0.2 + webdriver: 8.16.20 transitivePeerDependencies: - bufferutil - encoding @@ -28470,8 +28205,8 @@ packages: - utf-8-validate dev: true - /webdriverio@8.16.20(typescript@5.1.6): - resolution: {integrity: sha512-2xSJDrMxwPF1kucB/r7Wc8yF689GGi7iSKrog7vkkoIiRY25vd3U129iN2mTYgNDyM6SM0kw+GP5W1s73khpYw==} + /webdriverio@8.20.0(typescript@5.1.6): + resolution: {integrity: sha512-nVd3n4v1CYzjEezK6OgmGIcVx+T/7PNYwLK3fTNH2hGRNX05TyGGcR9HAcVZCbIu8WWFKRE0SrLvCjEutPO8gg==} engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -28479,18 +28214,18 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.8.2 - '@wdio/config': 8.16.20 + '@types/node': 20.8.8 + '@wdio/config': 8.20.0 '@wdio/logger': 8.16.17 - '@wdio/protocols': 8.16.5 + '@wdio/protocols': 8.18.0 '@wdio/repl': 8.10.1 - '@wdio/types': 8.16.12 - '@wdio/utils': 8.16.17 + '@wdio/types': 8.20.0 + '@wdio/utils': 8.20.0 archiver: 6.0.1 aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools-protocol: 0.0.1203626 + devtools-protocol: 0.0.1209236 grapheme-splitter: 1.0.4 import-meta-resolve: 3.0.0 is-plain-obj: 4.1.0 @@ -28502,7 +28237,7 @@ packages: resq: 1.11.0 rgb2hex: 0.2.5 serialize-error: 11.0.2 - webdriver: 8.16.20 + webdriver: 8.20.0 transitivePeerDependencies: - bufferutil - encoding @@ -28834,14 +28569,6 @@ packages: isexe: 2.0.0 dev: true - /which@3.0.0: - resolution: {integrity: sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which@3.0.1: resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -29279,15 +29006,6 @@ packages: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} dev: false - /zip-stream@4.1.0: - resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 2.1.0 - compress-commons: 4.1.1 - readable-stream: 3.6.0 - dev: true - /zip-stream@5.0.1: resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==} engines: {node: '>= 12.0.0'} diff --git a/test/bail/test/bail.test.ts b/test/bail/test/bail.test.ts index 22c01ec7c2a1..ea8438f04714 100644 --- a/test/bail/test/bail.test.ts +++ b/test/bail/test/bail.test.ts @@ -6,7 +6,7 @@ const configs: UserConfig[] = [] const pools: UserConfig[] = [{ pool: 'threads' }, { pool: 'forks' }, { pool: 'threads', poolOptions: { threads: { singleThread: true } } }] if (process.platform !== 'win32') - pools.push({ browser: { enabled: true, name: 'chrome' } }) + pools.push({ browser: { enabled: true, name: 'chromium', provider: 'playwright' } }) for (const isolate of [true, false]) { for (const pool of pools) { diff --git a/test/core/test/sequencers.test.ts b/test/core/test/sequencers.test.ts index fd4a716be680..48c83c666ac2 100644 --- a/test/core/test/sequencers.test.ts +++ b/test/core/test/sequencers.test.ts @@ -1,6 +1,6 @@ import type { Vitest } from 'vitest' import { describe, expect, test, vi } from 'vitest' -import type { VitestWorkspace } from 'vitest/node' +import type { WorkspaceProject } from 'vitest/node' import { RandomSequencer } from '../../../packages/vitest/src/node/sequencers/RandomSequencer' import { BaseSequencer } from '../../../packages/vitest/src/node/sequencers/BaseSequencer' import type { WorkspaceSpec } from '../../../packages/vitest/src/node/pool' @@ -20,7 +20,7 @@ function buildCtx() { function buildWorkspace() { return { getName: () => 'test', - } as any as VitestWorkspace + } as any as WorkspaceProject } const workspace = buildWorkspace() diff --git a/test/ui/package.json b/test/ui/package.json index bb4b0fc734ad..eb6ba4a7f81a 100644 --- a/test/ui/package.json +++ b/test/ui/package.json @@ -7,7 +7,7 @@ "devDependencies": { "execa": "^6.1.0", "fs-extra": "^10.1.0", - "playwright-chromium": "^1.27.0", + "playwright-chromium": "^1.39.0", "vitest": "workspace:*" } }