diff --git a/package.json b/package.json index c12f48cb84c..e40877369ac 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "sideEffects": false, "scripts": { "start": "cross-env BABEL_MODULES=false webpack-dev-server --port 8030 --inline --hot --config=src-docs/webpack.config.js", - "test-docker": "docker pull $npm_package_docker_image && docker run --rm -i -e GIT_COMMITTER_NAME=test -e GIT_COMMITTER_EMAIL=test --user=$(id -u):$(id -g) -e HOME=/tmp -v $(pwd):/app -w /app $npm_package_docker_image bash -c 'npm config set spin false && /opt/yarn*/bin/yarn && npm run test && npm run build'", + "test-docker": "node ./scripts/test-docker.js", "sync-docs": "node ./scripts/docs-sync.js", "build-docs": "cross-env BABEL_MODULES=false cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=4096 webpack --config=src-docs/webpack.config.js", "build": "yarn extract-i18n-strings && node ./scripts/compile-clean.js && node ./scripts/compile-eui.js && node ./scripts/compile-scss.js $npm_package_name", @@ -24,13 +24,15 @@ "lint-sass-fix": "sass-lint-auto-fix -c ./.sass-lint-fix.yml", "test": "yarn lint && yarn test-unit", "test-unit": "cross-env NODE_ENV=test jest --config ./scripts/jest/config.json", + "test-a11y": "node ./scripts/a11y-testing", "test-staged": "yarn lint && node scripts/test-staged.js", - "start-test-server": "webpack-dev-server --config src-docs/webpack.config.js --port 9999", + "start-test-server": "BABEL_MODULES=false NODE_ENV=puppeteer webpack-dev-server --config src-docs/webpack.config.js --port 9999", "test-visual": "wdio test/wdio.conf.js", "yo-component": "yo ./generator-eui/app/component.js", "test-visual-tests": "node ./scripts/run-visual-tests.js", "update-token-changelog": "node ./scripts/update-token-changelog.js", "start-test-server-and-visual-test": "start-server-and-test start-test-server http-get://localhost:9999 test-visual", + "start-test-server-and-a11y-test": "start-server-and-test start-test-server http-get://localhost:9999 test-a11y", "yo-doc": "yo ./generator-eui/app/documentation.js", "release": "node ./scripts/release.js", "postinstall": "node ./scripts/postinstall.js", @@ -98,6 +100,8 @@ "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", "autoprefixer": "^7.1.5", + "axe-core": "^3.3.2", + "axe-puppeteer": "^1.0.0", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", "babel-jest": "^24.1.0", @@ -113,7 +117,7 @@ "chai-webdriverio": "^0.4.3", "chalk": "^2.4.1", "chokidar": "^1.7.0", - "chromedriver": "2.37.0", + "chromedriver": "^77.0.0", "circular-dependency-plugin": "^5.0.2", "core-js": "^2.5.1", "cross-env": "^5.2.0", @@ -161,6 +165,7 @@ "prettier": "^1.17.0", "prompt": "^1.0.0", "prop-types": "^15.6.0", + "puppeteer": "^2.0.0", "raw-loader": "^0.5.1", "react": "^16.12.0", "react-dom": "^16.12.0", diff --git a/scripts/a11y-testing.js b/scripts/a11y-testing.js new file mode 100644 index 00000000000..2ad8e8f7a1f --- /dev/null +++ b/scripts/a11y-testing.js @@ -0,0 +1,94 @@ +const chalk = require('chalk'); +const puppeteer = require('puppeteer'); +const { AxePuppeteer } = require('axe-puppeteer'); + +const docsPages = async (root, page) => { + let links = [ + root, + ...(await page.$$eval('nav a', anchors => anchors.map(a => a.href))), + ]; + + links = links.splice(0, 9); + + return links; +}; + +const printResult = result => + console.log(`[${result.id}]: ${result.description} + Help: ${chalk.blue(result.helpUrl)} + Elements: + - ${result.nodes.map(node => node.target).join('\n - ')}`); + +(async () => { + let totalViolationsCount = 0; + let root = 'http://localhost:9999/'; + let browser; + let page; + + try { + browser = await puppeteer.launch({ args: ['--no-sandbox'] }); + page = await browser.newPage(); + + await page.setBypassCSP(true); + } catch (e) { + console.log(chalk.red('Failed to setup puppeteer')); + console.log(e); + process.exit(1); + } + + try { + await page.goto(root); + } catch (e) { + root = 'http://localhost:8030/'; + try { + await page.goto(root); + } catch (e) { + console.log( + chalk.red( + 'No local server found. Expecting localhost:9999 or localhost:8030 to resolve.' + ) + ); + process.exit(1); + } + } + + const links = await docsPages(root, page); + + for (const link of links) { + await page.goto(link); + + const { violations } = await new AxePuppeteer(page) + .disableRules('color-contrast') + .exclude(['figure[role="figure"']) // excluding figure[role="figure"] the duplicatory role is there for ie11 support + .analyze(); + + if (violations.length > 0) { + totalViolationsCount += violations.length; + + const pageName = link.length > 24 ? link.substr(2) : 'the home page'; + console.log(chalk.red(`Errors on ${pageName}`)); + } + + violations.forEach(result => { + printResult(result); + }); + } + + await page.close(); + await browser.close(); + + if (totalViolationsCount > 0) { + const errorsCount = chalk.red( + `${totalViolationsCount} accessibility errors` + ); + + console.log(`${errorsCount} + +Install axe for Chrome or Firefox to debug: +Chrome: https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd +Firefox: https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/`); + process.exit(1); + } else { + console.log(chalk.green('axe found no accessibility errors!')); + } +})(); diff --git a/scripts/test-docker.js b/scripts/test-docker.js new file mode 100644 index 00000000000..a75abf91576 --- /dev/null +++ b/scripts/test-docker.js @@ -0,0 +1,18 @@ +const { execSync } = require('child_process'); + +execSync('docker pull zenato/puppeteer', { + stdio: 'inherit', +}); +/* eslint-disable-next-line no-multi-str */ +execSync("docker run \ + -i --rm --cap-add=SYS_ADMIN --volume=$(pwd):/app --workdir=/app \ + -e GIT_COMMITTER_NAME=test -e GIT_COMMITTER_EMAIL=test -e HOME=/tmp \ + --user=$(id -u):$(id -g) \ + zenato/puppeteer \ + bash -c 'npm config set spin false \ + && /opt/yarn*/bin/yarn \ + && npm run test \ + && npm run start-test-server-and-a11y-test \ + && npm run build'", { + stdio: 'inherit', +}); diff --git a/src-docs/src/views/guidelines/button.js b/src-docs/src/views/guidelines/button.js index b4fc2714e84..c1b1396af28 100644 --- a/src-docs/src/views/guidelines/button.js +++ b/src-docs/src/views/guidelines/button.js @@ -49,7 +49,7 @@ export default () => ( -

Filled buttons are for the primary action

+

Filled buttons are for the primary action

This button has the heaviest visual weight to draw users' attention. @@ -67,7 +67,7 @@ export default () => ( -

Standard buttons are for secondary actions

+

Standard buttons are for secondary actions

Such actions include Add and Apply. This button type works well for multiple actions of equal weight. @@ -85,7 +85,7 @@ export default () => ( -

Empty buttons are for complementary, UI-specific actions

+

Empty buttons are for complementary, UI-specific actions

Close, cancel, filter, refresh, and other actions that reconfigure the UI are appropriate for empty buttons. @@ -111,7 +111,7 @@ export default () => ( -

Icon buttons are for saving space

+

Icon buttons are for saving space

The icon must be immediately understood, for example, a trash can for delete. Use these buttons sparingly, and never for the primary diff --git a/src-docs/src/views/guidelines/modals.js b/src-docs/src/views/guidelines/modals.js index d15fe10ab64..cfefd39f44f 100644 --- a/src-docs/src/views/guidelines/modals.js +++ b/src-docs/src/views/guidelines/modals.js @@ -70,17 +70,17 @@ export default () => ( -

The header sets the context

+

The header sets the context

Short and sentence-case, the header should indicate what the modal is about.

-

The body is for a single task

+

The body is for a single task

This task should not require a lot of explanation or user interaction.

-

Buttons are right-aligned

+

Buttons are right-aligned

The primary action is a filled button, and the secondary action is a link button. Labels should use strong action verbs. diff --git a/src-docs/src/views/guidelines/sass.js b/src-docs/src/views/guidelines/sass.js index 304f7af2f38..b4c9f4c560e 100644 --- a/src-docs/src/views/guidelines/sass.js +++ b/src-docs/src/views/guidelines/sass.js @@ -388,7 +388,7 @@ export const SassGuidelines = ({ selectedTheme }) => {

-

Sizing

+

Sizing

@@ -400,7 +400,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Z-index

+

Z-index

@@ -412,7 +412,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Color

+

Color

@@ -432,7 +432,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Theming patterns

+

Theming patterns

@@ -554,7 +554,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Color contrast patterns

+

Color contrast patterns

@@ -601,7 +601,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

More on color contrast

+

More on color contrast

@@ -654,7 +654,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Text sizes

+

Text sizes

@@ -665,7 +665,7 @@ export const SassGuidelines = ({ selectedTheme }) => {
-

Text colors

+

Text colors

@@ -677,7 +677,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Font families

+

Font families

@@ -752,7 +752,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Use mixins for shadows

+

Use mixins for shadows

@@ -773,7 +773,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Adding color to shadows

+

Adding color to shadows

@@ -793,7 +793,7 @@ export const SassGuidelines = ({ selectedTheme }) => {
-

Shadows to create graceful overflows

+

Shadows to create graceful overflows

@@ -806,9 +806,9 @@ export const SassGuidelines = ({ selectedTheme }) => { -
+

Vertical scrolling with euiYScrollWithShadows -

+
@@ -859,9 +859,9 @@ export const SassGuidelines = ({ selectedTheme }) => { -
+

Horizontal scrolling with euiXScrollWithShadows -

+
@@ -927,7 +927,7 @@ export const SassGuidelines = ({ selectedTheme }) => {
-

Breakpoint sizing

+

Breakpoint sizing

@@ -939,7 +939,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Mixin usage

+

Mixin usage

@@ -1004,7 +1004,7 @@ export const SassGuidelines = ({ selectedTheme }) => { -

Speed

+

Speed

@@ -1015,7 +1015,7 @@ export const SassGuidelines = ({ selectedTheme }) => {
-

Timing

+

Timing

diff --git a/src-docs/src/views/guidelines/toasts.js b/src-docs/src/views/guidelines/toasts.js index becacc3b751..9beaed04653 100644 --- a/src-docs/src/views/guidelines/toasts.js +++ b/src-docs/src/views/guidelines/toasts.js @@ -109,7 +109,7 @@ and space to read it properly. Alternatively just link to a full page. -

Success toasts indicate that everything worked out

+

Success toasts indicate that everything worked out

They are the most-commonly used toasts.

@@ -128,9 +128,9 @@ and space to read it properly. Alternatively just link to a full page. -

+

Warning toasts direct user attention to a potential problem -

+

These toasts work well in monitoring apps when something significant requires action. @@ -152,7 +152,7 @@ and space to read it properly. Alternatively just link to a full page. -

Error toasts report a problem

+

Error toasts report a problem

An error toast might let users know an action didn't complete or that a form has errors. @@ -176,7 +176,7 @@ and space to read it properly. Alternatively just link to a full page. -

Info toasts relay neutral information

+

Info toasts relay neutral information

The default toast, an info toast might notify users about an ongoing action. diff --git a/src-docs/src/views/guidelines/writing.js b/src-docs/src/views/guidelines/writing.js index c04ab55df7c..b6035036ce3 100644 --- a/src-docs/src/views/guidelines/writing.js +++ b/src-docs/src/views/guidelines/writing.js @@ -319,13 +319,16 @@ export default () => ( - + - + diff --git a/src-docs/src/views/home/home_view.js b/src-docs/src/views/home/home_view.js index 76216960e4c..93eb9ac166e 100644 --- a/src-docs/src/views/home/home_view.js +++ b/src-docs/src/views/home/home_view.js @@ -20,6 +20,7 @@ import { EuiText, EuiTitle, EuiToolTip, + EuiScreenReaderOnly, } from '../../../../src/components'; const pkg = require('../../../../package.json'); @@ -44,7 +45,10 @@ export const HomeView = () => ( - + + Elastic repo on GitHub + + diff --git a/src-docs/webpack.config.js b/src-docs/webpack.config.js index 644e79d63d2..4c907dc8ef7 100644 --- a/src-docs/webpack.config.js +++ b/src-docs/webpack.config.js @@ -7,9 +7,10 @@ const { NODE_ENV, CI } = process.env; const isDevelopment = NODE_ENV !== 'production' && CI == null; const isProduction = NODE_ENV === 'production'; +const bypassCache = NODE_ENV === 'puppeteer'; function useCache(loaders) { - if (isDevelopment) { + if (isDevelopment && !bypassCache) { return ['cache-loader'].concat(loaders); } diff --git a/wiki/automated-accessibility-testing.md b/wiki/automated-accessibility-testing.md new file mode 100644 index 00000000000..0b3d4915d66 --- /dev/null +++ b/wiki/automated-accessibility-testing.md @@ -0,0 +1,45 @@ +# Accessibility testing + +The goal is for the entirety of the EUI docs site to be run through [axe](https://www.deque.com/axe/). +As of [#2569](https://github.com/elastic/eui/pull/2569), all of the Guidelines pages are tested and the plumbing is in place to add the rest. + +## What is axe? + +axe is an "[accessibility engine for automated Web UI testing](https://github.com/dequelabs/axe-core)". +Automated tests cover ~30% of accessibility requirements but, ~60% of accessibility bugs are caught by automated tests. +So, though it can't replace manual testing, it's a great baseline for all of our components to meet. + +## How to run the tests? + +* `start-test-server-and-a11y-test` runs the test suite against the entire docs site and manages it's own local server for it. +* `test-a11y` can be used if you want to run it against your dev server (assumed to be `http://localhost:8030). + +### How to run it against 1 component? + +Though it's not setup to be run this way, there are two ways to do it. + +The recommended route is to install the axe addon (for [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/)). +Navigate to any page and run the analyzer from your browser's dev tools. +This will return the same* results to you while also giving you some convenience utilities like highlighting the exact element that's failing. + +Not as nice of a experience though potentially more direct, in `scripts/a11y-testing.js` you can modify the list of component pages return from `docsPages()` to run only one file. But remember not to check in these changes! + +\* It might not actually be the same in a couple cases (e.g., we've disabled some rules or a recent update that was pushed to the addon but we haven't updated yet) but it will generally be more strict that we are so you should never see something in CI that you can't see in the addon. + +## Deconstructing an error message + +```js +`[${id}]: ${description} + Help: ${helpURL} + Elements: + - ${nodePath} +`); +``` + +All error messages follow this same structure: +* The `id` will always map to the same `description` and `helpURL`. +* The `description` will give a one sentence explanation of the problem. +* The `helpURL` will take you to axe's documentation about the problem. The documentation is generally pretty strong and will walk you through different possible problems and remediation steps. +* The `nodePath` is the only thing that doesn't come directly from axe and is an attempt to lead you to the element that's triggering an error. (See `printResult()` in `scripts/a11y-testing.js` to see exactly how it's generated.) + +The **set** of failures for each page will be denoted by a line with the URL of the page being tested. diff --git a/wiki/component-development.md b/wiki/component-development.md index a7b4d419007..bcd0e99913a 100644 --- a/wiki/component-development.md +++ b/wiki/component-development.md @@ -48,6 +48,8 @@ fully-tested the code is, located at `reports/jest-coverage`. Refer to the [testing guide](testing.md) for guidelines on writing and designing your tests. +Refer to the [automated accessibility testing guide](automated-accessibility-testing.md) for info more info on those. + ### Testing the component with Kibana Note that `yarn link` currently does not work with Kibana. You'll need to manually pack and insert it into Kibana to test locally. diff --git a/yarn.lock b/yarn.lock index f78886da08f..33aa9452898 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1205,6 +1205,20 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + "@types/highlight.js@^9.12.3": version "9.12.3" resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.3.tgz#b672cfaac25cbbc634a0fd92c515f66faa18dbca" @@ -1232,6 +1246,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27" integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw== +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "@types/node@*": version "9.3.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" @@ -2127,6 +2146,18 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axe-core@^3.1.2, axe-core@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.4.0.tgz#a57ee620c182d5389aff229586aaae06bc541abe" + integrity sha512-5C0OdgxPv/DrQguO6Taj5F1dY5OlkWg4SVmZIVABFYKWlnAc5WTLPzG+xJSgIwf2fmY+NiNGiZXhXx2qT0u/9Q== + +axe-puppeteer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/axe-puppeteer/-/axe-puppeteer-1.0.0.tgz#cebbeec2c65a2e0cb7d5fd1e7aef26c5f71895a4" + integrity sha512-hTF3u4mtatgTN7fsLVyVgbRdNc15ngjDcTEuqhn9A7ugqLhLCryJWp9fzqZkNlrW8awPcxugyTwLPR7mRdPZmA== + dependencies: + axe-core "^3.1.2" + axobject-query@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" @@ -3126,16 +3157,16 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@2.37.0: - version "2.37.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.37.0.tgz#e7867c8236f6bb89024737bbffc9a4b33ded658b" - integrity sha512-Dz3ktXp+9T0ygMIEZX3SNL3grXywi2kC1swiD9cjISlLcoenzhOpsj/R/Gr2hJvrC49aGE2BhSpuUevdGq6J4w== +chromedriver@^77.0.0: + version "77.0.0" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-77.0.0.tgz#bd916cc87a0ccb7a6e4fb4b43cb2368bc54db6a0" + integrity sha512-mZa1IVx4HD8rDaItWbnS470mmypgiWsDiu98r0NkiT4uLm3qrANl4vOU6no6vtWtLQiW5kt1POcIbjeNpsLbXA== dependencies: - del "^3.0.0" - extract-zip "^1.6.5" - kew "^0.7.0" + del "^4.1.1" + extract-zip "^1.6.7" mkdirp "^0.5.1" - request "^2.83.0" + request "^2.88.0" + tcp-port-used "^1.0.1" ci-info@^2.0.0: version "2.0.0" @@ -3576,21 +3607,21 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0, concat-stream@^1.4.7: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= +concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.4.6, concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== +concat-stream@^1.4.7: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= dependencies: - buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" @@ -4327,6 +4358,13 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -4397,7 +4435,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -4494,6 +4532,19 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5729,14 +5780,14 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.5: - version "1.6.6" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" - integrity sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw= +extract-zip@^1.6.6, extract-zip@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= dependencies: - concat-stream "1.6.0" + concat-stream "1.6.2" debug "2.6.9" - mkdirp "0.5.0" + mkdirp "0.5.1" yauzl "2.4.1" extsprintf@1.3.0: @@ -7120,6 +7171,14 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + humanize-duration@~3.12.0: version "3.12.1" resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.12.1.tgz#e9a531519d001ee600b6400fc353fed4fa3b235f" @@ -7771,6 +7830,11 @@ is-path-cwd@^1.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + is-path-in-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" @@ -7778,6 +7842,13 @@ is-path-in-cwd@^1.0.0: dependencies: is-path-inside "^1.0.0" +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -7785,6 +7856,13 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7907,6 +7985,11 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-url@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -7922,6 +8005,15 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is2@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" + integrity sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA== + dependencies: + deep-is "^0.1.3" + ip-regex "^2.1.0" + is-url "^1.2.2" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -8624,11 +8716,6 @@ jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0: dependencies: array-includes "^3.0.3" -kew@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" - integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= - keymirror@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35" @@ -9586,13 +9673,6 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - integrity sha1-HXMHam35hs2TROFecfzAWkyavxI= - dependencies: - minimist "0.0.8" - mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -10578,6 +10658,11 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -11706,7 +11791,7 @@ process@~0.5.1: resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= -progress@2.0.3: +progress@2.0.3, progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -11786,6 +11871,11 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -11867,6 +11957,20 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= +puppeteer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.0.0.tgz#0612992e29ec418e0a62c8bebe61af1a64d7ec01" + integrity sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^3.0.0" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + q@^1.1.2, q@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -14232,6 +14336,14 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +tcp-port-used@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70" + integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q== + dependencies: + debug "4.1.0" + is2 "2.0.1" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -15466,6 +15578,13 @@ ws@^4.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" +ws@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + xdg-basedir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"