test: convert mock-adb to .NET (#5720)

#### Details

This PR migrates `mock-adb` from being a Node.js script packaged into an exe using `pkg` to being a .NET 6.0 console application built as a standalone exe.

##### Motivation

The main motivation is to improve the reliability of the unified tests by improving mock-adb performance. The .NET version is more than an order of magnitude faster than the Node.js version due to the high startup time involved to initialize the Node.js runtime, before our code starts running, and mock-adb is invoked tens of times per test for all unified tests of scenarios beyond the "device setup" flow.

##### Context

For internal folks, see the recording of our 7/7/22 engineering discussion for more context and team discussion. We considered and rejected a few other approaches, including:

* Rewrite in Rust/Go instead of .NET
* Move to a different repo as part of the rewrite
* Instead of rewriting, rearchitect some of the unified tests to avoid having to shell out to a separate `adb.exe` process so much

#### Pull request checklist
<!-- If a checklist item is not applicable to this change, write "n/a" in the checkbox -->
- [n/a] Addresses an existing issue: #0000
- [x] Ran `yarn fastpass`
- [no] Added/updated relevant unit test(s) (and ran `yarn test`)
- [x] Verified code coverage for the changes made. Check coverage report at: `<rootDir>/test-results/unit/coverage`
- [x] PR title *AND* final merge commit title both start with a semantic tag (`fix:`, `chore:`, `feat(feature-name):`, `refactor:`). See `CONTRIBUTING.md`.
- [n/a] (UI changes only) Added screenshots/GIFs to description above
- [n/a] (UI changes only) Verified usability with NVDA/JAWS
This commit is contained in:
Dan Bjorge 2022-07-12 16:03:08 -04:00 коммит произвёл GitHub
Родитель 1aadc8a861
Коммит d18b2ffdbf
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
46 изменённых файлов: 232 добавлений и 431 удалений

11
.github/workflows/ci.yml поставляемый
Просмотреть файл

@ -10,8 +10,9 @@ on:
- cron: '0 19 * * 0'
env:
# Keep this in sync with /pipeline/install-node-prerequisites.yaml
# Keep these in sync with /pipeline/install-node-prerequisites.yaml
NODE_VERSION: 16.14.2
DOTNET_SDK_VERSION: 6.0.301
jobs:
build:
@ -21,6 +22,10 @@ jobs:
- uses: actions/checkout@v2
timeout-minutes: 2
- uses: actions/setup-dotnet@v2
with: { dotnet-version: "${{ env.DOTNET_SDK_VERSION }}" }
timeout-minutes: 2
- uses: actions/setup-node@v2
with: { node-version: "${{ env.NODE_VERSION }}" }
timeout-minutes: 2
@ -264,6 +269,10 @@ jobs:
- uses: actions/checkout@v2
timeout-minutes: 2
- uses: actions/setup-dotnet@v2
with: { dotnet-version: "${{ env.DOTNET_SDK_VERSION }}" }
timeout-minutes: 2
- uses: actions/setup-node@v2
with: { node-version: "${{ env.NODE_VERSION }}" }
timeout-minutes: 2

2
.gitignore поставляемый
Просмотреть файл

@ -11,9 +11,11 @@
/extension/
/package/
bin/
bundle/
dist/
drop/
obj/
test-results/
analysis/
*.scss.d.ts

Просмотреть файл

@ -2,6 +2,8 @@
# Licensed under the MIT License.
**/*.a11ywebassessment
**/*.cs
**/*.csproj
**/*.dockerignore
**/*.gitattributes
**/*.gitignore
@ -27,14 +29,15 @@
.vs/
AppXManifest.xml
copyright-header.txt
bin/
bundle/
dist/
docs/art/ada-cat.ansi256.txt
docs/LICENSE.txt
obj/
src/electron/resources/mit_license_en.txt
src/electron/resources/mit_license.txt
src/NOTICE.html
src/tests/miscellaneous/mock-adb/bin/
drop/
extension/
package/

Просмотреть файл

@ -14,11 +14,17 @@ USER root
#
# We pin nodejs 16.x instead of accepting Playwright's default for consistency with
# our other build environments.
RUN apt-get update ; apt-get install ca-certificates \
&& apt-get update \
&& apt-get install -y curl && \
#
# dotnet-sdk-6.0 is required to build mock-adb
RUN apt-get update && \
apt-get install -y curl apt-transport-https && \
curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
curl -fsSL https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -o packages-microsoft-prod.deb && \
dpkg -i packages-microsoft-prod.deb && \
rm packages-microsoft-prod.deb && \
apt-get update && \
apt-get install -y --allow-downgrades nodejs=16.* && \
apt-get install -y dotnet-sdk-6.0 && \
rm -rf /var/lib/apt/lists/*
RUN npm install -g yarn@1.22.10

Просмотреть файл

@ -8,7 +8,6 @@ const sass = require('sass');
const targets = require('./targets.config');
module.exports = function (grunt) {
const pkgPath = path.resolve('./node_modules/.bin/pkg');
const typedScssModulesPath = path.resolve('./node_modules/.bin/typed-scss-modules');
const webpackPath = path.resolve('./node_modules/.bin/webpack');
@ -22,11 +21,9 @@ module.exports = function (grunt) {
const packageUIBundlePath = path.join(packageUIPath, 'bundle');
const packageUIDropPath = path.join(packageUIPath, 'drop');
const mockAdbAppPath = path.resolve('./src/tests/miscellaneous/mock-adb/app');
const mockAdbBinSrcPath = path.join(mockAdbAppPath, 'bin.js');
const mockAdbBinFilename = process.platform === 'win32' ? 'adb.exe' : 'adb';
const mockAdbObjPath = path.join('packages', 'mock-adb', 'obj');
const mockAdbBinPath = path.join('packages', 'mock-adb', 'bin');
const mockAdbDropPath = path.join('drop', 'mock-adb');
const mockAdbBinOutPath = path.join(mockAdbDropPath, mockAdbBinFilename);
function mustExist(file, reason) {
const normalizedFile = path.normalize(file);
@ -45,7 +42,7 @@ module.exports = function (grunt) {
},
clean: {
intermediates: ['dist', extensionPath],
'mock-adb': mockAdbDropPath,
'mock-adb': [mockAdbObjPath, mockAdbBinPath, mockAdbDropPath],
'package-report': packageReportDropPath,
'package-ui': packageUIDropPath,
scss: path.join('src', '**/*.scss.d.ts'),
@ -174,7 +171,10 @@ module.exports = function (grunt) {
'webpack-unified': `"${webpackPath}" --config-name unified`,
'webpack-package-ui': `"${webpackPath}" --config-name package-ui`,
'generate-scss-typings': `"${typedScssModulesPath}" src --exportType default`,
'pkg-mock-adb': `"${pkgPath}" "${mockAdbBinSrcPath}" -d --target host --output "${mockAdbBinOutPath}"`,
'dotnet-publish-mock-adb': {
command: `dotnet publish -c Release -o "${path.resolve(mockAdbDropPath)}"`,
cwd: 'packages/mock-adb',
},
},
sass: {
options: {
@ -754,6 +754,10 @@ module.exports = function (grunt) {
console.log(`package is in ${packageUIDropPath}`);
});
grunt.registerTask('build-mock-adb', function () {
grunt.task.run('exec:dotnet-publish-mock-adb');
});
grunt.registerTask('extension-release-drops', function () {
extensionReleaseTargets.forEach(targetName => {
grunt.task.run('drop:' + targetName);
@ -810,7 +814,7 @@ module.exports = function (grunt) {
grunt.registerTask('build-unified', [
'clean:intermediates',
'exec:generate-scss-typings',
'exec:pkg-mock-adb',
'build-mock-adb',
'exec:webpack-unified',
'build-assets',
'drop:unified-dev',
@ -839,7 +843,7 @@ module.exports = function (grunt) {
grunt.registerTask('build-all', [
'clean:intermediates',
'exec:generate-scss-typings',
'exec:pkg-mock-adb',
'build-mock-adb',
'concurrent:compile-all',
'build-assets',
'drop:dev',

Просмотреть файл

@ -19,12 +19,12 @@
"./packages/*/bundle",
"./packages/*/drop",
"./src/assessments/color/test-steps/flashing-text-example.html",
"./src/tests/miscellaneous/mock-adb/bin",
"./analysis",
".gitattribute",
".gitattributes",
".ignoredRevs",
"**/*.a11ywebassessment",
"**/*.csproj",
"**/.DS_Store",
"**/*.icns",
"**/*.scss.d.ts",
@ -32,8 +32,11 @@
"**/*.snap.html",
"**/*.svg",
"**/*.mp3",
"**/.vs",
"**/bin",
"**/bundle",
"**/drop",
"**/obj",
"**/test-results",
"**/yarn.lock",
"Dockerfile",
@ -50,7 +53,7 @@
"prepend": "<!--",
"append": "-->"
},
"ts|tsx|d.ts|js|scss|css": {
"ts|tsx|d.ts|js|scss|css|cs": {
"eachLine": {
"prepend": "// "
}

Просмотреть файл

@ -14,6 +14,9 @@ Throughout most of the code and build commands, Accessibility Insights for Andro
### Prerequisites
All the [prerequisites](./building-web.md#Prerequisites) for building Web are also required for Unified.
**Additionally**, you must [install the .NET 6.0 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0). Use the current LTS version. You can test whether you already have this installed by running `dotnet --list-sdks`.
Note that if you have Hadoop YARN installed, you will need to replace `yarn` with `yarnpkg` in the commands below.
### Building
@ -35,7 +38,7 @@ Most of the functionality of Unified relies on connecting to a device running th
#### Using a mock device
See guidance [here](../src/tests/miscellaneous/mock-adb/README.md).
We use a test tool called `mock-adb` to enable testing against mock devices. See the [`mock-adb` README](../packages/mock-adb/README.md) for details.
#### Connecting to a real device/emulator

Просмотреть файл

@ -27,7 +27,7 @@
"build:all": "grunt build-all",
"build:dev": "grunt build-dev",
"build:dev:mv3": "grunt build-dev-mv3",
"build:mock-adb": "grunt exec:pkg-mock-adb",
"build:mock-adb": "grunt build-mock-adb",
"build:unified": "grunt build-unified",
"build:unified:all": "grunt build-unified-all",
"build:unified:canary": "grunt build-unified-canary",
@ -51,7 +51,7 @@
"lint:fix": "eslint **/*.{js,ts,tsx} --quiet --fix",
"lint:scss": "stylelint **/*.scss",
"lint:scss:fix": "stylelint **/*.scss --fix",
"mock-adb": "node ./src/tests/miscellaneous/mock-adb/setup-mock-adb-command.js",
"mock-adb": "node ./src/tests/miscellaneous/setup-mock-adb/setup-mock-adb-command.js",
"null:autoadd": "node ./tools/strict-null-checks/auto-add.js",
"null:check": "tsc -p ./tsconfig.strictNullChecks.json",
"null:find": "node ./tools/strict-null-checks/find.js",
@ -157,7 +157,6 @@
"license-check-and-add": "^4.0.5",
"mini-css-extract-plugin": "2.6.1",
"npm-run-all": "^4.1.5",
"pkg": "^5.7.0",
"playwright": "^1.23.2",
"postcss": "^8.4.14",
"postcss-modules": "^4.3.1",

Просмотреть файл

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>Microsoft.AccessibilityInsights.MockAdb</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!--
These are required to produce a self-contained executable named "adb.exe", which is mandatory
because that's specifically what appium-adb looks for.
-->
<AssemblyName>adb</AssemblyName>
<OutputType>Exe</OutputType>
<UseCurrentRuntimeIdentifier>true</UseCurrentRuntimeIdentifier>
<SelfContained>true</SelfContained>
<!-- These are minor performance/size optimizations -->
<PublishReadyToRun>true</PublishReadyToRun>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
</Project>

Просмотреть файл

@ -38,4 +38,8 @@ In the remote build, these logs are uploaded as artifacts if any end-to-end test
### Implementation
The `mock-adb` implementation is in [bin.js](./app/bin.js). Commands such as `yarn mock-adb` and end-to-end tests call [setupMockAdb](https://github.com/microsoft/accessibility-insights-web/blob/main/src/tests/miscellaneous/mock-adb/setup-mock-adb.js#L28) to write the appropriate config/logging context to disk. `bin.js` gets packaged into an executable that reads the context from disk and runs with the configured behavior.
Our team wrote `mock-adb` in .NET to improve performance and ultimately the reliability of Unified tests. Since the tests invoke `mock-adb` hundreds of times, we migrated from Node.js due to the high startup time involved to initialize the Node.js runtime. On dev machines with fewer resources, this resulted in ~2s of overhead per call and caused the tests to timeout.
Commands such as `yarn mock-adb` and end-to-end tests call [setupMockAdb](https://github.com/microsoft/accessibility-insights-web/blob/main/src/tests/miscellaneous/setup-mock-adb/setup-mock-adb.js) to write the appropriate config/logging context to disk. `mock-adb` gets packaged into an executable that reads the context from disk and runs with the configured behavior.
`mock-adb` is normally built automatically as a step of `yarn build:unified`, but you can rebuild it individually with `yarn build:mock-adb`.

Просмотреть файл

@ -0,0 +1,37 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System.Text.RegularExpressions;
internal class CommandResult {
public string? stdout { get; set; }
public string? stderr { get; set; }
public int? exitCode { get; set; }
public int? delayMs { get; set; }
public string[]? input { get; set; }
public string? inputCommand { get; set; }
public string? regexTarget { get; set; }
public static CommandResult FromCommand(Dictionary<string, CommandResult> config, string inputCommand) {
// First option: exact match
if (config.ContainsKey(inputCommand)) {
return config[inputCommand];
}
// Second option: regex match
foreach (CommandResult result in config.Values) {
if (result.regexTarget != null) {
var resultRegex = new Regex(result.regexTarget);
if (resultRegex.IsMatch(inputCommand)) {
return result;
}
}
}
// default result (error)
return new CommandResult {
exitCode = 1,
stderr = $"unrecognized command: {inputCommand}",
};
}
}

Просмотреть файл

@ -0,0 +1,70 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System.Reflection;
using System.Text.Json;
using CommandConfig = System.Collections.Generic.Dictionary<string, CommandResult>;
string currentExe = Assembly.GetExecutingAssembly().Location;
string currentExeDir = Path.GetDirectoryName(currentExe) ?? throw new Exception("currentExe should not be a root directory");
string defaultConfigPath = Path.Join(currentExeDir, "mock_adb_config.json");
string configPath = Environment.GetEnvironmentVariable("MOCK_ADB_CONFIG") ?? defaultConfigPath;
if (!File.Exists(configPath))
{
Console.Error.WriteLine($"Could not find mock-adb config file at \"{configPath}\"");
Console.Error.WriteLine("You can create one with \"yarn mock-adb\"");
Environment.Exit(1);
}
string configRaw = File.ReadAllText(configPath);
CommandConfig config = JsonSerializer.Deserialize<CommandConfig>(configRaw) ?? throw new Exception($"failed to parse config file {configPath} as JSON object");
// latestAdbContext.txt is a file which contains a relative file path
string currentAdbContextPath = Path.Join(currentExeDir, "latestAdbContext.txt");
string currentAdbContext = File.ReadAllText(currentAdbContextPath);
string outputLogsDir = Path.Join(currentExeDir, "logs", currentAdbContext);
Directory.CreateDirectory(outputLogsDir);
string adbLogPath = Path.Join(outputLogsDir, "adb.log");
string outputPath = Path.Join(outputLogsDir, "mock_adb_output.json");
int numIgnoredPrefixArgs = 0;
if (args.Length > 0 && args[0].Equals("-P")) {
numIgnoredPrefixArgs = 2; // "mock-adb.exe -P <port> <command>" ignores the "-P <port>"
}
string inputCommand = String.Join(" ", args.Skip(numIgnoredPrefixArgs));
CommandResult result = CommandResult.FromCommand(config, inputCommand);
if (result.delayMs != null) {
Thread.Sleep((int)result.delayMs);
}
if (result.stderr != null) {
Console.Error.WriteLine(result.stderr);
}
if (result.stdout != null) {
Console.WriteLine(result.stdout);
}
result.input = args;
result.inputCommand = inputCommand;
string resultRaw = JsonSerializer.Serialize(result);
using (StreamWriter adbLogFile = File.AppendText(adbLogPath)) {
adbLogFile.WriteLine($"ADB {inputCommand}");
}
using (StreamWriter outputFile = File.CreateText(outputPath)) {
outputFile.WriteLine(resultRaw);
}
string outputConfigPath = Path.Join(outputLogsDir, "mock_adb_config.json");
File.Copy(configPath, outputConfigPath, true);
Environment.Exit(result.exitCode ?? 0);

Просмотреть файл

@ -1,6 +1,11 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
steps:
- task: UseDotNet@2 # For building mock-adb
inputs:
# Keep this in sync with /.github/workflows/ci.yml
version: '6.0.301'
- task: NodeTool@0
inputs:
# Keep this in sync with /.github/workflows/ci.yml

Просмотреть файл

@ -5,7 +5,7 @@ import * as path from 'path';
const mockAdbStandardResultPath = path.join(
__dirname,
'../miscellaneous/mock-adb/assets/result.json',
'../miscellaneous/setup-mock-adb/assets/result.json',
);
export const androidScanResultExample = JSON.parse(
fs.readFileSync(mockAdbStandardResultPath, { encoding: 'utf-8' }),

Просмотреть файл

@ -6,7 +6,7 @@ import { flushSettledPromises } from 'tests/common/flush-settled-promises';
import {
generateAdbLogPath,
generateOutputLogsDir,
} from 'tests/miscellaneous/mock-adb/generate-log-paths';
} from 'tests/miscellaneous/setup-mock-adb/generate-log-paths';
const readFile = util.promisify(fs.readFile);
export class LogController {

Просмотреть файл

@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
import { commonAdbConfigs, setupMockAdb } from '../../miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
// tslint:disable-next-line:no-default-export
export default async function (): Promise<void> {

Просмотреть файл

@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
import { commonAdbConfigs, setupMockAdb } from '../../miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
// tslint:disable-next-line:no-default-export
export default async function (): Promise<void> {

Просмотреть файл

@ -9,7 +9,7 @@ import {
delayAllCommands,
setupMockAdb,
simulateServiceNotInstalled,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
describe('Android setup - detect-service', () => {
const defaultDeviceConfig = commonAdbConfigs['single-device'];

Просмотреть файл

@ -18,7 +18,7 @@ import {
physicalDeviceName1,
setupMockAdb,
simulateReadContentError,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [cancelId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -14,7 +14,7 @@ import {
commonAdbConfigs,
setupMockAdb,
simulateNoDevicesConnected,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [closeId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -20,7 +20,7 @@ import {
physicalDeviceName1,
setupMockAdb,
simulateServiceNotInstalled,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [closeId, nextId, rescanId] = [
leftFooterButtonAutomationId,

Просмотреть файл

@ -16,7 +16,7 @@ import {
delayAllCommands,
setupMockAdb,
simulateNoDevicesConnected,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [closeId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -17,7 +17,7 @@ import {
delayAllCommands,
physicalDeviceName1,
setupMockAdb,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [cancelId, startTestingId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];
const expectedRunningApp = 'com.google.android.apps.messaging';

Просмотреть файл

@ -18,7 +18,7 @@ import {
physicalDeviceName1,
setupMockAdb,
simulateServiceLacksPermissions,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [cancelId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -20,7 +20,7 @@ import {
setupMockAdb,
simulateServiceInstallationError,
simulateServiceNotInstalled,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [cancelId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -18,7 +18,7 @@ import {
setupMockAdb,
simulateServiceInstallationError,
simulateServiceNotInstalled,
} from '../../miscellaneous/mock-adb/setup-mock-adb';
} from '../../miscellaneous/setup-mock-adb/setup-mock-adb';
const [cancelId, nextId] = [leftFooterButtonAutomationId, rightFooterButtonAutomationId];

Просмотреть файл

@ -5,7 +5,7 @@ import { createApplication } from 'tests/electron/common/create-application';
import { scanForAccessibilityIssuesInAllModes } from 'tests/electron/common/scan-for-accessibility-issues';
import { AppController } from 'tests/electron/common/view-controllers/app-controller';
import { CardsViewController } from 'tests/electron/common/view-controllers/cards-view-controller';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('AutomatedChecksView', () => {
let app: AppController;

Просмотреть файл

@ -4,7 +4,7 @@ import * as path from 'path';
import { createApplication } from 'tests/electron/common/create-application';
import { scanForAccessibilityIssuesInAllModes } from 'tests/electron/common/scan-for-accessibility-issues';
import { AppController } from 'tests/electron/common/view-controllers/app-controller';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('first time dialog', () => {
let app: AppController;

Просмотреть файл

@ -7,7 +7,7 @@ import { ResultsViewSelectors } from 'tests/electron/common/element-identifiers/
import { scanForAccessibilityIssuesInAllModes } from 'tests/electron/common/scan-for-accessibility-issues';
import { AppController } from 'tests/electron/common/view-controllers/app-controller';
import { ResultsViewController } from 'tests/electron/common/view-controllers/results-view-controller';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('NeedsReviewView', () => {
let app: AppController;

Просмотреть файл

@ -10,7 +10,7 @@ import { ScreenshotViewSelectors } from 'tests/electron/common/element-identifie
import { scanForAccessibilityIssuesInAllModes } from 'tests/electron/common/scan-for-accessibility-issues';
import { AppController } from 'tests/electron/common/view-controllers/app-controller';
import { ResultsViewController } from 'tests/electron/common/view-controllers/results-view-controller';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('ResultsView', () => {
let app: AppController;

Просмотреть файл

@ -16,7 +16,7 @@ import {
commonAdbConfigs,
mockAdbFolder,
setupMockAdb,
} from 'tests/miscellaneous/mock-adb/setup-mock-adb';
} from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('TabStopsView', () => {
let app: AppController;

Просмотреть файл

@ -7,7 +7,7 @@ import { AppController } from 'tests/electron/common/view-controllers/app-contro
import { ResultsViewController } from 'tests/electron/common/view-controllers/results-view-controller';
import { CommonSelectors } from 'tests/end-to-end/common/element-identifiers/common-selectors';
import { settingsPanelSelectors } from 'tests/end-to-end/common/element-identifiers/details-view-selectors';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/mock-adb/setup-mock-adb';
import { commonAdbConfigs, setupMockAdb } from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('AutomatedChecksView -> Settings Panel', () => {
let app: AppController;
let resultsView: ResultsViewController;

Просмотреть файл

@ -1,97 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
const fs = require('fs');
const { EOL } = require('os');
const path = require('path');
const process = require('process');
const { fileWithExpectedLoggingPath, fileWithMockAdbConfig } = require('../common-file-names.js');
const { generateAdbLogPath, generateOutputLogsDir } = require('../generate-log-paths.js');
function resultFromCommand(config, inputCommand) {
// First option: exact match
if (config[inputCommand]) {
return config[inputCommand];
}
// Second option: regex match
Object.values(config).forEach(value => {
const regexTarget = value.regexTarget;
if (regexTarget) {
const regex = new RegExp(regexTarget);
if (regex.test(inputCommand)) {
return value;
}
}
});
// default result (error)
return {
exitCode: 1,
stderr: `unrecognized command: ${inputCommand}`,
};
}
async function main() {
// Note: if you base a path on __dirname, pkg will bundle it into adb.exe
// Use path.dirname(process.execPath) instead for it to look for the file at runtime
const runtimeDirname = path.dirname(process.execPath);
const defaultConfigPath = path.join(runtimeDirname, fileWithMockAdbConfig);
const configPath = process.env['MOCK_ADB_CONFIG'] || defaultConfigPath;
const configContent = fs.readFileSync(configPath);
const config = JSON.parse(configContent);
const currentContext = fs.readFileSync(
path.join(runtimeDirname, fileWithExpectedLoggingPath),
'utf-8',
);
const outputLogsDir = generateOutputLogsDir(path.dirname(process.execPath), currentContext);
fs.mkdirSync(outputLogsDir, { recursive: true });
const adbLogsPath = generateAdbLogPath(outputLogsDir);
const outputFile = path.join(outputLogsDir, 'mock_adb_output.json');
let ignoredPrefixArgs = 2; // node.exe bin.js
if (process.argv[2] === '-P') {
ignoredPrefixArgs += 2; // -P 5037
}
const inputCommand = process.argv.slice(ignoredPrefixArgs).join(' ');
const result = resultFromCommand(config, inputCommand);
if (result.delayMs != null) {
await new Promise(resolve => {
setTimeout(resolve, result.delayMs);
});
}
if (result.stderr != null) {
console.error(result.stderr);
}
if (result.stdout != null) {
console.log(result.stdout);
}
result.input = process.argv;
result.inputCommand = inputCommand;
fs.writeFileSync(adbLogsPath, `ADB ${inputCommand}\n`, {
flag: 'a',
});
fs.writeFileSync(outputFile, JSON.stringify(result, null, ' ') + EOL, { flag: 'a' });
const outputConfigFile = path.join(outputLogsDir, fileWithMockAdbConfig);
fs.copyFileSync(configPath, outputConfigFile);
if (result.exitCode != null) {
process.exit(result.exitCode);
}
}
main().catch(e => {
console.error(`mock-adb error: ${e.stack}`);
process.exit(1);
});

Просмотреть файл

@ -0,0 +1,10 @@
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License.
-->
# mock-adb test integration
This directory contains helpers to setup mock-adb for use with unified test cases. It can also be invoked manually via `yarn mock-adb` for use with manual testing (this is why it's written in .js instead of .ts).
For the mock-adb implementation, see /packages/mock-adb

Просмотреть файл

@ -13,7 +13,7 @@ import {
simulateServiceLacksPermissions,
simulateServiceNotInstalled,
simulateInputKeyeventError,
} from 'tests/miscellaneous/mock-adb/setup-mock-adb';
} from 'tests/miscellaneous/setup-mock-adb/setup-mock-adb';
describe('mock-adb tests match snapshots after normalizing path', () => {
const definedConfigs = Object.getOwnPropertyNames(commonAdbConfigs);

306
yarn.lock
Просмотреть файл

@ -325,7 +325,7 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/parser@7.17.10", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9":
"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9":
version "7.17.10"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78"
integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==
@ -492,7 +492,7 @@
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@7.17.10", "@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.14.2", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.14.2", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
version "7.17.10"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4"
integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==
@ -3459,7 +3459,7 @@ ansi-escapes@^4.2.1:
dependencies:
type-fest "^0.11.0"
ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1:
ansi-regex@^2.0.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
@ -3597,11 +3597,6 @@ appium-adb@^9.9.0:
teen_process "^1.11.0"
utf7 "^1.0.2"
aproba@^1.0.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
@ -3644,14 +3639,6 @@ are-we-there-yet@^3.0.0:
delegates "^1.0.0"
readable-stream "^3.6.0"
are-we-there-yet@~1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -4412,11 +4399,6 @@ cheerio@^1.0.0-rc.3:
optionalDependencies:
fsevents "~2.3.2"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
@ -4554,11 +4536,6 @@ co@^4.6.0:
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
codecov@^3.8.3:
version "3.8.3"
resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.8.3.tgz#9c3e364b8a700c597346ae98418d09880a3fdbe7"
@ -4755,7 +4732,7 @@ configstore@^5.0.1:
write-file-atomic "^3.0.0"
xdg-basedir "^4.0.0"
console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
console-control-strings@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
@ -5122,13 +5099,6 @@ decimal.js@^10.3.1:
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
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"
@ -5233,11 +5203,6 @@ detect-indent@^6.0.0:
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
detect-newline@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
@ -6188,11 +6153,6 @@ exit@^0.1.2, exit@~0.1.2:
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
expand-template@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@ -6553,14 +6513,6 @@ fresh@0.5.2:
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
from2@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
dependencies:
inherits "^2.0.1"
readable-stream "^2.0.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
@ -6677,20 +6629,6 @@ gauge@^4.0.0, gauge@^4.0.3:
strip-ansi "^6.0.1"
wide-align "^1.1.5"
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gaze@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
@ -6840,11 +6778,6 @@ gitconfiglocal@^1.0.0:
dependencies:
ini "^1.3.2"
github-from-package@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
gitignore-to-glob@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz#59f32ab3d9b66ce50299c3ed24cb0ef42a094ceb"
@ -7277,7 +7210,7 @@ has-tostringtag@^1.0.0:
dependencies:
has-symbols "^1.0.2"
has-unicode@^2.0.0, has-unicode@^2.0.1:
has-unicode@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
@ -7638,14 +7571,6 @@ interpret@~1.1.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
into-stream@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702"
integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==
dependencies:
from2 "^2.3.0"
p-is-promise "^3.0.0"
ip@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
@ -7712,7 +7637,7 @@ is-ci@^3.0.0:
dependencies:
ci-info "^3.2.0"
is-core-module@2.9.0, is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1:
is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1:
version "2.9.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
@ -7729,18 +7654,6 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@ -9238,11 +9151,6 @@ mimic-response@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
mimic-response@^2.0.0:
version "2.1.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"
@ -9389,11 +9297,6 @@ minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2:
minipass "^3.0.0"
yallist "^4.0.0"
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mkdirp-infer-owner@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316"
@ -9456,14 +9359,6 @@ multimatch@^5.0.0:
arrify "^2.0.1"
minimatch "^3.0.4"
multistream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8"
integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==
dependencies:
once "^1.4.0"
readable-stream "^3.6.0"
mute-stream@0.0.8, mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
@ -9483,11 +9378,6 @@ nanoid@^3.3.4:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
napi-build-utils@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@ -9537,19 +9427,12 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
node-abi@^2.21.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
dependencies:
semver "^5.4.1"
node-addon-api@^1.6.3:
version "1.7.2"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
node-fetch@^2.6.1, node-fetch@^2.6.6:
node-fetch@^2.6.1:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
@ -9790,16 +9673,6 @@ npmlog@6.0.1:
gauge "^4.0.0"
set-blocking "^2.0.0"
npmlog@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
npmlog@^6.0.0, npmlog@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
@ -9817,11 +9690,6 @@ nth-check@>=2.0.1, nth-check@~1.0.1:
dependencies:
boolbase "^1.0.0"
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
nwsapi@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
@ -10018,11 +9886,6 @@ p-finally@^1.0.0:
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
p-is-promise@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971"
integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==
p-limit@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@ -10454,40 +10317,6 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
pkg-fetch@3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.4.1.tgz#be68bb9f7fdb0f6ed995abc518ab2e35aa64d2fd"
integrity sha512-fS4cdayCa1r4jHkOKGPJKnS9PEs6OWZst+s+m0+CmhmPZObMnxoRnf9T9yUWl+lzM2b5aJF7cnQIySCT7Hq8Dg==
dependencies:
chalk "^4.1.2"
fs-extra "^9.1.0"
https-proxy-agent "^5.0.0"
node-fetch "^2.6.6"
progress "^2.0.3"
semver "^7.3.5"
tar-fs "^2.1.1"
yargs "^16.2.0"
pkg@^5.7.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.7.0.tgz#6422df05e8aa147764be6ef912921d0fa719ea95"
integrity sha512-PTiAjNq/CGAtK5qUBR6pjheqnipTFjeecgSgIKEcAOJA4GpmZeOZC8pMOoT0rfes5vHsmcFo7wbSRTAmXQurrg==
dependencies:
"@babel/parser" "7.17.10"
"@babel/types" "7.17.10"
chalk "^4.1.2"
escodegen "^2.0.0"
fs-extra "^9.1.0"
globby "^11.1.0"
into-stream "^6.0.0"
is-core-module "2.9.0"
minimist "^1.2.6"
multistream "^4.1.0"
pkg-fetch "3.4.1"
prebuild-install "6.1.4"
resolve "^1.22.0"
stream-meter "^1.0.4"
playwright-core@1.23.2:
version "1.23.2"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.23.2.tgz#ddc15b3251e42ee0eed82a96ece3f7b2641d75a4"
@ -10661,25 +10490,6 @@ postinstall-build@^5.0.1:
resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.3.tgz#238692f712a481d8f5bc8960e94786036241efc7"
integrity sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==
prebuild-install@6.1.4:
version "6.1.4"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f"
integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1"
node-abi "^2.21.0"
npmlog "^4.0.1"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^3.0.3"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@ -10940,7 +10750,7 @@ raw-loader@~0.5.1:
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
rc@^1.2.7, rc@^1.2.8:
rc@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@ -11165,7 +10975,7 @@ readable-stream@^1.0.31:
isarray "0.0.1"
string_decoder "~0.10.x"
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@~2.3.6:
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@ -11467,7 +11277,7 @@ safari-14-idb-fix@^3.0.0:
resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440"
integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@ -11665,7 +11475,7 @@ serve-static@1.15.0, serve-static@^1.15.0:
parseurl "~1.3.3"
send "0.18.0"
set-blocking@^2.0.0, set-blocking@~2.0.0:
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
@ -11720,7 +11530,7 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
@ -11730,20 +11540,6 @@ signal-exit@^3.0.7:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-git@^3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.10.0.tgz#f20031dd121d3c49e215ef0186a102bece3f89b2"
@ -12004,13 +11800,6 @@ stream-events@^1.0.5:
dependencies:
stubs "^3.0.0"
stream-meter@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d"
integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=
dependencies:
readable-stream "^2.1.4"
stream-shift@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
@ -12034,23 +11823,6 @@ string-template@~0.2.1:
resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2":
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@ -12145,20 +11917,13 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
strip-ansi@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@ -12406,37 +12171,6 @@ tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar-fs@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.0.0"
tar-fs@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.1.4"
tar-stream@^2.0.0, tar-stream@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
dependencies:
bl "^4.0.3"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
readable-stream "^3.1.1"
tar-stream@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
@ -12734,13 +12468,6 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
tunnel@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
@ -13340,13 +13067,6 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1:
dependencies:
isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
dependencies:
string-width "^1.0.2 || 2"
wide-align@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"