diff --git a/package.json b/package.json
index 908e57f61cd424..41f186aa32d353 100644
--- a/package.json
+++ b/package.json
@@ -2,6 +2,7 @@
"version": "4.5.2",
"private": true,
"scripts": {
+ "postinstall": "patch-package",
"proptypes": "ts-node --skip-project ./scripts/generateProptypes.ts",
"deduplicate": "node scripts/deduplicate.js",
"argos": "argos upload test/regressions/screenshots/chrome --token $ARGOS_TOKEN",
@@ -111,6 +112,8 @@
"lerna": "^3.16.4",
"mocha": "^6.2.0",
"nyc": "^14.1.1",
+ "patch-package": "^6.2.0",
+ "postinstall-postinstall": "^2.0.0",
"prettier": "1.17.0",
"pretty-bytes": "^5.3.0",
"prop-types": "^15.7.2",
diff --git a/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js b/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js
index fb4f5225d1f9b4..e6ae2e5d395793 100644
--- a/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js
+++ b/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js
@@ -2,24 +2,22 @@ import React from 'react';
import { expect } from 'chai';
import { createMount, getClasses } from '@material-ui/core/test-utils';
import describeConformance from '@material-ui/core/test-utils/describeConformance';
+import { spy } from 'sinon';
import { createClientRender, fireEvent } from 'test/utils/createClientRender';
-import TextField from '@material-ui/core/TextField';
import Autocomplete from './Autocomplete';
+import TextField from '@material-ui/core/TextField';
describe('', () => {
let mount;
let classes;
const render = createClientRender({ strict: true });
- const defaultProps = {
- renderInput: params => ,
- };
before(() => {
- classes = getClasses();
+ classes = getClasses( null} />);
mount = createMount({ strict: true });
});
- describeConformance(, () => ({
+ describeConformance( null} />, () => ({
classes,
inheritComponent: 'div',
mount,
@@ -30,7 +28,9 @@ describe('', () => {
describe('combobox', () => {
it('should clear the input when blur', () => {
- const { container } = render();
+ const { container } = render(
+ } />,
+ );
const input = container.querySelector('input');
input.focus();
fireEvent.change(input, { target: { value: 'a' } });
@@ -42,11 +42,192 @@ describe('', () => {
describe('multiple', () => {
it('should not crash', () => {
- const { container } = render();
+ const { container } = render(
+ } multiple />,
+ );
const input = container.querySelector('input');
input.focus();
document.activeElement.blur();
input.focus();
});
});
+
+ describe('WAI-ARIA conforming markup', () => {
+ specify('when closed', () => {
+ const { getAllByRole, getByRole, queryByRole } = render(
+ } />,
+ );
+
+ const combobox = getByRole('combobox');
+ expect(combobox).to.have.attribute('aria-expanded', 'false');
+ // reflected aria-haspopup is `listbox`
+ // this assertion can fail if the value is `listbox`
+ expect(combobox).not.to.have.attribute('aria-haspopup');
+
+ const textbox = getByRole('textbox');
+ expect(combobox).to.contain(textbox);
+ // reflected aria-multiline has to be false i.e. not present or false
+ expect(textbox).not.to.have.attribute('aria-multiline');
+ expect(textbox).to.have.attribute('aria-autocomplete', 'list');
+ expect(textbox, 'no option is focused when openened').not.to.have.attribute(
+ 'aria-activedescendant',
+ );
+
+ // popup is not only inaccessible but not in the DOM
+ const popup = queryByRole('listbox', { hidden: true });
+ expect(popup).to.be.null;
+
+ const buttons = getAllByRole('button');
+ expect(buttons).to.have.length(2);
+ // TODO: computeAccessibleName
+ expect(buttons[0]).to.have.attribute('title', 'Clear');
+ // TODO: computeAccessibleName
+ expect(buttons[1]).to.have.attribute('title', 'Open popup');
+ buttons.forEach(button => {
+ expect(button, 'button is not in tab order').to.have.property('tabIndex', -1);
+ });
+ });
+
+ specify('when open', () => {
+ const { getAllByRole, getByRole } = render(
+ }
+ />,
+ );
+
+ const combobox = getByRole('combobox');
+ expect(combobox).to.have.attribute('aria-expanded', 'true');
+
+ const textbox = getByRole('textbox');
+
+ const popup = getByRole('listbox');
+ expect(combobox, 'combobox owns listbox').to.have.attribute(
+ 'aria-owns',
+ popup.getAttribute('id'),
+ );
+ expect(textbox).to.have.attribute('aria-controls', popup.getAttribute('id'));
+ expect(textbox, 'no option is focused when openened').not.to.have.attribute(
+ 'aria-activedescendant',
+ );
+
+ const options = getAllByRole('option');
+ expect(options).to.have.length(2);
+ options.forEach(option => {
+ expect(popup).to.contain(option);
+ });
+
+ const buttons = getAllByRole('button');
+ expect(buttons).to.have.length(2);
+ // TODO: computeAccessibleName
+ expect(buttons[0]).to.have.attribute('title', 'Clear');
+ // TODO: computeAccessibleName
+ expect(buttons[1]).to.have.attribute('title', 'Close popup');
+ buttons.forEach(button => {
+ expect(button, 'button is not in tab order').to.have.property('tabIndex', -1);
+ });
+ });
+ });
+
+ describe('when popup closed', () => {
+ it('opens when the textbox is focused', () => {
+ const handleOpen = spy();
+ render(
+ }
+ />,
+ );
+
+ expect(handleOpen.callCount).to.equal(1);
+ });
+
+ ['ArrowDown', 'ArrowUp'].forEach(key => {
+ it(`opens on ${key} when focus is on the textbox without moving focus`, () => {
+ const handleOpen = spy();
+ const { getByRole } = render(
+ }
+ />,
+ );
+
+ fireEvent.keyDown(document.activeElement, { key });
+
+ // first from focus
+ expect(handleOpen.callCount).to.equal(2);
+ expect(getByRole('textbox')).not.to.have.attribute('aria-activedescendant');
+ });
+ });
+
+ it('does not clear the textbox on Escape', () => {
+ const handleChange = spy();
+ render(
+ }
+ />,
+ );
+
+ fireEvent.keyDown(document.activeElement, { key: 'Escape' });
+
+ expect(handleChange.callCount).to.equal(0);
+ });
+ });
+
+ describe('when popup open', () => {
+ it('closes the popup if Escape is pressed ', () => {
+ const handleClose = spy();
+ render(
+ }
+ />,
+ );
+
+ fireEvent.keyDown(document.activeElement, { key: 'Escape' });
+
+ expect(handleClose.callCount).to.equal(1);
+ });
+
+ it('moves focus to the first option on ArrowDown', () => {
+ const { getAllByRole, getByRole } = render(
+ }
+ />,
+ );
+
+ fireEvent.keyDown(document.activeElement, { key: 'ArrowDown' });
+
+ expect(getByRole('textbox')).to.have.attribute(
+ 'aria-activedescendant',
+ getAllByRole('option')[0].getAttribute('id'),
+ );
+ });
+
+ it('moves focus to the last option on ArrowUp', () => {
+ const { getAllByRole, getByRole } = render(
+ }
+ />,
+ );
+
+ fireEvent.keyDown(document.activeElement, { key: 'ArrowUp' });
+
+ const options = getAllByRole('option');
+ expect(getByRole('textbox')).to.have.attribute(
+ 'aria-activedescendant',
+ options[options.length - 1].getAttribute('id'),
+ );
+ });
+ });
});
diff --git a/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js b/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js
index 31bee7fefb653d..07a5f430fba954 100644
--- a/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js
+++ b/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js
@@ -104,7 +104,10 @@ export default function useAutocomplete(props) {
function setHighlightedIndex(index, mouse = false) {
highlightedIndexRef.current = index;
- inputRef.current.setAttribute('aria-activedescendant', `${id}-option-${index}`);
+ // does the index exist?
+ if (index !== -1) {
+ inputRef.current.setAttribute('aria-activedescendant', `${id}-option-${index}`);
+ }
if (!listboxRef.current) {
return;
@@ -650,8 +653,11 @@ export default function useAutocomplete(props) {
onBlur: handleBlur,
onFocus: handleFocus,
onChange: handleInputChange,
+ // if open then this is handled imperativeley so don't let react override
+ // only have an opinion about this when closed
+ 'aria-activedescendant': popupOpen ? undefined : null,
'aria-autocomplete': autoComplete ? 'both' : 'list',
- 'aria-controls': `${id}-listbox`,
+ 'aria-controls': `${id}-popup`,
// autoComplete: 'off', // Disable browser's suggestion that might overlap with the popup.
autoComplete: 'disabled', // disable autocomplete and autofill
ref: inputRef,
@@ -678,11 +684,10 @@ export default function useAutocomplete(props) {
}),
getPopupProps: () => ({
role: 'presentation',
- id: `${id}-popup`,
}),
getListboxProps: () => ({
role: 'listbox',
- id: `${id}-listbox`,
+ id: `${id}-popup`,
'aria-labelledby': `${id}-label`,
ref: handleListboxRef,
onMouseDown: event => {
diff --git a/patches/jsdom+15.2.0.patch b/patches/jsdom+15.2.0.patch
new file mode 100644
index 00000000000000..46537a8c40290b
--- /dev/null
+++ b/patches/jsdom+15.2.0.patch
@@ -0,0 +1,15 @@
+diff --git a/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js b/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
+index 468f263..2ef0288 100644
+--- a/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
++++ b/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
+@@ -45,6 +45,10 @@ class HTMLOrSVGElementImpl {
+
+ const previous = this._ownerDocument._lastFocusedElement;
+
++ if (previous === this) {
++ return;
++ }
++
+ focusing.fireFocusEventWithTargetAdjustment("blur", previous, this);
+ this._ownerDocument._lastFocusedElement = this;
+ focusing.fireFocusEventWithTargetAdjustment("focus", this, previous);
diff --git a/yarn.lock b/yarn.lock
index 8e058392e23fac..a650043b42bddc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2842,6 +2842,13 @@ amphtml-validator@1.0.23:
commander "2.9.0"
promise "7.1.1"
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
+ dependencies:
+ string-width "^2.0.0"
+
ansi-align@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
@@ -3668,6 +3675,19 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+boxen@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
+ integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^2.0.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^1.2.0"
+ widest-line "^2.0.0"
+
boxen@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb"
@@ -4057,7 +4077,7 @@ camelcase@^2.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-camelcase@^4.1.0:
+camelcase@^4.0.0, camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
@@ -4087,6 +4107,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001004:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001004.tgz#d879b73981b255488316da946c39327d8c00a586"
integrity sha512-3nfOR4O8Wa2RWoYfJkMtwRVOsK96TQ+eq57wd0iKaEWl8dwG4hKZ/g0MVBfCvysFvMLi9fQGR/DvozMdkEPl3g==
+capture-stack-trace@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
+ integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
+
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -4223,6 +4248,11 @@ chrome-trace-event@^1.0.0, chrome-trace-event@^1.0.2:
dependencies:
tslib "^1.9.0"
+ci-info@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+ integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@@ -4263,6 +4293,11 @@ clean-css@^4.1.11:
dependencies:
source-map "~0.6.0"
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+ integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
+
cli-boxes@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
@@ -4540,6 +4575,18 @@ config-chain@^1.1.11:
ini "^1.3.4"
proto-list "~1.2.1"
+configstore@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
+ integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
+ dependencies:
+ dot-prop "^4.1.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
configstore@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7"
@@ -4835,6 +4882,13 @@ create-emotion@^10.0.14:
"@emotion/sheet" "0.9.3"
"@emotion/utils" "0.11.2"
+create-error-class@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
create-hash@^1.1.0, create-hash@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
@@ -6838,6 +6892,14 @@ find-up@^4.0.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
findup-sync@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
@@ -6974,6 +7036,15 @@ fs-extra@^1.0.0:
jsonfile "^2.1.0"
klaw "^1.0.0"
+fs-extra@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
fs-extra@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
@@ -6983,7 +7054,7 @@ fs-extra@^6.0.1:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^7.0.0:
+fs-extra@^7.0.0, fs-extra@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
@@ -7443,6 +7514,23 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
+got@^6.7.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
got@^9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@@ -8135,6 +8223,13 @@ is-callable@^1.1.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
+is-ci@^1.0.10:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+ integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
+ dependencies:
+ ci-info "^1.5.0"
+
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
@@ -8269,6 +8364,11 @@ is-module@^1.0.0:
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+ integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
+
is-npm@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053"
@@ -8339,6 +8439,11 @@ is-promise@^2.1.0:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+ integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
+
is-reference@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.3.tgz#e99059204b66fdbe09305cfca715a29caa5c8a51"
@@ -8358,6 +8463,11 @@ is-resolvable@^1.0.0:
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+is-retry-allowed@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
is-ssh@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3"
@@ -8365,7 +8475,7 @@ is-ssh@^1.3.0:
dependencies:
protocols "^1.1.0"
-is-stream@^1.0.1, is-stream@^1.1.0:
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
@@ -9090,6 +9200,13 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
klaw@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
@@ -9118,6 +9235,13 @@ last-call-webpack-plugin@^3.0.0:
lodash "^4.17.5"
webpack-sources "^1.1.0"
+latest-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+ integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
+ dependencies:
+ package-json "^4.0.0"
+
latest-version@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
@@ -10957,6 +11081,16 @@ package-hash@^3.0.0:
lodash.flattendeep "^4.4.0"
release-zalgo "^1.0.0"
+package-json@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+ integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
+ dependencies:
+ got "^6.7.1"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
package-json@^6.3.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
@@ -11122,6 +11256,25 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+patch-package@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.0.tgz#677de858e352b6ca4e6cb48a6efde2cec9fde566"
+ integrity sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+ update-notifier "^2.5.0"
+
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
@@ -11689,11 +11842,21 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1
source-map "^0.6.1"
supports-color "^6.1.0"
+postinstall-postinstall@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.0.0.tgz#7ba6711b4420575c4f561638836a81faad47f43f"
+ integrity sha512-3f6qWexsHiT4WKtZc5DRb0FPLilHtARi5KpY4fqban/DJNn8/YhZH8U7dVKVz51WbOxEnR31gV+qYQhvEdHtdQ==
+
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
@@ -12061,7 +12224,7 @@ raw-loader@^1.0.0:
loader-utils "^1.1.0"
schema-utils "^1.0.0"
-rc@^1.2.7, rc@^1.2.8:
+rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -12760,6 +12923,14 @@ regexpu-core@^4.5.4:
unicode-match-property-ecmascript "^1.0.4"
unicode-match-property-value-ecmascript "^1.1.0"
+registry-auth-token@^3.0.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
+ integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
+ dependencies:
+ rc "^1.1.6"
+ safe-buffer "^5.0.1"
+
registry-auth-token@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.0.0.tgz#30e55961eec77379da551ea5c4cf43cbf03522be"
@@ -12768,6 +12939,13 @@ registry-auth-token@^4.0.0:
rc "^1.2.8"
safe-buffer "^5.0.1"
+registry-url@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+ integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
+ dependencies:
+ rc "^1.0.1"
+
registry-url@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
@@ -14259,7 +14437,7 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8,
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-timed-out@4.0.1:
+timed-out@4.0.1, timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
@@ -14704,6 +14882,11 @@ unset-value@^1.0.0:
has-value "^0.3.1"
isobject "^3.0.0"
+unzip-response@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+ integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
+
unzipper@^0.9.3:
version "0.9.15"
resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.9.15.tgz#97d99203dad17698ee39882483c14e4845c7549c"
@@ -14724,6 +14907,22 @@ upath@^1.1.1:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
+update-notifier@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
+ integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
+ dependencies:
+ boxen "^1.2.1"
+ chalk "^2.0.1"
+ configstore "^3.0.0"
+ import-lazy "^2.1.0"
+ is-ci "^1.0.10"
+ is-installed-globally "^0.1.0"
+ is-npm "^1.0.0"
+ latest-version "^3.0.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^3.0.0"
+
update-notifier@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250"
@@ -14763,6 +14962,13 @@ url-loader@^2.1.0:
mime "^2.4.4"
schema-utils "^2.4.1"
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
+ dependencies:
+ prepend-http "^1.0.1"
+
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"