feat(electron-playwright): Upgrade Electron and use Playwright for end-to-end tests (#4673)
This commit is contained in:
Родитель
7fbd098d19
Коммит
e6ce083708
|
@ -219,7 +219,10 @@ jobs:
|
|||
e2e-unified-tests:
|
||||
name: e2e-unified-tests (${{ strategy.job-index }}/${{ strategy.job-total }})
|
||||
runs-on: ubuntu-20.04
|
||||
env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 }
|
||||
env:
|
||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
||||
DISPLAY: :99
|
||||
DEBUG: pw:api
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
|
@ -257,9 +260,17 @@ jobs:
|
|||
- run: yarn build:unified
|
||||
timeout-minutes: 5
|
||||
|
||||
- run: yarn playwright install-deps chromium
|
||||
timeout-minutes: 5
|
||||
|
||||
- name: configure xvfb to use DISPLAY var from env
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo /usr/bin/Xvfb $DISPLAY -screen 0 1024x768x24 &
|
||||
|
||||
- name: yarn test:unified
|
||||
run: |
|
||||
xvfb-run --server-args="-screen 0 1024x768x24" yarn test:unified --ci --testMatch="<rootDir>/**/${{ matrix.test-filename-prefix-pattern }}*.test.ts"
|
||||
yarn test:unified --ci --testMatch="<rootDir>/**/${{ matrix.test-filename-prefix-pattern }}*.test.ts"
|
||||
timeout-minutes: 15
|
||||
|
||||
- name: upload artifact e2e-unified-tests-results
|
||||
|
|
17
Dockerfile
17
Dockerfile
|
@ -5,7 +5,7 @@
|
|||
# reference: https://stackoverflow.com/a/51683309/3711475
|
||||
# reference: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-puppeteer-in-docker
|
||||
|
||||
FROM mcr.microsoft.com/playwright:v1.14.1-focal
|
||||
FROM mcr.microsoft.com/playwright:v1.14.1-focal AS setup
|
||||
|
||||
USER root
|
||||
|
||||
|
@ -26,9 +26,24 @@ RUN yarn install --frozen-lockfile
|
|||
|
||||
COPY . /app
|
||||
|
||||
FROM setup AS web
|
||||
RUN yarn build:dev --no-cache
|
||||
|
||||
# since we need our chromium to run in 'headful' mode (for testing chrome extension)
|
||||
# we need a fake display (to run headful chromium), which we create by starting a Virtualized X server environment using xvfb-run
|
||||
# man page for command: https://manpages.ubuntu.com/manpages/xenial/man1/xvfb-run.1.html
|
||||
ENTRYPOINT ["/bin/sh", "-c", "xvfb-run --server-args=\"-screen 0 1024x768x24\" yarn test:e2e $@", ""]
|
||||
|
||||
FROM setup AS unified
|
||||
RUN apt-get update && \
|
||||
apt-get install -y dos2unix \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
RUN yarn playwright install-deps chromium
|
||||
RUN yarn build:unified --no-cache
|
||||
# because Xvfb commands must run on the container after it is built we need to use
|
||||
# a bash script. these commands copy the script into the container and reformat
|
||||
# the file to run in linux
|
||||
ADD unified-entrypoint.sh /unified-entrypoint.sh
|
||||
RUN chmod +x /unified-entrypoint.sh
|
||||
RUN dos2unix /unified-entrypoint.sh
|
||||
ENTRYPOINT ["/unified-entrypoint.sh"]
|
||||
|
|
11
package.json
11
package.json
|
@ -70,8 +70,12 @@
|
|||
"test": "cross-env --max-old-space-size=16384 jest --projects src/tests/unit",
|
||||
"publish-code-coverage": "npx codecov",
|
||||
"test:e2e": "cross-env --max-old-space-size=16384 jest --projects src/tests/end-to-end --runInBand --forceExit --detectOpenHandles",
|
||||
"test:e2e:docker:build": "docker build -t accessibility-insights-web-e2e .",
|
||||
"test:e2e:docker:run": "docker run -t accessibility-insights-web-e2e",
|
||||
"test:e2e:docker:build": "docker build -t accessibility-insights-e2e --target web .",
|
||||
"test:e2e:docker:build:web": "docker build -t accessibility-insights-web-e2e --target web .",
|
||||
"test:e2e:docker:build:unified": "docker build -t accessibility-insights-unified-e2e --target unified .",
|
||||
"test:e2e:docker:run": "docker run -t accessibility-insights-e2e",
|
||||
"test:e2e:docker:run:web": "docker run -t accessibility-insights-web-e2e",
|
||||
"test:e2e:docker:run:unified": "docker run -t accessibility-insights-unified-e2e sh -c \"yarn test:unified --ci\"",
|
||||
"test:e2e:docker": "npm-run-all --serial test:e2e:docker:build \"test:e2e:docker:run {@}\" --",
|
||||
"test:unified": "cross-env --max-old-space-size=16384 jest --projects src/tests/electron --runInBand --forceExit --detectOpenHandles",
|
||||
"test:report:e2e": "lerna --scope accessibility-insights-report-e2e-tests run test",
|
||||
|
@ -156,7 +160,6 @@
|
|||
"serve-static": "^1.13.2",
|
||||
"simple-git": "^2.45.1",
|
||||
"source-map-loader": "^3.0.0",
|
||||
"spectron": "^13.0.0",
|
||||
"terser-webpack-plugin": "^5.2.4",
|
||||
"ts-loader": "^9.2.5",
|
||||
"typed-scss-modules": "^4.1.1",
|
||||
|
@ -176,7 +179,7 @@
|
|||
"axe-core": "4.3.2",
|
||||
"axios": "^0.21.4",
|
||||
"classnames": "^2.3.1",
|
||||
"electron": "11.4.5",
|
||||
"electron": "14.0.0",
|
||||
"electron-log": "^4.4.1",
|
||||
"electron-updater": "^4.3.9",
|
||||
"idb-keyval": "^6.0.2",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
steps:
|
||||
- script: docker build -t app .
|
||||
- script: docker build -t app --target web .
|
||||
displayName: setup docker
|
||||
|
||||
- script: docker run --network=host -i app --ci
|
||||
|
|
|
@ -6,4 +6,4 @@ This number identifies an internally-maintained Electron build
|
|||
used in our releases. Each Electron update in package.json requires
|
||||
a corresponding change here.
|
||||
*/
|
||||
exports.electronBuildId = '7912306';
|
||||
exports.electronBuildId = '9728310';
|
||||
|
|
|
@ -11,7 +11,7 @@ steps:
|
|||
condition: and(succeeded(), ne(variables.platform, 'linux'))
|
||||
timeoutInMinutes: 22
|
||||
|
||||
- script: xvfb-run --server-args="-screen 0 1024x768x24" yarn test:unified --ci
|
||||
- script: yarn test:unified --ci
|
||||
displayName: run unified e2e tests (linux)
|
||||
condition: and(succeeded(), eq(variables.platform, 'linux'))
|
||||
timeoutInMinutes: 12
|
||||
|
|
|
@ -1,10 +1,22 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
steps:
|
||||
- script: yarn build:unified
|
||||
displayName: build:unified
|
||||
timeoutInMinutes: 5
|
||||
- script: DOCKER_BUILDKIT=1 docker build -t app --target unified .
|
||||
displayName: setup docker
|
||||
|
||||
- script: xvfb-run --server-args="-screen 0 1024x768x24" yarn test:unified --ci
|
||||
displayName: run electron e2e tests
|
||||
timeoutInMinutes: 12
|
||||
- script: docker run --network=host -i app sh -c "yarn test:unified --ci"
|
||||
displayName: run e2e tests on docker
|
||||
|
||||
- bash: |
|
||||
export CONTAINERID=$(docker ps -alq)
|
||||
echo "##vso[task.setvariable variable=CONTAINER_ID]$CONTAINERID"
|
||||
displayName: get container id for docker
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- script: docker cp $(CONTAINER_ID):/app/test-results/ .
|
||||
displayName: copy test results from docker to base agent
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- script: docker cp $(CONTAINER_ID):/app/drop/ .
|
||||
displayName: copy mock adb folder from docker to base agent
|
||||
condition: succeededOrFailed()
|
||||
|
|
|
@ -24,8 +24,12 @@ const keyToPersistedDataMapping = {
|
|||
export function getPersistedData(
|
||||
indexedDBInstance: IndexedDBAPI,
|
||||
dataKeysToFetch: string[],
|
||||
options?: { ignorePersistedData: boolean }, // this option is for tests to ensure they can use mock-adb
|
||||
): Promise<PersistedData> {
|
||||
const persistedData = {} as PersistedData;
|
||||
if (options?.ignorePersistedData) {
|
||||
return Promise.resolve(persistedData); //empty object
|
||||
}
|
||||
|
||||
const promises: Array<Promise<any>> = dataKeysToFetch.map(key => {
|
||||
return indexedDBInstance.getItem(key).then(data => {
|
||||
|
|
|
@ -36,14 +36,27 @@ if (platformInfo.isLinux()) {
|
|||
app.disableHardwareAcceleration();
|
||||
}
|
||||
|
||||
//these preferences allow electron to run in the linux test environment
|
||||
const linuxTestWebPreferences = {
|
||||
webgl: true,
|
||||
webSecurity: false,
|
||||
experimentalFeatures: true,
|
||||
experimentalCanvasFeatures: true,
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false,
|
||||
};
|
||||
const standardWebPreferences = { nodeIntegration: true, contextIsolation: false };
|
||||
|
||||
let recurringUpdateCheck;
|
||||
const electronAutoUpdateCheck = new AutoUpdaterClient(autoUpdater);
|
||||
|
||||
const createWindow = () => {
|
||||
mainWindow = new BrowserWindow({
|
||||
show: false,
|
||||
// enableRemoteModule required for spectron (https://github.com/electron-userland/spectron/issues/693#issuecomment-696957538)
|
||||
webPreferences: { nodeIntegration: true, enableRemoteModule: true },
|
||||
webPreferences:
|
||||
process.env.ACCESSIBILITY_INSIGHTS_ELECTRON_LINUX_TESTS === 'true'
|
||||
? linuxTestWebPreferences
|
||||
: standardWebPreferences,
|
||||
titleBarStyle: 'hidden',
|
||||
width: mainWindowConfig.defaultWidth,
|
||||
height: mainWindowConfig.defaultHeight,
|
||||
|
@ -97,7 +110,6 @@ const createWindow = () => {
|
|||
})
|
||||
.catch(console.log);
|
||||
};
|
||||
|
||||
const enableDevMode = (window: BrowserWindow) => {
|
||||
if (process.env.DEV_MODE === 'true') {
|
||||
const devTools = new BrowserWindow();
|
||||
|
|
|
@ -186,7 +186,9 @@ const indexedDBDataKeysToFetch = [
|
|||
|
||||
const logger = createDefaultLogger();
|
||||
|
||||
getPersistedData(indexedDBInstance, indexedDBDataKeysToFetch)
|
||||
getPersistedData(indexedDBInstance, indexedDBDataKeysToFetch, {
|
||||
ignorePersistedData: process.env.ACCESSIBILITY_INSIGHTS_ELECTRON_CLEAR_DATA === 'true', // this option is for tests to ensure they can use mock-adb
|
||||
})
|
||||
.then((persistedData: Partial<PersistedData>) => {
|
||||
const installationData: InstallationData = persistedData.installationData;
|
||||
|
||||
|
|
|
@ -1,19 +1,14 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import * as Electron from 'electron';
|
||||
import { AppConstructorOptions, Application } from 'spectron';
|
||||
import { retry } from 'tests/common/retry';
|
||||
|
||||
import {
|
||||
DEFAULT_APP_CONNECT_RETRIES,
|
||||
DEFAULT_APP_CONNECT_TIMEOUT_MS,
|
||||
DEFAULT_CHROMEDRIVER_START_RETRIES,
|
||||
DEFAULT_CHROMEDRIVER_START_TIMEOUT_MS,
|
||||
} from 'tests/electron/setup/timeouts';
|
||||
import { _electron as electron } from 'playwright';
|
||||
import { AppController } from './view-controllers/app-controller';
|
||||
|
||||
export interface AppOptions extends Partial<AppConstructorOptions> {
|
||||
export interface AppOptions {
|
||||
suppressFirstTimeDialog: boolean;
|
||||
env?: {
|
||||
ANDROID_HOME?: string;
|
||||
DISPLAY?: any;
|
||||
};
|
||||
}
|
||||
|
||||
export async function createApplication(options?: AppOptions): Promise<AppController> {
|
||||
|
@ -21,14 +16,29 @@ export async function createApplication(options?: AppOptions): Promise<AppContro
|
|||
(global as any).rootDir
|
||||
}/drop/electron/unified-dev/product/bundle/main.bundle.js`;
|
||||
|
||||
if (process.env.DISPLAY) {
|
||||
// we need the DISPLAY env variable for running tests in linux
|
||||
if (!options) {
|
||||
options = { suppressFirstTimeDialog: false, env: {} };
|
||||
}
|
||||
if (!options.env) {
|
||||
options.env = {};
|
||||
}
|
||||
options.env.DISPLAY = process.env.DISPLAY;
|
||||
}
|
||||
|
||||
const unifiedOptions = {
|
||||
...options,
|
||||
env: {
|
||||
ANDROID_HOME: `${(global as any).rootDir}/drop/mock-adb`,
|
||||
DEBUG_MODE: 'true',
|
||||
ACCESSIBILITY_INSIGHTS_ELECTRON_LINUX_TESTS: 'true',
|
||||
ACCESSIBILITY_INSIGHTS_ELECTRON_CLEAR_DATA: 'true',
|
||||
...options.env,
|
||||
},
|
||||
...options,
|
||||
};
|
||||
|
||||
const appController = await createAppController(targetApp, unifiedOptions);
|
||||
await appController.initialize();
|
||||
|
||||
if (options?.suppressFirstTimeDialog === true) {
|
||||
await appController.setTelemetryState(false);
|
||||
|
@ -36,33 +46,16 @@ export async function createApplication(options?: AppOptions): Promise<AppContro
|
|||
|
||||
return appController;
|
||||
}
|
||||
|
||||
export async function createAppController(
|
||||
targetApp: string,
|
||||
overrideSpectronOptions?: Partial<AppConstructorOptions>,
|
||||
options?: Partial<AppOptions>,
|
||||
): Promise<AppController> {
|
||||
const app = await retry(
|
||||
async () => {
|
||||
const app = new Application({
|
||||
path: Electron as any,
|
||||
args: [targetApp],
|
||||
connectionRetryCount: DEFAULT_APP_CONNECT_RETRIES,
|
||||
connectionRetryTimeout: DEFAULT_APP_CONNECT_TIMEOUT_MS,
|
||||
startTimeout: DEFAULT_CHROMEDRIVER_START_TIMEOUT_MS,
|
||||
...overrideSpectronOptions,
|
||||
});
|
||||
await app.start();
|
||||
return app;
|
||||
},
|
||||
{
|
||||
operationLabel: 'app.start',
|
||||
warnOnRetry: true,
|
||||
maxRetries: DEFAULT_CHROMEDRIVER_START_RETRIES,
|
||||
retryOnlyIfMatches: err =>
|
||||
err?.message?.includes('ChromeDriver did not start within') ||
|
||||
err?.message?.includes('Failed to create session.\nread ECONNRESET'),
|
||||
},
|
||||
);
|
||||
const app = await electron.launch({
|
||||
args: ['--enable-logging', '--ignore_gpu_blacklist', '--disable_splash_screen', targetApp],
|
||||
env: options.env,
|
||||
path: Electron,
|
||||
bypassCSP: true, //allow injecting axe despite privacy headers
|
||||
});
|
||||
|
||||
return new AppController(app);
|
||||
}
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { source as axeCoreSource } from 'axe-core';
|
||||
import * as path from 'path';
|
||||
import { Result } from 'axe-core';
|
||||
import { Page } from 'playwright';
|
||||
import { AppController } from 'tests/electron/common/view-controllers/app-controller';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import {
|
||||
prettyPrintAxeViolations,
|
||||
PrintableAxeResult,
|
||||
} from 'tests/end-to-end/common/pretty-print-axe-violations';
|
||||
|
||||
declare let axe;
|
||||
import { screenshotOnError as screenshot } from '../../end-to-end/common/screenshot-on-error';
|
||||
|
||||
declare let window: Window & { axe };
|
||||
|
||||
export async function scanForAccessibilityIssuesInAllModes(app: AppController): Promise<void> {
|
||||
await scanForAccessibilityIssues(app, true);
|
||||
|
@ -26,12 +25,8 @@ async function scanForAccessibilityIssues(
|
|||
expect(violations).toStrictEqual([]);
|
||||
}
|
||||
|
||||
async function runAxeScan(
|
||||
spectronClient: SpectronAsyncClient,
|
||||
selector?: string,
|
||||
): Promise<PrintableAxeResult[]> {
|
||||
await injectAxeIfUndefined(spectronClient);
|
||||
|
||||
async function runAxeScan(client: Page, selector?: string): Promise<Result[]> {
|
||||
await injectAxeIfUndefined(client);
|
||||
const axeRunOptions = {
|
||||
runOnly: {
|
||||
type: 'tag',
|
||||
|
@ -39,31 +34,42 @@ async function runAxeScan(
|
|||
},
|
||||
};
|
||||
|
||||
const axeResults = await spectronClient.executeAsync(
|
||||
(options, selectorInEvaluate, done) => {
|
||||
const elementContext =
|
||||
selectorInEvaluate === null ? document : { include: [selectorInEvaluate] };
|
||||
const axeResults = await client.evaluate(
|
||||
async ({ selector, axeRunOptions }) => {
|
||||
const elementContext = selector === undefined ? document : { include: [selector] };
|
||||
|
||||
axe.run(elementContext, options, function (err: Error, results: any): void {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
done(results);
|
||||
});
|
||||
const results = await window.axe.run(elementContext, axeRunOptions);
|
||||
return results;
|
||||
},
|
||||
axeRunOptions,
|
||||
selector,
|
||||
{ selector, axeRunOptions },
|
||||
);
|
||||
|
||||
return prettyPrintAxeViolations(axeResults);
|
||||
return axeResults.violations;
|
||||
}
|
||||
|
||||
async function injectAxeIfUndefined(spectronClient: SpectronAsyncClient): Promise<void> {
|
||||
const axeIsUndefined = await spectronClient.execute(() => {
|
||||
async function injectAxeIfUndefined(client: Page): Promise<void> {
|
||||
const axeIsUndefined = await client.evaluate(() => {
|
||||
return (window as any).axe === undefined;
|
||||
});
|
||||
}, null);
|
||||
|
||||
if (axeIsUndefined) {
|
||||
await spectronClient.execute(axeCoreSource);
|
||||
await injectScriptFile(
|
||||
client,
|
||||
path.join(__dirname, '../../../../node_modules/axe-core/axe.min.js'),
|
||||
);
|
||||
|
||||
await client.waitForFunction(() => {
|
||||
return (window as any).axe !== undefined;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function screenshotOnError<T>(client: Page, wrappedFunction: () => Promise<T>): Promise<T> {
|
||||
return await screenshot(path => client.screenshot({ path, fullPage: true }), wrappedFunction);
|
||||
}
|
||||
|
||||
async function injectScriptFile(client: Page, filePath: string): Promise<void> {
|
||||
await screenshotOnError(client, async () => {
|
||||
await client.addScriptTag({ path: filePath, type: 'module' });
|
||||
await client.waitForLoadState(); //wait for the script to be available
|
||||
});
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
// Licensed under the MIT License.
|
||||
import { AndroidSetupStepId } from 'electron/platform/android/setup/android-setup-step-id';
|
||||
import { rightFooterButtonAutomationId } from 'electron/views/device-connect-view/components/automation-ids';
|
||||
import { Page } from 'playwright';
|
||||
import { getAutomationIdSelector } from 'tests/common/get-automation-id-selector';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class AndroidSetupViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@ export class AndroidSetupViewController extends ViewController {
|
|||
// validates and starts scanning
|
||||
public async startTesting(): Promise<void> {
|
||||
const startTestingId = rightFooterButtonAutomationId;
|
||||
await this.client.waitForEnabled(getAutomationIdSelector(startTestingId));
|
||||
await this.waitForEnabled(getAutomationIdSelector(startTestingId));
|
||||
await this.client.click(getAutomationIdSelector(startTestingId));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,39 +1,41 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { AndroidSetupStepId } from 'electron/platform/android/setup/android-setup-step-id';
|
||||
import { Application } from 'spectron';
|
||||
import { ElectronApplication, Page } from 'playwright';
|
||||
import { AndroidSetupViewController } from 'tests/electron/common/view-controllers/android-setup-view-controller';
|
||||
import { DeviceConnectionDialogController } from 'tests/electron/common/view-controllers/device-connection-dialog-controller';
|
||||
import { ResultsViewController } from 'tests/electron/common/view-controllers/results-view-controller';
|
||||
import {
|
||||
getSpectronAsyncClient,
|
||||
SpectronAsyncClient,
|
||||
} from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS } from 'tests/electron/setup/timeouts';
|
||||
|
||||
declare let window: Window & {
|
||||
featureFlagsController;
|
||||
insightsUserConfiguration;
|
||||
};
|
||||
export class AppController {
|
||||
public client: SpectronAsyncClient;
|
||||
public client: Page;
|
||||
|
||||
constructor(public app: Application) {
|
||||
this.client = getSpectronAsyncClient(app.client, app.browserWindow);
|
||||
}
|
||||
constructor(public app: ElectronApplication) {}
|
||||
|
||||
public initialize = async () => {
|
||||
this.client = await this.app.firstWindow();
|
||||
};
|
||||
|
||||
public async stop(): Promise<void> {
|
||||
if (this.app && this.app.isRunning()) {
|
||||
await this.app.stop();
|
||||
if (this.app && !this.client.isClosed()) {
|
||||
await this.app.close();
|
||||
}
|
||||
}
|
||||
|
||||
public async waitForTitle(expectedTitle: string): Promise<void> {
|
||||
const timeout = DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS;
|
||||
await this.client.waitUntil(
|
||||
async () => {
|
||||
const title = await this.app.webContents.getTitle();
|
||||
const title = await this.client.title();
|
||||
await this.client.waitForFunction(
|
||||
({ expectedTitle, title }) => {
|
||||
return title === expectedTitle;
|
||||
},
|
||||
{ expectedTitle, title },
|
||||
{
|
||||
timeout,
|
||||
timeoutMsg: `was expecting window title to transition to ${expectedTitle} within ${timeout}ms`,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -69,35 +71,25 @@ export class AppController {
|
|||
return resultsView;
|
||||
}
|
||||
|
||||
public async setHighContrastMode(enableHighContrast: boolean): Promise<void> {
|
||||
public async waitForHighContrastMode(expectedHighContrastMode: boolean): Promise<void> {
|
||||
await this.waitForWindowPropertyInitialized('insightsUserConfiguration');
|
||||
|
||||
await this.app.webContents.executeJavaScript(
|
||||
`window.insightsUserConfiguration.setHighContrastMode(${enableHighContrast})`,
|
||||
await this.client.evaluate(
|
||||
`window.insightsUserConfiguration.setHighContrastMode(${expectedHighContrastMode})`,
|
||||
);
|
||||
}
|
||||
|
||||
public async waitForHighContrastMode(expectedHighContrastMode: boolean): Promise<void> {
|
||||
const highContrastThemeClass = 'high-contrast-theme';
|
||||
public async setHighContrastMode(enableHighContrast: boolean): Promise<void> {
|
||||
await this.waitForWindowPropertyInitialized('insightsUserConfiguration');
|
||||
|
||||
await this.client.waitUntil(
|
||||
async () => {
|
||||
const classes = await this.client.getAttribute('body', 'class');
|
||||
return expectedHighContrastMode === classes.includes(highContrastThemeClass);
|
||||
},
|
||||
{
|
||||
timeout: DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS,
|
||||
timeoutMsg: `was expecting body element ${
|
||||
expectedHighContrastMode ? 'with' : 'without'
|
||||
} class high-contrast-theme`,
|
||||
},
|
||||
await this.client.evaluate(
|
||||
`window.insightsUserConfiguration.setHighContrastMode(${enableHighContrast})`,
|
||||
);
|
||||
}
|
||||
|
||||
public async setTelemetryState(enableTelemetry: boolean): Promise<void> {
|
||||
await this.waitForWindowPropertyInitialized('insightsUserConfiguration');
|
||||
|
||||
await this.app.webContents.executeJavaScript(
|
||||
await this.client.evaluate(
|
||||
`window.insightsUserConfiguration.setTelemetryState(${enableTelemetry})`,
|
||||
);
|
||||
}
|
||||
|
@ -105,24 +97,19 @@ export class AppController {
|
|||
public async setFeatureFlag(flag: string, enabled: boolean): Promise<void> {
|
||||
await this.waitForWindowPropertyInitialized('featureFlagsController');
|
||||
const action = enabled ? 'enable' : 'disable';
|
||||
await this.app.webContents.executeJavaScript(
|
||||
`window.featureFlagsController.${action}Feature('${flag}')`,
|
||||
);
|
||||
await this.client.evaluate(`window.featureFlagsController.${action}Feature('${flag}')`);
|
||||
}
|
||||
|
||||
private async waitForWindowPropertyInitialized(
|
||||
propertyName: 'insightsUserConfiguration' | 'featureFlagsController',
|
||||
): Promise<void> {
|
||||
await this.client.waitUntil(
|
||||
async () => {
|
||||
return await this.client.executeAsync((prop, done) => {
|
||||
done((window as any)[prop] != null);
|
||||
}, propertyName);
|
||||
},
|
||||
{
|
||||
timeout: DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS,
|
||||
timeoutMsg: `was expecting window.${propertyName} to be defined`,
|
||||
await this.client.waitForFunction(
|
||||
prop => {
|
||||
const initialized = (window as any)[prop] != null;
|
||||
return initialized;
|
||||
},
|
||||
propertyName,
|
||||
{ timeout: 6000, polling: 50 },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { Page } from 'playwright';
|
||||
import { ScreenshotViewSelectors } from 'tests/electron/common/element-identifiers/screenshot-view-selectors';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { AutomatedChecksViewSelectors } from '../element-identifiers/automated-checks-view-selectors';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class CardsViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,6 @@ export class CardsViewController extends ViewController {
|
|||
|
||||
public async toggleRuleGroupAtPosition(position: number): Promise<void> {
|
||||
const selector = AutomatedChecksViewSelectors.nthRuleGroupCollapseExpandButton(position);
|
||||
await this.waitForSelector(selector);
|
||||
await this.client.click(selector);
|
||||
}
|
||||
|
||||
|
@ -33,7 +32,7 @@ export class CardsViewController extends ViewController {
|
|||
expectedTitle: string,
|
||||
expectedFailures: number,
|
||||
): Promise<void> {
|
||||
const title = await this.client.getText(
|
||||
const title = await this.client.innerText(
|
||||
AutomatedChecksViewSelectors.nthRuleGroupTitle(position),
|
||||
);
|
||||
|
||||
|
@ -47,7 +46,7 @@ export class CardsViewController extends ViewController {
|
|||
}
|
||||
|
||||
public async assertCollapsedRuleGroup(position: number, expectedTitle: string): Promise<void> {
|
||||
const title = await this.client.getText(
|
||||
const title = await this.client.innerText(
|
||||
AutomatedChecksViewSelectors.nthRuleGroupTitle(position),
|
||||
);
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { Page } from 'playwright';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class CodecTestViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { Page } from 'playwright';
|
||||
import { CommonSelectors } from '../element-identifiers/common-selectors';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class DeviceConnectionDialogController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
// Licensed under the MIT License.
|
||||
import * as fs from 'fs';
|
||||
import * as util from 'util';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { DEFAULT_WAIT_FOR_LOG_TIMEOUT_MS } from 'tests/electron/setup/timeouts';
|
||||
import { tick } from 'tests/unit/common/tick';
|
||||
import {
|
||||
generateAdbLogPath,
|
||||
generateOutputLogsDir,
|
||||
|
@ -11,16 +10,11 @@ import {
|
|||
} from '../../../miscellaneous/mock-adb/generate-log-paths';
|
||||
|
||||
const readFile = util.promisify(fs.readFile);
|
||||
|
||||
export class LogController {
|
||||
private adbLogPath: string;
|
||||
private serverLogPath: string;
|
||||
|
||||
constructor(
|
||||
currentContext: string,
|
||||
private mockAdbPath: string,
|
||||
private client: SpectronAsyncClient,
|
||||
) {
|
||||
constructor(currentContext: string, private mockAdbPath: string) {
|
||||
this.adbLogPath = this.getAdbLogPath(currentContext);
|
||||
this.serverLogPath = this.getServerLogPath(currentContext);
|
||||
}
|
||||
|
@ -37,6 +31,11 @@ export class LogController {
|
|||
return generateAdbLogPath(this.getOutputLogsDir(currentContext));
|
||||
}
|
||||
|
||||
public async getLog(path: string): Promise<string> {
|
||||
const log = await readFile(path);
|
||||
return log.toString();
|
||||
}
|
||||
|
||||
public async getServerLog(): Promise<string> {
|
||||
const log = await readFile(this.serverLogPath);
|
||||
return log.toString();
|
||||
|
@ -55,25 +54,52 @@ export class LogController {
|
|||
fs.unlinkSync(this.serverLogPath);
|
||||
}
|
||||
|
||||
private adbLogExists(): boolean {
|
||||
private adbLogExists = () => {
|
||||
return fs.existsSync(this.adbLogPath);
|
||||
}
|
||||
};
|
||||
|
||||
private serverLogExists(): boolean {
|
||||
return fs.existsSync(this.serverLogPath);
|
||||
}
|
||||
|
||||
public async waitForAdbLogToContain(contains: string) {
|
||||
const isLogReady = async () =>
|
||||
this.adbLogExists() && (await this.getAdbLog()).includes(contains);
|
||||
public waitUntil = async (waitFunction, args?, options?): Promise<void> => {
|
||||
const { timeout } = options ? options : { timeout: 5000 };
|
||||
let currentTime = Number(new Date());
|
||||
const endTime = currentTime + timeout;
|
||||
|
||||
return this.client.waitUntil(isLogReady, { timeout: DEFAULT_WAIT_FOR_LOG_TIMEOUT_MS });
|
||||
}
|
||||
do {
|
||||
const value = args ? await waitFunction(...args) : await waitFunction();
|
||||
if (value === true) {
|
||||
return value;
|
||||
} else {
|
||||
await tick();
|
||||
currentTime = Number(new Date());
|
||||
}
|
||||
} while (currentTime < endTime);
|
||||
throw new Error(`timed out looking for ${args[0]}, ${args[1]}!`);
|
||||
};
|
||||
|
||||
public async waitForServerLogToContain(contains: string) {
|
||||
const isLogReady = async () =>
|
||||
this.serverLogExists() && (await this.getServerLog()).includes(contains);
|
||||
public waitForAdbLogToExist = async () => {
|
||||
await this.waitUntil(this.adbLogExists.bind(this));
|
||||
};
|
||||
|
||||
return this.client.waitUntil(isLogReady, { timeout: DEFAULT_WAIT_FOR_LOG_TIMEOUT_MS });
|
||||
}
|
||||
public waitForServerLogToExist = async () => {
|
||||
await this.waitUntil(this.serverLogExists.bind(this));
|
||||
};
|
||||
|
||||
public waitForAdbLogToContain = async (contains: string) => {
|
||||
await this.waitForAdbLogToExist();
|
||||
await this.waitUntil(
|
||||
async (contains: string) => (await this.getAdbLog()).includes(contains),
|
||||
[contains],
|
||||
);
|
||||
};
|
||||
|
||||
public waitForServerLogToContain = async (contains: string) => {
|
||||
await this.waitForServerLogToExist();
|
||||
await this.waitUntil(
|
||||
async (contains: string) => (await this.getServerLog()).includes(contains),
|
||||
[contains],
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { LeftNavItemKey } from 'electron/types/left-nav-item-key';
|
||||
import { Page } from 'playwright';
|
||||
import { ResultsViewSelectors } from 'tests/electron/common/element-identifiers/results-view-selectors';
|
||||
import { ScreenshotViewSelectors } from 'tests/electron/common/element-identifiers/screenshot-view-selectors';
|
||||
import { CardsViewController } from 'tests/electron/common/view-controllers/cards-view-controller';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { settingsPanelSelectors } from 'tests/end-to-end/common/element-identifiers/details-view-selectors';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class ResultsViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,6 @@ export class ResultsViewController extends ViewController {
|
|||
}
|
||||
|
||||
public async openSettingsPanel(): Promise<void> {
|
||||
await this.waitForSelector(ResultsViewSelectors.settingsButton);
|
||||
await this.click(ResultsViewSelectors.settingsButton);
|
||||
await this.waitForSelector(settingsPanelSelectors.settingsPanel);
|
||||
await this.waitForMilliseconds(750); // Allow for fabric's panel animation to settle
|
||||
|
@ -30,7 +29,6 @@ export class ResultsViewController extends ViewController {
|
|||
|
||||
public async clickLeftNavItem(key: LeftNavItemKey): Promise<void> {
|
||||
const selector = this.getSelectorForLeftNavItemLink(key);
|
||||
await this.waitForSelector(selector);
|
||||
await this.click(selector);
|
||||
}
|
||||
|
||||
|
@ -62,7 +60,6 @@ export class ResultsViewController extends ViewController {
|
|||
}
|
||||
|
||||
public async clickStartOver(): Promise<void> {
|
||||
await this.waitForSelector(ResultsViewSelectors.startOverButton);
|
||||
return this.click(ResultsViewSelectors.startOverButton);
|
||||
return await this.click(ResultsViewSelectors.startOverButton);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,96 +0,0 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
import { SpectronClient, SpectronWindow } from 'spectron';
|
||||
import * as WebDriverIO from 'webdriverio';
|
||||
|
||||
// This file worked around incorrect or missing spectron/webdriverio
|
||||
// typings in the past. webdriverio types are improved in spectron 12.0.0,
|
||||
// so parts of this file can be removed by updating individual end-to-end
|
||||
// tests/controllers to consume SpectronClient directly. SpectronAsyncWindow
|
||||
// works around github issue spectron@343
|
||||
|
||||
export function getSpectronAsyncClient(client: SpectronClient, browserWindow: SpectronWindow) {
|
||||
const typedAsyncClient: SpectronAsyncClient = {
|
||||
browserWindow: browserWindow as unknown as SpectronAsyncWindow,
|
||||
$: (selector: string) => client.$(selector),
|
||||
$$: (selector: string) => client.$$(selector),
|
||||
click: async (selector: string) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.click();
|
||||
},
|
||||
execute: (script: string | ((...args: any[]) => void), ...args: any[]) =>
|
||||
client.execute(script, ...args),
|
||||
executeAsync: (script: string | ((...args: any[]) => void), ...args: any[]) =>
|
||||
client.executeAsync(script, ...args),
|
||||
getAttribute: async (selector: string, attributeName: string) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.getAttribute(attributeName);
|
||||
},
|
||||
getText: async (selector: string) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.getText();
|
||||
},
|
||||
isEnabled: async (selector: string) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.isEnabled();
|
||||
},
|
||||
keys: (keys: string) => client.keys(keys),
|
||||
pause: (milliseconds: number) => client.pause(milliseconds),
|
||||
waitForEnabled: async (selector: string, milliseconds?: number, reverse?: boolean) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.waitForEnabled({
|
||||
timeout: milliseconds,
|
||||
reverse,
|
||||
});
|
||||
},
|
||||
waitForExist: async (
|
||||
selector: string,
|
||||
milliseconds?: number,
|
||||
reverse?: boolean,
|
||||
timeoutMsg?: string,
|
||||
) => {
|
||||
const element = await client.$(selector);
|
||||
return await element.waitForExist({
|
||||
timeout: milliseconds,
|
||||
reverse,
|
||||
timeoutMsg,
|
||||
});
|
||||
},
|
||||
waitUntil: (condition: () => Promise<Boolean>, options?: WebDriverIO.WaitUntilOptions) =>
|
||||
client.waitUntil(condition, options),
|
||||
};
|
||||
return typedAsyncClient;
|
||||
}
|
||||
|
||||
export interface SpectronAsyncWindow {
|
||||
restore(): Promise<void>;
|
||||
setSize(width: number, height: number): Promise<void>;
|
||||
capturePage(): Promise<Uint8Array>; // bytes in PNG format
|
||||
}
|
||||
|
||||
export interface SpectronAsyncClient {
|
||||
// https://github.com/electron-userland/spectron/blob/cd733c4bc6b28eb5a1041ed79eef5563e75432ae/lib/api.js#L311
|
||||
browserWindow: SpectronAsyncWindow;
|
||||
$(selector: string): Promise<WebDriverIO.Element>;
|
||||
$$(selector: string): Promise<WebDriverIO.Element[]>;
|
||||
click(selector: string): Promise<void>;
|
||||
executeAsync(script: string | ((...args: any[]) => void), ...args: any[]): Promise<any>;
|
||||
execute(script: string | ((...args: any[]) => void), ...args: any[]): Promise<any>;
|
||||
getAttribute(selector: string, attributeName: string): Promise<string>;
|
||||
getText(selector?: string): Promise<string>;
|
||||
isEnabled(selector?: string): Promise<boolean>;
|
||||
keys(keys: string): Promise<void>;
|
||||
pause(milliseconds: number): Promise<void>;
|
||||
waitForEnabled(selector: string, milliseconds?: number, reverse?: boolean): Promise<boolean>;
|
||||
waitForExist(
|
||||
selector: string,
|
||||
milliseconds?: number,
|
||||
reverse?: boolean,
|
||||
timeoutMsg?: string,
|
||||
): Promise<boolean>;
|
||||
waitUntil(
|
||||
condition: () => Promise<Boolean>,
|
||||
options?: WebDriverIO.WaitUntilOptions,
|
||||
): Promise<boolean>;
|
||||
}
|
|
@ -1,16 +1,18 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import { Page } from 'playwright';
|
||||
import { TabStopsViewSelectors } from 'tests/electron/common/element-identifiers/tab-stops-view-selectors';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS } from 'tests/electron/setup/timeouts';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class TabStopsViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
public async clickToggleTabStops(): Promise<void> {
|
||||
await this.waitForSelector(TabStopsViewSelectors.tabStopsToggle);
|
||||
await this.client.click(TabStopsViewSelectors.tabStopsToggle);
|
||||
await this.client.click(TabStopsViewSelectors.tabStopsToggle, {
|
||||
timeout: DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,22 +1,30 @@
|
|||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
import * as fs from 'fs';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { Page } from 'playwright';
|
||||
import { DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS } from 'tests/electron/setup/timeouts';
|
||||
import { DEFAULT_PAGE_ELEMENT_WAIT_TIMEOUT_MS } from 'tests/end-to-end/common/timeouts';
|
||||
import { screenshotOnError } from '../../../end-to-end/common/screenshot-on-error';
|
||||
|
||||
export abstract class ViewController {
|
||||
constructor(public client: SpectronAsyncClient) {}
|
||||
constructor(public client: Page) {}
|
||||
|
||||
public async waitForSelector(
|
||||
selector: string,
|
||||
timeout: number = DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS,
|
||||
): Promise<void> {
|
||||
// Note: we're intentionally not using waitForVisible here because it has different
|
||||
// semantics than Puppeteer; in particular, it requires the element be in the viewport
|
||||
// but doesn't scroll the page to the element, so it's easy for it to fail in ways that
|
||||
// are dependent on the test environment.
|
||||
await this.screenshotOnError(async () => await this.client.waitForExist(selector, timeout));
|
||||
await this.screenshotOnError(
|
||||
async () => await this.client.waitForSelector(selector, { state: 'attached', timeout }),
|
||||
);
|
||||
}
|
||||
|
||||
public async waitForEnabled(
|
||||
selector: string,
|
||||
timeout: number = DEFAULT_PAGE_ELEMENT_WAIT_TIMEOUT_MS,
|
||||
) {
|
||||
await this.screenshotOnError(
|
||||
async () => await this.client.isEnabled(selector, { timeout }),
|
||||
);
|
||||
}
|
||||
|
||||
public async waitForNumberOfSelectorMatches(
|
||||
|
@ -25,32 +33,22 @@ export abstract class ViewController {
|
|||
timeout: number = DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS,
|
||||
): Promise<void> {
|
||||
await this.screenshotOnError(async () => {
|
||||
await this.client.waitUntil(
|
||||
async () => {
|
||||
return (await this.client.$$(selector)).length === expectedNumber;
|
||||
},
|
||||
{
|
||||
timeout,
|
||||
timeoutMsg: `expected to find ${expectedNumber} matches for selector ${selector} within ${timeout}ms`,
|
||||
},
|
||||
);
|
||||
await this.client.waitForSelector(`:nth-match(${selector}, ${expectedNumber})`, {
|
||||
timeout,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Webdriver waits the full implicit waitForTimeout before returning not-found.
|
||||
// This means we need to wrap the waitForExist call with a longer timeout when
|
||||
// reverse is true. See webdriverio@2082 and ai-web@3599.
|
||||
public async waitForSelectorToDisappear(
|
||||
selector: string,
|
||||
timeout: number = DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS * 2,
|
||||
): Promise<void> {
|
||||
await this.screenshotOnError(async () =>
|
||||
this.client.waitForExist(
|
||||
selector,
|
||||
timeout,
|
||||
true,
|
||||
`was expecting element by selector ${selector} to disappear`,
|
||||
),
|
||||
await this.screenshotOnError(
|
||||
async () =>
|
||||
await this.client.waitForSelector(selector, {
|
||||
timeout,
|
||||
state: 'detached',
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -60,30 +58,27 @@ export abstract class ViewController {
|
|||
// time-based delay (eg, a UI element animates in before becoming active), NOT sprinkled in
|
||||
// randomly in the hopes that it improves reliability.
|
||||
public async waitForMilliseconds(durationInMilliseconds: number): Promise<void> {
|
||||
await this.client.pause(durationInMilliseconds);
|
||||
await this.client.waitForTimeout(durationInMilliseconds);
|
||||
}
|
||||
|
||||
public async click(selector: string): Promise<void> {
|
||||
await this.screenshotOnError(async () => this.client.click(selector));
|
||||
await this.screenshotOnError(async () => await this.client.click(selector));
|
||||
}
|
||||
|
||||
public async isEnabled(selector: string): Promise<boolean> {
|
||||
return await this.screenshotOnError(async () => this.client.isEnabled(selector));
|
||||
return await this.screenshotOnError(async () => await this.client.isEnabled(selector));
|
||||
}
|
||||
|
||||
public async itemTextIncludesTarget(selector: string, target: string): Promise<boolean> {
|
||||
return await this.screenshotOnError(async () => {
|
||||
const itemText: string = await this.client.getText(selector);
|
||||
const itemText: string = await this.client.innerText(selector);
|
||||
return itemText.includes(target);
|
||||
});
|
||||
}
|
||||
|
||||
private async screenshotOnError<T>(wrappedFunction: () => Promise<T>): Promise<T> {
|
||||
return await screenshotOnError(
|
||||
path =>
|
||||
this.client.browserWindow
|
||||
.capturePage()
|
||||
.then(buffer => fs.writeFileSync(path, buffer)),
|
||||
path => this.client.screenshot().then(buffer => fs.writeFileSync(path, buffer)),
|
||||
wrappedFunction,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
// Licensed under the MIT License.
|
||||
import { KeyEventCode } from 'electron/platform/android/adb-wrapper';
|
||||
import { buildKeyboardButtonAutomationId } from 'electron/views/tab-stops/virtual-keyboard-buttons';
|
||||
import { Page } from 'playwright';
|
||||
import { getAutomationIdSelector } from 'tests/common/get-automation-id-selector';
|
||||
import { SpectronAsyncClient } from 'tests/electron/common/view-controllers/spectron-async-client';
|
||||
import { ViewController } from './view-controller';
|
||||
|
||||
export class VirtualKeyboardViewController extends ViewController {
|
||||
constructor(client: SpectronAsyncClient) {
|
||||
constructor(client: Page) {
|
||||
super(client);
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,6 @@ export class VirtualKeyboardViewController extends ViewController {
|
|||
const automationId = buildKeyboardButtonAutomationId(KeyEventCode[virtualKey]);
|
||||
const selector = getAutomationIdSelector(automationId);
|
||||
|
||||
await this.waitForSelector(selector);
|
||||
await this.client.click(selector);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,3 +3,4 @@
|
|||
import { DEFAULT_ELECTRON_TEST_TIMEOUT_MS } from './timeouts';
|
||||
|
||||
jest.setTimeout(DEFAULT_ELECTRON_TEST_TIMEOUT_MS);
|
||||
jest.retryTimes(2);
|
||||
|
|
|
@ -15,7 +15,7 @@ export const DEFAULT_CHROMEDRIVER_START_TIMEOUT_MS = 5000;
|
|||
export const DEFAULT_CHROMEDRIVER_START_RETRIES = 3;
|
||||
|
||||
// How long to wait for an element to be visible
|
||||
export const DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS = 5000;
|
||||
export const DEFAULT_WAIT_FOR_ELEMENT_TO_BE_VISIBLE_TIMEOUT_MS = 10000;
|
||||
|
||||
// How long of a wait to artificially inject between element hover/mousedown/mouseup during clicks
|
||||
export const DEFAULT_CLICK_HOVER_DELAY_MS = 100;
|
||||
|
|
|
@ -48,7 +48,7 @@ describe('Android setup - locate adb', () => {
|
|||
'respects user-provided location',
|
||||
);
|
||||
await dialog.click('input[type="text"]');
|
||||
await dialog.client.keys(`${(global as any).rootDir}/drop/mock-adb`);
|
||||
await dialog.client.keyboard.type(`${(global as any).rootDir}/drop/mock-adb`);
|
||||
|
||||
expect(await dialog.isEnabled(getAutomationIdSelector(nextId))).toBe(true);
|
||||
await dialog.click(getAutomationIdSelector(nextId));
|
||||
|
|
|
@ -31,7 +31,6 @@ const [closeId, nextId, rescanId] = [
|
|||
describe('Android setup - prompt-choose-device (multiple devices)', () => {
|
||||
const multipleDescription = 'prompt-choose-device-multiple';
|
||||
const defaultDeviceConfig: MockAdbConfig = commonAdbConfigs['multiple-devices'];
|
||||
const downArrowKey = '\uE015'; // "ArrowDown" value from https://w3c.github.io/webdriver/#keyboard-actions
|
||||
|
||||
let app: AppController;
|
||||
let dialog: AndroidSetupViewController;
|
||||
|
@ -91,7 +90,7 @@ describe('Android setup - prompt-choose-device (multiple devices)', () => {
|
|||
|
||||
// Select the second item in the list
|
||||
await dialog.click(getAutomationIdSelector(deviceDescriptionAutomationId));
|
||||
await dialog.client.keys(downArrowKey);
|
||||
await dialog.client.keyboard.press('ArrowDown');
|
||||
await dialog.waitForMilliseconds(1000);
|
||||
await dialog.click(getAutomationIdSelector(nextId));
|
||||
await dialog.waitForDialogVisible('detect-service');
|
||||
|
|
|
@ -39,7 +39,7 @@ const releaseTests = process.env.RUN_RELEASE_TESTS === 'true';
|
|||
});
|
||||
|
||||
it('uses expected build during release', async () => {
|
||||
const buildId = await viewContoller.client.execute(() => {
|
||||
const buildId = await viewContoller.client.evaluate(() => {
|
||||
return (window as any).process.versions['microsoft-build'];
|
||||
});
|
||||
expect(buildId).toBe(electronBuildId);
|
||||
|
@ -54,9 +54,9 @@ it('electron versions in package.json and build id are updated together', async
|
|||
electronBuildId,
|
||||
};
|
||||
expect(versions).toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"electronBuildId": "7912306",
|
||||
"electronVersion": "11.4.5",
|
||||
}
|
||||
`);
|
||||
Object {
|
||||
"electronBuildId": "9728310",
|
||||
"electronVersion": "14.0.0",
|
||||
}
|
||||
`);
|
||||
});
|
||||
|
|
|
@ -12,8 +12,8 @@ import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/set
|
|||
describe('NeedsReviewView', () => {
|
||||
let app: AppController;
|
||||
let resultsViewController: ResultsViewController;
|
||||
const windowWidth = getNarrowModeThresholdsForUnified().collapseHeaderAndNavThreshold + 5;
|
||||
const windowHeight = 1000;
|
||||
const width = getNarrowModeThresholdsForUnified().collapseHeaderAndNavThreshold + 5;
|
||||
const height = 1000;
|
||||
|
||||
beforeEach(async () => {
|
||||
await setupMockAdb(
|
||||
|
@ -23,7 +23,7 @@ describe('NeedsReviewView', () => {
|
|||
);
|
||||
|
||||
app = await createApplication({ suppressFirstTimeDialog: true });
|
||||
app.client.browserWindow.setSize(windowWidth, windowHeight);
|
||||
app.client.setViewportSize({ width, height });
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
|
|
|
@ -35,12 +35,12 @@ describe('ResultsView', () => {
|
|||
});
|
||||
|
||||
it('should pass accessibility validation when left nav is showing', async () => {
|
||||
app.client.setViewportSize({
|
||||
width: narrowModeThresholds.collapseCommandBarThreshold + 1,
|
||||
height,
|
||||
});
|
||||
await openResultsView();
|
||||
|
||||
await app.client.browserWindow.setSize(
|
||||
narrowModeThresholds.collapseCommandBarThreshold + 1,
|
||||
height,
|
||||
);
|
||||
await resultsView.waitForSelector(ResultsViewSelectors.leftNav);
|
||||
await scanForAccessibilityIssuesInAllModes(app);
|
||||
});
|
||||
|
@ -51,15 +51,14 @@ describe('ResultsView', () => {
|
|||
config => config.featureFlag === undefined,
|
||||
)[testIndex].contentPageInfo.title;
|
||||
|
||||
await openResultsView();
|
||||
|
||||
await app.client.browserWindow.setSize(
|
||||
narrowModeThresholds.collapseCommandBarThreshold + 1,
|
||||
app.client.setViewportSize({
|
||||
width: narrowModeThresholds.collapseCommandBarThreshold + 1,
|
||||
height,
|
||||
);
|
||||
});
|
||||
await openResultsView();
|
||||
await resultsView.waitForSelector(ResultsViewSelectors.leftNav);
|
||||
await resultsView.client.click(ResultsViewSelectors.nthTestInLeftNav(testIndex + 1));
|
||||
const title = await resultsView.client.getText('h1');
|
||||
const title = await resultsView.client.textContent('h1');
|
||||
expect(title).toEqual(expectedTestTitle);
|
||||
});
|
||||
|
||||
|
@ -145,8 +144,7 @@ describe('ResultsView', () => {
|
|||
? narrowModeThresholds.collapseCommandBarThreshold - 2
|
||||
: narrowModeThresholds.collapseCommandBarThreshold;
|
||||
|
||||
await app.client.browserWindow.restore();
|
||||
await app.client.browserWindow.setSize(width, height);
|
||||
await app.client.setViewportSize({ width, height });
|
||||
};
|
||||
|
||||
it('command bar reflows when narrow mode threshold is crossed', async () => {
|
||||
|
|
|
@ -26,8 +26,8 @@ describe('TabStopsView', () => {
|
|||
let tabStopsViewController: TabStopsViewController;
|
||||
const mockAdbLogsBase = path.basename(__filename);
|
||||
const mockAdbLogsFolder = 'tabStopsLogs';
|
||||
const windowWidth = getNarrowModeThresholdsForUnified().collapseHeaderAndNavThreshold + 5;
|
||||
const windowHeight = 1000;
|
||||
const width = getNarrowModeThresholdsForUnified().collapseHeaderAndNavThreshold + 5;
|
||||
const height = 1000;
|
||||
const logsContext = path.join(mockAdbLogsBase, mockAdbLogsFolder);
|
||||
|
||||
beforeEach(async () => {
|
||||
|
@ -35,8 +35,8 @@ describe('TabStopsView', () => {
|
|||
|
||||
app = await createApplication({ suppressFirstTimeDialog: true });
|
||||
app.setFeatureFlag(UnifiedFeatureFlags.tabStops, true);
|
||||
app.client.browserWindow.setSize(windowWidth, windowHeight);
|
||||
logController = new LogController(logsContext, mockAdbFolder, app.client);
|
||||
app.client.setViewportSize({ width, height });
|
||||
logController = new LogController(logsContext, mockAdbFolder);
|
||||
tabStopsViewController = new TabStopsViewController(app.client);
|
||||
virtualKeyboardViewController = new VirtualKeyboardViewController(app.client);
|
||||
resultsViewController = await app.openResultsView();
|
||||
|
@ -48,7 +48,7 @@ describe('TabStopsView', () => {
|
|||
});
|
||||
|
||||
afterEach(async () => {
|
||||
if (app != null) {
|
||||
if (app != null && !app.client.isClosed()) {
|
||||
await app.stop();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -196,6 +196,7 @@ export class Page {
|
|||
public async injectScriptFile(filePath: string): Promise<void> {
|
||||
await this.screenshotOnError(async () => {
|
||||
await this.underlyingPage.addScriptTag({ path: filePath });
|
||||
await this.underlyingPage.waitForLoadState();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ app.whenReady().then(() => {
|
|||
const win = new BrowserWindow({
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
enableRemoteModule: true,
|
||||
contextIsolation: false,
|
||||
},
|
||||
});
|
||||
win.loadFile('codecs.html');
|
||||
|
|
|
@ -457,7 +457,6 @@
|
|||
"./src/tests/electron/common/view-controllers/codecs-test-view-controller.ts",
|
||||
"./src/tests/electron/common/view-controllers/device-connection-dialog-controller.ts",
|
||||
"./src/tests/electron/common/view-controllers/log-controller.ts",
|
||||
"./src/tests/electron/common/view-controllers/spectron-async-client.ts",
|
||||
"./src/tests/electron/common/view-controllers/tab-stops-view-controller.ts",
|
||||
"./src/tests/electron/common/view-controllers/view-controller.ts",
|
||||
"./src/tests/electron/common/view-controllers/virtual-keyboard-view-controller.ts",
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
echo "Starting Xvfb"
|
||||
Xvfb :99 -ac &
|
||||
sleep 2
|
||||
|
||||
export DISPLAY=:99
|
||||
Xvfb $DISPLAY -screen 0 1024x768x24
|
||||
|
||||
export DEBUG=pw:api
|
||||
|
||||
echo "Executing command $@"
|
||||
|
||||
exec "$@"
|
440
yarn.lock
440
yarn.lock
|
@ -340,7 +340,7 @@
|
|||
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752"
|
||||
integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==
|
||||
|
||||
"@electron/get@^1.0.1", "@electron/get@^1.12.2", "@electron/get@^1.13.0":
|
||||
"@electron/get@^1.0.1", "@electron/get@^1.13.0":
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.0.tgz#95c6bcaff4f9a505ea46792424f451efea89228c"
|
||||
integrity sha512-+SjZhRuRo+STTO1Fdhzqnv9D2ZhjxXP6egsJ9kiO8dtP68cDx7dFCwWi64dlMQV7sWcfW1OYCW4wviEBzmRsfQ==
|
||||
|
@ -1820,11 +1820,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
|
||||
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
|
||||
|
||||
"@sindresorhus/is@^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4"
|
||||
integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==
|
||||
|
||||
"@sinonjs/commons@^1.7.0":
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6"
|
||||
|
@ -1926,13 +1921,6 @@
|
|||
dependencies:
|
||||
defer-to-connect "^1.0.1"
|
||||
|
||||
"@szmarczak/http-timer@^4.0.5":
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152"
|
||||
integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==
|
||||
dependencies:
|
||||
defer-to-connect "^2.0.0"
|
||||
|
||||
"@tootallnate/once@1":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.0.0.tgz#9c13c2574c92d4503b005feca8f2e16cc1611506"
|
||||
|
@ -1976,16 +1964,6 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.3.0"
|
||||
|
||||
"@types/cacheable-request@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976"
|
||||
integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==
|
||||
dependencies:
|
||||
"@types/http-cache-semantics" "*"
|
||||
"@types/keyv" "*"
|
||||
"@types/node" "*"
|
||||
"@types/responselike" "*"
|
||||
|
||||
"@types/cheerio@*":
|
||||
version "0.22.14"
|
||||
resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.14.tgz#d150889891e7db892c6a0b16bd5583cc70b3fc44"
|
||||
|
@ -2099,11 +2077,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.3.tgz#856c99cdc1551d22c22b18b5402719affec9839a"
|
||||
integrity sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw==
|
||||
|
||||
"@types/http-cache-semantics@*":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
|
||||
integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
|
||||
|
||||
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
|
||||
|
@ -2150,13 +2123,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
||||
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
|
||||
|
||||
"@types/keyv@*":
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7"
|
||||
integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/lodash@^4.14.173":
|
||||
version "4.14.173"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.173.tgz#9d3b674c67a26cf673756f6aca7b429f237f91ed"
|
||||
|
@ -2225,20 +2191,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
|
||||
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
|
||||
|
||||
"@types/puppeteer-core@^5.4.0":
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/puppeteer-core/-/puppeteer-core-5.4.0.tgz#880a7917b4ede95cbfe2d5e81a558cfcb072c0fb"
|
||||
integrity sha512-yqRPuv4EFcSkTyin6Yy17pN6Qz2vwVwTCJIDYMXbE3j8vTPhv0nCQlZOl5xfi0WHUkqvQsjAR8hAfjeMCoetwg==
|
||||
dependencies:
|
||||
"@types/puppeteer" "*"
|
||||
|
||||
"@types/puppeteer@*":
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.3.tgz#cdca84aa7751d77448d8a477dbfa0af1f11485f2"
|
||||
integrity sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/react-copy-to-clipboard@^5.0.1":
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz#7d9c2c0af52e2e8106ebe2b9fde4f02859af7a3d"
|
||||
|
@ -2291,13 +2243,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz#d8e6c2f830e2650dc06fe74464472ff64b54a302"
|
||||
integrity sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==
|
||||
|
||||
"@types/responselike@*", "@types/responselike@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
|
||||
integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/scheduler@*":
|
||||
version "0.16.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
|
||||
|
@ -2501,44 +2446,6 @@
|
|||
prop-types "^15.7.2"
|
||||
tslib "^1.10.0"
|
||||
|
||||
"@wdio/config@6.12.1":
|
||||
version "6.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@wdio/config/-/config-6.12.1.tgz#86d987b505d8ca85ec11471830d2ba296dab3bcf"
|
||||
integrity sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ==
|
||||
dependencies:
|
||||
"@wdio/logger" "6.10.10"
|
||||
deepmerge "^4.0.0"
|
||||
glob "^7.1.2"
|
||||
|
||||
"@wdio/logger@6.10.10":
|
||||
version "6.10.10"
|
||||
resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-6.10.10.tgz#1e07cf32a69606ddb94fa9fd4b0171cb839a5980"
|
||||
integrity sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==
|
||||
dependencies:
|
||||
chalk "^4.0.0"
|
||||
loglevel "^1.6.0"
|
||||
loglevel-plugin-prefix "^0.8.4"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
"@wdio/protocols@6.12.0":
|
||||
version "6.12.0"
|
||||
resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-6.12.0.tgz#e40850be62c42c82dd2c486655d6419cd9ec1e3e"
|
||||
integrity sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A==
|
||||
|
||||
"@wdio/repl@6.11.0":
|
||||
version "6.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-6.11.0.tgz#5b1eab574b6b89f7f7c383e7295c06af23c3818e"
|
||||
integrity sha512-FxrFKiTkFyELNGGVEH1uijyvNY7lUpmff6x+FGskFGZB4uSRs0rxkOMaEjxnxw7QP1zgQKr2xC7GyO03gIGRGg==
|
||||
dependencies:
|
||||
"@wdio/utils" "6.11.0"
|
||||
|
||||
"@wdio/utils@6.11.0":
|
||||
version "6.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-6.11.0.tgz#878c2500efb1a325bf5a66d2ff3d08162f976e8c"
|
||||
integrity sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==
|
||||
dependencies:
|
||||
"@wdio/logger" "6.10.10"
|
||||
|
||||
"@webassemblyjs/ast@1.11.1":
|
||||
version "1.11.1"
|
||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
|
||||
|
@ -2765,11 +2672,6 @@ add-stream@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
|
||||
integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=
|
||||
|
||||
agent-base@5:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c"
|
||||
integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==
|
||||
|
||||
agent-base@6:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
|
@ -3313,7 +3215,7 @@ 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.1, atob@^2.1.2:
|
||||
atob@^2.1.1:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
|
||||
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
|
||||
|
@ -3640,7 +3542,7 @@ buffer-from@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
|
||||
|
||||
buffer@^5.1.0, buffer@^5.2.0, buffer@^5.2.1, buffer@^5.5.0:
|
||||
buffer@^5.1.0, buffer@^5.2.0, buffer@^5.5.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
||||
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
|
||||
|
@ -3769,11 +3671,6 @@ cacache@^15.0.5:
|
|||
tar "^6.0.2"
|
||||
unique-filename "^1.1.1"
|
||||
|
||||
cacheable-lookup@^5.0.3:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3"
|
||||
integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==
|
||||
|
||||
cacheable-request@^6.0.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
|
||||
|
@ -3787,19 +3684,6 @@ cacheable-request@^6.0.0:
|
|||
normalize-url "^4.1.0"
|
||||
responselike "^1.0.2"
|
||||
|
||||
cacheable-request@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58"
|
||||
integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==
|
||||
dependencies:
|
||||
clone-response "^1.0.2"
|
||||
get-stream "^5.1.0"
|
||||
http-cache-semantics "^4.0.0"
|
||||
keyv "^4.0.0"
|
||||
lowercase-keys "^2.0.0"
|
||||
normalize-url "^4.1.0"
|
||||
responselike "^2.0.0"
|
||||
|
||||
call-bind@^1.0.0, call-bind@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
||||
|
@ -3948,18 +3832,6 @@ chownr@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
|
||||
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
|
||||
|
||||
chrome-launcher@^0.13.1:
|
||||
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==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
escape-string-regexp "^1.0.5"
|
||||
is-wsl "^2.2.0"
|
||||
lighthouse-logger "^1.0.0"
|
||||
mkdirp "^0.5.3"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
chrome-trace-event@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
|
||||
|
@ -4546,12 +4418,7 @@ css-selector-tokenizer@^0.7.0:
|
|||
fastparse "^1.1.1"
|
||||
regexpu-core "^1.0.0"
|
||||
|
||||
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-value@^0.0.1, css-value@~0.0.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=
|
||||
|
@ -4706,13 +4573,6 @@ decompress-response@^4.2.0:
|
|||
dependencies:
|
||||
mimic-response "^2.0.0"
|
||||
|
||||
decompress-response@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
|
||||
dependencies:
|
||||
mimic-response "^3.1.0"
|
||||
|
||||
dedent@^0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
||||
|
@ -4728,7 +4588,7 @@ deep-is@^0.1.3, 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.0.0, deepmerge@^4.2.2:
|
||||
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==
|
||||
|
@ -4750,11 +4610,6 @@ defer-to-connect@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
|
||||
integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
|
||||
|
||||
defer-to-connect@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1"
|
||||
integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==
|
||||
|
||||
define-properties@^1.1.2, define-properties@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
|
||||
|
@ -4817,31 +4672,6 @@ detect-node@^2.0.4:
|
|||
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
|
||||
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
|
||||
|
||||
dev-null@^0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818"
|
||||
integrity sha1-WiBc48Ky73e2I41roXnrdMag6Bg=
|
||||
|
||||
devtools-protocol@0.0.809251:
|
||||
version "0.0.809251"
|
||||
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.809251.tgz#300b3366be107d5c46114ecb85274173e3999518"
|
||||
integrity sha512-pf+2OY6ghMDPjKkzSWxHMq+McD+9Ojmq5XVRYpv/kPd9sTMQxzEt21592a31API8qRjro0iYYOc3ag46qF/1FA==
|
||||
|
||||
devtools@6.12.1:
|
||||
version "6.12.1"
|
||||
resolved "https://registry.yarnpkg.com/devtools/-/devtools-6.12.1.tgz#f0298c6d6f46d8d3b751dd8fa4a0c7bc76e1268f"
|
||||
integrity sha512-JyG46suEiZmld7/UVeogkCWM0zYGt+2ML/TI+SkEp+bTv9cs46cDb0pKF3glYZJA7wVVL2gC07Ic0iCxyJEnCQ==
|
||||
dependencies:
|
||||
"@wdio/config" "6.12.1"
|
||||
"@wdio/logger" "6.10.10"
|
||||
"@wdio/protocols" "6.12.0"
|
||||
"@wdio/utils" "6.11.0"
|
||||
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"
|
||||
|
||||
dezalgo@^1.0.0:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
|
||||
|
@ -5046,11 +4876,6 @@ ecc-jsbn@~0.1.1:
|
|||
jsbn "~0.1.0"
|
||||
safer-buffer "^2.1.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==
|
||||
|
||||
ee-first@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||
|
@ -5086,14 +4911,6 @@ electron-builder@22.11.7:
|
|||
update-notifier "^5.1.0"
|
||||
yargs "^17.0.1"
|
||||
|
||||
electron-chromedriver@^11.0.0:
|
||||
version "11.0.0"
|
||||
resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-11.0.0.tgz#49b034ed0ad12c12e3522862c7bb46875a0d85e1"
|
||||
integrity sha512-ayMJPBbB4puU0SqYbcD9XvF3/7GWIhqKE1n5lG2/GQPRnrZkNoPIilsrS0rQcD50Xhl69KowatDqLhUznZWtbA==
|
||||
dependencies:
|
||||
"@electron/get" "^1.12.2"
|
||||
extract-zip "^2.0.0"
|
||||
|
||||
electron-log@^4.4.1:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.1.tgz#28ebeb474eccba2ebf194a96c40d6328e5353e4d"
|
||||
|
@ -5156,13 +4973,13 @@ electron-updater@^4.3.9:
|
|||
lodash.isequal "^4.5.0"
|
||||
semver "^7.3.5"
|
||||
|
||||
electron@11.4.5:
|
||||
version "11.4.5"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-11.4.5.tgz#71ffeb8be8d04bddcd165ed8460867d6e6a4a396"
|
||||
integrity sha512-F1s70t8ZVU7PuXuP7wxbF5muOIRulWvzRAE8MiD5PTomaOar5+I+eR3jD20bs13Z5GdyOQu148WQt8r9h+ALTA==
|
||||
electron@14.0.0:
|
||||
version "14.0.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-14.0.0.tgz#a096484bfbf71d87fc0fa85a943a7869d6b9bf94"
|
||||
integrity sha512-O6EI7L1BPIrTpEIFefjjmdbmSn9LtE4mmrv4dfpV4Mqaa8uKuNYQogwZPEvSwaBexb69eb1LQ25n+f+kBcjiRQ==
|
||||
dependencies:
|
||||
"@electron/get" "^1.0.1"
|
||||
"@types/node" "^12.0.12"
|
||||
"@types/node" "^14.6.2"
|
||||
extract-zip "^1.0.3"
|
||||
|
||||
emittery@^0.8.1:
|
||||
|
@ -5734,7 +5551,7 @@ extract-zip@^1.0.3:
|
|||
mkdirp "^0.5.4"
|
||||
yauzl "^2.10.0"
|
||||
|
||||
extract-zip@^2.0.0, extract-zip@^2.0.1:
|
||||
extract-zip@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
|
||||
integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
|
||||
|
@ -5763,11 +5580,6 @@ fake-indexeddb@^3.1.3:
|
|||
realistic-structured-clone "^2.0.1"
|
||||
setimmediate "^1.0.5"
|
||||
|
||||
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, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||
|
@ -6480,23 +6292,6 @@ globule@^1.0.0:
|
|||
lodash "~4.17.10"
|
||||
minimatch "~3.0.2"
|
||||
|
||||
got@^11.0.2:
|
||||
version "11.8.0"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.8.0.tgz#be0920c3586b07fd94add3b5b27cb28f49e6545f"
|
||||
integrity sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^4.0.0"
|
||||
"@szmarczak/http-timer" "^4.0.5"
|
||||
"@types/cacheable-request" "^6.0.1"
|
||||
"@types/responselike" "^1.0.0"
|
||||
cacheable-lookup "^5.0.3"
|
||||
cacheable-request "^7.0.1"
|
||||
decompress-response "^6.0.0"
|
||||
http2-wrapper "^1.0.0-beta.5.2"
|
||||
lowercase-keys "^2.0.0"
|
||||
p-cancelable "^2.0.0"
|
||||
responselike "^2.0.0"
|
||||
|
||||
got@^9.6.0:
|
||||
version "9.6.0"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
|
||||
|
@ -6868,22 +6663,6 @@ http-signature@~1.2.0:
|
|||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
http2-wrapper@^1.0.0-beta.5.2:
|
||||
version "1.0.0-beta.5.2"
|
||||
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3"
|
||||
integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==
|
||||
dependencies:
|
||||
quick-lru "^5.1.1"
|
||||
resolve-alpn "^1.0.0"
|
||||
|
||||
https-proxy-agent@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b"
|
||||
integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==
|
||||
dependencies:
|
||||
agent-base "5"
|
||||
debug "4"
|
||||
|
||||
https-proxy-agent@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
|
||||
|
@ -7211,11 +6990,6 @@ is-date-object@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
|
||||
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
|
||||
|
||||
is-docker@^2.0.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
|
||||
integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
|
@ -7405,13 +7179,6 @@ is-windows@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
|
||||
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
|
||||
|
||||
is-wsl@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
|
||||
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
|
||||
dependencies:
|
||||
is-docker "^2.0.0"
|
||||
|
||||
is-yarn-global@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
|
||||
|
@ -8071,11 +7838,6 @@ json-buffer@3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
|
||||
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
|
||||
|
||||
json-buffer@3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
|
||||
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
|
||||
|
||||
json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
|
||||
|
@ -8171,13 +7933,6 @@ keyv@^3.0.0:
|
|||
dependencies:
|
||||
json-buffer "3.0.0"
|
||||
|
||||
keyv@^4.0.0:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254"
|
||||
integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==
|
||||
dependencies:
|
||||
json-buffer "3.0.1"
|
||||
|
||||
kind-of@^6.0.2, kind-of@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
|
||||
|
@ -8310,14 +8065,6 @@ liftup@~3.0.1:
|
|||
rechoir "^0.7.0"
|
||||
resolve "^1.19.0"
|
||||
|
||||
lighthouse-logger@^1.0.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca"
|
||||
integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==
|
||||
dependencies:
|
||||
debug "^2.6.8"
|
||||
marky "^1.2.0"
|
||||
|
||||
lines-and-columns@^1.1.6:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
|
||||
|
@ -8464,17 +8211,12 @@ lodash.ismatch@^4.4.0:
|
|||
resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
|
||||
integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
|
||||
|
||||
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.merge@^4.6.1, lodash.merge@^4.6.2:
|
||||
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==
|
||||
|
@ -8514,26 +8256,11 @@ lodash.union@^4.6.0:
|
|||
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
|
||||
integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
|
||||
|
||||
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.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.7.0, lodash@^4.8.0, lodash@~4.17.10, lodash@~4.17.19, lodash@~4.17.21:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||
|
||||
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.0"
|
||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0"
|
||||
integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==
|
||||
|
||||
loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||
|
@ -8643,11 +8370,6 @@ map-obj@^4.0.0:
|
|||
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
|
||||
integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
|
||||
|
||||
marky@^1.2.0:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02"
|
||||
integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==
|
||||
|
||||
matcher@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28"
|
||||
|
@ -8775,11 +8497,6 @@ mimic-response@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
|
||||
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
|
||||
|
||||
mimic-response@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
min-document@^2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
|
||||
|
@ -8926,7 +8643,7 @@ mkdirp-infer-owner@^2.0.0:
|
|||
infer-owner "^1.0.4"
|
||||
mkdirp "^1.0.3"
|
||||
|
||||
mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1:
|
||||
mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1:
|
||||
version "0.5.5"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
|
||||
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
|
||||
|
@ -9554,11 +9271,6 @@ p-cancelable@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
|
||||
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
|
||||
|
||||
p-cancelable@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
|
||||
integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==
|
||||
|
||||
p-each-series@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48"
|
||||
|
@ -10292,7 +10004,7 @@ process@^0.11.1, process@^0.11.10:
|
|||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
||||
|
||||
progress@^2.0.0, progress@^2.0.1, progress@^2.0.3:
|
||||
progress@^2.0.0, progress@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
@ -10370,7 +10082,7 @@ proxy-addr@~2.0.5:
|
|||
forwarded "~0.1.2"
|
||||
ipaddr.js "1.9.0"
|
||||
|
||||
proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
|
||||
proxy-from-env@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
||||
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
|
||||
|
@ -10432,24 +10144,6 @@ pupa@^2.1.1:
|
|||
dependencies:
|
||||
escape-goat "^2.0.0"
|
||||
|
||||
puppeteer-core@^5.1.0:
|
||||
version "5.4.1"
|
||||
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-5.4.1.tgz#68b85c1aae2dcde8e41df1d12aad8852768a88bd"
|
||||
integrity sha512-JfPCQgLvyBlpwQTbdnEwCEvD2KiRB2Hv+J1YCwz9o0PxlTqVSuzSQ4XeLhPmy6fZpBFynyQ+r4FSn6RUywawqA==
|
||||
dependencies:
|
||||
debug "^4.1.0"
|
||||
devtools-protocol "0.0.809251"
|
||||
extract-zip "^2.0.0"
|
||||
https-proxy-agent "^4.0.0"
|
||||
node-fetch "^2.6.1"
|
||||
pkg-dir "^4.2.0"
|
||||
progress "^2.0.1"
|
||||
proxy-from-env "^1.0.0"
|
||||
rimraf "^3.0.2"
|
||||
tar-fs "^2.0.0"
|
||||
unbzip2-stream "^1.3.3"
|
||||
ws "^7.2.3"
|
||||
|
||||
q@^1.5.1, q@~1.5.0:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
|
||||
|
@ -10480,11 +10174,6 @@ quick-lru@^4.0.1:
|
|||
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
|
||||
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
|
||||
|
||||
quick-lru@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
|
||||
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
|
||||
|
||||
raf@^3.4.1:
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
|
||||
|
@ -10996,11 +10685,6 @@ resize-observer-polyfill@^1.5.1:
|
|||
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
|
||||
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
|
||||
|
||||
resolve-alpn@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c"
|
||||
integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==
|
||||
|
||||
resolve-cwd@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
|
||||
|
@ -11059,20 +10743,6 @@ responselike@^1.0.2:
|
|||
dependencies:
|
||||
lowercase-keys "^1.0.0"
|
||||
|
||||
responselike@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
|
||||
integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
|
||||
dependencies:
|
||||
lowercase-keys "^2.0.0"
|
||||
|
||||
resq@^1.9.1:
|
||||
version "1.9.2"
|
||||
resolved "https://registry.yarnpkg.com/resq/-/resq-1.9.2.tgz#f674b061b22b415225edb4d0b20c33a85f949fc1"
|
||||
integrity sha512-Y+fprJ9wQY64gh+vJRNatiG61G+9XD5jJe4kI/Rqw6gmOa5ihZvgrxZVydqyM96xj75jwaRCPVYPU3RwsEk6ug==
|
||||
dependencies:
|
||||
fast-deep-equal "^2.0.1"
|
||||
|
||||
restore-cursor@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
|
||||
|
@ -11104,11 +10774,6 @@ reusify@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
|
||||
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
|
||||
|
||||
rgb2hex@0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.3.tgz#8aa464c517b8a26c7a79d767dabaec2b49ee78ec"
|
||||
integrity sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ==
|
||||
|
||||
rgb2hex@^0.1.9:
|
||||
version "0.1.10"
|
||||
resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.10.tgz#4fdd432665273e2d5900434940ceba0a04c8a8a8"
|
||||
|
@ -11351,13 +11016,6 @@ serialize-error@^5.0.0:
|
|||
dependencies:
|
||||
type-fest "^0.8.0"
|
||||
|
||||
serialize-error@^8.0.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67"
|
||||
integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==
|
||||
dependencies:
|
||||
type-fest "^0.20.2"
|
||||
|
||||
serialize-javascript@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
|
||||
|
@ -11623,17 +11281,6 @@ spdx-license-ids@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
|
||||
integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
|
||||
|
||||
spectron@^13.0.0:
|
||||
version "13.0.0"
|
||||
resolved "https://registry.yarnpkg.com/spectron/-/spectron-13.0.0.tgz#16bdfcf9a2b26cb5ee6c3e29b4f08101e339aa4d"
|
||||
integrity sha512-7RPa6Fp8gqL4V0DubobnqIRFHIijkpjg6MFHcJlxoerWyvLJd+cQvOh756XpB1Z/U3DyA9jPcS+HE2PvYRP5+A==
|
||||
dependencies:
|
||||
dev-null "^0.1.1"
|
||||
electron-chromedriver "^11.0.0"
|
||||
request "^2.88.2"
|
||||
split "^1.0.1"
|
||||
webdriverio "^6.9.1"
|
||||
|
||||
split2@^2.1.1:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
|
||||
|
@ -11648,7 +11295,7 @@ split2@^3.0.0:
|
|||
dependencies:
|
||||
readable-stream "^3.0.0"
|
||||
|
||||
split@^1.0.0, split@^1.0.1:
|
||||
split@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
|
||||
integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
|
||||
|
@ -12202,7 +11849,7 @@ through2@^4.0.0:
|
|||
dependencies:
|
||||
readable-stream "3"
|
||||
|
||||
through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4:
|
||||
through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3.4:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||
|
@ -12529,7 +12176,7 @@ typeson@5.13.0, typeson@^5.8.2:
|
|||
resolved "https://registry.yarnpkg.com/typeson/-/typeson-5.13.0.tgz#dc65b23ea1978a315ed4c95e58a5b6936bcc3591"
|
||||
integrity sha512-xcSaSt+hY/VcRYcqZuVkJwMjDXXJb4CZd51qDocpYw8waA314ygyOPlKhsGsw4qKuJ0tfLLUrxccrm+xvyS0AQ==
|
||||
|
||||
ua-parser-js@^0.7.21, ua-parser-js@^0.7.28:
|
||||
ua-parser-js@^0.7.28:
|
||||
version "0.7.28"
|
||||
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
|
||||
integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==
|
||||
|
@ -12559,14 +12206,6 @@ unbox-primitive@^1.0.1:
|
|||
has-symbols "^1.0.2"
|
||||
which-boxed-primitive "^1.0.2"
|
||||
|
||||
unbzip2-stream@^1.3.3:
|
||||
version "1.4.3"
|
||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
|
||||
integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
|
||||
dependencies:
|
||||
buffer "^5.2.1"
|
||||
through "^2.3.8"
|
||||
|
||||
unc-path-regex@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
|
||||
|
@ -12839,18 +12478,6 @@ wdio-dot-reporter@~0.0.8:
|
|||
resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz#facfb7c9c5984149951f59cbc3cd0752101cf0e0"
|
||||
integrity sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==
|
||||
|
||||
webdriver@6.12.1:
|
||||
version "6.12.1"
|
||||
resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-6.12.1.tgz#30eee65340ea5124aa564f99a4dbc7d2f965b308"
|
||||
integrity sha512-3rZgAj9o2XHp16FDTzvUYaHelPMSPbO1TpLIMUT06DfdZjNYIzZiItpIb/NbQDTPmNhzd9cuGmdI56WFBGY2BA==
|
||||
dependencies:
|
||||
"@wdio/config" "6.12.1"
|
||||
"@wdio/logger" "6.10.10"
|
||||
"@wdio/protocols" "6.12.0"
|
||||
"@wdio/utils" "6.11.0"
|
||||
got "^11.0.2"
|
||||
lodash.merge "^4.6.1"
|
||||
|
||||
webdriverio@^4.13.0:
|
||||
version "4.14.4"
|
||||
resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.14.4.tgz#f7a94e9a6530819796088f42b009833d83de0386"
|
||||
|
@ -12879,35 +12506,6 @@ webdriverio@^4.13.0:
|
|||
wdio-dot-reporter "~0.0.8"
|
||||
wgxpath "~1.0.0"
|
||||
|
||||
webdriverio@^6.9.1:
|
||||
version "6.12.1"
|
||||
resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-6.12.1.tgz#5b6f1167373bd7a154419d8a930ef1ffda9d0537"
|
||||
integrity sha512-Nx7ge0vTWHVIRUbZCT+IuMwB5Q0Q5nLlYdgnmmJviUKLuc3XtaEBkYPTbhHWHgSBXsPZMIc023vZKNkn+6iyeQ==
|
||||
dependencies:
|
||||
"@types/puppeteer-core" "^5.4.0"
|
||||
"@wdio/config" "6.12.1"
|
||||
"@wdio/logger" "6.10.10"
|
||||
"@wdio/repl" "6.11.0"
|
||||
"@wdio/utils" "6.11.0"
|
||||
archiver "^5.0.0"
|
||||
atob "^2.1.2"
|
||||
css-shorthand-properties "^1.1.1"
|
||||
css-value "^0.0.1"
|
||||
devtools "6.12.1"
|
||||
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.3"
|
||||
serialize-error "^8.0.0"
|
||||
webdriver "6.12.1"
|
||||
|
||||
webextension-polyfill-ts@^0.26.0:
|
||||
version "0.26.0"
|
||||
resolved "https://registry.yarnpkg.com/webextension-polyfill-ts/-/webextension-polyfill-ts-0.26.0.tgz#80b7063ddaf99abaa1ca73aad0cec09f306612d3"
|
||||
|
@ -13203,7 +12801,7 @@ write-pkg@^4.0.0:
|
|||
type-fest "^0.4.1"
|
||||
write-json-file "^3.2.0"
|
||||
|
||||
ws@^7.2.3, ws@^7.4.5, ws@^7.4.6:
|
||||
ws@^7.4.5, ws@^7.4.6:
|
||||
version "7.4.6"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
|
||||
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
|
||||
|
|
Загрузка…
Ссылка в новой задаче