diff --git a/examples/lit/package.json b/examples/lit/package.json index 54bb31465caa..aa6218770d7f 100644 --- a/examples/lit/package.json +++ b/examples/lit/package.json @@ -1,5 +1,6 @@ { "name": "@vitest/example-lit", + "type": "module", "private": true, "files": [ "dist", @@ -12,13 +13,15 @@ "test:ui": "vitest --ui" }, "dependencies": { - "lit": "^2.2.5" + "lit": "^3.0.1" }, "devDependencies": { + "@vitest/browser": "latest", "@vitest/ui": "latest", "jsdom": "latest", "vite": "latest", - "vitest": "latest" + "vitest": "latest", + "webdriverio": "^8.21.0" }, "stackblitz": { "startCommand": "npm run test:ui" diff --git a/examples/lit/test/basic.test.ts b/examples/lit/test/basic.test.ts index ae4eab061874..47a128458c87 100644 --- a/examples/lit/test/basic.test.ts +++ b/examples/lit/test/basic.test.ts @@ -1,22 +1,14 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import '../src/my-button' +import '../src/my-button.js' describe('Button with increment', async () => { function getInsideButton(): HTMLElement | null | undefined { return document.body.querySelector('my-button')?.shadowRoot?.querySelector('button') } - beforeEach(async () => { + beforeEach(() => { document.body.innerHTML = '' - await new Promise((resolve) => { - const interval = setInterval(() => { - if (getInsideButton()) { - clearInterval(interval) - resolve() - } - }) - }) }) it('should increment the count on each click', () => { diff --git a/examples/lit/tsconfig.json b/examples/lit/tsconfig.json index 93f02b62c176..ce9c274a30cc 100644 --- a/examples/lit/tsconfig.json +++ b/examples/lit/tsconfig.json @@ -1,7 +1,10 @@ { "compilerOptions": { + "module": "node16", + "target": "es2020", + "moduleResolution": "Node16", "experimentalDecorators": true, "useDefineForClassFields": false, - "importsNotUsedAsValues": "preserve" + "verbatimModuleSyntax": true } } diff --git a/examples/lit/vite.config.ts b/examples/lit/vite.config.ts index e546d108f118..3f79995620ff 100644 --- a/examples/lit/vite.config.ts +++ b/examples/lit/vite.config.ts @@ -5,7 +5,9 @@ import { defineConfig } from 'vite' // https://vitejs.dev/config/ export default defineConfig({ test: { - globals: true, - environment: 'jsdom', + browser: { + enabled: true, + name: 'chrome', + }, }, }) diff --git a/packages/browser/providers.d.ts b/packages/browser/providers.d.ts index b2b8f375cd26..ea14bc4d78b1 100644 --- a/packages/browser/providers.d.ts +++ b/packages/browser/providers.d.ts @@ -2,5 +2,6 @@ import type { BrowserProvider } from 'vitest/nide' declare var webdriverio: BrowserProvider declare var playwright: BrowserProvider +declare var none: BrowserProvider -export { webdriverio, playwright } +export { webdriverio, playwright, none } diff --git a/packages/browser/src/node/providers/index.ts b/packages/browser/src/node/providers/index.ts index 26f3c240c5e0..aca17df8fde6 100644 --- a/packages/browser/src/node/providers/index.ts +++ b/packages/browser/src/node/providers/index.ts @@ -1,5 +1,7 @@ import { PlaywrightBrowserProvider } from './playwright' import { WebdriverBrowserProvider } from './webdriver' +import { NoneBrowserProvider } from './none' export const webdriverio = WebdriverBrowserProvider export const playwright = PlaywrightBrowserProvider +export const none = NoneBrowserProvider diff --git a/packages/browser/src/node/providers/none.ts b/packages/browser/src/node/providers/none.ts new file mode 100644 index 000000000000..92156ce837f7 --- /dev/null +++ b/packages/browser/src/node/providers/none.ts @@ -0,0 +1,40 @@ +import type { Awaitable } from 'vitest' +import type { BrowserProvider, WorkspaceProject } from 'vitest/node' + +export class NoneBrowserProvider implements BrowserProvider { + public name = 'none' + private ctx!: WorkspaceProject + private open = false + + getSupportedBrowsers() { + // `none` is not restricted to certain browsers. + return [] + } + + isOpen() { + return this.open + } + + async initialize(ctx: WorkspaceProject) { + this.ctx = ctx + this.open = false + } + + catchError(_cb: (error: Error) => Awaitable) { + return () => {} + } + + async openPage(_url: string) { + this.open = true + if (!this.ctx.browser) + throw new Error('Browser is not initialized') + const options = this.ctx.browser.config.server + const _open = options.open + options.open = _url + this.ctx.browser.openBrowser() + options.open = _open + } + + async close() { + } +} diff --git a/packages/vitest/src/integrations/browser.ts b/packages/vitest/src/integrations/browser.ts index d0d25db12074..71dae0e971b6 100644 --- a/packages/vitest/src/integrations/browser.ts +++ b/packages/vitest/src/integrations/browser.ts @@ -6,14 +6,17 @@ interface Loader { executeId: (id: string) => any } +const builtinProviders = ['webdriverio', 'playwright', 'none'] + export async function getBrowserProvider(options: ResolvedBrowserOptions, loader: Loader): Promise { - if (options.provider == null || options.provider === 'webdriverio' || options.provider === 'playwright') { + if (options.provider == null || builtinProviders.includes(options.provider)) { await ensurePackageInstalled('@vitest/browser', loader.root) const providers = await loader.executeId('@vitest/browser/providers') as { webdriverio: BrowserProviderModule playwright: BrowserProviderModule + none: BrowserProviderModule } - const provider = (options.provider || 'webdriverio') as 'webdriverio' | 'playwright' + const provider = (options.provider || 'webdriverio') as 'webdriverio' | 'playwright' | 'none' return providers[provider] } diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 2e2e4a6576cf..511407bf970b 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -5,7 +5,7 @@ import type { ResolvedConfig as ResolvedViteConfig } from 'vite' import type { ApiConfig, ResolvedConfig, UserConfig, VitestRunMode } from '../types' import { defaultBrowserPort, defaultPort } from '../constants' import { benchmarkConfigDefaults, configDefaults } from '../defaults' -import { isCI, toArray } from '../utils' +import { isCI, stdProvider, toArray } from '../utils' import { VitestCache } from './cache' import { BaseSequencer } from './sequencers/BaseSequencer' import { RandomSequencer } from './sequencers/RandomSequencer' @@ -386,6 +386,9 @@ export function resolveConfig( resolved.browser.slowHijackESM ??= false resolved.browser.isolate ??= true + if (resolved.browser.enabled && stdProvider === 'stackblitz') + resolved.browser.provider = 'none' + resolved.browser.api = resolveApiServerConfig(resolved.browser) || { port: defaultBrowserPort, } diff --git a/packages/vitest/src/node/workspace.ts b/packages/vitest/src/node/workspace.ts index 614d84611981..3f5bc5755610 100644 --- a/packages/vitest/src/node/workspace.ts +++ b/packages/vitest/src/node/workspace.ts @@ -376,7 +376,7 @@ export class WorkspaceProject { const supportedBrowsers = this.browserProvider.getSupportedBrowsers() if (!browser) throw new Error(`[${this.getName()}] Browser name is required. Please, set \`test.browser.name\` option manually.`) - if (!supportedBrowsers.includes(browser)) + if (supportedBrowsers.length && !supportedBrowsers.includes(browser)) throw new Error(`[${this.getName()}] Browser "${browser}" is not supported by the browser provider "${this.browserProvider.name}". Supported browsers: ${supportedBrowsers.join(', ')}.`) const providerOptions = this.config.browser.providerOptions await this.browserProvider.initialize(this, { browser, options: providerOptions }) diff --git a/packages/vitest/src/types/browser.ts b/packages/vitest/src/types/browser.ts index 1a464f046c05..cc819744ac3f 100644 --- a/packages/vitest/src/types/browser.ts +++ b/packages/vitest/src/types/browser.ts @@ -40,7 +40,7 @@ export interface BrowserConfigOptions { * * @default 'webdriverio' */ - provider?: 'webdriverio' | 'playwright' | (string & {}) + provider?: 'webdriverio' | 'playwright' | 'none' | (string & {}) /** * Options that are passed down to a browser provider. diff --git a/packages/vitest/src/utils/env.ts b/packages/vitest/src/utils/env.ts index cafe9b01256e..58a747258f64 100644 --- a/packages/vitest/src/utils/env.ts +++ b/packages/vitest/src/utils/env.ts @@ -1,3 +1,3 @@ export const isNode: boolean = typeof process < 'u' && typeof process.stdout < 'u' && !process.versions?.deno && !globalThis.window export const isBrowser: boolean = typeof window !== 'undefined' -export { isCI } from 'std-env' +export { isCI, provider as stdProvider } from 'std-env' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9d7d39e846d..e81c9501952d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -245,9 +245,12 @@ importers: examples/lit: dependencies: lit: - specifier: ^2.2.5 - version: 2.3.1 + specifier: ^3.0.1 + version: 3.0.1 devDependencies: + '@vitest/browser': + specifier: latest + version: link:../../packages/browser '@vitest/ui': specifier: latest version: link:../../packages/ui @@ -260,6 +263,9 @@ importers: vitest: specifier: workspace:* version: link:../../packages/vitest + webdriverio: + specifier: ^8.21.0 + version: 8.21.0(typescript@5.1.6) examples/marko: devDependencies: @@ -7155,7 +7161,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -7176,7 +7182,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -7213,7 +7219,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 jest-mock: 27.5.1 dev: true @@ -7230,7 +7236,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.18.6 + '@types/node': 20.8.10 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -7259,7 +7265,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -7372,7 +7378,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.8.8 + '@types/node': 18.18.6 '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -7383,7 +7389,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.5 '@types/istanbul-reports': 3.0.3 - '@types/node': 18.18.6 + '@types/node': 20.8.10 '@types/yargs': 16.0.7 chalk: 4.1.2 dev: true @@ -7395,7 +7401,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.8.8 + '@types/node': 18.18.6 '@types/yargs': 17.0.12 chalk: 4.1.2 dev: true @@ -7492,8 +7498,14 @@ packages: type-detect: 4.0.8 dev: true - /@lit/reactive-element@1.4.1: - resolution: {integrity: sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==} + /@lit-labs/ssr-dom-shim@1.1.2: + resolution: {integrity: sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==} + dev: false + + /@lit/reactive-element@2.0.1: + resolution: {integrity: sha512-eu50SQXHRthFwWJMp0oAFg95Rvm6MTPjxSXWuvAu7It90WVFLFpNBoIno7XOXSDvVgTrtKnUV4OLJqys2Svn4g==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.2 dev: false /@marko/babel-utils@6.3.1: @@ -10413,7 +10425,7 @@ packages: resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: '@types/connect': 3.4.37 - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/braces@3.0.1: @@ -10440,7 +10452,7 @@ packages: /@types/connect@3.4.37: resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/cookie@0.4.1: @@ -10522,7 +10534,7 @@ packages: /@types/express-serve-static-core@4.17.39: resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 '@types/qs': 6.9.9 '@types/range-parser': 1.2.6 '@types/send': 0.17.3 @@ -10564,26 +10576,26 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.1 - '@types/node': 20.8.8 + '@types/node': 18.18.6 dev: true /@types/glob@8.0.0: resolution: {integrity: sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==} dependencies: '@types/minimatch': 5.1.1 - '@types/node': 20.8.8 + '@types/node': 18.18.6 dev: true /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 dev: true /@types/graceful-fs@4.1.8: resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/hast@2.3.4: @@ -10748,14 +10760,14 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 form-data: 3.0.1 dev: true /@types/node-fetch@2.6.7: resolution: {integrity: sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 form-data: 4.0.0 dev: true @@ -10774,6 +10786,12 @@ packages: resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} dev: true + /@types/node@20.8.10: + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.8.2: resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} dev: true @@ -10921,7 +10939,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/resolve@1.20.2: @@ -10939,7 +10957,7 @@ packages: resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: '@types/mime': 1.3.4 - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/serve-static@1.15.4: @@ -10947,13 +10965,13 @@ packages: dependencies: '@types/http-errors': 2.0.3 '@types/mime': 3.0.3 - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /@types/set-cookie-parser@2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -11045,7 +11063,7 @@ packages: /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 '@types/source-list-map': 0.1.2 source-map: 0.7.4 dev: true @@ -11053,7 +11071,7 @@ packages: /@types/webpack@4.41.32: resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 '@types/tapable': 1.0.8 '@types/uglify-js': 3.17.0 '@types/webpack-sources': 3.2.0 @@ -12235,6 +12253,22 @@ packages: - supports-color dev: true + /@wdio/config@8.21.0: + resolution: {integrity: sha512-ilq880hg+q/MpDqn03bwZruFG0+C5t21XjGbDxdGmpf2aJMFVZdWk6tjlbnwjJ7nDTufIYidp/LWyG7Ro/W7FA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.21.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: resolution: {integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==} engines: {node: ^16.13 || >=18} @@ -12253,11 +12287,15 @@ packages: resolution: {integrity: sha512-TABA0mksHvu5tE8qNYYDR0fDyo90NCANeghbGAtsI8TUsJzgH0dwpos3WSSiB97J9HRSZuWIMa7YuABEkBIjWQ==} dev: true + /@wdio/protocols@8.20.4: + resolution: {integrity: sha512-9PwA2xgjsoB/9Fm8UWRhJlw61O69ckRICuBn0bzoHmMF7uMzYgDvDTekzYKn8JfjzvLm/MnWXL8raCZfQQ0P5g==} + dev: true + /@wdio/repl@8.10.1: resolution: {integrity: sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.8.8 + '@types/node': 20.8.10 dev: true /@wdio/types@8.16.12: @@ -12274,6 +12312,13 @@ packages: '@types/node': 20.8.8 dev: true + /@wdio/types@8.21.0: + resolution: {integrity: sha512-mZFOipmu541z0BXBW7mBAUjM4zZWhNnP/w321OSYx082Jy4d0UHMFXYWaOC98DIMBPahJu/yLX2WH5iCrazKSA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.8.10 + dev: true + /@wdio/utils@8.16.17: resolution: {integrity: sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==} engines: {node: ^16.13 || >=18} @@ -12318,6 +12363,28 @@ packages: - supports-color dev: true + /@wdio/utils@8.21.0: + resolution: {integrity: sha512-bEmOL9wRsDXnHxh/FYH/rHv/3pJdNIZ8SL0vbBFl3m3ZvKWBJ0xZgpW6XUYXK5S0xi20Y2T7zf2URifp+AOlPg==} + engines: {node: ^16.13 || >=18} + dependencies: + '@puppeteer/browsers': 1.7.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.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: @@ -15895,6 +15962,10 @@ packages: resolution: {integrity: sha512-z4eehc+fhmptqhxwreLcg9iydszZGU4Q5FzaaElXVGp3KyfXbjtXeUCmo4l8FxBJbyXtCz4VRIJsGW2ekApyUQ==} dev: true + /devtools-protocol@0.0.1213968: + resolution: {integrity: sha512-o4n/beY+3CcZwFctYapjGelKptR4AuQT5gXS1Kvgbig+ArwkxK7f8wDVuD1wsoswiJWCwV6OK+Qb7vhNzNmABQ==} + dev: true + /devtools-protocol@0.0.981744: resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} dev: true @@ -18506,7 +18577,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 - minipass: 5.0.0 + minipass: 7.0.4 path-scurry: 1.10.1 dev: true @@ -20109,7 +20180,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -20244,7 +20315,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -20262,7 +20333,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -20283,7 +20354,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 20.8.8 + '@types/node': 18.18.6 anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -20306,7 +20377,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.8 - '@types/node': 18.18.6 + '@types/node': 20.8.10 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -20346,7 +20417,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -20426,7 +20497,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 dev: true /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -20487,7 +20558,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -20544,7 +20615,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 graceful-fs: 4.2.11 dev: true @@ -20552,7 +20623,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.18.6 + '@types/node': 20.8.10 graceful-fs: 4.2.11 dev: true @@ -20591,7 +20662,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 20.8.8 + '@types/node': 18.18.6 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -20603,7 +20674,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -20615,7 +20686,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.0.1 - '@types/node': 20.8.8 + '@types/node': 18.18.6 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -20640,7 +20711,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.18.6 + '@types/node': 20.8.10 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -20651,7 +20722,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -20660,7 +20731,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.8.8 + '@types/node': 18.18.6 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -21293,25 +21364,26 @@ packages: wrap-ansi: 7.0.0 dev: true - /lit-element@3.2.2: - resolution: {integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==} + /lit-element@4.0.1: + resolution: {integrity: sha512-OxRMJem4HKZt0320HplLkBPoi4KHiEHoPHKd8Lzf07ZQVAOKIjZ32yPLRKRDEolFU1RgrQBfSHQMoxKZ72V3Kw==} dependencies: - '@lit/reactive-element': 1.4.1 - lit-html: 2.3.1 + '@lit-labs/ssr-dom-shim': 1.1.2 + '@lit/reactive-element': 2.0.1 + lit-html: 3.0.1 dev: false - /lit-html@2.3.1: - resolution: {integrity: sha512-FyKH6LTW6aBdkfNhNSHyZTnLgJSTe5hMk7HFtc/+DcN1w74C215q8B+Cfxc2OuIEpBNcEKxgF64qL8as30FDHA==} + /lit-html@3.0.1: + resolution: {integrity: sha512-1nmGaNNQg9rBvE1yJ6oS3ZNbLs3FXtlG4+jgGkix8O740qVEwwiFVTgDGIIH8N5TcQ8V9tBk5T+sxqBgffcjJg==} dependencies: '@types/trusted-types': 2.0.2 dev: false - /lit@2.3.1: - resolution: {integrity: sha512-TejktDR4mqG3qB32Y8Lm5Lye3c8SUehqz7qRsxe1PqGYL6me2Ef+jeQAEqh20BnnGncv4Yxy2njEIT0kzK1WCw==} + /lit@3.0.1: + resolution: {integrity: sha512-CYFv7/gwrs6bfPm299O9LD/HB4dgHvsEf/yqUOI//fi469i2OrT4xaptUcmhr05DNQEgsBFecFH8EJnN5So8oQ==} dependencies: - '@lit/reactive-element': 1.4.1 - lit-element: 3.2.2 - lit-html: 2.3.1 + '@lit/reactive-element': 2.0.1 + lit-element: 4.0.1 + lit-html: 3.0.1 dev: false /load-json-file@1.1.0: @@ -27280,6 +27352,10 @@ packages: resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /undici@5.22.1: resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} engines: {node: '>=14.0'} @@ -28530,6 +28606,27 @@ packages: - utf-8-validate dev: true + /webdriver@8.21.0: + resolution: {integrity: sha512-jQ3Me9lEAD+rQWg2g+YfTi2rADCfg7sl02jji9eVRJKJ7Vji7ceGJ6xXfj5+gEZZW8EJt7tpXILJi3etMAYwvA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.8.10 + '@types/ws': 8.5.5 + '@wdio/config': 8.21.0 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.20.4 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.21.0 + 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 + /webdriverio@8.16.20(typescript@5.1.6): resolution: {integrity: sha512-2xSJDrMxwPF1kucB/r7Wc8yF689GGi7iSKrog7vkkoIiRY25vd3U129iN2mTYgNDyM6SM0kw+GP5W1s73khpYw==} engines: {node: ^16.13 || >=18} @@ -28612,6 +28709,47 @@ packages: - utf-8-validate dev: true + /webdriverio@8.21.0(typescript@5.1.6): + resolution: {integrity: sha512-vLpQMOQ9eGyrihkVpuFfd4X83MB8RhfAhhSKnEVAzWn/2CRNlwQSQ4vdNXKhv/kmmBdJOckJThbpV905AQSXFA==} + engines: {node: ^16.13 || >=18} + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + dependencies: + '@types/node': 20.8.10 + '@wdio/config': 8.21.0 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.20.4 + '@wdio/repl': 8.10.1 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.21.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.1213968 + 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.9.0(typescript@5.1.6) + query-selector-shadow-dom: 1.0.1 + resq: 1.11.0 + rgb2hex: 0.2.5 + serialize-error: 11.0.2 + webdriver: 8.21.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}