diff --git a/.changeset/modern-rats-nail.md b/.changeset/modern-rats-nail.md new file mode 100644 index 000000000..ac54b277d --- /dev/null +++ b/.changeset/modern-rats-nail.md @@ -0,0 +1,5 @@ +--- +'@web/test-runner-webdriver': patch +--- + +Initial implementation of WebdriverIO launcher diff --git a/docs/docs/test-runner/browser-launchers/webdriver.md b/docs/docs/test-runner/browser-launchers/webdriver.md new file mode 100644 index 000000000..63a8cb111 --- /dev/null +++ b/docs/docs/test-runner/browser-launchers/webdriver.md @@ -0,0 +1,38 @@ +# Test Runner >> Browser Launchers >> Webdriver ||80 + +Run tests using [WebdriverIO](https://webdriver.io). + +## Usage + +1. Make sure you have a selenium server running, either locally or remote. + +2. Add the Webdriver launcher to your test runner config and specify relevant [options](https://webdriver.io/docs/options.html): + +```js +import { webdriverLauncher } from '@web/test-runner-webdriver'; + +module.exports = { + browsers: [ + webdriverLauncher({ + automationProtocol: 'webdriver', + path: '/wd/hub/', + capabilities: { + browserName: 'chrome', + 'goog:chromeOptions': { + args: ['headless', 'disable-gpu'] + } + } + }) + webdriverLauncher({ + automationProtocol: 'webdriver', + path: '/wd/hub/', + capabilities: { + browserName: 'firefox', + 'moz:firefoxOptions': { + args: ['-headless'] + } + } + }) + ] +}; +``` diff --git a/packages/test-runner-webdriver/index.d.ts b/packages/test-runner-webdriver/index.d.ts new file mode 100644 index 000000000..c41020304 --- /dev/null +++ b/packages/test-runner-webdriver/index.d.ts @@ -0,0 +1,2 @@ +// this file is autogenerated with the generate-mjs-dts-entrypoints script +export * from './dist/index'; diff --git a/packages/test-runner-webdriver/index.mjs b/packages/test-runner-webdriver/index.mjs new file mode 100644 index 000000000..1cf785847 --- /dev/null +++ b/packages/test-runner-webdriver/index.mjs @@ -0,0 +1,6 @@ +// this file is autogenerated with the generate-mjs-dts-entrypoints script +import cjsEntrypoint from './dist/index.js'; + +const { webdriverIOLauncher, WebdriverIOLauncher } = cjsEntrypoint; + +export { webdriverIOLauncher, WebdriverIOLauncher }; diff --git a/packages/test-runner-webdriver/package.json b/packages/test-runner-webdriver/package.json new file mode 100644 index 000000000..fa02702cf --- /dev/null +++ b/packages/test-runner-webdriver/package.json @@ -0,0 +1,57 @@ +{ + "name": "@web/test-runner-webdriver", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "Webdriver browser launcher for Web Test Runner", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/modernweb-dev/web.git", + "directory": "packages/test-runner-webdriver" + }, + "author": "modern-web", + "homepage": "https://github.com/modernweb-dev/web/tree/master/packages/test-runner-webdriver", + "main": "dist/index.js", + "exports": { + ".": { + "import": "./index.mjs", + "require": "./dist/index.js" + } + }, + "engines": { + "node": ">=10.0.0" + }, + "scripts": { + "build": "tsc", + "test": "mocha test/**/*.test.ts --require ts-node/register", + "test:watch": "mocha test/**/*.test.ts --require ts-node/register --watch --watch-files src,test" + }, + "files": [ + "*.d.ts", + "*.js", + "*.mjs", + "dist", + "src" + ], + "keywords": [ + "web", + "test", + "runner", + "testrunner", + "webdriver", + "webdriverio", + "wdio", + "browser", + "launcher" + ], + "dependencies": { + "@web/test-runner-core": "^0.8.11", + "webdriverio": "^6.10.0" + }, + "devDependencies": { + "@types/selenium-standalone": "^6.15.2", + "selenium-standalone": "^6.23.0" + } +} diff --git a/packages/test-runner-webdriver/src/IFrameManager.ts b/packages/test-runner-webdriver/src/IFrameManager.ts new file mode 100644 index 000000000..185c49179 --- /dev/null +++ b/packages/test-runner-webdriver/src/IFrameManager.ts @@ -0,0 +1,172 @@ +import { TestRunnerCoreConfig } from '@web/test-runner-core'; +import { BrowserObject, Element } from 'webdriverio'; +import { validateBrowserResult } from './coverage'; + +/** + * Manages tests to be executed in iframes on a page. + */ +export class IFrameManager { + private config: TestRunnerCoreConfig; + private driver: BrowserObject; + private framePerSession = new Map(); + private inactiveFrames: string[] = []; + private frameCount = 0; + private initialized = false; + private initializePromise?: Promise; + private locked?: Promise; + private isIE: boolean; + + constructor(config: TestRunnerCoreConfig, driver: BrowserObject, isIE: boolean) { + this.config = config; + this.driver = driver; + this.isIE = isIE; + } + + private async _initialize(url: string) { + const pageUrl = `${new URL(url).origin}/?mode=iframe`; + await this.driver.navigateTo(pageUrl); + } + + isActive(id: string) { + return this.framePerSession.has(id); + } + + async getBrowserUrl(sessionId: string): Promise { + const frameId = this.getFrameId(sessionId); + + const returnValue = (await this.driver.execute(` + try { + var iframe = document.getElementById("${frameId}"); + return iframe.contentWindow.location.href; + } catch (_) { + return undefined; + } + `)) as string | undefined; + + return returnValue; + } + + private getFrameId(sessionId: string): string { + const frameId = this.framePerSession.get(sessionId); + if (!frameId) { + throw new Error( + `Something went wrong while running tests, there is no frame id for session ${sessionId}`, + ); + } + return frameId; + } + + private async scheduleCommand(fn: () => Promise) { + if (!this.isIE) { + return fn(); + } + + while (this.locked) { + await this.locked; + } + + const fnPromise = fn(); + this.locked = fnPromise; + const result = await fnPromise; + this.locked = undefined; + return result; + } + + async queueStartSession(id: string, url: string) { + if (!this.initializePromise && !this.initialized) { + this.initializePromise = this._initialize(url); + } + + if (this.initializePromise) { + await this.initializePromise; + this.initializePromise = undefined; + this.initialized = true; + } + + this.scheduleCommand(() => this.startSession(id, url)); + } + + private async startSession(id: string, url: string) { + let frameId: string; + if (this.inactiveFrames.length > 0) { + frameId = this.inactiveFrames.pop()!; + await this.driver.execute(` + var iframe = document.getElementById("${frameId}"); + iframe.src = "${url}"; + `); + } else { + this.frameCount += 1; + frameId = `wtr-test-frame-${this.frameCount}`; + await this.driver.execute(` + var iframe = document.createElement("iframe"); + iframe.id = "${frameId}"; + iframe.src = "${url}"; + document.body.appendChild(iframe); + `); + } + + this.framePerSession.set(id, frameId); + } + + async queueStopSession(id: string) { + return this.scheduleCommand(() => this.stopSession(id)); + } + + async stopSession(id: string) { + const frameId = this.getFrameId(id); + + // Retrieve test results from iframe. Note: IIFE is used to prevent + // WebdriverIO from crashing failure with Puppeteer (default mode): + // Error: Evaluation failed: SyntaxError: Illegal return statement + // See https://github.com/webdriverio/webdriverio/pull/4829 + const returnValue = await this.driver.execute(` + return (function() { + var iframe = document.getElementById("${frameId}"); + var testCoverage; + try { + testCoverage = iframe.contentWindow.__coverage__; + } catch (error) { + // iframe can throw a cross-origin error if the test navigated + } + + // set src after retrieving values to avoid the iframe from navigating away + iframe.src = "data:,"; + return { testCoverage: testCoverage }; + })(); + `); + + if (!validateBrowserResult(returnValue)) { + throw new Error(); + } + + const { testCoverage } = returnValue; + + this.inactiveFrames.push(frameId); + + return { testCoverage: this.config.coverage ? testCoverage : undefined }; + } + + async takeScreenshot(sessionId: string, locator: string): Promise { + const frameId = this.getFrameId(sessionId); + + const frame = await this.driver.$(`iframe#${frameId}`); + + await this.driver.switchToFrame(frame); + + const elementData = (await this.driver.execute(locator, [])) as Element; + + const element = await this.driver.$(elementData); + + let base64 = ''; + + try { + base64 = await this.driver.takeElementScreenshot(element.elementId); + } catch (err) { + console.log('Failed to take a screenshot:', err); + } + + await this.driver.switchToParentFrame(); + + return Buffer.from(base64, 'base64'); + } +} diff --git a/packages/test-runner-webdriver/src/SessionManager.ts b/packages/test-runner-webdriver/src/SessionManager.ts new file mode 100644 index 000000000..5e69ec5a9 --- /dev/null +++ b/packages/test-runner-webdriver/src/SessionManager.ts @@ -0,0 +1,98 @@ +import { TestRunnerCoreConfig } from '@web/test-runner-core'; +import { BrowserObject, Element } from 'webdriverio'; +import { validateBrowserResult } from './coverage'; + +/** + * Manages tests to be executed in one session (concurrency: 1). + */ +export class SessionManager { + private config: TestRunnerCoreConfig; + private driver: BrowserObject; + private locked?: Promise; + private isIE: boolean; + private urlMap = new Map(); + + constructor(config: TestRunnerCoreConfig, driver: BrowserObject, isIE: boolean) { + this.config = config; + this.driver = driver; + this.isIE = isIE; + } + + isActive(id: string) { + return this.urlMap.has(id); + } + + async getBrowserUrl(id: string): Promise { + return this.urlMap.get(id); + } + + private async scheduleCommand(fn: () => Promise) { + if (!this.isIE) { + return fn(); + } + + while (this.locked) { + await this.locked; + } + + const fnPromise = fn(); + this.locked = fnPromise; + const result = await fnPromise; + this.locked = undefined; + return result; + } + + async queueStartSession(id: string, url: string) { + this.scheduleCommand(() => this.startSession(id, url)); + } + + private async startSession(id: string, url: string) { + this.urlMap.set(id, url); + await this.driver.navigateTo(url); + } + + async queueStopSession(id: string) { + return this.scheduleCommand(() => this.stopSession(id)); + } + + async stopSession(id: string) { + // Retrieve test results from iframe. Note: IIFE is used to prevent + // WebdriverIO from crashing failure with Puppeteer (default mode): + // Error: Evaluation failed: SyntaxError: Illegal return statement + // See https://github.com/webdriverio/webdriverio/pull/4829 + const returnValue = await this.driver.execute(` + return (function() { + return { testCoverage: window.__coverage__ }; + })(); + `); + + if (!validateBrowserResult(returnValue)) { + throw new Error(); + } + + const { testCoverage } = returnValue; + + // navigate to an empty page to kill any running code on the page + await this.driver.navigateTo('data:,'); + + this.urlMap.delete(id); + + return { testCoverage: this.config.coverage ? testCoverage : undefined }; + } + + async takeScreenshot(_: string, locator: string): Promise { + const elementData = (await this.driver.execute(locator, [])) as Element; + + const element = await this.driver.$(elementData); + + let base64 = ''; + + try { + base64 = await this.driver.takeElementScreenshot(element.elementId); + } catch (err) { + console.log('Failed to take a screenshot:', err); + } + + return Buffer.from(base64, 'base64'); + } +} diff --git a/packages/test-runner-webdriver/src/coverage.ts b/packages/test-runner-webdriver/src/coverage.ts new file mode 100644 index 000000000..957ba073d --- /dev/null +++ b/packages/test-runner-webdriver/src/coverage.ts @@ -0,0 +1,14 @@ +import { CoverageMapData } from '@web/test-runner-core'; + +export interface BrowserResult { + testCoverage?: CoverageMapData; + url: string; +} + +export function validateBrowserResult(result: any): result is BrowserResult { + if (typeof result !== 'object') throw new Error('Browser did not return an object'); + if (result.testCoverage != null && typeof result.testCoverage !== 'object') + throw new Error('Browser returned non-object testCoverage'); + + return true; +} diff --git a/packages/test-runner-webdriver/src/index.ts b/packages/test-runner-webdriver/src/index.ts new file mode 100644 index 000000000..3bcead353 --- /dev/null +++ b/packages/test-runner-webdriver/src/index.ts @@ -0,0 +1 @@ +export { webdriverLauncher, WebdriverLauncher } from './webdriverLauncher'; diff --git a/packages/test-runner-webdriver/src/utils.ts b/packages/test-runner-webdriver/src/utils.ts new file mode 100644 index 000000000..e74c951c7 --- /dev/null +++ b/packages/test-runner-webdriver/src/utils.ts @@ -0,0 +1,17 @@ +import { DesiredCapabilities } from 'webdriver'; + +function getPlatform(c: DesiredCapabilities): string | undefined { + return c.platformName || c.platform; +} + +export function getBrowserName(c: DesiredCapabilities): string | undefined { + return c.browserName; +} + +function getBrowserVersion(c: DesiredCapabilities): string | undefined { + return c.browserVersion || c.version; +} + +export function getBrowserLabel(c: DesiredCapabilities): string { + return [getPlatform(c), getBrowserName(c), getBrowserVersion(c)].filter(_ => _).join(' '); +} diff --git a/packages/test-runner-webdriver/src/webdriverLauncher.ts b/packages/test-runner-webdriver/src/webdriverLauncher.ts new file mode 100644 index 000000000..9bb38eb56 --- /dev/null +++ b/packages/test-runner-webdriver/src/webdriverLauncher.ts @@ -0,0 +1,121 @@ +import { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core'; +import { remote, BrowserObject, RemoteOptions } from 'webdriverio'; +import { IFrameManager } from './IFrameManager'; +import { SessionManager } from './SessionManager'; +import { getBrowserLabel } from './utils'; + +export class WebdriverLauncher implements BrowserLauncher { + public name = 'Initializing...'; + public type = 'wdio'; + private config?: TestRunnerCoreConfig; + private driver?: BrowserObject; + private debugDriver: undefined | BrowserObject = undefined; + private driverManager?: IFrameManager | SessionManager; + private __managerPromise?: Promise; + private isIE = false; + + constructor(private options: RemoteOptions) {} + + async initialize(config: TestRunnerCoreConfig) { + this.config = config; + + const options: RemoteOptions = { logLevel: 'error', ...this.options }; + + try { + this.driver = await remote(options); + } catch (e) { + this.stop(); + throw e; + } + + const cap = this.driver.capabilities; + this.name = getBrowserLabel(cap); + const browserName = cap.browserName?.toLowerCase().replace(/_/g, ' ') || ''; + this.isIE = + (browserName.includes('internet') && browserName.includes('explorer')) || + browserName === 'ie' || + browserName === 'ie11'; + } + + async stop() { + try { + await this.driver?.deleteSession(); + await this.debugDriver?.deleteSession(); + + this.driver = undefined; + this.debugDriver = undefined; + this.driverManager = undefined; + } catch { + // + } + } + + async startSession(id: string, url: string) { + await this.ensureManagerInitialized(); + return this.driverManager!.queueStartSession(id, url); + } + + isActive(id: string) { + return !!this.driverManager?.isActive(id); + } + + getBrowserUrl(sessionId: string) { + if (!this.driverManager) { + throw new Error('Not initialized'); + } + return this.driverManager.getBrowserUrl(sessionId); + } + + async stopSession(id: string) { + return this.driverManager!.queueStopSession(id); + } + + async startDebugSession(_: string, url: string) { + if (this.debugDriver) { + await this.debugDriver.deleteSession(); + } + this.debugDriver = await remote(this.options); + await this.debugDriver.navigateTo(url); + } + + private async ensureManagerInitialized(): Promise { + if (this.driverManager) { + return; + } + + if (this.__managerPromise) { + await this.__managerPromise; + return; + } + + this.__managerPromise = this.createDriverManager(); + await this.__managerPromise; + this.__managerPromise = undefined; + } + + private async createDriverManager() { + if (!this.config || !this.driver) throw new Error('Not initialized'); + + this.driverManager = + this.config.concurrency === 1 + ? new SessionManager(this.config, this.driver, this.isIE) + : new IFrameManager(this.config, this.driver, this.isIE); + + return this.driverManager; + } + + takeScreenshot(sessionId: string, locator: string) { + if (!this.driverManager) { + throw new Error('Not initialized'); + } + return this.driverManager.takeScreenshot(sessionId, locator); + } +} + +export function webdriverLauncher(options: RemoteOptions) { + if (!options?.capabilities) { + throw new Error(`Webdriver launcher requires a capabilities property.`); + } + + return new WebdriverLauncher(options); +} diff --git a/packages/test-runner-webdriver/test/fixtures/a.js b/packages/test-runner-webdriver/test/fixtures/a.js new file mode 100644 index 000000000..72c009e26 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/a.js @@ -0,0 +1,13 @@ +/* eslint-disable */ +it('test a', async function () { + this.timeout(5000); + await new Promise(resolve => setTimeout(resolve, 1000)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/b.js b/packages/test-runner-webdriver/test/fixtures/b.js new file mode 100644 index 000000000..66fe8b8e6 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/b.js @@ -0,0 +1,12 @@ +/* eslint-disable */ +it('test a', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/c.js b/packages/test-runner-webdriver/test/fixtures/c.js new file mode 100644 index 000000000..72c009e26 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/c.js @@ -0,0 +1,13 @@ +/* eslint-disable */ +it('test a', async function () { + this.timeout(5000); + await new Promise(resolve => setTimeout(resolve, 1000)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/d.js b/packages/test-runner-webdriver/test/fixtures/d.js new file mode 100644 index 000000000..66fe8b8e6 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/d.js @@ -0,0 +1,12 @@ +/* eslint-disable */ +it('test a', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/e.js b/packages/test-runner-webdriver/test/fixtures/e.js new file mode 100644 index 000000000..72c009e26 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/e.js @@ -0,0 +1,13 @@ +/* eslint-disable */ +it('test a', async function () { + this.timeout(5000); + await new Promise(resolve => setTimeout(resolve, 1000)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/f.js b/packages/test-runner-webdriver/test/fixtures/f.js new file mode 100644 index 000000000..66fe8b8e6 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/f.js @@ -0,0 +1,12 @@ +/* eslint-disable */ +it('test a', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/g.js b/packages/test-runner-webdriver/test/fixtures/g.js new file mode 100644 index 000000000..72c009e26 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/g.js @@ -0,0 +1,13 @@ +/* eslint-disable */ +it('test a', async function () { + this.timeout(5000); + await new Promise(resolve => setTimeout(resolve, 1000)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/h.js b/packages/test-runner-webdriver/test/fixtures/h.js new file mode 100644 index 000000000..66fe8b8e6 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/h.js @@ -0,0 +1,12 @@ +/* eslint-disable */ +it('test a', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/i.js b/packages/test-runner-webdriver/test/fixtures/i.js new file mode 100644 index 000000000..72c009e26 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/i.js @@ -0,0 +1,13 @@ +/* eslint-disable */ +it('test a', async function () { + this.timeout(5000); + await new Promise(resolve => setTimeout(resolve, 1000)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/j.js b/packages/test-runner-webdriver/test/fixtures/j.js new file mode 100644 index 000000000..66fe8b8e6 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/j.js @@ -0,0 +1,12 @@ +/* eslint-disable */ +it('test a', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test b', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); + +it('test c', async () => { + await new Promise(resolve => setTimeout(resolve, 100)); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/module-features-a.js b/packages/test-runner-webdriver/test/fixtures/module-features-a.js new file mode 100644 index 000000000..d1d0f07c2 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/module-features-a.js @@ -0,0 +1 @@ +export default 'moduleFeaturesA'; diff --git a/packages/test-runner-webdriver/test/fixtures/module-features-b.js b/packages/test-runner-webdriver/test/fixtures/module-features-b.js new file mode 100644 index 000000000..55b6e6747 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/module-features-b.js @@ -0,0 +1 @@ +export default 'moduleFeaturesB'; diff --git a/packages/test-runner-webdriver/test/fixtures/module-features.js b/packages/test-runner-webdriver/test/fixtures/module-features.js new file mode 100644 index 000000000..4aae65b13 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/module-features.js @@ -0,0 +1,15 @@ +import { expect } from '../../../../node_modules/@esm-bundle/chai/esm/chai.js'; +import module from './module-features-a.js'; + +it('supports static imports', () => { + expect(module).to.equal('moduleFeaturesA'); +}); + +it('supports dynamic imports', async () => { + const featuresB = (await import('./module-features-b.js')).default; + expect(featuresB).to.equal('moduleFeaturesB'); +}); + +it('supports import meta', () => { + expect(import.meta.url.indexOf('fixtures/module-features.js')).to.not.equal(-1); +}); diff --git a/packages/test-runner-webdriver/test/fixtures/stage-4-features.js b/packages/test-runner-webdriver/test/fixtures/stage-4-features.js new file mode 100644 index 000000000..6523bb9e1 --- /dev/null +++ b/packages/test-runner-webdriver/test/fixtures/stage-4-features.js @@ -0,0 +1,49 @@ +import { expect } from '../../../../node_modules/@esm-bundle/chai/esm/chai.js'; + +it('supports object spread', () => { + const foo = { a: 1 }; + const bar = { b: 2, ...foo }; + expect(bar).to.eql({ a: 1, b: 2 }); +}); + +it('supports async functions', () => { + async function asyncFunction() { + // + } + expect(asyncFunction() instanceof Promise).to.equal(true); +}); + +it('supports exponentiation', () => { + expect(2 ** 4).to.equal(16); +}); + +it('supports classes', () => { + class Foo { + constructor(foo) { + this.foo = foo; + } + } + + class Bar extends Foo { + constructor() { + super('bar'); + } + } + expect(new Bar().foo).to.equal('bar'); +}); + +it('supports template literals', () => { + const val = 'literal'; + expect(`template ${val}`).to.equal('template literal'); +}); + +it('supports optional chaining', () => { + const lorem = { ipsum: 'lorem ipsum' }; + expect(lorem?.ipsum).to.equal('lorem ipsum'); + expect(lorem?.ipsum?.foo).to.equal(undefined); +}); + +it('supports nullish coalescing', () => { + const buz = null; + expect(buz ?? 'nullish colaesced').to.equal('nullish colaesced'); +}); diff --git a/packages/test-runner-webdriver/test/webdriverLauncher.test.ts b/packages/test-runner-webdriver/test/webdriverLauncher.test.ts new file mode 100644 index 000000000..728dca55f --- /dev/null +++ b/packages/test-runner-webdriver/test/webdriverLauncher.test.ts @@ -0,0 +1,82 @@ +import os from 'os'; +import selenium from 'selenium-standalone'; +import { runIntegrationTests } from '../../../integration/test-runner'; +import { webdriverLauncher } from '../src/webdriverLauncher'; + +async function startSeleniumServer() { + await new Promise((resolve, reject) => + selenium.install(err => { + if (err) { + reject(err); + } else { + resolve(); + } + }), + ); + + return new Promise((resolve, reject) => + selenium.start((err, server) => { + if (err) { + reject(err); + } else { + resolve(server); + } + }), + ); +} + +let seleniumServer: selenium.ChildProcess; + +// selenium doesn't work on windows in the CI +if (os.platform() !== 'win32') { + before(async function () { + this.timeout(50000); + seleniumServer = await startSeleniumServer(); + }); + + describe('test-runner-webdriver', function testRunnerWebdriver() { + this.timeout(50000); + + function createConfig() { + return { + browserStartTimeout: 1000 * 60 * 2, + testsStartTimeout: 1000 * 60 * 2, + testsFinishTimeout: 1000 * 60 * 2, + browsers: [ + webdriverLauncher({ + automationProtocol: 'webdriver', + path: '/wd/hub/', + capabilities: { + browserName: 'chrome', + 'goog:chromeOptions': { + args: ['headless', 'disable-gpu'], + }, + }, + }), + webdriverLauncher({ + automationProtocol: 'webdriver', + path: '/wd/hub/', + capabilities: { + browserName: 'firefox', + 'moz:firefoxOptions': { + args: ['-headless'], + }, + }, + }), + ], + }; + } + + runIntegrationTests(createConfig, { + basic: true, + groups: true, + parallel: true, + testFailure: true, + locationChanged: true, + }); + }); + + after(() => { + seleniumServer.kill(); + }); +} diff --git a/packages/test-runner-webdriver/tsconfig.json b/packages/test-runner-webdriver/tsconfig.json new file mode 100644 index 000000000..734713694 --- /dev/null +++ b/packages/test-runner-webdriver/tsconfig.json @@ -0,0 +1,35 @@ +// Don't edit this file directly. It is generated by /scripts/update-package-configs.ts + +{ + "extends": "../../tsconfig.node-base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist", + "rootDir": "./src", + "composite": true, + "allowJs": true + }, + "references": [ + { + "path": "../parse5-utils/tsconfig.json" + }, + { + "path": "../browser-logs/tsconfig.json" + }, + { + "path": "../dev-server-core/tsconfig.json" + }, + { + "path": "../test-runner-core/tsconfig.json" + } + ], + "include": [ + "src", + "types" + ], + "exclude": [ + "src/browser", + "tests", + "dist" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c0ce0adf6..17d5e3422 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -96,6 +96,9 @@ }, { "path": "./packages/test-runner-visual-regression/tsconfig.json" + }, + { + "path": "./packages/test-runner-webdriver/tsconfig.json" } ] } \ No newline at end of file diff --git a/workspace-packages.mjs b/workspace-packages.mjs index 99b16a87d..ba2314454 100644 --- a/workspace-packages.mjs +++ b/workspace-packages.mjs @@ -30,6 +30,7 @@ const packages = [ { name: 'test-runner-mocha', type: 'ts', environment: 'browser' }, { name: 'test-runner-saucelabs', type: 'ts', environment: 'node' }, { name: 'test-runner-visual-regression', type: 'ts', environment: 'node' }, + { name: 'test-runner-webdriver', type: 'ts', environment: 'node' }, ]; export { packages }; diff --git a/yarn.lock b/yarn.lock index 8175db919..003fbe9ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -57,29 +57,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== -"@babel/core@7.11.6": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" - integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.6" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@7.12.9", "@babel/core@^7.12.9", "@babel/core@^7.8.4": +"@babel/core@7.12.9", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.7.5", "@babel/core@^7.8.4": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -101,29 +79,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.7.tgz#bf55363c08c8352a37691f7216ec30090bf7e3bf" - integrity sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.7" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.6", "@babel/generator@^7.12.5", "@babel/generator@^7.9.6": +"@babel/generator@^7.12.5", "@babel/generator@^7.9.6": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== @@ -246,7 +202,7 @@ dependencies: "@babel/types" "^7.12.5" -"@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.12.1": +"@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== @@ -333,7 +289,7 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.10.4", "@babel/helpers@^7.12.1", "@babel/helpers@^7.12.5": +"@babel/helpers@^7.12.1", "@babel/helpers@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== @@ -351,7 +307,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.11.5", "@babel/parser@^7.12.7", "@babel/parser@^7.9.6": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.9.6": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== @@ -421,15 +377,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread@7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" @@ -514,13 +461,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" - integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx@7.12.1", "@babel/plugin-syntax-jsx@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" @@ -747,7 +687,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.12.1" -"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1": +"@babel/plugin-transform-parameters@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== @@ -935,22 +875,7 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.7.tgz#572a722408681cef17d6b0bef69ef2e728ca69f1" - integrity sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.12.9": +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== @@ -965,7 +890,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.4.4": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== @@ -1444,32 +1369,7 @@ dependencies: extend "3.0.2" -"@mdx-js/mdx@^1.6.21": - version "1.6.21" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.21.tgz#d3651b4802db7bdc399270c0ffa9e2aa99dd4b00" - integrity sha512-z35VI6qDw9eAzR/obtgHbYVUdb/Pm+oUnlP1lLR94Oe05Xs2H7vlAgpuFBCLH5g/egzAc2wZCyoVydr25CsF+A== - dependencies: - "@babel/core" "7.11.6" - "@babel/plugin-syntax-jsx" "7.10.4" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.21" - babel-plugin-apply-mdx-type-prop "1.6.21" - babel-plugin-extract-import-names "1.6.21" - camelcase-css "2.0.1" - detab "2.0.3" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "9.1.2" - remark-footnotes "2.0.0" - remark-mdx "1.6.21" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/mdx@^1.6.22": +"@mdx-js/mdx@^1.6.21", "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== @@ -1494,11 +1394,6 @@ unist-builder "2.0.3" unist-util-visit "2.0.3" -"@mdx-js/util@1.6.21": - version "1.6.21" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.21.tgz#25f97a0a1b76e78c16ae5d98c6c73e1be8d89e39" - integrity sha512-6sANhqfEHu6gdHZSrzDjN18Y48mIon8f2Os6J+IFmMHN0IhNG/0PUIIsI07kA1sZ9t6vgZNBloVmcDa5WOSe6A== - "@mdx-js/util@1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" @@ -1577,7 +1472,7 @@ dependencies: slash "^3.0.0" -"@rollup/plugin-babel@^5.2.0", "@rollup/plugin-babel@^5.2.2": +"@rollup/plugin-babel@^5.2.0", "@rollup/plugin-babel@^5.2.1", "@rollup/plugin-babel@^5.2.2": version "5.2.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.2.tgz#e5623a01dd8e37e004ba87f2de218c611727d9b2" integrity sha512-MjmH7GvFT4TW8xFdIeFS3wqIX646y5tACdxkTO+khbHvS3ZcVJL6vkAHLw2wqPmkhwCfWHoNsp15VYNwW6JEJA== @@ -1585,14 +1480,6 @@ "@babel/helper-module-imports" "^7.10.4" "@rollup/pluginutils" "^3.1.0" -"@rollup/plugin-babel@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz#20fc8f8864dc0eaa1c5578408459606808f72924" - integrity sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" - "@rollup/plugin-commonjs@^16.0.0": version "16.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz#169004d56cd0f0a1d0f35915d31a036b0efe281f" @@ -1764,6 +1651,18 @@ dependencies: "@types/node" "*" +"@types/archiver@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.1.0.tgz#869f4ce4028e49cf9a0243cf914415f4cc3d1f3d" + integrity sha512-baFOhanb/hxmcOd1Uey2TfFg43kTSmM6py1Eo7Rjbv/ivcl7PXLhY0QgXGf50Hx/eskGCFqPfhs/7IZLb15C5g== + dependencies: + "@types/glob" "*" + +"@types/atob@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/atob/-/atob-2.1.2.tgz#157eb0cc46264a8c55f2273a836c7a1a644fb820" + integrity sha512-8GAYQ1jDRUQkSpHzJUqXwAkYFOxuWAOGLhIR4aPd/Y/yL12Q/9m7LsKpHKlfKdNE/362Hc9wPI1Yh6opDfxVJg== + "@types/babel-types@*", "@types/babel-types@^7.0.0": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41" @@ -1948,7 +1847,14 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/glob@^7.1.3": +"@types/fs-extra@^9.0.2": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.4.tgz#12553138cf0438db9a31cdc8b0a3aa9332eb67aa" + integrity sha512-50GO5ez44lxK5MDH90DYHFFfqxH7+fTqEEnvguQRzJ/tY9qFrMSHLiYHite+F3SNmf7+LHC1eMXojuD+E3Qcyg== + dependencies: + "@types/node" "*" + +"@types/glob@*", "@types/glob@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== @@ -2077,6 +1983,32 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/lodash.clonedeep@^4.5.6": + version "4.5.6" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.6.tgz#3b6c40a0affe0799a2ce823b440a6cf33571d32b" + integrity sha512-cE1jYr2dEg1wBImvXlNtp0xDoS79rfEdGozQVgliDZj1uERH4k+rmEMTudP9b4VQ8O6nRb5gPqft0QzEQGMQgA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.isplainobject@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#757d2dcdecbb32f4452018b285a586776092efd1" + integrity sha512-8G41YFhmOl8Ck6NrwLK5hhnbz6ADfuDJP+zusDnX3PoYhfC60+H/rQE6zmdO4yFzPCPJPY4oGZK2spbXm6gYEA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.merge@^4.6.6": + version "4.6.6" + resolved "https://registry.yarnpkg.com/@types/lodash.merge/-/lodash.merge-4.6.6.tgz#b84b403c1d31bc42d51772d1cd5557fa008cd3d6" + integrity sha512-IB90krzMf7YpfgP3u/EvZEdXVvm4e3gJbUvh5ieuI+o+XqiNEt6fCzqNRaiLlPVScLI59RxIGZMQ3+Ko/DJ8vQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.165" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.165.tgz#74d55d947452e2de0742bad65270433b63a8c30f" + integrity sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg== + "@types/lru-cache@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" @@ -2116,21 +2048,16 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.4.tgz#b840c2dce46bacf286e237bfb59a29e843399148" integrity sha512-M4BwiTJjHmLq6kjON7ZoI2JMlBvpY3BYSdiP6s/qCT3jb1s9/DeJF0JELpAxiVSIxXDzfNKe+r7yedMIoLbknQ== -"@types/node@*": - version "14.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" - integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== +"@types/node@*", "@types/node@^14.14.10": + version "14.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" + integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== "@types/node@^12.7.1": version "12.19.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.6.tgz#fbf249fa46487dd8c7386d785231368b92a33a53" integrity sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ== -"@types/node@^14.14.10": - version "14.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" - integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== - "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -2388,6 +2315,44 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@wdio/config@6.10.4": + version "6.10.4" + resolved "https://registry.yarnpkg.com/@wdio/config/-/config-6.10.4.tgz#84e87d9254173289517271a83618059097749e1b" + integrity sha512-M22EunI+n/mmYOQqb9+BTVRqrfmPw+7rR1AHeD36vOXCnZ55Nrl4ZU4d6QzPHp9cLdMZqV786iDmkonnb6jb8w== + dependencies: + "@wdio/logger" "6.10.4" + deepmerge "^4.0.0" + glob "^7.1.2" + +"@wdio/logger@6.10.4": + version "6.10.4" + resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-6.10.4.tgz#f821c01996d15faa6b5a399be2aea02a2661b61f" + integrity sha512-I+1I/5CtQigy59QJen56PHuwV0yiQdnZaOxmXIP6FzpWkeXLjcoUNaCRDuKwJx5GKrUSDqmGlMWSH53scwwzHg== + dependencies: + chalk "^4.0.0" + loglevel "^1.6.0" + loglevel-plugin-prefix "^0.8.4" + strip-ansi "^6.0.0" + +"@wdio/protocols@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-6.10.0.tgz#5f3523d77bf77fc1bcec7ee0469b8a52ef8fb499" + integrity sha512-MaloMFtlZeeGoqHyy2g5QM8HHuQDZOAGjxotsQ6mVAzZpAFbwUGHPSRlwBbbsB3gHVALJVowViltJ95jgaFfZg== + +"@wdio/repl@6.10.4": + version "6.10.4" + resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-6.10.4.tgz#ae00485efe9520897a795f502a242bd6d79e1201" + integrity sha512-VwucPyUqAxU6CWWoEVf14asjtLGTgyaJwp47kEFegr06ZBG43zVQ6JqKFiGDxUJ+fZVRhdd7nRVHd+6UllK18w== + dependencies: + "@wdio/utils" "6.10.4" + +"@wdio/utils@6.10.4": + version "6.10.4" + resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-6.10.4.tgz#d71fb5ee3b6f8855bb0a95d16c9e46697e61d6c4" + integrity sha512-DkFguYGKUcv9TmIYuuwS/pxpiGcgyv8gWUWRXffirt2OYpFXJNwB+S96CSQnjgb4B5MqSFgEti+gl8A2wsdDgQ== + dependencies: + "@wdio/logger" "6.10.4" + "@web/dev-server@^0.0.24": version "0.0.24" resolved "https://registry.yarnpkg.com/@web/dev-server/-/dev-server-0.0.24.tgz#891de7da5497a538d74b50b7c99a492a1f5661b3" @@ -2649,6 +2614,35 @@ archive-type@^4.0.0: dependencies: file-type "^4.2.0" +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + 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.0.0" + +archiver@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.1.0.tgz#05b0f6f7836f3e6356a0532763d2bb91017a7e37" + integrity sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.0" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.0.0" + tar-stream "^2.1.4" + zip-stream "^4.0.4" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -2765,6 +2759,11 @@ async@^2.6.2: dependencies: lodash "^4.17.14" +async@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2775,6 +2774,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + axios@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" @@ -2790,14 +2794,6 @@ babel-extract-comments@^1.0.0: dependencies: babylon "^6.18.0" -babel-plugin-apply-mdx-type-prop@1.6.21: - version "1.6.21" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.21.tgz#0c8600c965ca4203e3c026ed971ed5b7e810aeba" - integrity sha512-+vQarmm+g+kePH4CMp2iEN/HOx1oEvZeSKCdKCEZlnJOthXzkpaRAbM3ZNCiKqVr9WuoqPNfoXQ0EVppYpIwfg== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.21" - babel-plugin-apply-mdx-type-prop@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" @@ -2821,13 +2817,6 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-extract-import-names@1.6.21: - version "1.6.21" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.21.tgz#94efffee4ea79982491573e5f67d9957ab77596a" - integrity sha512-mCjTry00HB/4xHGunxQNMOGZ7JEGJdEScNh7C1WJBto7nePyn9wCdYAZP61pGC6+z3ETH5btY20mqg0plcxZGA== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - babel-plugin-extract-import-names@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" @@ -3140,18 +3129,7 @@ browserslist-useragent@^3.0.3: semver "^7.3.2" useragent "^2.3.0" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.9.1: - version "4.14.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" - integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== - dependencies: - caniuse-lite "^1.0.30001157" - colorette "^1.2.1" - electron-to-chromium "^1.3.591" - escalade "^3.1.1" - node-releases "^1.1.66" - -browserslist@^4.15.0: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.15.0, browserslist@^4.9.1: version "4.15.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.15.0.tgz#3d48bbca6a3f378e86102ffd017d9a03f122bdb0" integrity sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ== @@ -3208,7 +3186,7 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-crc32@~0.2.3: +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= @@ -3382,12 +3360,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001157: - version "1.0.30001159" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" - integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== - -caniuse-lite@^1.0.30001164: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001164: version "1.0.30001164" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001164.tgz#5bbfd64ca605d43132f13cc7fdabb17c3036bfdc" integrity sha512-G+A/tkf4bu0dSp9+duNiXc7bGds35DioCyC6vgK2m/rjA4Krpy5WeZgZyfH2f0wj2kI6yAWWucyap6oOwmY1mg== @@ -3556,7 +3529,7 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chrome-launcher@^0.13.4: +chrome-launcher@^0.13.1, chrome-launcher@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.4.tgz#4c7d81333c98282899c4e38256da23e00ed32f73" integrity sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A== @@ -3838,6 +3811,16 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +compress-commons@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7" + integrity sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^4.0.1" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -3970,12 +3953,7 @@ cookies@~0.8.0: depd "~2.0.0" keygrip "~1.1.0" -core-js-bundle@^3.6.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.7.0.tgz#e49b332fb214767369eb506e7c4ab5037aff4cd8" - integrity sha512-dxWbbGslTVI8RP2wFGw6llMbw7LD+R0NJHj7WnLrdtpLiZ6YcTdn/7uNEVBIfxi1PH7q4Kt48TbB8gwwZFvrJQ== - -core-js-bundle@^3.8.0: +core-js-bundle@^3.6.0, core-js-bundle@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.8.0.tgz#f83c1e029155fcb2ecad65480deafe093ddde513" integrity sha512-ggWMDcmwbHGRjSDfAXnR6rySJ/86yULxcg80YgGyyrcoan9yOGr0PqSm9X9P1oB8x/hj3z6nkFFwC/Anigpn+Q== @@ -4019,6 +3997,22 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc-32@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +crc32-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067" + integrity sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -4111,6 +4105,11 @@ css-selector-tokenizer@^0.7.0: cssesc "^3.0.0" fastparse "^1.1.2" +css-shorthand-properties@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935" + integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A== + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -4127,6 +4126,11 @@ css-tree@^1.0.0: mdn-data "2.0.14" source-map "^0.6.1" +css-value@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" + integrity sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo= + css-what@^3.2.1: version "3.4.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" @@ -4426,7 +4430,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^4.2.2: +deepmerge@^4.0.0, deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -4508,13 +4512,6 @@ destroy@^1.0.4, destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detab@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.3.tgz#33e5dd74d230501bd69985a0d2b9a3382699a130" - integrity sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A== - dependencies: - repeat-string "^1.5.4" - detab@2.0.4, detab@^2.0.0, detab@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" @@ -4548,6 +4545,24 @@ devtools-protocol@0.0.818844: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== +devtools@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/devtools/-/devtools-6.10.4.tgz#b71c8516370e2a972facc79da04e6c75ab7ee2e6" + integrity sha512-53LoeU2S4q4cLJGKgo2Or7WU9Kc5RQscC0DbBAZcodkot1lKFbMg/z6/cQTq+XKl4kgYr5VA/s5kzNU7ScBctQ== + dependencies: + "@types/puppeteer-core" "^2.0.0" + "@types/ua-parser-js" "^0.7.33" + "@types/uuid" "^8.3.0" + "@wdio/config" "6.10.4" + "@wdio/logger" "6.10.4" + "@wdio/protocols" "6.10.0" + "@wdio/utils" "6.10.4" + chrome-launcher "^0.13.1" + edge-paths "^2.1.0" + puppeteer-core "^5.1.0" + ua-parser-js "^0.7.21" + uuid "^8.0.0" + diff@4.0.2, diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -4675,6 +4690,11 @@ eazy-logger@3.1.0: dependencies: tfunk "^4.0.0" +edge-paths@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/edge-paths/-/edge-paths-2.1.0.tgz#f273f3a0fe022422048bb78f83eb61aca29977ef" + integrity sha512-ZpIN1Vm5hlo9dkkST/1s8QqPNne2uwk3Plf6HcVUhnpfal0WnDRLdNj/wdQo3xRc+wnN3C25wPpPlV2E6aOunQ== + editorconfig@^0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" @@ -4695,15 +4715,10 @@ ejs@^2.6.1, ejs@^2.7.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.591: - version "1.3.603" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz#1b71bec27fb940eccd79245f6824c63d5f7e8abf" - integrity sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ== - electron-to-chromium@^1.3.612: - version "1.3.614" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.614.tgz#ff359e8d2249e2ce859a4c2bc34c22bd2e2eb0a2" - integrity sha512-JMDl46mg4G+n6q/hAJkwy9eMTj5FJjsE+8f/irAGRMLM4yeRVbMuRrdZrbbGGOrGVcZc4vJPjUpEUWNb/fA6hg== + version "1.3.612" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.612.tgz#4a49864b9de694403a69d5a9f439cbceca543e48" + integrity sha512-CdrdX1B6mQqxfw+51MPWB5qA6TKWjza9f5voBtUlRfEZEwZiFaxJLrhFI8zHE9SBAuGt4h84rQU6Ho9Bauo1LA== emitter-mixin@0.0.3: version "0.0.3" @@ -5129,6 +5144,11 @@ executable@^4.1.0: dependencies: pify "^2.2.0" +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + ext-list@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" @@ -5181,6 +5201,11 @@ extract-zip@^2.0.0, extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5535,6 +5560,11 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -5616,7 +5646,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.0.3, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@7.1.6, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -5695,7 +5725,7 @@ got@9.6.0, got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -got@^11.7.0, got@^11.8.0: +got@^11.0.2, got@^11.7.0, got@^11.8.0: version "11.8.0" resolved "https://registry.yarnpkg.com/got/-/got-11.8.0.tgz#be0920c3586b07fd94add3b5b27cb28f49e6545f" integrity sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ== @@ -5740,7 +5770,7 @@ graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -grapheme-splitter@^1.0.4: +grapheme-splitter@^1.0.2, grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== @@ -7147,6 +7177,13 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + levenshtein-edit-distance@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/levenshtein-edit-distance/-/levenshtein-edit-distance-1.0.0.tgz#895baf478cce8b5c1a0d27e45d7c1d978a661e49" @@ -7327,11 +7364,26 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + lodash.difference@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.intersection@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.intersection/-/lodash.intersection-4.4.0.tgz#0a11ba631d0e95c23c7f2f4cbb9a692ed178e705" @@ -7342,6 +7394,16 @@ lodash.isfinite@^3.3.2: resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.mapvalues@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" @@ -7352,7 +7414,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.6.2: +lodash.merge@^4.6.1, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -7382,11 +7444,21 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= + lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" @@ -7409,6 +7481,16 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +loglevel-plugin-prefix@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" + integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== + +loglevel@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + longest-streak@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" @@ -7595,13 +7677,6 @@ mdast-util-definitions@^1.2.0: dependencies: unist-util-visit "^1.0.0" -mdast-util-definitions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz#06af6c49865fc63d6d7d30125569e2f7ae3d0a86" - integrity sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA== - dependencies: - unist-util-visit "^2.0.0" - mdast-util-definitions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" @@ -7628,20 +7703,6 @@ mdast-util-to-hast@10.0.1: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-hast@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-9.1.2.tgz#10fa5ed9d45bf3755891e5801d0f32e2584a9423" - integrity sha512-OpkFLBC2VnNAb2FNKcKWu9FMbJhQKog+FCT8nuKmQNIKXyT1n3SIskE7uWDep6x+cA20QXlK5AETHQtYmQmxtQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^3.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - mdast-util-to-hast@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz#24a8791b7c624118637d70f03a9d29116e4311cf" @@ -7992,7 +8053,7 @@ node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-releases@^1.1.66, node-releases@^1.1.67: +node-releases@^1.1.67: version "1.1.67" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== @@ -9105,6 +9166,11 @@ pretty@^2.0.0: extend-shallow "^2.0.1" js-beautify "^1.6.12" +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + prismjs@~1.17.0: version "1.17.1" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" @@ -9331,7 +9397,7 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@^5.5.0: +puppeteer-core@^5.1.0, puppeteer-core@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-5.5.0.tgz#dfb6266efe5a933cbf1a368d27025a6fd4f5a884" integrity sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ== @@ -9476,7 +9542,7 @@ read-yaml-file@^1.1.0: pify "^4.0.1" strip-bom "^3.0.0" -readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9489,7 +9555,7 @@ readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9520,6 +9586,13 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" +readdir-glob@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" + integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== + dependencies: + minimatch "^3.0.4" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -9893,20 +9966,6 @@ remark-lint@^7.0.0, remark-lint@^7.0.1: dependencies: remark-message-control "^6.0.0" -remark-mdx@1.6.21: - version "1.6.21" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.21.tgz#0c1a7e042e50938ff89ad8dd7e8e219d4b0404ce" - integrity sha512-IGb3l46a6NFi62egT+WXeTT3T8wYTunmPCEGTfDO6oRAfuss9VAb/3InVCKKGXXoiNi0mTuplI0EFusdCLGk3A== - dependencies: - "@babel/core" "7.11.6" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.11.0" - "@babel/plugin-syntax-jsx" "7.10.4" - "@mdx-js/util" "1.6.21" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - remark-mdx@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" @@ -10200,6 +10259,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +resq@^1.9.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resq/-/resq-1.10.0.tgz#40b5e3515ff984668e6b6b7c2401f282b08042ea" + integrity sha512-hCUd0xMalqtPDz4jXIqs0M5Wnv/LZXN8h7unFOo4/nvExT9dDPbhwd3udRxLlp0HgBnHcV009UlduE9NZi7A6w== + dependencies: + fast-deep-equal "^2.0.1" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -10257,6 +10323,11 @@ rgb-regex@^1.0.1: resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= +rgb2hex@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.3.tgz#8aa464c517b8a26c7a79d767dabaec2b49ee78ec" + integrity sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ== + rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" @@ -10383,14 +10454,7 @@ rollup@^1.31.1: "@types/node" "*" acorn "^7.1.0" -rollup@^2.16.0: - version "2.33.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.33.3.tgz#ae72ce31f992b09a580072951bfea76e9df17342" - integrity sha512-RpayhPTe4Gu/uFGCmk7Gp5Z9Qic2VsqZ040G+KZZvsZYdcuWaJg678JeDJJvJeEQXminu24a2au+y92CUWVd+w== - optionalDependencies: - fsevents "~2.1.2" - -rollup@^2.25.0, rollup@^2.34.1: +rollup@^2.16.0, rollup@^2.25.0, rollup@^2.34.1: version "2.34.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.34.1.tgz#a387230df02c58b242794a213dfb68b42de2c8fb" integrity sha512-tGveB6NU5x4MS/iXaIsjfUkEv4hxzJJ4o0FRy5LO62Ndx3R2cmE1qsLYlSfRkvHUUPqWiFoxEm8pRftzh1a5HA== @@ -10551,12 +10615,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -10591,6 +10650,13 @@ sentence-case@^3.0.3: tslib "^1.10.0" upper-case-first "^2.0.1" +serialize-error@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-javascript@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" @@ -11460,16 +11526,7 @@ terser@^4.6.2, terser@^4.6.3, terser@^4.6.7, terser@^4.7.0: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.0.tgz#1406fcb4d4bc517add3b22a9694284c040e33448" - integrity sha512-eopt1Gf7/AQyPhpygdKePTzaet31TvQxXvrf7xYUvD/d8qkCJm4SKPDzu+GHK5ZaYTn8rvttfqaZc3swK21e5g== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - -terser@^5.5.1: +terser@^5.0.0, terser@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== @@ -11791,7 +11848,7 @@ typical@^5.0.0, typical@^5.2.0: resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== -ua-parser-js@^0.7.18, ua-parser-js@^0.7.22: +ua-parser-js@^0.7.18, ua-parser-js@^0.7.21, ua-parser-js@^0.7.22: version "0.7.22" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== @@ -12209,7 +12266,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^8.3.1: +uuid@^8.0.0, uuid@^8.3.1: version "8.3.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== @@ -12326,6 +12383,53 @@ web-namespaces@^1.0.0, web-namespaces@^1.1.2: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +webdriver@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-6.10.4.tgz#f4ef0a81f7e82d1c0e83ce17c03befec877115aa" + integrity sha512-N2FkEy22QWAJMeyz1219ik9wyt3/SOT/RtsY6JheEriZ1GptzZyK0OibkOnCoaIAt+nvSxnSmTTlmXQMGBE6Mw== + dependencies: + "@types/lodash.merge" "^4.6.6" + "@wdio/config" "6.10.4" + "@wdio/logger" "6.10.4" + "@wdio/protocols" "6.10.0" + "@wdio/utils" "6.10.4" + got "^11.0.2" + lodash.merge "^4.6.1" + +webdriverio@^6.10.0: + version "6.10.5" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-6.10.5.tgz#3f060b0b5149419e6bd75bd8efdd631f2668bf58" + integrity sha512-TLIKVOOM0Oszn2mLxZcMQk0vq1bOWpsZNXMxMtpBXKLvcOCLedftxotwh0o1LqRiq8ODiubJ/vNOLgCN/oLFJQ== + dependencies: + "@types/archiver" "^5.1.0" + "@types/atob" "^2.1.2" + "@types/fs-extra" "^9.0.2" + "@types/lodash.clonedeep" "^4.5.6" + "@types/lodash.isplainobject" "^4.0.6" + "@types/puppeteer-core" "^2.0.0" + "@wdio/config" "6.10.4" + "@wdio/logger" "6.10.4" + "@wdio/repl" "6.10.4" + "@wdio/utils" "6.10.4" + archiver "^5.0.0" + atob "^2.1.2" + css-shorthand-properties "^1.1.1" + css-value "^0.0.1" + devtools "6.10.4" + fs-extra "^9.0.1" + get-port "^5.1.1" + grapheme-splitter "^1.0.2" + lodash.clonedeep "^4.5.0" + lodash.isobject "^3.0.2" + lodash.isplainobject "^4.0.6" + lodash.zip "^4.2.0" + minimatch "^3.0.4" + puppeteer-core "^5.1.0" + resq "^1.9.1" + rgb2hex "^0.2.0" + serialize-error "^7.0.0" + webdriver "6.10.4" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -13010,6 +13114,15 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +zip-stream@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a" + integrity sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw== + dependencies: + archiver-utils "^2.1.0" + compress-commons "^4.0.2" + readable-stream "^3.6.0" + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"