* add playwright harness script and configs (#4229)

* split harness and server

* add environment variables
* fix tsconfig conflicts
* add README

* update yarn.lock after rebase

* install playwright latest

* Replace rollup-plugin-copy with copyfiles

* cross-env environment var setting

* add playwright CI

* add ci-workflow to linux machine

* add playwright ci to linux environment

* work flow fixes in linux

* resolve conflict issue

* playwright worflow

* playwright workflow

* fix run workflow

* install playwright for servers

* change tittle for the build

* Update .github/workflows/ci-weekly.yml

Co-authored-by: Jane Chu <7559015+janechu@users.noreply.github.com>

* Update build/copy.js

Co-authored-by: Jane Chu <7559015+janechu@users.noreply.github.com>

* remove blank lines

* renaming test dir to __test__

* organize gitignore files

* Update packages/web-components/fast-components/__test__/README.md

* fix environment variable casing

* remove abbreviation from environment variable

* sort package.json scripts

Co-authored-by: John Kreitlow <863023+radium-v@users.noreply.github.com>
Co-authored-by: John Kreitlow <john.kreitlow@microsoft.com>
Co-authored-by: nicholasrice <nicholasrice@users.noreply.github.com>
Co-authored-by: Ibrahim Maga <imaga75@hotmail.com>
Co-authored-by: Jane Chu <7559015+janechu@users.noreply.github.com>
This commit is contained in:
Nicholas Rice 2021-02-18 15:26:05 -08:00 коммит произвёл GitHub
Родитель b2f2f2907e
Коммит be996eea6c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
22 изменённых файлов: 884 добавлений и 126 удалений

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

@ -1,11 +1,20 @@
name: CI - FAST Validation
on:
push:
branches:
- master
- releases/*
pull_request:
branches:
- master
- releases/*
- features/*
schedule:
- cron: 0 7 * * 3
jobs:
build_linux:
linux_cross-platform_cross-browser:
runs-on: [ubuntu-latest]
steps:
@ -36,6 +45,14 @@ jobs:
- name: Testing unit tests
run: yarn lerna run test --stream
- name: Test Playwright
run: |
cd packages/web-components/fast-components
npm install playwright
yarn test-chromium:pw
yarn test-firefox:pw
yarn test-webkit:pw
- name: Collect and upload code coverage to Code Climate
uses: paambaati/codeclimate-action@v2.6.0
@ -55,7 +72,7 @@ jobs:
${{github.workspace}}/sites/fast-component-explorer/coverage/lcov.info:lcov
debug: false
build-windows:
windows_cross-platform_cross-browser:
runs-on: [windows-latest]
steps:
@ -94,6 +111,14 @@ jobs:
- name: Testing unit tests
run: yarn lerna run test --stream
- name: Test Playwright
run: |
cd packages/web-components/fast-components
npm install playwright
yarn test-chromium:pw
yarn test-firefox:pw
yarn test-webkit:pw
- name: Collect and upload code coverage to Code Climate
uses: paambaati/codeclimate-action@v2.6.0
@ -114,7 +139,7 @@ jobs:
${{github.workspace}}/sites/fast-component-explorer/coverage/lcov.info:lcov
debug: false
build-macos:
macos_cross-platform_cross-browser:
runs-on: [macos-latest]
steps:
@ -145,6 +170,14 @@ jobs:
- name: Testing unit tests
run: yarn lerna run test --stream
- name: Test Playwright
run: |
cd packages/web-components/fast-components
npm install playwright
yarn test-chromium:pw
yarn test-firefox:pw
yarn test-webkit:pw
- name: Collect and upload code coverage to Code Climate
uses: paambaati/codeclimate-action@v2.6.0

22
build/copy.js Normal file
Просмотреть файл

@ -0,0 +1,22 @@
/* eslint-env node, es2015 */
/* eslint-disable @typescript-eslint/explicit-function-return-type, @typescript-eslint/no-var-requires, @typescript-eslint/typedef */
const copyfiles = require("copyfiles");
function copy(files, destination, config = { flat: true, verbose: true, up: true }) {
return new Promise((resolve, reject) => {
return copyfiles([...files, destination], config, err =>
err ? reject(err.details) : resolve()
);
}).catch(err => {
console.error(err);
process.exit(1);
});
}
/**
* Copy files from one place to another.
* @param {string[]} files - Paths and globs to copy
* @param {string} destination - Directory to copy the files to
* @param {{ flat?: boolean; verbose?: boolean; up?: boolean; }} config - Configuration options passed to `copyfiles`.
*/
module.exports = copy;

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

@ -24,7 +24,9 @@
"**/@types/chai",
"**/@types/jest",
"**/@types/karma",
"**/@types/mocha"
"**/@types/mocha",
"**/@types/node",
"**/chai"
]
},
"repository": {
@ -121,6 +123,7 @@
"@types/node": "^9.4.7",
"beachball": "^1.36.2",
"chalk": "^2.4.2",
"copyfiles": "^2.4.1",
"docusaurus-init": "^1.11.0",
"dotenv": "^6.0.0",
"eyes.selenium": "3.6.2",
@ -138,6 +141,7 @@
"yargs": "^11.0.0"
},
"dependencies": {
"playwright": "^1.8.0",
"saucelabs": "^1.5.0",
"selenium-webdriver": "^3.6.0"
}

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

@ -1,4 +1,6 @@
.rollupcache
coverage
tsdoc-metadata.json
temp
temp
__test__/dist
__test__/public

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

@ -0,0 +1,10 @@
{
"colors": true,
"recursive": true,
"timeout": 5000,
"require": [
"esm",
"./__test__/server.js",
"./__test__/harness.js"
]
}

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

@ -0,0 +1,62 @@
# FAST Components Test Harness
## Core Concepts
The general workflow for running functional tests with Playwright:
1. Build `*.pw.spec.ts` files with `tsc`, output to `dist/`. These are the files that Mocha will run directly.
2. Build fixtures and distribution files with `rollup`, ouptut to `public/`, so Playwright can navigate to them in the browser.
3. Run Mocha:
* Before running any tests, start a local server to host the fixtures. This can be skipped for CI environments (see the "Environment Variables" section below).
* Before starting the test suite, open the browser with Playwright.
* Before each test, open a new page in the browser and navigate to a hosted fixture. After each test, close the page.
* After all tests complete, close the browser and stop the local server.
The test harness for FAST Components is composed of these parts:
* `server.js` - Uses [Mocha Global setup fixtures](https://mochajs.org/#global-setup-fixtures) for starting a local web server before running any tests. This is needed so Playwright has pages it can navigate to, where tests can inject their scenarios. The web server is closed after all the tests have run.
* `harness.js` - Uses [Mocha root hook plugins](https://mochajs.org/#root-hook-plugins) for ensuring the Playwright browser instance is launched and that a new page is opened before every test, and closed after each test completes.
Both `server.js` and `harness.js` are included as `require` entries in `.mocharc.json`.
## CLI
### Standard commands
|command|description|
|-|-|
| `yarn clean:test` | Remove `dist/` and `public/` from previous builds. |
| `yarn build:pw-tests` | Build `*.pw.spec.ts` files with `tsc` (outputs to `dist/`). |
| `yarn build:pw-fixtures` | Build fixtures and distribution files with `rollup` (ouptuts to `public/`). |
| `yarn build:pw` | Run `build:pw-tests` and `build:pw-fixtures`. |
| `yarn test-pw` | Run all built tests with Mocha. The default browser is `chromium`. |
| `yarn test-pw:full` | Run `clean:test`, `build:pw`, and `test-pw`. |
| `yarn test-chromium:pw` | Run `test-pw:full` in Chromium. |
| `yarn test-firefox:pw` | Run `test-pw:full` in Firefox. |
| `yarn test-webkit:pw` | Run `test-pw:full` in Webkit. |
### Environment Variables
| variable | description |
|-|-|
| `PLAYWRIGHT_BROWSER` | Target a specific Playwright browser. Values are `chromium`, `firefox`, and `webkit`. |
| `FIXTURE` | Override the fixture file that Playwright will use for all tests. Values depend on available fixtures in `fixtures/`, currently `index.html` or `iife.html`. Defaults to `index.html`. |
| `FIXTURE_URL` | Override the entire fixture URL that Playwright will use for all tests. Defaults to `http://localhost:7001/index.html`. |
| `USE_LOCAL` | When set to `false`, the local Express server initialization will be skipped. |
| `PORT` | Override the listening port for Express. Defaults to `7001`. |
### Examples
* Run all tests against a specific website:
```bash
USE_LOCAL=false \
FIXTURE_URL=http://explore.fast.design/preview \
yarn test-pw:full
```
* Re-run the tests in a different browser, without rebuilding everything:
```bash
PLAYWRIGHT_BROWSER=firefox yarn test-pw
```

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

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FAST Components Test Harness</title>
<script src="/fast-components.iife.js"></script>
</head>
<body>
<fast-design-system-provider id="root" use-defaults></fast-design-system-provider>
</body>
</html>

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

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FAST Components Test Harness</title>
<script src="/fast-components.js" type="module"></script>
</head>
<body>
<fast-design-system-provider id="root" use-defaults></fast-design-system-provider>
</body>
</html>

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

@ -0,0 +1,33 @@
/* eslint-env node */
import { chromium, firefox, webkit } from "playwright";
const selectedBrowser = process.env.PW_BROWSER || "chromium";
const FixtureURL = process.env.FIXTURE_URL;
const fixture = process.env.FIXTURE || "index.html";
const expressPort = process.env.PW_PORT || 7001;
export const mochaHooks = {
async beforeAll() {
const browser = { chromium, firefox, webkit }[selectedBrowser];
this.browser = await browser.launch();
console.log(`Launched ${selectedBrowser} browser`);
},
async beforeEach() {
this.page = await this.browser.newPage();
const fixtureUrl = FixtureURL || `http://localhost:${expressPort}/${fixture}`;
await this.page.goto(fixtureUrl);
},
async afterEach() {
if (this.page) {
await this.page.close();
}
},
async afterAll() {
if (this.browser) {
await this.browser.close();
}
},
};

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

@ -0,0 +1,54 @@
/* eslint-env node */
/* eslint-disable @typescript-eslint/no-var-requires */
import path from "path";
import commonJS from "rollup-plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import typescript from "rollup-plugin-typescript2";
const copy = require("../../../../build/copy");
const srcDir = path.resolve(__dirname, "..", "src");
const distDir = path.resolve(__dirname, "public");
export default [
{
context: "this",
input: path.resolve(srcDir, "index-rollup.ts"),
onwarn(warning, warn) {
// The IIFE export doesn't have a namespace since component exports
// are expected to be top-level objects
if (warning.code === "MISSING_NAME_OPTION_FOR_IIFE_EXPORT") {
return;
}
warn(warning);
},
output: [
{
file: path.resolve(distDir, "fast-components.js"),
format: "esm",
sourcemap: true,
},
{
file: path.resolve(distDir, "fast-components.iife.js"),
format: "iife",
sourcemap: true,
},
],
plugins: [
resolve(),
commonJS(),
typescript({
tsconfigOverride: {
compilerOptions: {
declaration: false,
},
},
}),
],
},
];
// Copy the fixtures to the public directory
copy([`${path.resolve(__dirname, "fixtures")}/*`], distDir);

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

@ -0,0 +1,36 @@
/* eslint-env node */
import path from "path";
import express from "express";
const useLocalServer = process.env.USE_LOCAL !== "false";
const expressPort = process.env.PORT || 7001;
let server;
const app = useLocalServer && express();
if (app) {
app.use(express.static(path.resolve(__dirname, "public")));
}
export function mochaGlobalSetup() {
if (!useLocalServer) {
console.log("Test harness server skipped.");
return;
}
server = app.listen(expressPort, () => {
console.log(`Test harness server listening on port ${expressPort}`);
});
}
export async function mochaGlobalTeardown() {
if (!useLocalServer) {
return;
}
if (server) {
await server.close();
console.log(`Test harness server on port ${expressPort} closed`);
}
}

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

@ -0,0 +1,15 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"declaration": false,
"declarationDir": null,
"target": "ES2017",
"outDir": "dist",
"importsNotUsedAsValues": "preserve",
"types": [
"mocha",
"node"
],
},
"include": ["../src/**/*.pw.spec.ts"]
}

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

@ -1,20 +1,19 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
"mainEntryPointFilePath": "dist/dts/index.d.ts",
"apiReport": {
"enabled": true,
"reportFolder": "docs",
"reportFileName": "api-report.md"
},
"docModel": {
"enabled": true,
"apiJsonFilePath": "dist/fast-components.api.json"
},
"dtsRollup": {
"enabled": true
}
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
"mainEntryPointFilePath": "dist/dts/index.d.ts",
"apiReport": {
"enabled": true,
"reportFileName": "api-report.md",
"reportFolder": "docs"
},
"compiler": {
"tsconfigFilePath": "./tsconfig.api-extractor.json"
},
"docModel": {
"enabled": true,
"apiJsonFilePath": "dist/fast-components.api.json",
},
"dtsRollup": {
"enabled": true
}
}

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

@ -19,37 +19,46 @@
"types": "dist/fast-components.d.ts",
"unpkg": "dist/fast-components.min.js",
"scripts": {
"clean:dist": "node ../../../build/clean.js dist",
"doc": "api-extractor run --local",
"doc:ci": "api-extractor run",
"build": "yarn generate-default-palettes && yarn build:tsc && yarn generate-open-ui-definition && yarn build:rollup && yarn doc",
"build-storybook": "build-storybook",
"build:pw-fixtures": "rollup -c ./__test__/rollup.config.js",
"build:pw-tests": "tsc -p ./__test__/tsconfig.json",
"build:pw": "yarn build:pw-tests && yarn build:pw-fixtures",
"build:rollup": "rollup -c",
"build:tsc": "tsc -p ./tsconfig.json",
"build": "yarn generate-default-palettes && yarn build:tsc && yarn generate-open-ui-definition && yarn build:rollup && yarn doc",
"clean:dist": "node ../../../build/clean.js dist",
"clean:test": "node ../../../build/clean.js test/dist test/public",
"dev": "tsc -p ./tsconfig.json -w",
"tdd": "yarn dev & yarn test-chrome:watch",
"prepare": "yarn clean:dist && yarn build",
"prettier": "prettier --config ../../../.prettierrc --write \"**/*.{ts,html}\"",
"prettier:diff": "prettier --config ../../../.prettierrc \"**/*.{ts,html}\" --list-different",
"eslint": "eslint . --ext .ts",
"doc:ci": "api-extractor run",
"doc": "api-extractor run --local",
"eslint:fix": "eslint . --ext .ts --fix",
"start": "start-storybook -p 6006",
"build-storybook": "build-storybook",
"eslint": "eslint . --ext .ts",
"generate-default-palettes": "node -r esm build/generate-default-palettes.js",
"generate-open-ui-definition": "tsc -p ./tsconfig.definitions.json && node -r esm build/generate-open-ui-definition",
"test": "yarn test-chrome:verbose && yarn doc:ci && yarn test:diff",
"test:diff": "git update-index --refresh && git diff-index --quiet HEAD -- || yarn test:diff:error",
"test:diff:error": "echo \"You have untracked files, try running yarn prepare.\" && exit 1",
"test-node": "mocha --reporter min --exit dist/esm/__test__/setup-node.js './dist/esm/**/*.spec.js'",
"test-node:watch": "mocha --reporter min --exit dist/esm/__test__/setup-node.js --watch './dist/esm/**/*.spec.js'",
"test-node:verbose": "mocha --reporter spec --exit dist/esm/__test__/setup-node.js './dist/esm/**/*.spec.js'",
"test-chrome": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --single-run --coverage",
"prepare": "yarn clean:dist && yarn build",
"prettier:diff": "prettier --config ../../../.prettierrc \"**/*.{ts,html}\" --list-different",
"prettier": "prettier --config ../../../.prettierrc --write \"**/*.{ts,html}\"",
"start": "start-storybook -p 6006",
"tdd": "yarn dev & yarn test-chrome:watch",
"test-chrome:debugger": "karma start karma.conf.js --browsers=ChromeDebugging",
"test-chrome:verbose:debugger": "karma start karma.conf.js --browsers=ChromeDebugging --reporter=mocha",
"test-chrome:verbose:watch": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --coverage --watch-extensions js --reporter=mocha ",
"test-chrome:verbose": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --single-run --coverage --reporter=mocha",
"test-chrome:watch": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --coverage --watch-extensions js",
"test-chrome:debugger": "karma start karma.conf.js --browsers=ChromeDebugging",
"test-chrome:verbose:watch": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --coverage --watch-extensions js --reporter=mocha ",
"test-chrome:verbose:debugger": "karma start karma.conf.js --browsers=ChromeDebugging --reporter=mocha",
"test-chrome": "karma start karma.conf.js --browsers=ChromeHeadlessOpt --single-run --coverage",
"test-chromium:pw": "cross-env PLAYWRIGHT_BROWSER=chromium && yarn test-pw:full",
"test-firefox:pw": "cross-env PLAYWRIGHT_BROWSER=firefox && yarn test-pw:full",
"test-firefox:verbose": "karma start karma.conf.js --browsers=FirefoxHeadless --single-run --coverage --reporter=mocha",
"test-firefox": "karma start karma.conf.js --browsers=FirefoxHeadless --single-run --coverage",
"test-firefox:verbose": "karma start karma.conf.js --browsers=FirefoxHeadless --single-run --coverage --reporter=mocha"
"test-node:verbose": "mocha --reporter spec --exit dist/esm/__test__/setup-node.js './dist/esm/**/*.spec.js'",
"test-node:watch": "mocha --reporter min --exit dist/esm/__test__/setup-node.js --watch './dist/esm/**/*.spec.js'",
"test-node": "mocha --reporter min --exit dist/esm/__test__/setup-node.js './dist/esm/**/*.spec.js'",
"test-pw:full": "yarn clean:test && yarn build:pw && yarn test-pw",
"test-pw": "mocha --config ./__test__/.mocharc.json ./__test__/**/*.spec.js",
"test-webkit:pw": "cross-env PLAYWRIGHT_BROWSER=webkit && yarn test-pw:full",
"test:diff:error": "echo \"You have untracked files, try running yarn prepare.\" && exit 1",
"test:diff": "git update-index --refresh && git diff-index --quiet HEAD -- || yarn test:diff:error",
"test": "yarn test-chrome:verbose && yarn doc:ci && yarn test:diff"
},
"devDependencies": {
"@microsoft/api-extractor": "7.8.1",
@ -60,12 +69,14 @@
"@types/chai": "^4.2.11",
"@types/chai-spies": "^1.0.1",
"@types/karma": "^5.0.0",
"@types/mocha": "^7.0.2",
"@types/mocha": "^8.2.0",
"@types/node": "^10.12.12",
"@types/webpack-env": "^1.15.2",
"ajv": "^6.12.2",
"chai": "^4.2.0",
"chai-spies": "^1.0.0",
"circular-dependency-plugin": "^5.2.0",
"cross-env": "^7.0.3",
"esm": "^3.2.25",
"ignore-loader": "^0.1.2",
"istanbul": "^0.4.5",
@ -83,7 +94,8 @@
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^4.0.2",
"lodash-es": "4.17.15",
"mocha": "^7.1.2",
"mocha": "^8.2.1",
"playwright": "^1.8.0",
"prettier": "2.0.2",
"rollup": "^2.7.6",
"rollup-plugin-commonjs": "^10.1.0",

11
packages/web-components/fast-components/src/mocha-typings.d.ts поставляемый Normal file
Просмотреть файл

@ -0,0 +1,11 @@
import type { Browser, ElementHandle, Page } from "playwright";
import type { FASTDesignSystemProvider } from "./design-system-provider";
declare module "mocha" {
export interface Context {
documentHandle: ElementHandle<Document>;
providerHandle: ElementHandle<FASTDesignSystemProvider>;
browser: Browser;
page: Page;
}
}

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

@ -0,0 +1,253 @@
import type {
ListboxOption as FASTOption,
Select as FASTSelectType,
} from "@microsoft/fast-foundation";
import { expect } from "chai";
import type { ElementHandle } from "playwright";
import type { FASTDesignSystemProvider } from "../design-system-provider";
type FASTSelect = HTMLElement & FASTSelectType;
describe("FASTSelect", function () {
beforeEach(async function () {
if (!this.page && !this.browser) {
this.skip();
}
this.documentHandle = await this.page.evaluateHandle(() => document);
this.providerHandle = (await this.page.$("#root")) as ElementHandle<
FASTDesignSystemProvider
>;
this.setupHandle = await this.page.evaluateHandle(
([document, provider]) => {
const element = document.createElement("fast-select") as FASTSelect;
for (let i = 1; i <= 3; i++) {
const option = document.createElement("fast-option") as FASTOption;
option.value = `${i}`;
option.textContent = `option ${i}`;
element.appendChild(option);
}
provider.appendChild(element);
},
[this.documentHandle, this.providerHandle] as [
ElementHandle<Document>,
ElementHandle<FASTDesignSystemProvider>
]
);
});
afterEach(async function () {
if (this.setupHandle) {
await this.setupHandle.dispose();
}
});
// FASTSelect should render on the page
it("should render on the page", async function () {
const element = await this.page.waitForSelector("fast-select");
expect(element).to.exist;
});
// FASTSelect should have a value of 'one'
it("should have a value of 'one'", async function () {
const element = await this.page.waitForSelector("fast-select");
expect(await element?.evaluate(node => (node as FASTSelect).value)).to.equal("1");
});
// FASTSelect should have a text content of 'option 1'
it("should have a text content of 'option 1'", async function () {
const element = await this.page.waitForSelector("fast-select .selected-value");
expect(await element?.evaluate((node: HTMLElement) => node.innerText)).to.equal(
"option 1"
);
});
// FASTSelect should open when focused and receives keyboard interaction
describe("should open when focused and receives keyboard interaction", function () {
// FASTSelect should open when focused and receives keyboard interaction via space key
it("via Space key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
expect(await element.evaluate(node => node.open)).to.be.false;
await element.focus();
await this.page.keyboard.press(" ");
expect(await element.evaluate(node => node.open)).to.be.true;
await this.page.keyboard.press(" ");
expect(await element.evaluate(node => node.open)).to.be.false;
});
// FASTSelect should open when focused and receives keyboard interaction via enter key
it("via Enter key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
expect(await element.evaluate(node => node.open)).to.be.false;
await element.focus();
await element.press("Enter");
expect(await element.evaluate(node => node.open)).to.be.true;
await element.press("Enter");
expect(await element.evaluate(node => node.open)).to.be.false;
});
});
// FASTSelect should close
describe("should close", function () {
// FASTSelect should close when focused and keyboard interaction is received
describe("when focused and keyboard interaction is received", function () {
// FASTSelect should close when focused and keyboard interaction is received via space key
it("via Space key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.press(" ");
expect(await element.evaluate(node => node.open)).to.be.true;
await element.press(" ");
expect(await element.evaluate(node => node.open)).to.be.false;
});
// FASTSelect should close when focused and keyboard interaction is received via enter key
it("via Enter key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.press("Enter");
expect(await element.evaluate(node => node.open)).to.be.true;
await element.press("Enter");
expect(await element.evaluate(node => node.open)).to.be.false;
});
// FASTSelect should close when focused and keyboard interaction is received via escape key
it("via Escape key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.click();
expect(await element.evaluate(node => node.open)).to.be.true;
await this.page.keyboard.press("Escape");
expect(await element.evaluate(node => node.open)).to.be.false;
});
// FASTSelect should close when focused and keyboard interaction is received via tab key
it("via Tab key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.click();
expect(await element.evaluate(node => node.open)).to.be.true;
await element.press("Tab");
expect(await element.evaluate(node => node.open)).to.be.false;
});
});
describe("when focus is lost", function () {
it("via click", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.click();
expect(await element.evaluate(node => node.open)).to.be.true;
await this.page.click("body");
expect(
await this.page.evaluate(
element => element.isSameNode(document.activeElement),
element
)
).to.be.false;
expect(await element.evaluate(node => node.open)).to.be.false;
});
});
});
describe("should change the value when focused and receives keyboard interaction", function () {
it("via arrow down key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
expect(await element.evaluate(node => node.value)).to.equal("1");
await element.press("ArrowDown");
expect(await element.evaluate(node => node.value)).to.equal("2");
});
it("via arrow up key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.evaluate(node => (node.value = "2"));
expect(await element.evaluate(node => node.value)).to.equal("2");
await element.press("ArrowUp");
expect(await element.evaluate(node => node.value)).to.equal("1");
});
it("via home key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
await element.evaluate(node => (node.value = "3"));
expect(await element.evaluate(node => node.value)).to.equal("3");
await element.press("Home");
expect(await element.evaluate(node => node.value)).to.equal("1");
});
it("via end key", async function () {
const element = (await this.page.waitForSelector(
"fast-select"
)) as ElementHandle<FASTSelect>;
expect(await element.evaluate(node => node.value)).to.equal("1");
await element.press("End");
expect(await element.evaluate(node => node.value)).to.equal("3");
});
});
});

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

@ -36,8 +36,8 @@ export const TooltipStyles = css`
font-size: var(--type-ramp-base-font-size);
line-height: var(--type-ramp-base-line-height);
white-space: nowrap;
// TODO: a mechanism to manage z-index across components
// https://github.com/microsoft/fast/issues/3813
${/* TODO: a mechanism to manage z-index across components
https://github.com/microsoft/fast/issues/3813 */ ""}
z-index: 10000;
}

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

@ -0,0 +1,7 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"declarationMap": true
},
"exclude": ["src/mocha-typings.d.ts"]
}

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

@ -10,6 +10,7 @@
"allowJs": true,
"importHelpers": true,
"types": [
"node",
"mocha",
"webpack-env"
],

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

@ -30,7 +30,6 @@
"devDependencies": {
"@microsoft/api-documenter": "7.8.13",
"classnames": "^2.2.6",
"copyfiles": "^2.3.0",
"progress-bar-webpack-plugin": "^2.1.0"
}
}

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

@ -1,38 +1,26 @@
// FIXME: #3298 Merge fast-website and website projects to replace temporary build/copy script
/* eslint-env node */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/typedef */
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const copyfiles = require("copyfiles");
const webpack = require("webpack");
const merge = require("webpack-merge");
const ProgressBarPlugin = require("progress-bar-webpack-plugin");
const fastWebsiteConfig = require("@microsoft/fast-website/webpack.prod.js");
const copy = require("../../../build/copy");
function getPackageDir(pkg) {
return path.dirname(require.resolve(`${pkg}/package.json`));
}
function copy(files) {
return new Promise((resolve, reject) => {
return copyfiles(files, copyFilesConfig, err =>
err ? reject(err.details) : resolve()
);
}).catch(err => {
console.error(err);
process.exit(1);
});
}
const outputPath = path.resolve(__dirname, "../static");
const utilitiesDir = getPackageDir("@microsoft/site-utilities");
const fastComponentsDir = getPackageDir("@microsoft/fast-components");
const utilitiesAssets = path.resolve(utilitiesDir, "statics/assets");
const copyFilesConfig = { flat: true, verbose: true, up: true };
const config = merge(fastWebsiteConfig, {
output: { path: outputPath },
performance: { hints: false },
@ -65,15 +53,15 @@ compiler.run(async (err, stats) => {
info.warnings.forEach(w => console.warn(w));
}
await copy([
...[
await copy(
[
`${utilitiesAssets}/favicon.ico`,
`${utilitiesAssets}/fast-inline-logo.svg`,
`${utilitiesAssets}/fast-inline-logo-light.svg`,
`${fastComponentsDir}/dist/fast-components.iife.min.js`,
].map(x => require.resolve(x)),
outputPath,
]);
outputPath
);
await copy([`${utilitiesAssets}/badges/*.svg`, `${outputPath}/badges`]);
await copy([`${utilitiesAssets}/badges/*.svg`], `${outputPath}/badges`);
});

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

@ -4240,6 +4240,11 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce"
integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==
"@types/mocha@^8.2.0":
version "8.2.0"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44"
integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==
"@types/node-fetch@^2.5.4":
version "2.5.8"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb"
@ -4470,6 +4475,13 @@
dependencies:
"@types/yargs-parser" "*"
"@types/yauzl@^2.9.1":
version "2.9.1"
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af"
integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@^2.23.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9"
@ -4513,6 +4525,11 @@
semver "^7.3.2"
tsutils "^3.17.1"
"@ungap/promise-all-settled@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
"@webassemblyjs/ast@1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
@ -4961,16 +4978,16 @@ ansi-colors@3.2.3:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
ansi-colors@4.1.1, ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
ansi-colors@^3.0.0:
version "3.2.4"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
ansi-escapes@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
@ -6346,6 +6363,11 @@ buffer-alloc@^1.1.0:
buffer-alloc-unsafe "^1.1.0"
buffer-fill "^1.0.0"
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-equal@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
@ -6862,6 +6884,21 @@ chokidar@3.3.0:
optionalDependencies:
fsevents "~2.1.1"
chokidar@3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b"
integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
glob-parent "~5.1.0"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.5.0"
optionalDependencies:
fsevents "~2.1.2"
chokidar@^2.0.4, chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@ -7337,7 +7374,7 @@ commander@^5.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
commander@^6.2.0:
commander@^6.1.0, commander@^6.2.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
@ -7713,7 +7750,7 @@ copy-webpack-plugin@^6.0.3, copy-webpack-plugin@^6.3.0:
serialize-javascript "^5.0.1"
webpack-sources "^1.4.3"
copyfiles@^2.3.0:
copyfiles@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5"
integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==
@ -7850,6 +7887,13 @@ create-react-context@0.3.0:
gud "^1.0.0"
warning "^4.0.3"
cross-env@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
dependencies:
cross-spawn "^7.0.1"
cross-fetch@^3.0.4:
version "3.0.6"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c"
@ -7877,7 +7921,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^7.0.0:
cross-spawn@^7.0.0, cross-spawn@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@ -8369,6 +8413,13 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
dependencies:
ms "2.1.2"
debug@4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
dependencies:
ms "2.1.2"
debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@ -8401,6 +8452,11 @@ decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, deca
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
decamelize@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
decimal.js@^10.2.0:
version "10.2.1"
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3"
@ -8673,7 +8729,7 @@ diff@3.5.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
diff@^4.0.1:
diff@4.0.2, diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
@ -9426,6 +9482,11 @@ escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
escape-string-regexp@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escodegen@1.8.x:
version "1.8.1"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
@ -9917,6 +9978,17 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.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==
dependencies:
debug "^4.1.1"
get-stream "^5.1.0"
yauzl "^2.10.0"
optionalDependencies:
"@types/yauzl" "^2.9.1"
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@ -10085,6 +10157,13 @@ fbjs@^3.0.0:
setimmediate "^1.0.5"
ua-parser-js "^0.7.18"
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
dependencies:
pend "~1.2.0"
feed@^4.2.1:
version "4.2.2"
resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e"
@ -10253,6 +10332,14 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
find-up@5.0.0, find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@ -10268,14 +10355,6 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
find-versions@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965"
@ -10317,6 +10396,11 @@ flat@^4.1.0:
dependencies:
is-buffer "~2.0.3"
flat@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
flatted@^2.0.0, flatted@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
@ -10547,7 +10631,7 @@ fsevents@^2.1.2, fsevents@~2.3.1:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f"
integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==
fsevents@~2.1.1:
fsevents@~2.1.1, fsevents@~2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
@ -10823,18 +10907,7 @@ glob@7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^5.0.15:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
dependencies:
inflight "^1.0.4"
inherits "2"
minimatch "2 || 3"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -10846,6 +10919,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^5.0.15:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
dependencies:
inflight "^1.0.4"
inherits "2"
minimatch "2 || 3"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d"
@ -12433,7 +12517,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
is-plain-obj@^2.0.0:
is-plain-obj@^2.0.0, is-plain-obj@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
@ -13244,7 +13328,7 @@ joi@^17.2.1, joi@^17.3.0:
"@sideway/formula" "^3.0.0"
"@sideway/pinpoint" "^2.0.0"
jpeg-js@0.4.2, jpeg-js@^0.1.1, jpeg-js@^0.4.3:
jpeg-js@0.4.2, jpeg-js@^0.1.1, jpeg-js@^0.4.2, jpeg-js@^0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b"
integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==
@ -13272,6 +13356,14 @@ js-yaml@3.13.1, js-yaml@~3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@3.14.0:
version "3.14.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.13.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
@ -14255,6 +14347,13 @@ log-symbols@3.0.0:
dependencies:
chalk "^2.4.2"
log-symbols@4.0.0, log-symbols@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
dependencies:
chalk "^4.0.0"
log-symbols@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
@ -14262,13 +14361,6 @@ log-symbols@^2.1.0:
dependencies:
chalk "^2.0.1"
log-symbols@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
dependencies:
chalk "^4.0.0"
log-update@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
@ -14806,7 +14898,7 @@ mime@1.6.0, mime@^1.3.4:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.4, mime@^2.4.5:
mime@^2.4.4, mime@^2.4.5, mime@^2.4.6:
version "2.5.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1"
integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==
@ -15089,6 +15181,37 @@ mocha@^7.1.2:
yargs-parser "13.1.2"
yargs-unparser "1.6.0"
mocha@^8.2.1:
version "8.2.1"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39"
integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==
dependencies:
"@ungap/promise-all-settled" "1.1.2"
ansi-colors "4.1.1"
browser-stdout "1.3.1"
chokidar "3.4.3"
debug "4.2.0"
diff "4.0.2"
escape-string-regexp "4.0.0"
find-up "5.0.0"
glob "7.1.6"
growl "1.10.5"
he "1.2.0"
js-yaml "3.14.0"
log-symbols "4.0.0"
minimatch "3.0.4"
ms "2.1.2"
nanoid "3.1.12"
serialize-javascript "5.0.1"
strip-json-comments "3.1.1"
supports-color "7.2.0"
which "2.0.2"
wide-align "1.1.3"
workerpool "6.0.2"
yargs "13.3.2"
yargs-parser "13.1.2"
yargs-unparser "2.0.0"
modernizr-webpack-plugin@^1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/modernizr-webpack-plugin/-/modernizr-webpack-plugin-1.0.7.tgz#a82e800b2ea2ba8172ae190b5c4bd4d93fd82537"
@ -15225,6 +15348,11 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
nanoid@3.1.12:
version "3.1.12"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654"
integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@ -16518,6 +16646,11 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@ -16614,6 +16747,24 @@ pkg-up@3.1.0, pkg-up@^3.1.0:
dependencies:
find-up "^3.0.0"
playwright@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.8.0.tgz#8eca2250967ee892b9fdfec44e2358455ab0f8e3"
integrity sha512-urMJDLX92KawbkWKrt3chVVBPQsuuNwlS5St7I5YQENXAEItoyUqX7FjiYaoPgXifKqe1+BKC+7pBAq1QUkgSw==
dependencies:
commander "^6.1.0"
debug "^4.1.1"
extract-zip "^2.0.1"
https-proxy-agent "^5.0.0"
jpeg-js "^0.4.2"
mime "^2.4.6"
pngjs "^5.0.0"
progress "^2.0.3"
proper-lockfile "^4.1.1"
proxy-from-env "^1.1.0"
rimraf "^3.0.2"
ws "^7.3.1"
please-upgrade-node@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
@ -16636,6 +16787,11 @@ pngjs@^3.0.0, pngjs@^3.2.0, pngjs@^3.3.3:
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
pngjs@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
pnp-webpack-plugin@1.6.4, pnp-webpack-plugin@^1.6.4:
version "1.6.4"
resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
@ -17819,6 +17975,15 @@ prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.5.8,
object-assign "^4.1.1"
react-is "^16.8.1"
proper-lockfile@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
dependencies:
graceful-fs "^4.2.4"
retry "^0.12.0"
signal-exit "^3.0.2"
property-information@^5.0.0, property-information@^5.3.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69"
@ -17851,6 +18016,11 @@ proxy-addr@~2.0.5:
forwarded "~0.1.2"
ipaddr.js "1.9.1"
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==
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@ -19621,6 +19791,13 @@ sentence-case@^1.1.1, sentence-case@^1.1.2:
dependencies:
lower-case "^1.1.1"
serialize-javascript@5.0.1, serialize-javascript@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
dependencies:
randombytes "^2.1.0"
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
@ -19628,13 +19805,6 @@ serialize-javascript@^4.0.0:
dependencies:
randombytes "^2.1.0"
serialize-javascript@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
dependencies:
randombytes "^2.1.0"
serve-favicon@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0"
@ -20597,7 +20767,7 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
strip-json-comments@^3.0.1:
strip-json-comments@3.1.1, strip-json-comments@^3.0.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@ -20649,6 +20819,13 @@ supports-color@6.0.0:
dependencies:
has-flag "^3.0.0"
supports-color@7.2.0, supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@ -20675,13 +20852,6 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
supports-hyperlinks@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47"
@ -22428,7 +22598,7 @@ which@1.3.1, which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3
dependencies:
isexe "^2.0.0"
which@^2.0.1, which@^2.0.2:
which@2.0.2, which@^2.0.1, which@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
@ -22625,6 +22795,11 @@ worker-rpc@^0.1.0:
dependencies:
microevent.ts "~0.1.1"
workerpool@6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438"
integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==
workspace-tools@^0.10.2:
version "0.10.3"
resolved "https://registry.yarnpkg.com/workspace-tools/-/workspace-tools-0.10.3.tgz#1517ecd97bc4f34c586be6a160da6d8a3a6c3c87"
@ -22747,7 +22922,7 @@ ws@^6.0.0, ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
ws@^7.0.0, ws@^7.2.3, ws@~7.4.2:
ws@^7.0.0, ws@^7.2.3, ws@^7.3.1, ws@~7.4.2:
version "7.4.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd"
integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==
@ -22897,6 +23072,16 @@ yargs-unparser@1.6.0:
lodash "^4.17.15"
yargs "^13.3.0"
yargs-unparser@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
dependencies:
camelcase "^6.0.0"
decamelize "^4.0.0"
flat "^5.0.2"
is-plain-obj "^2.1.0"
yargs@13.3.2, yargs@^13.3.0, yargs@^13.3.2:
version "13.3.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
@ -22988,6 +23173,14 @@ yargs@~3.10.0:
decamelize "^1.0.0"
window-size "0.1.0"
yauzl@^2.10.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
yeast@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"