diff --git a/.circleci/config.yml b/.circleci/config.yml
index 25ac5ff333ce1..145ab72bd3f7b 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -36,6 +36,14 @@ commands:
- run:
name: Install js dependencies
command: yarn
+ prepare_chrome_headless:
+ steps:
+ - run:
+ name: Install dependencies for Chrome Headless
+ # From https://github.com/GoogleChrome/puppeteer/blob/811415bc8c47f7882375629b57b3fe186ad61ed4/docs/troubleshooting.md#chrome-headless-doesnt-launch
+ command: |
+ sudo apt-get update
+ sudo apt-get install -y --force-yes gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
jobs:
checkout:
@@ -53,6 +61,21 @@ jobs:
key: v2-yarn-sha-{{ checksum "yarn.lock" }}
paths:
- ~/.cache/yarn/v4
+ test_unit:
+ <<: *defaults
+ steps:
+ - checkout
+ - install_js
+ - run:
+ name: Tests fake browser
+ command: yarn test:coverage
+ - run:
+ name: Check coverage generated
+ command: |
+ if ! [[ -s coverage/lcov.info ]]
+ then
+ exit 1
+ fi
test_static:
<<: *defaults
steps:
@@ -67,11 +90,30 @@ jobs:
- run:
name: Lint JSON
command: yarn jsonlint
+ test_browser:
+ <<: *defaults
+ steps:
+ - checkout
+ - install_js
+ - prepare_chrome_headless
+ - run:
+ name: Tests real browsers
+ command: yarn test:karma
+ - store_artifacts:
+ # hardcoded in karma-webpack
+ path: /tmp/_karma_webpack_
+ destination: artifact-file
workflows:
version: 2
pipeline:
jobs:
- checkout
+ - test_unit:
+ requires:
+ - checkout
- test_static:
requires:
- checkout
+ - test_browser:
+ requires:
+ - checkout
diff --git a/.eslintrc.js b/.eslintrc.js
index 6ef39427ea667..0f0f3d3af27a6 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,3 +1,5 @@
+const path = require('path');
+
module.exports = {
root: true, // So parent files don't get applied
globals: {
@@ -24,8 +26,8 @@ module.exports = {
plugins: ['react-hooks', '@typescript-eslint'],
settings: {
'import/resolver': {
- node: {
- extensions: ['.js', '.ts', '.tsx', '.json'],
+ webpack: {
+ config: path.join(__dirname, './webpackBaseConfig.js'),
},
},
},
@@ -88,11 +90,7 @@ module.exports = {
},
overrides: [
{
- files: [
- '**/test-utils/**/*.js',
- // matching the pattern of the test runner
- '*.test.js',
- ],
+ files: ['*.test.tsx', '*.test.ts'],
env: {
mocha: true,
},
diff --git a/.gitignore b/.gitignore
index 3a6c2793403c8..49de4d1407f36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@
.DS_STORE
*.log
/.eslintcache
+/.nyc_output
+/coverage
dist
node_modules
__diff_output__
\ No newline at end of file
diff --git a/.mocharc.js b/.mocharc.js
new file mode 100644
index 0000000000000..7fea6f5b38d73
--- /dev/null
+++ b/.mocharc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ recursive: true,
+ reporter: 'dot',
+ require: [require.resolve('./test/utils/setup')],
+};
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000000000..fb49c16869299
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,81 @@
+const path = require('path');
+
+const errorCodesPath = path.resolve(__dirname, './docs/public/static/error-codes.json');
+const missingError = process.env.MUI_EXTRACT_ERROR_CODES === 'true' ? 'write' : 'annotate';
+
+let defaultPresets;
+
+// We release a ES version of Material-UI.
+// It's something that matches the latest official supported features of JavaScript.
+// Nothing more (stage-1, etc), nothing less (require, etc).
+if (process.env.BABEL_ENV === 'es') {
+ defaultPresets = [];
+} else {
+ defaultPresets = [
+ [
+ '@babel/preset-env',
+ {
+ bugfixes: true,
+ modules: ['esm', 'production-umd'].includes(process.env.BABEL_ENV) ? false : 'commonjs',
+ },
+ ],
+ ];
+}
+
+const defaultAlias = {
+ '@material-ui/x-grid': './packages/grid/x-grid/src',
+ '@material-ui/x-grid-modules': './packages/grid/x-grid-modules/src',
+ '@material-ui/x-license': './packages/license/src',
+ '@material-ui/data-grid': './packages/grid/data-grid/src',
+};
+
+module.exports = {
+ presets: defaultPresets.concat(['@babel/preset-react', '@babel/preset-typescript']),
+ plugins: [
+ [
+ 'babel-plugin-macros',
+ {
+ muiError: {
+ errorCodesPath,
+ missingError,
+ },
+ },
+ ],
+ 'babel-plugin-optimize-clsx',
+ ['@babel/plugin-proposal-class-properties', { loose: true }],
+ ['@babel/plugin-proposal-object-rest-spread', { loose: true }],
+ // any package needs to declare 7.4.4 as a runtime dependency. default is ^7.0.0
+ ['@babel/plugin-transform-runtime', { version: '^7.4.4' }],
+ // for IE 11 support
+ '@babel/plugin-transform-object-assign',
+ ],
+ ignore: [/@babel[\\|/]runtime/], // Fix a Windows issue.
+ env: {
+ coverage: {
+ plugins: [
+ 'babel-plugin-istanbul',
+ [
+ 'babel-plugin-module-resolver',
+ {
+ root: ['./'],
+ extensions: ['.js', '.ts', '.tsx'],
+ alias: defaultAlias,
+ },
+ ],
+ ],
+ },
+ test: {
+ sourceMaps: 'both',
+ plugins: [
+ [
+ 'babel-plugin-module-resolver',
+ {
+ root: ['./'],
+ extensions: ['.js', '.ts', '.tsx'],
+ alias: defaultAlias,
+ },
+ ],
+ ],
+ },
+ },
+};
diff --git a/package.json b/package.json
index 44f3a2ac2034c..8281f0584b6b3 100644
--- a/package.json
+++ b/package.json
@@ -2,6 +2,9 @@
"version": "0.1.0",
"private": true,
"devDependencies": {
+ "@babel/plugin-transform-object-assign": "^7.10.4",
+ "@babel/plugin-transform-runtime": "^7.10.5",
+ "@babel/register": "^7.10.5",
"@material-ui/core": "^4.9.12",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "^4.0.0-alpha.54",
@@ -17,25 +20,43 @@
"@types/styled-components": "^5.0.1",
"@typescript-eslint/eslint-plugin": "^3.6.1",
"@typescript-eslint/parser": "^3.6.1",
+ "babel-plugin-module-resolver": "^4.0.0",
+ "babel-plugin-optimize-clsx": "^2.6.1",
+ "chai": "^4.2.0",
+ "chai-dom": "^1.8.2",
+ "cross-env": "^7.0.2",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.2",
"eslint": "^7.4.0",
"eslint-config-airbnb-typescript": "^9.0.0",
"eslint-config-prettier": "^6.11.0",
+ "eslint-import-resolver-webpack": "^0.12.2",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-mocha": "^7.0.1",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.20.3",
"eslint-plugin-react-hooks": "^4.0.8",
+ "format-util": "^1.0.5",
"glob-gitignore": "^1.0.14",
"jest": "^25.1.0",
"jest-cli": "^25.1.0",
"jest-transform-stub": "^2.0.0",
+ "karma": "^5.1.0",
+ "karma-browserstack-launcher": "^1.6.0",
+ "karma-chrome-launcher": "^3.1.0",
+ "karma-mocha": "^2.0.1",
+ "karma-mocha-reporter": "^2.2.5",
+ "karma-sourcemap-loader": "^0.3.7",
+ "karma-webpack": "^4.0.2",
"lerna": "^3.20.2",
+ "mocha": "^8.0.1",
+ "nyc": "^15.1.0",
"prettier": "^2.0.5",
+ "pretty-format-v24": "npm:pretty-format@24",
"react": "^16.13.1",
"react-dom": "^16.13.1",
+ "sinon": "^9.0.2",
"styled-components": "^5.1.0",
"stylelint": "^13.3.3",
"stylelint-config-recommended": "^3.0.0",
@@ -54,6 +75,11 @@
"start": "lerna run start --parallel",
"prettier": "node ./scripts/prettier.js",
"test": "lerna run test --parallel",
+ "test:coverage": "cross-env NODE_ENV=test BABEL_ENV=coverage nyc mocha 'packages/**/*.test.tsx' --exclude '**/node_modules/**' && nyc report -r lcovonly",
+ "test:coverage:html": "cross-env NODE_ENV=test BABEL_ENV=coverage nyc mocha 'packages/**/*.test.tsx' --exclude '**/node_modules/**' && nyc report --reporter=html",
+ "test:karma": "cross-env NODE_ENV=test karma start test/karma.conf.js",
+ "test:unit": "cross-env NODE_ENV=test mocha 'packages/**/*.test.tsx' --exclude '**/node_modules/**'",
+ "test:watch": "yarn test:unit --watch",
"lint": "yarn eslint && yarn jsonlint",
"eslint": "eslint . --cache --report-unused-disable-directives --ext .js,.ts,.tsx",
"eslint:ci": "eslint . --report-unused-disable-directives --ext .js,.ts,.tsx"
diff --git a/packages/grid/x-grid/rollup.config.js b/packages/grid/x-grid/rollup.config.js
index 81babe42a1f75..2167063c71b45 100644
--- a/packages/grid/x-grid/rollup.config.js
+++ b/packages/grid/x-grid/rollup.config.js
@@ -1,5 +1,4 @@
import typescript from 'rollup-plugin-typescript2';
-// eslint-disable-next-line import/no-unresolved
import { generateReleaseInfo } from '@material-ui/x-license';
import cleaner from 'rollup-plugin-cleaner';
import sourceMaps from 'rollup-plugin-sourcemaps';
diff --git a/packages/grid/x-grid/test/XGrid.test.tsx b/packages/grid/x-grid/test/XGrid.test.tsx
new file mode 100644
index 0000000000000..9cda9716b47b9
--- /dev/null
+++ b/packages/grid/x-grid/test/XGrid.test.tsx
@@ -0,0 +1,140 @@
+import * as React from 'react';
+import { createClientRender, act, fireEvent } from 'test/utils';
+import { expect } from 'chai';
+import { XGrid } from '@material-ui/x-grid';
+import { useData } from 'packages/storybook/src/hooks/useData';
+
+function getActiveCell() {
+ const activeElement = document.activeElement;
+
+ if (!activeElement || !activeElement.parentElement) {
+ return null;
+ }
+
+ return `${activeElement.parentElement.getAttribute('data-rowindex')}-${activeElement.getAttribute(
+ 'data-colindex',
+ )}`;
+}
+
+async function sleep(duration: number) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, duration);
+ });
+}
+
+async function raf() {
+ return new Promise((resolve) => {
+ // Chrome and Safari have a bug where calling rAF once returns the current
+ // frame instead of the next frame, so we need to call a double rAF here.
+ // See crbug.com/675795 for more.
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ resolve();
+ });
+ });
+ });
+}
+
+describe('', () => {
+ const render = createClientRender();
+
+ before(function beforeHook() {
+ if (/jsdom/.test(window.navigator.userAgent)) {
+ // Need layouting
+ this.skip();
+ }
+ });
+
+ describe('keyboard', () => {
+ const KeyboardTest = () => {
+ const data = useData(100, 20);
+ const transformColSizes = (columns) => columns.map((column) => ({ ...column, width: 60 }));
+
+ return (
+
+
+
+ );
+ };
+
+ it('cell navigation with arrows ', async () => {
+ render();
+ await raf();
+ // @ts-ignore
+ document.querySelector('[data-rowindex="0"]').querySelector('[data-colindex="0"]').focus();
+ expect(getActiveCell()).to.equal('0-0');
+
+ fireEvent.keyDown(document.activeElement, { code: 'ArrowRight' });
+ await raf();
+ expect(getActiveCell()).to.equal('0-1');
+
+ fireEvent.keyDown(document.activeElement, { code: 'ArrowDown' });
+ await raf();
+ expect(getActiveCell()).to.equal('1-1');
+
+ fireEvent.keyDown(document.activeElement, { code: 'ArrowLeft' });
+ await raf();
+ expect(getActiveCell()).to.equal('1-0');
+
+ fireEvent.keyDown(document.activeElement, { code: 'ArrowUp' });
+ await raf();
+ expect(getActiveCell()).to.equal('0-0');
+ });
+
+ it('Home / End navigation', async () => {
+ render();
+ await raf();
+ // @ts-ignore
+ document.querySelector('[data-rowindex="1"]').querySelector('[data-colindex="1"]').focus();
+ expect(getActiveCell()).to.equal('1-1');
+
+ fireEvent.keyDown(document.activeElement, { code: 'Home' });
+ await raf();
+ expect(getActiveCell()).to.equal('1-0');
+
+ fireEvent.keyDown(document.activeElement, { code: 'End' });
+ await raf();
+ expect(getActiveCell()).to.equal('1-19');
+ });
+ });
+
+ it('should resize the width of the columns', async function test() {
+ function App(props) {
+ const { width = 300 } = props;
+ return (
+
+
+
+ );
+ }
+
+ const { container, setProps } = render();
+ let rect;
+ // @ts-ignore
+ rect = container.querySelector('[role="row"][data-rowindex="0"]').getBoundingClientRect();
+ expect(rect.width).to.equal(300 - 2);
+ setProps({ width: 400 });
+ act(() => {
+ window.dispatchEvent(new window.Event('resize', {}));
+ });
+ await sleep(100); // resize debounce
+ await sleep(100); // Not sure why
+ // @ts-ignore
+ rect = container.querySelector('[role="row"][data-rowindex="0"]').getBoundingClientRect();
+ expect(rect.width).to.equal(400 - 2);
+ });
+});
diff --git a/packages/license/bin/license-gen-script.js b/packages/license/bin/license-gen-script.js
index 7ee174058a050..cf77c360d37ba 100755
--- a/packages/license/bin/license-gen-script.js
+++ b/packages/license/bin/license-gen-script.js
@@ -1,7 +1,5 @@
#!/usr/bin/env node
-
-// eslint-disable-next-line no-global-assign
+/* eslint-disable */
require = require('esm')(module);
-// eslint-disable-next-line import/no-unresolved
require('../dist/cjs/license-cli').licenseGenCli(process.argv);
diff --git a/test/karma.conf.js b/test/karma.conf.js
new file mode 100644
index 0000000000000..e1c40f6862488
--- /dev/null
+++ b/test/karma.conf.js
@@ -0,0 +1,155 @@
+const path = require('path');
+const webpack = require('webpack');
+
+const browserStack = {
+ username: process.env.BROWSERSTACK_USERNAME,
+ accessKey: process.env.BROWSERSTACK_ACCESS_KEY,
+ build: `material-ui-${new Date().toISOString()}`,
+};
+
+process.env.CHROME_BIN = require('puppeteer').executablePath();
+
+// Karma configuration
+module.exports = function setKarmaConfig(config) {
+ const baseConfig = {
+ basePath: '../',
+ browsers: ['ChromeHeadlessNoSandbox'],
+ browserDisconnectTimeout: 120000, // default 2000
+ browserDisconnectTolerance: 1, // default 0
+ browserNoActivityTimeout: 300000, // default 10000
+ colors: true,
+ frameworks: ['mocha'],
+ files: [
+ {
+ pattern: 'test/karma.tests.js',
+ watched: true,
+ served: true,
+ included: true,
+ },
+ ],
+ plugins: [
+ 'karma-mocha',
+ 'karma-chrome-launcher',
+ 'karma-sourcemap-loader',
+ 'karma-webpack',
+ 'karma-mocha-reporter',
+ ],
+ /**
+ * possible values:
+ * - config.LOG_DISABLE
+ * - config.LOG_ERROR
+ * - config.LOG_WARN
+ * - config.LOG_INFO
+ * - config.LOG_DEBUG
+ */
+ logLevel: config.LOG_INFO,
+ port: 9876,
+ preprocessors: {
+ 'test/karma.tests.js': ['webpack', 'sourcemap'],
+ },
+ reporters: ['dots'],
+ webpack: {
+ mode: 'development',
+ devtool: 'inline-source-map',
+ plugins: [
+ new webpack.DefinePlugin({
+ 'process.env': {
+ NODE_ENV: JSON.stringify('test'),
+ CI: JSON.stringify(process.env.CI),
+ },
+ }),
+ ],
+ module: {
+ rules: [
+ {
+ test: /\.(js|ts|tsx)$/,
+ loader: 'babel-loader',
+ exclude: /node_modules/,
+ },
+ ],
+ },
+ node: {
+ // Some tests import fs
+ fs: 'empty',
+ },
+ resolve: {
+ extensions: ['.js', '.ts', '.tsx'],
+ modules: [path.join(__dirname, '../'), 'node_modules'],
+ alias: {
+ // yarn alias for `pretty-format@3`
+ // @testing-library/dom -> pretty-format@25
+ // which uses Object.entries which isn't implemented in all browsers
+ // we support
+ 'pretty-format': require.resolve('pretty-format-v24'),
+ // https://github.com/sinonjs/sinon/issues/1951
+ // use the cdn main field. Neither module nor main are supported for browserbuilds
+ sinon: 'sinon/pkg/sinon.js',
+ // https://github.com/testing-library/react-testing-library/issues/486
+ // "default" bundles are not browser compatible
+ '@testing-library/react/pure':
+ '@testing-library/react/dist/@testing-library/react.pure.esm',
+ },
+ },
+ },
+ webpackMiddleware: {
+ noInfo: true,
+ writeToDisk: Boolean(process.env.CI),
+ },
+ customLaunchers: {
+ ChromeHeadlessNoSandbox: {
+ base: 'ChromeHeadless',
+ flags: ['--no-sandbox'],
+ },
+ },
+ singleRun: Boolean(process.env.CI),
+ };
+
+ let newConfig = baseConfig;
+
+ if (browserStack.accessKey) {
+ newConfig = {
+ ...baseConfig,
+ browserStack,
+ browsers: baseConfig.browsers.concat([
+ 'BrowserStack_Chrome',
+ 'BrowserStack_Firefox',
+ 'BrowserStack_Safari',
+ 'BrowserStack_Edge',
+ ]),
+ plugins: baseConfig.plugins.concat(['karma-browserstack-launcher']),
+ customLaunchers: {
+ ...baseConfig.customLaunchers,
+ BrowserStack_Chrome: {
+ base: 'BrowserStack',
+ os: 'OS X',
+ os_version: 'Sierra',
+ browser: 'Chrome',
+ browser_version: '49.0',
+ },
+ BrowserStack_Firefox: {
+ base: 'BrowserStack',
+ os: 'Windows',
+ os_version: '10',
+ browser: 'Firefox',
+ browser_version: '52.0',
+ },
+ BrowserStack_Safari: {
+ base: 'BrowserStack',
+ os: 'OS X',
+ os_version: 'Sierra',
+ browser: 'Safari',
+ browser_version: '10.1',
+ },
+ BrowserStack_Edge: {
+ base: 'BrowserStack',
+ os: 'Windows',
+ os_version: '10',
+ browser: 'Edge',
+ browser_version: '14.0',
+ },
+ },
+ };
+ }
+
+ config.set(newConfig);
+};
diff --git a/test/karma.tests.js b/test/karma.tests.js
new file mode 100644
index 0000000000000..8c1072faf26ce
--- /dev/null
+++ b/test/karma.tests.js
@@ -0,0 +1,4 @@
+import './utils/init';
+
+const packagesContext = require.context('../packages', true, /\.test\.tsx$/);
+packagesContext.keys().forEach(packagesContext);
diff --git a/test/utils/components.js b/test/utils/components.js
new file mode 100644
index 0000000000000..c12f46def7dee
--- /dev/null
+++ b/test/utils/components.js
@@ -0,0 +1,38 @@
+import * as React from 'react';
+import * as PropTypes from 'prop-types';
+
+/**
+ * A basic error boundary that can be used to assert thrown errors in render.
+ * @example ;
+ * expect(errorRef.current.errors).to.have.lenght(0);
+ */
+// enforce a single file for test related components
+export class ErrorBoundary extends React.Component {
+ static propTypes = {
+ children: PropTypes.node.isRequired,
+ };
+
+ state = {
+ error: null,
+ };
+
+ /**
+ * @public
+ */
+ errors = [];
+
+ static getDerivedStateFromError(error) {
+ return { error };
+ }
+
+ componentDidCatch(error) {
+ this.errors.push(error);
+ }
+
+ render() {
+ if (this.state.error) {
+ return null;
+ }
+ return this.props.children;
+ }
+}
diff --git a/test/utils/createClientRender.js b/test/utils/createClientRender.js
new file mode 100644
index 0000000000000..2b6184ff980e9
--- /dev/null
+++ b/test/utils/createClientRender.js
@@ -0,0 +1,213 @@
+/* eslint-env mocha */
+import React from 'react';
+import PropTypes from 'prop-types';
+import {
+ act,
+ buildQueries,
+ cleanup,
+ createEvent,
+ fireEvent as rtlFireEvent,
+ queries,
+ render as testingLibraryRender,
+ prettyDOM,
+} from '@testing-library/react/pure';
+
+// holes are *All* selectors which aren't necessary for id selectors
+const [queryDescriptionOf, , getDescriptionOf, , findDescriptionOf] = buildQueries(
+ function queryAllDescriptionsOf(container, element) {
+ return container.querySelectorAll(`#${element.getAttribute('aria-describedby')}`);
+ },
+ function getMultipleError() {
+ return `Found multiple descriptions. An element should be described by a unique element.`;
+ },
+ function getMissingError() {
+ return `Found no describing element.`;
+ },
+);
+
+const customQueries = { queryDescriptionOf, getDescriptionOf, findDescriptionOf };
+
+/**
+ * @typedef {object} RenderOptions
+ * @property {HTMLElement} [options.baseElement] - https://testing-library.com/docs/react-testing-library/api#baseelement-1
+ * @property {HTMLElement} [options.container] - https://testing-library.com/docs/react-testing-library/api#container
+ * @property {boolean} [options.disableUnnmount] - if true does not cleanup before mount
+ * @property {boolean} [options.hydrate] - https://testing-library.com/docs/react-testing-library/api#hydrate
+ * @property {boolean} [options.strict] - wrap in React.StrictMode?
+ */
+
+/**
+ *
+ * @param {React.ReactElement} element
+ * @param {RenderOptions} [options]
+ * @returns {import('@testing-library/react').RenderResult & { setProps(props: object): void}}
+ * TODO: type return RenderResult in setProps
+ */
+function clientRender(element, options = {}) {
+ const {
+ baseElement,
+ container,
+ hydrate,
+ strict = true,
+ wrapper: InnerWrapper = React.Fragment,
+ } = options;
+
+ const Mode = strict ? React.StrictMode : React.Fragment;
+ function Wrapper({ children }) {
+ return (
+
+ {children}
+
+ );
+ }
+ Wrapper.propTypes = { children: PropTypes.node };
+
+ const result = testingLibraryRender(element, {
+ baseElement,
+ container,
+ hydrate,
+ queries: { ...queries, ...customQueries },
+ wrapper: Wrapper,
+ });
+
+ /**
+ * convenience helper. Better than repeating all props.
+ */
+ result.setProps = function setProps(props) {
+ result.rerender(React.cloneElement(element, props));
+ return result;
+ };
+
+ result.forceUpdate = function forceUpdate() {
+ result.rerender(
+ React.cloneElement(element, {
+ 'data-force-update': String(Math.random()),
+ }),
+ );
+ return result;
+ };
+
+ return result;
+}
+
+/**
+ * @param {RenderOptions} globalOptions
+ * @returns {clientRender}
+ */
+export function createClientRender(globalOptions = {}) {
+ const { strict: globalStrict } = globalOptions;
+
+ // save stack to re-use in async afterEach
+ const { stack: createClientRenderStack } = new Error();
+ afterEach(async () => {
+ if (setTimeout.hasOwnProperty('clock')) {
+ const error = Error(
+ "Can't cleanup before fake timers are restored.\n" +
+ 'Be sure to:\n' +
+ ' 1. Restore the clock in `afterEach` instead of `after`.\n' +
+ ' 2. Move the test hook to restore the clock before the call to `createClientRender()`.',
+ );
+ // Use saved stack otherwise the stack trace will not include the test location.
+ error.stack = createClientRenderStack;
+ throw error;
+ }
+ // If this issues an act() warning you probably didn't
+ // wait for an async event in your test (or didn't wrap it in act() at all).
+ // please wait for every update in your test and make appropriate assertions
+ await cleanup();
+ });
+
+ return function configuredClientRender(element, options = {}) {
+ const { strict = globalStrict, ...localOptions } = options;
+
+ return clientRender(element, { ...localOptions, strict });
+ };
+}
+
+const fireEvent = Object.assign(rtlFireEvent, {
+ // polyfill event.key(Code) for chrome 49 and edge 15 (supported in Material-UI v4)
+ // for user-interactions react does the polyfilling but manually created
+ // events don't have this luxury
+ keyDown(element, options = {}) {
+ // `element` shouldn't be `document` but we catch this later anyway
+ const document = element.ownerDocument || element;
+ const target = document.activeElement || document.body || document.documentElement;
+ if (target !== element) {
+ // see https://www.w3.org/TR/uievents/#keydown
+ const error = new Error(
+ `\`keydown\` events can only be targeted at the active element which is ${prettyDOM(
+ target,
+ undefined,
+ { maxDepth: 1 },
+ )}`,
+ );
+ // We're only interested in the callsite of fireEvent.keyDown
+ error.stack = error.stack
+ .split('\n')
+ .filter((line) => !/at Function.key/.test(line))
+ .join('\n');
+ throw error;
+ }
+
+ const event = createEvent.keyDown(element, options);
+ Object.defineProperty(event, 'key', {
+ get() {
+ return options.key || '';
+ },
+ });
+ if (options.keyCode !== undefined && event.keyCode === 0) {
+ Object.defineProperty(event, 'keyCode', {
+ get() {
+ return options.keyCode;
+ },
+ });
+ }
+
+ rtlFireEvent(element, event);
+ },
+ keyUp(element, options = {}) {
+ // `element` shouldn't be `document` but we catch this later anyway
+ const document = element.ownerDocument || element;
+ const target = document.activeElement || document.body || document.documentElement;
+ if (target !== element) {
+ // see https://www.w3.org/TR/uievents/#keyup
+ const error = new Error(
+ `\`keyup\` events can only be targeted at the active element which is ${prettyDOM(
+ target,
+ undefined,
+ { maxDepth: 1 },
+ )}`,
+ );
+ // We're only interested in the callsite of fireEvent.keyUp
+ error.stack = error.stack
+ .split('\n')
+ .filter((line) => !/at Function.key/.test(line))
+ .join('\n');
+ throw error;
+ }
+ const event = createEvent.keyUp(element, options);
+ Object.defineProperty(event, 'key', {
+ get() {
+ return options.key || '';
+ },
+ });
+ if (options.keyCode !== undefined && event.keyCode === 0) {
+ Object.defineProperty(event, 'keyCode', {
+ get() {
+ return options.keyCode;
+ },
+ });
+ }
+
+ rtlFireEvent(element, event);
+ },
+});
+
+export * from '@testing-library/react/pure';
+export { act, cleanup, fireEvent };
+
+export function render() {
+ throw new Error(
+ "Don't use `render` directly. Instead use the return value from `createClientRender`",
+ );
+}
diff --git a/test/utils/createDOM.d.ts b/test/utils/createDOM.d.ts
new file mode 100644
index 0000000000000..9dc704f4f5776
--- /dev/null
+++ b/test/utils/createDOM.d.ts
@@ -0,0 +1,9 @@
+// there's probably a broader solution e.g. levering DOMWindow from 'jsodm'
+// interface Window extends DOMWindow doesn't work because jsdom typings use
+// triple slash directives. Technical dom.lib.d.ts should already have these properties
+interface Window {
+ DragEvent: typeof DragEvent;
+ Event: typeof Event;
+ HTMLButtonElement: HTMLButtonElement;
+ HTMLParagraphElement: HTMLParagraphElement;
+}
diff --git a/test/utils/createDOM.js b/test/utils/createDOM.js
new file mode 100644
index 0000000000000..2e02509b235d9
--- /dev/null
+++ b/test/utils/createDOM.js
@@ -0,0 +1,63 @@
+const { JSDOM } = require('jsdom');
+
+// We can use jsdom-global at some point if maintaining these lists is a burden.
+const whitelist = [
+ // required for fake getComputedStyle
+ 'CSSStyleDeclaration',
+ 'Element',
+ 'Event',
+ 'Image',
+ 'HTMLElement',
+ 'HTMLInputElement',
+ 'Node',
+ 'Performance',
+ 'document',
+];
+const blacklist = ['sessionStorage', 'localStorage'];
+
+function createDOM() {
+ const dom = new JSDOM('', { pretendToBeVisual: true });
+ global.window = dom.window;
+ // Not yet supported: https://github.com/jsdom/jsdom/issues/2152
+ class Touch {
+ constructor(instance) {
+ this.instance = instance;
+ }
+
+ get identifier() {
+ return this.instance.identifier;
+ }
+
+ get pageX() {
+ return this.instance.pageX;
+ }
+
+ get pageY() {
+ return this.instance.pageY;
+ }
+
+ get clientX() {
+ return this.instance.clientX;
+ }
+
+ get clientY() {
+ return this.instance.clientY;
+ }
+ }
+ global.window.Touch = Touch;
+
+ global.navigator = {
+ userAgent: 'node.js',
+ };
+
+ Object.keys(dom.window)
+ .filter((key) => !blacklist.includes(key))
+ .concat(whitelist)
+ .forEach((key) => {
+ if (typeof global[key] === 'undefined') {
+ global[key] = dom.window[key];
+ }
+ });
+}
+
+module.exports = createDOM;
diff --git a/test/utils/createMount.js b/test/utils/createMount.js
new file mode 100644
index 0000000000000..33c0f6bca5c5e
--- /dev/null
+++ b/test/utils/createMount.js
@@ -0,0 +1,91 @@
+/* eslint-env mocha */
+import * as React from 'react';
+import * as ReactDOM from 'react-dom';
+import * as PropTypes from 'prop-types';
+import { mount as enzymeMount } from 'enzyme';
+
+/**
+ * Can't just mount {node}
+ * because that swallows wrapper.setProps
+ *
+ * why class component:
+ * https://github.com/airbnb/enzyme/issues/2043
+ */
+// eslint-disable-next-line react/prefer-stateless-function
+class Mode extends React.Component {
+ static propTypes = {
+ /**
+ * this is essentially children. However we can't use children because then
+ * using `wrapper.setProps({ children })` would work differently if this component
+ * would be the root.
+ */
+ __element: PropTypes.element.isRequired,
+ __strict: PropTypes.bool.isRequired,
+ };
+
+ render() {
+ // Excess props will come from e.g. enzyme setProps
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const { __element, __strict, ...other } = this.props;
+ const Component = __strict ? React.StrictMode : React.Fragment;
+
+ return {React.cloneElement(__element, other)};
+ }
+}
+
+// Generate an enhanced mount function.
+export default function createMount(options = {}) {
+ const { mount = enzymeMount, strict: globalStrict = true, ...globalEnzymeOptions } = options;
+
+ let container = null;
+
+ /**
+ * @param {import('mocha').Test | undefined} test
+ */
+ function computeTestName(test) {
+ /**
+ * @type {import('mocha').Test | import('mocha').Suite | undefined}
+ */
+ let current = test;
+ const titles = [];
+ while (current != null) {
+ titles.push(current.title);
+ current = current.parent;
+ }
+
+ return titles.filter(Boolean).reverse().join(' -> ');
+ }
+
+ beforeEach(function beforeEachMountTest() {
+ container = document.createElement('div');
+ container.setAttribute('data-test', computeTestName(this.currentTest));
+ document.body.insertBefore(container, document.body.firstChild);
+ });
+
+ afterEach(() => {
+ ReactDOM.unmountComponentAtNode(container);
+ container.parentElement.removeChild(container);
+ container = null;
+ });
+
+ const mountWithContext = function mountWithContext(node, localOptions = {}) {
+ const { strict = globalStrict, ...localEnzymeOptions } = localOptions;
+
+ if (container === null) {
+ throw new Error(
+ `Tried to mount without setup. Mounting inside before() is not allowed. Try mounting in beforeEach or better: in each test`,
+ );
+ }
+ ReactDOM.unmountComponentAtNode(container);
+
+ // some tests require that no other components are in the tree
+ // e.g. when doing .instance(), .state() etc.
+ return mount(strict == null ? node : , {
+ attachTo: container,
+ ...globalEnzymeOptions,
+ ...localEnzymeOptions,
+ });
+ };
+
+ return mountWithContext;
+}
diff --git a/test/utils/createServerRender.js b/test/utils/createServerRender.js
new file mode 100644
index 0000000000000..6f20f2f6e058c
--- /dev/null
+++ b/test/utils/createServerRender.js
@@ -0,0 +1,35 @@
+/* eslint-env mocha */
+import { render as enzymeRender } from 'enzyme';
+import { stub } from 'sinon';
+
+/**
+ *
+ * @param {object} [options]
+ * @param {boolean} [options.expectUseLayoutEffectWarning]
+ */
+export default function createServerRender(options = {}) {
+ const { expectUseLayoutEffectWarning = false } = options;
+
+ beforeEach(() => {
+ stub(console, 'error').callsFake((message, ...args) => {
+ const isUseLayoutEffectWarning = /Warning: useLayoutEffect does nothing on the server/.test(
+ message,
+ );
+
+ if (!expectUseLayoutEffectWarning || !isUseLayoutEffectWarning) {
+ // callThrough
+ // eslint-disable-next-line no-console
+ console.info(message, ...args);
+ throw new Error(message, ...args);
+ }
+ });
+ });
+
+ afterEach(() => {
+ console.error.restore();
+ });
+
+ return function render(node) {
+ return enzymeRender(node);
+ };
+}
diff --git a/test/utils/createShallow.js b/test/utils/createShallow.js
new file mode 100644
index 0000000000000..05789d93ac0ed
--- /dev/null
+++ b/test/utils/createShallow.js
@@ -0,0 +1,45 @@
+import { shallow as enzymeShallow } from 'enzyme';
+import until from './until';
+
+/**
+ * @typedef {object} ExtendedShallowOptions
+ * @property {typeof import('enzyme').shallow} shallow;
+ * @property {boolean} dive
+ * @property {import('enzyme').EnzymeSelector} untilSelector
+ *
+ * @typedef {import('enzyme').ShallowRendererProps & ExtendedShallowOptions} ShallowOptions
+ */
+
+/**
+ * Generate an enhanced shallow function.
+ * @param {Partial} [options1]
+ * @returns {typeof import('enzyme').shallow}
+ */
+export default function createShallow(options1 = {}) {
+ const { shallow = enzymeShallow, dive = false, untilSelector = false, ...other1 } = options1;
+
+ const shallowWithContext = function shallowWithContext(node, options2 = {}) {
+ const options = {
+ ...other1,
+ ...options2,
+ context: {
+ ...other1.context,
+ ...options2.context,
+ },
+ };
+
+ const wrapper = shallow(node, options);
+
+ if (dive) {
+ return wrapper.dive();
+ }
+
+ if (untilSelector) {
+ return until.call(wrapper, untilSelector, options);
+ }
+
+ return wrapper;
+ };
+
+ return shallowWithContext;
+}
diff --git a/test/utils/describeConformance.js b/test/utils/describeConformance.js
new file mode 100644
index 0000000000000..5838e770b12ea
--- /dev/null
+++ b/test/utils/describeConformance.js
@@ -0,0 +1,226 @@
+/* eslint-env mocha */
+import { expect } from 'chai';
+import * as React from 'react';
+import ReactTestRenderer from 'react-test-renderer';
+import findOutermostIntrinsic from './findOutermostIntrinsic';
+
+function assertDOMNode(node) {
+ // duck typing a DOM node
+ expect(typeof node.nodeName).to.equal('string');
+}
+
+/**
+ * Utility method to make assertions about the ref on an element
+ * @param {React.ReactElement} element - The element should have a component wrapped
+ * in withStyles as the root
+ * @param {function} mount - Should be returnvalue of createMount
+ * @param {function} onRef - Callback, first arg is the ref.
+ * Assert that the ref is a DOM node by default
+ */
+function testRef(element, mount, onRef = assertDOMNode) {
+ const ref = React.createRef();
+ const wrapper = mount({React.cloneElement(element, { ref })});
+ onRef(ref.current, wrapper);
+}
+
+/**
+ * Glossary
+ * - root component:
+ * - renders the outermost host component
+ * - has the `root` class if the component has one
+ * - excess props are spread to this component
+ * - has the type of `inheritComponent`
+ */
+
+/**
+ * Returns the component with the same constructor as `component` that renders
+ * the outermost host
+ *
+ * @param {import('enzyme').ReactWrapper} wrapper
+ * @param {object} options
+ * @param {import('react').ElementType} component
+ */
+function findRootComponent(wrapper, { component }) {
+ const outermostHostElement = findOutermostIntrinsic(wrapper).getElement();
+
+ return wrapper.find(component).filterWhere((componentWrapper) => {
+ return componentWrapper.contains(outermostHostElement);
+ });
+}
+
+function randomStringValue() {
+ return Math.random().toString(36).slice(2);
+}
+
+/**
+ * Material-UI components have a `className` prop. The `className` is applied to
+ * the root component.
+ *
+ * @param {React.ReactElement} element
+ * @param {() => ConformanceOptions} getOptions
+ */
+function testClassName(element, getOptions) {
+ it('applies the className to the root component', () => {
+ const { mount } = getOptions();
+ const className = randomStringValue();
+
+ const wrapper = mount(React.cloneElement(element, { className }));
+
+ expect(findOutermostIntrinsic(wrapper).hasClass(className)).to.equal(
+ true,
+ 'does have a custom `className`',
+ );
+ });
+}
+
+/**
+ * Material-UI components have a `component` prop that allows rendering a different
+ * Component from @inheritComponent
+ *
+ * @param {React.ReactElement} element
+ * @param {() => ConformanceOptions} getOptions
+ */
+function testComponentProp(element, getOptions) {
+ describe('prop: component', () => {
+ it('can render another root component with the `component` prop', () => {
+ const { classes, mount, testComponentPropWith: component = 'em' } = getOptions();
+
+ const wrapper = mount(React.cloneElement(element, { component }));
+
+ expect(findRootComponent(wrapper, { classes, component }).exists()).to.equal(true);
+ });
+ });
+}
+
+/**
+ * Material-UI components can spread additional props to a documented component.
+ * It's set via @inheritComponent in the source.
+ *
+ * @param {React.ReactElement} element
+ * @param {() => ConformanceOptions} getOptions
+ */
+function testPropsSpread(element, getOptions) {
+ it(`spreads props to the root component`, () => {
+ // type def in ConformanceOptions
+ const { classes, inheritComponent, mount } = getOptions();
+ const testProp = 'data-test-props-spread';
+ const value = randomStringValue();
+
+ const wrapper = mount(React.cloneElement(element, { [testProp]: value }));
+ const root = findRootComponent(wrapper, { classes, component: inheritComponent });
+
+ expect(root.props()[testProp]).to.equal(value);
+ });
+}
+
+/**
+ * Tests that the `ref` of a component will return the correct instance
+ *
+ * This is determined by a given constructor i.e. a React.Component or HTMLElement for
+ * components that forward their ref and attach it to a host component.
+ *
+ * @param {React.ReactElement} element
+ * @param {() => ConformanceOptions} getOptions
+ */
+function describeRef(element, getOptions) {
+ describe('ref', () => {
+ it(`attaches the ref`, () => {
+ // type def in ConformanceOptions
+ const { inheritComponent, mount, refInstanceof } = getOptions();
+
+ testRef(element, mount, (instance, wrapper) => {
+ expect(instance).to.be.instanceof(refInstanceof);
+
+ if (inheritComponent && instance.nodeType === 1) {
+ const rootHost = findOutermostIntrinsic(wrapper);
+ expect(instance).to.equal(rootHost.instance());
+ }
+ });
+ });
+ });
+}
+
+/**
+ * Tests that the root component has the root class
+ *
+ * @param {React.ReactElement} element
+ * @param {() => ConformanceOptions} getOptions
+ */
+function testRootClass(element, getOptions) {
+ it('applies the root class to the root component if it has this class', () => {
+ const { classes, mount } = getOptions();
+ if (classes.root == null) {
+ return;
+ }
+
+ const className = randomStringValue();
+ const wrapper = mount(React.cloneElement(element, { className }));
+
+ // we established that the root component renders the outermost host previously. We immediately
+ // jump to the host component because some components pass the `root` class
+ // to the `classes` prop of the root component.
+ // https://github.com/mui-org/material-ui/blob/f9896bcd129a1209153106296b3d2487547ba205/packages/material-ui/src/OutlinedInput/OutlinedInput.js#L101
+ expect(findOutermostIntrinsic(wrapper).hasClass(classes.root)).to.equal(true);
+ expect(findOutermostIntrinsic(wrapper).hasClass(className)).to.equal(true);
+ });
+}
+
+/**
+ * Tests that the component can be rendered with react-test-renderer.
+ * This is important for snapshot testing with Jest (even if we don't encourage it).
+ *
+ * @param {React.ReactElement} element
+ */
+function testReactTestRenderer(element) {
+ it('should render without errors in ReactTestRenderer', () => {
+ ReactTestRenderer.act(() => {
+ ReactTestRenderer.create(element, {
+ createNodeMock: (node) => {
+ return document.createElement(node.type);
+ },
+ });
+ });
+ });
+}
+
+const fullSuite = {
+ componentProp: testComponentProp,
+ mergeClassName: testClassName,
+ propsSpread: testPropsSpread,
+ refForwarding: describeRef,
+ rootClass: testRootClass,
+ reactTestRenderer: testReactTestRenderer,
+};
+
+/**
+ * @typedef {Object} ConformanceOptions
+ * @property {Record} classes - `classes` of the component provided by `@material-ui/styles`
+ * @property {import('react').ElementType} inheritComponent - The element type that receives spread props.
+ * @property {function} mount - Should be a return value from createMount
+ * @property {Array} [only] - If specified only run the tests listed
+ * @property {any} refInstanceof - `ref` will be an instanceof this constructor.
+ * @property {Array} [skip] - Skip the specified tests
+ * @property {string} [testComponentPropWith] - The host component that should be rendered instead.
+ */
+
+/**
+ * Tests various aspects of a component that should be equal across Material-UI
+ * components.
+ *
+ * @param {React.ReactElement} minimalElement - the component with it's minimal required props
+ * @param {() => ConformanceOptions} getOptions
+ *
+ */
+export default function describeConformance(minimalElement, getOptions) {
+ const { after: runAfterHook = () => {}, only = Object.keys(fullSuite), skip = [] } = getOptions();
+ describe('Material-UI component API', () => {
+ after(runAfterHook);
+
+ Object.keys(fullSuite)
+ .filter((testKey) => only.indexOf(testKey) !== -1 && skip.indexOf(testKey) === -1)
+ .forEach((testKey) => {
+ const test = fullSuite[testKey];
+ test(minimalElement, getOptions);
+ });
+ });
+}
diff --git a/test/utils/findOutermostIntrinsic.js b/test/utils/findOutermostIntrinsic.js
new file mode 100644
index 0000000000000..4756ab19f05ab
--- /dev/null
+++ b/test/utils/findOutermostIntrinsic.js
@@ -0,0 +1,19 @@
+/**
+ * checks if a given react wrapper wraps an intrinsic element i.e. a DOM node
+ *
+ * @param {import('enzyme').ReactWrapper} reactWrapper
+ * @returns {boolean} true if the given reactWrapper wraps an intrinsic element
+ */
+export function wrapsIntrinsicElement(reactWrapper) {
+ return typeof reactWrapper.type() === 'string';
+}
+
+/**
+ * like ReactWrapper#getDOMNode() but returns a ReactWrapper
+ *
+ * @param {import('enzyme').ReactWrapper} reactWrapper
+ * @returns {import('enzyme').ReactWrapper} the wrapper for the outermost DOM node
+ */
+export default function findOutermostIntrinsic(reactWrapper) {
+ return reactWrapper.findWhere((n) => n.exists() && wrapsIntrinsicElement(n)).first();
+}
diff --git a/test/utils/findOutermostIntrinsic.test.js b/test/utils/findOutermostIntrinsic.test.js
new file mode 100644
index 0000000000000..1e116d779051a
--- /dev/null
+++ b/test/utils/findOutermostIntrinsic.test.js
@@ -0,0 +1,68 @@
+import * as React from 'react';
+import { expect } from 'chai';
+import { createMount } from 'test/utils';
+import findOutermostIntrinsic from './findOutermostIntrinsic';
+
+describe('findOutermostIntrinsic', () => {
+ const mount = createMount({ strict: null });
+ const expectIntrinsic = (node, expected) => {
+ const wrapper = mount(node);
+ const outermostIntrinsic = findOutermostIntrinsic(wrapper);
+
+ if (expected === null) {
+ expect(outermostIntrinsic.exists()).to.equal(false);
+ } else {
+ expect(outermostIntrinsic.type()).to.equal(expected);
+ expect(outermostIntrinsic.type()).to.equal(
+ outermostIntrinsic.getDOMNode().nodeName.toLowerCase(),
+ );
+ }
+ };
+ const Headless = ({ children }) => children;
+
+ it('returns immediate DOM nodes', () => {
+ expectIntrinsic(Hello, World!
, 'div');
+ });
+
+ it('only returns the outermost', () => {
+ expectIntrinsic(
+
+ Hello, World!
+ ,
+ 'span',
+ );
+ });
+
+ it('ignores components', () => {
+ expectIntrinsic(
+
+ Hello, World!
+ ,
+ 'div',
+ );
+ expectIntrinsic(
+
+
+ Hello, World!
+
+ ,
+ 'div',
+ );
+ expectIntrinsic(
+
+
+
+
+ Hello, World!
+
+
+
+ ,
+ 'div',
+ );
+ });
+
+ it('can handle that no DOM node is rendered', () => {
+ expectIntrinsic({false && }, null);
+ });
+});
diff --git a/test/utils/getClasses.js b/test/utils/getClasses.js
new file mode 100644
index 0000000000000..6268173a7f77f
--- /dev/null
+++ b/test/utils/getClasses.js
@@ -0,0 +1,22 @@
+import * as React from 'react';
+import createShallow from './createShallow';
+
+const shallow = createShallow();
+
+/**
+ * Extracts the available classes for the `classes` prop of the given component
+ * @param {React.ReactElement} element - An element created from a Material-UI component that implements the `classes` prop.
+ * @returns {Record}
+ */
+export default function getClasses(element) {
+ const { useStyles } = element.type;
+
+ let classes;
+ function Listener() {
+ classes = useStyles(element.props);
+ return null;
+ }
+ shallow();
+
+ return classes;
+}
diff --git a/test/utils/index.js b/test/utils/index.js
new file mode 100644
index 0000000000000..6c7e15d0f697b
--- /dev/null
+++ b/test/utils/index.js
@@ -0,0 +1,8 @@
+export * from './components';
+export { default as describeConformance } from './describeConformance';
+export * from './createClientRender';
+export { default as createMount } from './createMount';
+export { default as createServerRender } from './createServerRender';
+export { default as createShallow } from './createShallow';
+export { default as findOutermostIntrinsic, wrapsIntrinsicElement } from './findOutermostIntrinsic';
+export { default as getClasses } from './getClasses';
diff --git a/test/utils/init.d.ts b/test/utils/init.d.ts
new file mode 100644
index 0000000000000..936b4442bb496
--- /dev/null
+++ b/test/utils/init.d.ts
@@ -0,0 +1,51 @@
+///
+
+declare namespace Chai {
+ interface Assertion {
+ /**
+ * checks if the element in question is considered aria-hidden
+ * Does not replace accessibility check as that requires display/visibility/layout
+ * @deprecated Use `inaccessible` + `visible` instead
+ */
+ toBeAriaHidden(): void;
+ /**
+ * Check if an element is not visually hidden
+ */
+ toBeVisible(): void;
+ /**
+ * checks if the element is inaccessible
+ */
+ toBeInaccessible(): void;
+ /**
+ * checks if the accessible name computation (according to `accname` spec)
+ * matches the expectation.
+ * @see https://www.w3.org/TR/accname-1.2/
+ * @param name
+ */
+ toHaveAccessibleName(name: string): void;
+ /**
+ * checks if the element is focused
+ */
+ toHaveFocus(): void;
+ /**
+ * checks if the element is the active-descendant of the active element.
+ */
+ toHaveVirtualFocus(): void;
+ /**
+ * Matches calls to `console.warn` in the asserted callback.
+ *
+ * @example expect(() => render()).not.toWarnDev()
+ * @example expect(() => render()).toWarnDev('single message')
+ * @example expect(() => render()).toWarnDev(['first warning', 'then the second'])
+ */
+ toWarnDev(messages?: string | string[]): void;
+ /**
+ * Matches calls to `console.error` in the asserted callback.
+ *
+ * @example expect(() => render()).not.toErrorDev()
+ * @example expect(() => render()).toErrorDev('single message')
+ * @example expect(() => render()).toErrorDev(['first warning', 'then the second'])
+ */
+ toErrorDev(messages?: string | string[]): void;
+ }
+}
diff --git a/test/utils/init.js b/test/utils/init.js
new file mode 100644
index 0000000000000..fee2ab944c79b
--- /dev/null
+++ b/test/utils/init.js
@@ -0,0 +1,15 @@
+import enzyme from 'enzyme';
+import Adapter from 'enzyme-adapter-react-16';
+import * as testingLibrary from '@testing-library/react/pure';
+import './initMatchers';
+
+enzyme.configure({ adapter: new Adapter() });
+
+// checking if an element is hidden is quite expensive
+// this is only done in CI as a fail safe. It can still explicitly be checked
+// in the test files which helps documenting what is part of the DOM but hidden
+// from assistive technology
+const defaultHidden = !process.env.CI;
+// adds verbosity for something that might be confusing
+console.warn(`${defaultHidden ? 'including' : 'excluding'} inaccessible elements by default`);
+testingLibrary.configure({ defaultHidden });
diff --git a/test/utils/initMatchers.js b/test/utils/initMatchers.js
new file mode 100644
index 0000000000000..66b69bd21300b
--- /dev/null
+++ b/test/utils/initMatchers.js
@@ -0,0 +1,303 @@
+import chai from 'chai';
+import chaiDom from 'chai-dom';
+import { isInaccessible } from '@testing-library/dom';
+import { prettyDOM } from '@testing-library/react/pure';
+import { computeAccessibleName } from 'dom-accessibility-api';
+import formatUtil from 'format-util';
+
+// chai#utils.elToString that looks like stringified elements in testing-library
+function elementToString(element) {
+ if (typeof element?.nodeType === 'number') {
+ return prettyDOM(element, undefined, { highlight: true, maxDepth: 1 });
+ }
+ return String(element);
+}
+
+chai.use(chaiDom);
+chai.use((chaiAPI, utils) => {
+ // better diff view for expect(element).to.equal(document.activeElement)
+ chai.Assertion.addMethod('toHaveFocus', function elementIsFocused() {
+ const element = utils.flag(this, 'object');
+
+ this.assert(
+ element === document.activeElement,
+ 'expected element to have focus',
+ `expected element to NOT have focus \n${elementToString(element)}`,
+ elementToString(element),
+ elementToString(document.activeElement),
+ );
+ });
+
+ chai.Assertion.addMethod('toHaveVirtualFocus', function elementIsVirtuallyFocused() {
+ const element = utils.flag(this, 'object');
+ const id = element.getAttribute('id');
+
+ const virutallyFocusedElement = document.activeElement.getAttribute('aria-activedescendant');
+
+ this.assert(
+ virutallyFocusedElement === id,
+ 'expected element to be virtually focused',
+ 'expected element to NOT to be virtually focused',
+ id,
+ virutallyFocusedElement,
+ );
+ });
+
+ chai.Assertion.addMethod('toBeAriaHidden', function elementIsAccessible() {
+ const element = utils.flag(this, 'object');
+
+ // used for debugging failed assertions, will either point to the top most node
+ // or the node that had aria-hidden="true"
+ let previousNode = element;
+ let currentNode = element;
+ let ariaHidden = false;
+ // "An element is considered hidden if it, or any of its ancestors are not
+ // rendered or have their aria-hidden attribute value set to true."
+ // -- https://www.w3.org/TR/wai-aria-1.1/#aria-hidden
+ while (
+ currentNode !== null &&
+ // stoping at so that failed assertion message only prints
+ // or below. use cases for aria-hidden on are unknown
+ currentNode !== document.documentElement &&
+ ariaHidden === false
+ ) {
+ ariaHidden = currentNode.getAttribute('aria-hidden') === 'true';
+ previousNode = currentNode;
+ currentNode = currentNode.parentElement;
+ }
+
+ this.assert(
+ ariaHidden === true,
+ `expected \n${elementToString(element)} to be aria-hidden`,
+ `expected \n${elementToString(element)} to not be aria-hidden, but \n${elementToString(
+ previousNode,
+ )} had aria-hidden="true" instead`,
+ );
+ });
+
+ chai.Assertion.addMethod('toBeInaccessible', function elementIsAccessible() {
+ const element = utils.flag(this, 'object');
+
+ const inaccessible = isInaccessible(element);
+
+ this.assert(
+ inaccessible === true,
+ `expected \n${elementToString(element)} to be inaccessible but it was accessible`,
+ `expected \n${elementToString(element)} to be accessible but it was inaccessible`,
+ );
+ });
+
+ chai.Assertion.addMethod('toHaveAccessibleName', function hasAccessibleName(expectedName) {
+ const root = utils.flag(this, 'object');
+ // make sure it's an Element
+ new chai.Assertion(root.nodeType, `Expected an Element but got '${String(root)}'`).to.equal(1);
+
+ const blockElements = new Set(
+ 'html',
+ 'address',
+ 'blockquote',
+ 'body',
+ 'dd',
+ 'div',
+ 'dl',
+ 'dt',
+ 'fieldset',
+ 'form',
+ 'frame',
+ 'frameset',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'noframes',
+ 'ol',
+ 'p',
+ 'ul',
+ 'center',
+ 'dir',
+ 'hr',
+ 'menu',
+ 'pre',
+ );
+ /**
+ *
+ * @param {Element} element
+ * @returns {CSSStyleDeclaration}
+ */
+ function pretendVisibleGetComputedStyle(element) {
+ // `CSSStyleDeclaration` is not constructable
+ // https://stackoverflow.com/a/52732909/3406963
+ // this is not equivalent to the declaration from `getComputedStyle`
+ // e.g `getComputedStyle` would return a readonly declaration
+ // let's hope this doesn't get passed around until it's no longer clear where it comes from
+ const declaration = document.createElement('span').style;
+
+ // initial values
+ declaration.content = '';
+ // technically it's `inline`. We partially apply the default user agent sheet (chrome) here
+ // we're only interested in elements that use block
+ declaration.display = blockElements.has(element.tagName) ? 'block' : 'inline';
+ declaration.visibility = 'visible';
+
+ return declaration;
+ }
+
+ const actualName = computeAccessibleName(root, {
+ // in local development we pretend to be visible. full getComputedStyle is
+ // expensive and reserved for CI
+ getComputedStyle: process.env.CI ? undefined : pretendVisibleGetComputedStyle,
+ });
+
+ this.assert(
+ actualName === expectedName,
+ `expected \n${elementToString(root)} to have accessible name #{exp} but got #{act} instead.`,
+ `expected \n${elementToString(root)} not to have accessible name #{exp}.`,
+ expectedName,
+ actualName,
+ );
+ });
+
+ /**
+ * Correct name for `to.be.visible`
+ */
+ chai.Assertion.addMethod('toBeVisible', function toBeVisible() {
+ // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unused-expressions
+ new chai.Assertion(this._obj).to.be.visible;
+ });
+});
+
+chai.use((chaiAPI, utils) => {
+ function addConsoleMatcher(matcherName, methodName) {
+ /**
+ * @param {string[]} expectedMessages
+ */
+ function matcher(expectedMessages = []) {
+ // documented pattern to get the actual value of the assertion
+ // eslint-disable-next-line no-underscore-dangle
+ const callback = this._obj;
+
+ if (process.env.NODE_ENV !== 'production') {
+ const remainingMessages =
+ typeof expectedMessages === 'string' ? [expectedMessages] : expectedMessages.slice();
+ const unexpectedMessages = [];
+ let caughtError = null;
+
+ this.assert(
+ remainingMessages.length > 0,
+ `Expected to call console.${methodName} but didn't provide messages. ` +
+ `If you don't expect any messages prefer \`expect().not.${matcherName}();\`.`,
+ `Expected no call to console.${methodName} while also expecting messages.` +
+ 'Expected no call to console.error but provided messages. ' +
+ "If you want to make sure a certain message isn't logged prefer the positive. " +
+ 'By expecting certain messages you automatically expect that no other messages are logged',
+ );
+
+ // eslint-disable-next-line no-console
+ const originalMethod = console[methodName];
+
+ const consoleMatcher = (format, ...args) => {
+ const actualMessage = formatUtil(format, ...args);
+ const expectedMessage = remainingMessages.shift();
+
+ let message = null;
+ if (expectedMessage === undefined) {
+ message = `Expected no more error messages but got:\n"${actualMessage}"`;
+ } else if (!actualMessage.includes(expectedMessage)) {
+ message = `Expected "${actualMessage}"\nto include\n"${expectedMessage}"`;
+ }
+
+ if (message !== null) {
+ const error = new Error(message);
+
+ const { stack: fullStack } = error;
+ const fullStacktrace = fullStack.replace(`Error: ${message}\n`, '').split('\n');
+
+ const usefulStacktrace = fullStacktrace
+ //
+ // first line points to this frame which is irrelevant for the tester
+ .slice(1);
+ const usefulStack = `${message}\n${usefulStacktrace.join('\n')}`;
+
+ error.stack = usefulStack;
+ unexpectedMessages.push(error);
+ }
+ };
+ // eslint-disable-next-line no-console
+ console[methodName] = consoleMatcher;
+
+ try {
+ callback();
+ } catch (error) {
+ caughtError = error;
+ } finally {
+ // eslint-disable-next-line no-console
+ console[methodName] = originalMethod;
+
+ // unexpected thrown error takes precedence over unexpected console call
+ if (caughtError !== null) {
+ // not the same pattern as described in the block because we don't rethrow in the catch
+ // eslint-disable-next-line no-unsafe-finally
+ throw caughtError;
+ }
+
+ const formatMessages = (messages) => {
+ const formattedMessages = messages.map((message) => {
+ if (typeof message === 'string') {
+ return `"${message}"`;
+ }
+ // full Error
+ return `${message.stack}`;
+ });
+ return `\n\n - ${formattedMessages.join('\n\n- ')}`;
+ };
+
+ const shouldHaveWarned = utils.flag(this, 'negate') !== true;
+
+ // unreachable from expect().not.toWarnDev(messages)
+ if (unexpectedMessages.length > 0) {
+ const unexpectedMessageRecordedMessage = `Recorded unexpected console.${methodName} calls: ${formatMessages(
+ unexpectedMessages,
+ )}`;
+ // chai will duplicate the stack frames from the unexpected calls in their assertion error
+ // it's not ideal but the test failure is located the second to last stack frame
+ // and the origin of the call is the second stackframe in the stack
+ this.assert(
+ // force chai to always trigger an assertion error
+ !shouldHaveWarned,
+ unexpectedMessageRecordedMessage,
+ unexpectedMessageRecordedMessage,
+ );
+ }
+
+ if (shouldHaveWarned) {
+ this.assert(
+ remainingMessages.length === 0,
+ `Could not match the following console.${methodName} calls. ` +
+ `Make sure previous actions didn't call console.${methodName} by wrapping them in expect(() => {}).not.${matcherName}(): ${formatMessages(
+ remainingMessages,
+ )}`,
+ `Impossible state reached in \`expect().${matcherName}()\`. ` +
+ `This is a bug in the matcher.`,
+ );
+ }
+ }
+ } else {
+ // nothing to do in prod
+ // If there are still console calls than our test setup throws.
+ callback();
+ }
+ }
+
+ chai.Assertion.addMethod(matcherName, matcher);
+ /* eslint-enable no-console */
+ }
+
+ /**
+ * @example expect(() => render()).toWarnDev('single message')
+ * @example expect(() => render()).toWarnDev(['first warning', 'then the second'])
+ */
+ addConsoleMatcher('toWarnDev', 'warn');
+ addConsoleMatcher('toErrorDev', 'error');
+});
diff --git a/test/utils/initMatchers.test.js b/test/utils/initMatchers.test.js
new file mode 100644
index 0000000000000..74cf9fd398674
--- /dev/null
+++ b/test/utils/initMatchers.test.js
@@ -0,0 +1,120 @@
+import { expect } from 'chai';
+import { createSandbox } from 'sinon';
+
+describe('custom matchers', () => {
+ const consoleSandbox = createSandbox();
+
+ beforeEach(() => {
+ // otherwise our global setup throws on unexpected calls in afterEach
+ consoleSandbox.stub(console, 'warn');
+ consoleSandbox.stub(console, 'error');
+ });
+
+ afterEach(() => {
+ consoleSandbox.restore();
+ });
+
+ describe('toErrorDev()', () => {
+ it('passes if the message is exactly the same', () => {
+ expect(() => console.error('expected message')).toErrorDev('expected message');
+ });
+
+ it('passes if the message is a subset', () => {
+ expect(() => console.error('expected message')).toErrorDev('pected messa');
+ });
+
+ it('passes if multiple messages are expected', () => {
+ expect(() => {
+ console.error('expected message');
+ console.error('another message');
+ }).toErrorDev(['expected message', 'another message']);
+ });
+
+ it('fails if an expected console.error call wasnt recorded with a useful stacktrace', () => {
+ let caughtError;
+ try {
+ console.error('expected message');
+ expect(() => {}).toErrorDev('expected message');
+ } catch (error) {
+ caughtError = error;
+ }
+
+ expect(caughtError).to.have.property('stack');
+ expect(caughtError.stack).to.include(
+ 'Could not match the following console.error calls. ' +
+ "Make sure previous actions didn't call console.error by wrapping them in expect(() => {}).not.toErrorDev(): \n\n" +
+ ' - "expected message"\n' +
+ ' at Context.',
+ );
+ // check that the top stackframe points to this test
+ // if this test is moved to another file the next assertion fails
+ expect(caughtError.stack).to.match(
+ /- "expected message"\s+at Context\. \(.+\/initMatchers\.test\.js:\d+:\d+\)/,
+ );
+ });
+
+ it('is case sensitive', () => {
+ let caughtError;
+ try {
+ expect(() => console.error('expected Message')).toErrorDev('expected message');
+ } catch (error) {
+ caughtError = error;
+ }
+
+ expect(caughtError).to.have.property('stack');
+ expect(caughtError.stack).to.include(
+ 'Recorded unexpected console.error calls: \n\n' +
+ ' - Expected "expected Message"\n' +
+ 'to include\n' +
+ '"expected message"\n' +
+ ' at callback',
+ );
+ // check that the top stackframe points to this test
+ // if this test is moved to another file the next assertion fails
+ expect(caughtError.stack).to.match(
+ /"expected message"\s+at callback \(.+\/initMatchers\.test\.js:\d+:\d+\)/,
+ );
+ });
+
+ it('fails if the order of calls does not match', () => {
+ expect(() => {
+ expect(() => {
+ console.error('another message');
+ console.error('expected message');
+ }).toErrorDev(['expected message', 'another message']);
+ }).to.throw('Recorded unexpected console.error calls');
+ });
+
+ it('fails if there are fewer messages than expected', () => {
+ expect(() => {
+ expect(() => {
+ console.error('expected message');
+ }).toErrorDev(['expected message', 'another message']);
+ }).to.throw('Could not match the following console.error calls');
+ });
+
+ it('passes if no messages were recored if expected', () => {
+ expect(() => {}).not.toErrorDev();
+ expect(() => {}).not.toErrorDev([]);
+ });
+
+ it('fails if no arguments are used as a way of negating', () => {
+ expect(() => {
+ expect(() => {}).toErrorDev();
+ }).to.throw(
+ "Expected to call console.error but didn't provide messages. " +
+ "If you don't expect any messages prefer `expect().not.toErrorDev();",
+ );
+ });
+
+ it('fails if arguments are passed when negated', () => {
+ expect(() => {
+ expect(() => {}).not.toErrorDev('not unexpected?');
+ }).to.throw(
+ 'Expected no call to console.error but provided messages. ' +
+ "If you want to make sure a certain message isn't logged prefer the positive. " +
+ 'By expecting certain messages you automatically expect that no other messages are logged',
+ );
+ });
+ });
+});
diff --git a/test/utils/setup.js b/test/utils/setup.js
new file mode 100644
index 0000000000000..767a0ed5b9a89
--- /dev/null
+++ b/test/utils/setup.js
@@ -0,0 +1,80 @@
+const formatUtil = require('format-util');
+const Mocha = require('mocha');
+const createDOM = require('./createDOM');
+
+process.browser = true;
+
+require('@babel/register')({ extensions: ['.js', '.ts', '.tsx'] });
+
+// Enable missing act warnings: https://github.com/facebook/react/blob/v16.13.1/packages/react-reconciler/src/ReactFiberHooks.js#L965
+// TODO: Revisit once https://github.com/facebook/react/issues/15439 is resolved.
+global.jest = null;
+
+createDOM();
+require('./init');
+
+const mochaHooks = {
+ beforeEach: [],
+ afterEach: [],
+};
+
+function throwOnUnexpectedConsoleMessages(methodName, expectedMatcher) {
+ const unexpectedCalls = [];
+ const stackTraceFilter = Mocha.utils.stackTraceFilter();
+
+ function logUnexpectedConsoleCalls(format, ...args) {
+ const message = formatUtil(format, ...args);
+ // Safe stack so that test dev can track where the unexpected console message was created.
+ const { stack } = new Error();
+
+ unexpectedCalls.push([
+ // first line includes the (empty) error message
+ // i.e. Remove the `Error:` line
+ // second line is this frame
+ stackTraceFilter(stack.split('\n').slice(2).join('\n')),
+ message,
+ ]);
+ }
+ // eslint-disable-next-line no-console
+ console[methodName] = logUnexpectedConsoleCalls;
+
+ mochaHooks.beforeEach.push(function resetUnexpectedCalls() {
+ unexpectedCalls.length = 0;
+ });
+
+ mochaHooks.afterEach.push(function flushUnexpectedCalls() {
+ const hadUnexpectedCalls = unexpectedCalls.length > 0;
+ const formattedCalls = unexpectedCalls.map(([stack, message]) => `${message}\n${stack}`);
+ unexpectedCalls.length = 0;
+
+ // eslint-disable-next-line no-console
+ if (console[methodName] !== logUnexpectedConsoleCalls) {
+ throw new Error(`Did not tear down spy or stub of console.${methodName} in your test.`);
+ }
+ if (hadUnexpectedCalls) {
+ const location = this.currentTest.file;
+ const testPath = `"${this.currentTest.parent
+ .titlePath()
+ .concat(this.currentTest.title)
+ .join('" -> "')}"`;
+ const message =
+ `Expected test not to call console.${methodName}()\n\n` +
+ 'If the warning is expected, test for it explicitly by ' +
+ `using the ${expectedMatcher}() matcher.`;
+
+ const error = new Error(
+ `${location}: ${message}\n\n${formattedCalls.join('\n\n')}\n\n` +
+ `in ${testPath} (${location})`,
+ );
+ // The stack of `flushUnexpectedCalls` is irrelevant.
+ // It includes no clue where the test was triggered
+ error.stack = '';
+ throw error;
+ }
+ });
+}
+
+throwOnUnexpectedConsoleMessages('warn', 'toWarnDev');
+throwOnUnexpectedConsoleMessages('error', 'toErrorDev');
+
+module.exports = { mochaHooks };
diff --git a/test/utils/until.js b/test/utils/until.js
new file mode 100644
index 0000000000000..aab33f8085bf5
--- /dev/null
+++ b/test/utils/until.js
@@ -0,0 +1,28 @@
+function shallowRecursively(wrapper, selector, { context, ...other }) {
+ if (wrapper.isEmptyRender() || typeof wrapper.getElement().type === 'string') {
+ return wrapper;
+ }
+
+ let newContext = context;
+
+ const instance = wrapper.root().instance();
+ // The instance can be null with a stateless functional component and react >= 16.
+ if (instance && instance.getChildContext) {
+ newContext = {
+ ...context,
+ ...instance.getChildContext(),
+ };
+ }
+
+ const nextWrapper = wrapper.shallow({ context: newContext, ...other });
+
+ if (selector && wrapper.is(selector)) {
+ return nextWrapper;
+ }
+
+ return shallowRecursively(nextWrapper, selector, { context: newContext });
+}
+
+export default function until(selector, options = {}) {
+ return this.single('until', () => shallowRecursively(this, selector, options));
+}
diff --git a/test/utils/until.test.js b/test/utils/until.test.js
new file mode 100644
index 0000000000000..c80020c8d38f5
--- /dev/null
+++ b/test/utils/until.test.js
@@ -0,0 +1,111 @@
+import * as React from 'react';
+import { expect } from 'chai';
+import PropTypes from 'prop-types';
+import { shallow } from 'enzyme';
+import until from './until';
+
+const Div = () => ;
+const hoc = (Component) => () => ;
+
+describe('until', () => {
+ it('shallow renders the current wrapper one level deep', () => {
+ const EnhancedDiv = hoc(Div);
+ const wrapper = until.call(shallow(), 'Div');
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ it('shallow renders the current wrapper several levels deep', () => {
+ const EnhancedDiv = hoc(hoc(hoc(Div)));
+ const wrapper = until.call(shallow(), 'Div');
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ it('stops shallow rendering when the wrapper is empty', () => {
+ const nullHoc = () => () => null;
+ const EnhancedDiv = nullHoc();
+ const wrapper = until.call(shallow(), 'Div');
+ expect(wrapper.html()).to.equal(null);
+ });
+
+ it('shallow renders as much as possible when no selector is provided', () => {
+ const EnhancedDiv = hoc(hoc(Div));
+ const wrapper = until.call(shallow());
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ it('shallow renders the current wrapper even if the selector never matches', () => {
+ const EnhancedDiv = hoc(Div);
+ const wrapper = until.call(shallow(), 'NotDiv');
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ it('stops shallow rendering when it encounters a HTML element', () => {
+ const wrapper = until.call(
+ shallow(
+ ,
+ ),
+ 'Div',
+ );
+ expect(
+ wrapper.contains(
+ ,
+ ),
+ ).to.equal(true);
+ });
+
+ it('throws when until called on an empty wrapper', () => {
+ expect(() => {
+ until.call(shallow().find('Foo'), 'div');
+ }).to.throw(Error);
+ });
+
+ it('shallow renders non-root wrappers', () => {
+ const Container = () => (
+
+ );
+ const wrapper = until.call(shallow().find(Div));
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ // eslint-disable-next-line react/prefer-stateless-function
+ class Foo extends React.Component {
+ render() {
+ return ;
+ }
+ }
+
+ Foo.contextTypes = {
+ quux: PropTypes.bool.isRequired,
+ };
+
+ it('context propagation passes down context from the root component', () => {
+ const EnhancedFoo = hoc(Foo);
+ const options = { context: { quux: true } };
+ const wrapper = until.call(shallow(, options), 'Foo', options);
+ expect(wrapper.context('quux')).to.equal(true);
+ expect(wrapper.contains()).to.equal(true);
+ });
+
+ class Bar extends React.Component {
+ static childContextTypes = { quux: PropTypes.bool };
+
+ getChildContext = () => ({ quux: true });
+
+ render() {
+ return ;
+ }
+ }
+
+ it('context propagation passes down context from an intermediary component', () => {
+ const EnhancedBar = hoc(Bar);
+ const wrapper = until.call(shallow(), 'Foo');
+ expect(wrapper.context('quux')).to.equal(true);
+ expect(wrapper.contains()).to.equal(true);
+ });
+});
diff --git a/tsconfig.json b/tsconfig.json
index c2866e17ced1e..16f596b65e0d4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,6 +15,17 @@
"jsx": "react",
"sourceMap": true,
"noImplicitAny": false,
- "types": ["jest", "node"]
+ "types": ["jest", "node"],
+ "baseUrl": "./",
+ "paths": {
+ "@material-ui/x-grid": ["./packages/grid/x-grid/src"],
+ "@material-ui/x-grid/*": ["./packages/grid/x-grid/src/*"],
+ "@material-ui/x-grid-modules": ["./packages/grid/x-grid-modules/src"],
+ "@material-ui/x-grid-modules/*": ["./packages/grid/x-grid-modules/src/*"],
+ "@material-ui/x-license": ["./packages/license/src"],
+ "@material-ui/x-license/*": ["./packages/license/src/¨"],
+ "@material-ui/data-grid": ["./packages/grid/data-grid/src"],
+ "@material-ui/data-grid/*": ["./packages/grid/data-grid/src/*"]
+ }
}
}
diff --git a/webpackBaseConfig.js b/webpackBaseConfig.js
new file mode 100644
index 0000000000000..d0ac9d1c4f094
--- /dev/null
+++ b/webpackBaseConfig.js
@@ -0,0 +1,42 @@
+const path = require('path');
+
+// This module isn't used to build the documentation. We use Next.js for that.
+// This module is used by the visual regression tests to run the demos.
+module.exports = {
+ context: path.resolve(__dirname),
+ resolve: {
+ modules: [__dirname, 'node_modules'],
+ alias: {
+ '@material-ui/x-grid': path.resolve(__dirname, './packages/grid/x-grid/src'),
+ '@material-ui/x-grid-modules': path.resolve(__dirname, './packages/grid/x-grid-modules/src'),
+ '@material-ui/x-license': path.resolve(__dirname, './packages/license/src'),
+ '@material-ui/data-grid': path.resolve(__dirname, './packages/grid/data-grid/src'),
+ },
+ extensions: ['.js', '.ts', '.tsx', '.d.ts'],
+ },
+ output: {
+ path: path.join(__dirname, 'build'),
+ filename: 'bundle.js',
+ publicPath: '/build/',
+ },
+ module: {
+ rules: [
+ {
+ test: /\.(js|ts|tsx)$/,
+ exclude: /node_modules/,
+ loader: 'babel-loader',
+ query: {
+ cacheDirectory: true,
+ },
+ },
+ {
+ test: /\.md$/,
+ loader: 'raw-loader',
+ },
+ {
+ test: /\.css$/,
+ loader: 'style-loader!css-loader',
+ },
+ ],
+ },
+};
diff --git a/yarn.lock b/yarn.lock
index 632bbe0451296..221acb8e637b5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -69,14 +69,13 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.10.4", "@babel/generator@^7.4.0", "@babel/generator@^7.9.6":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243"
- integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==
+"@babel/generator@^7.10.4", "@babel/generator@^7.4.0", "@babel/generator@^7.6.2", "@babel/generator@^7.9.6":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
+ integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.10.5"
jsesc "^2.5.1"
- lodash "^4.17.13"
source-map "^0.5.0"
"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4":
@@ -696,6 +695,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
+"@babel/plugin-transform-object-assign@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.4.tgz#f7c8f54ce8052ccd8b9da9b3358848423221c338"
+ integrity sha512-6zccDhYEICfMeQqIjuY5G09/yhKzG30DKHJeYBQUHIsJH7c2jXSGvgwRalufLAXAq432OSlsEfAOLlzEsQzxVw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
"@babel/plugin-transform-object-super@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
@@ -790,6 +796,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
+"@babel/plugin-transform-runtime@^7.10.5":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.5.tgz#3b39b7b24830e0c2d8ff7a4489fe5cf99fbace86"
+ integrity sha512-tV4V/FjElJ9lQtyjr5xD2IFFbgY46r7EeVu5a8CpEKT5laheHKSlFeHjpkPppW3PqzGLAuv5k2qZX5LgVZIX5w==
+ dependencies:
+ "@babel/helper-module-imports" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ resolve "^1.8.1"
+ semver "^5.5.1"
+
"@babel/plugin-transform-shorthand-properties@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
@@ -961,18 +977,18 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-typescript" "^7.10.4"
-"@babel/register@^7.0.0":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.4.tgz#53004ba8b04c4af3cbd84508e03ad150669746e4"
- integrity sha512-whHmgGiWNVyTVnYTSawtDWhaeYsc+noeU8Rmi+MPnbGhDYmr5QpEDMrQcIA07D2RUv0BlThPcN89XcHCqq/O4g==
+"@babel/register@^7.0.0", "@babel/register@^7.10.5":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.5.tgz#354f3574895f1307f79efe37a51525e52fd38d89"
+ integrity sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw==
dependencies:
find-cache-dir "^2.0.0"
- lodash "^4.17.13"
+ lodash "^4.17.19"
make-dir "^2.1.0"
pirates "^4.0.0"
source-map-support "^0.5.16"
-"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.8.3":
+"@babel/runtime-corejs3@^7.10.2":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d"
integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==
@@ -992,7 +1008,7 @@
resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.4.tgz#63b9e211bee42e8ba8dfc1c0b68a856150e37bf2"
integrity sha512-Cgnx+Z7dYqQrz42GPGzDFTph8n15NogWuR9OpocOVlRZQoRw4q+OmudevYAd6CjOVjGu6PgvJwojxCE34cfXPg==
-"@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.8.6":
+"@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.8.6":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
@@ -1016,13 +1032,13 @@
globals "^11.1.0"
lodash "^4.17.13"
-"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.9.6":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee"
- integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==
+"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.6.1", "@babel/types@^7.9.6":
+ version "7.10.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
+ integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
dependencies:
"@babel/helper-validator-identifier" "^7.10.4"
- lodash "^4.17.13"
+ lodash "^4.17.19"
to-fast-properties "^2.0.0"
"@base2/pretty-print-object@1.0.0":
@@ -2705,20 +2721,42 @@
resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25"
integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==
-"@sinonjs/commons@^1.7.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d"
- integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==
+"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.7.2":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
+ integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==
dependencies:
type-detect "4.0.8"
-"@sinonjs/fake-timers@^6.0.1":
+"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
dependencies:
"@sinonjs/commons" "^1.7.0"
+"@sinonjs/formatio@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089"
+ integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==
+ dependencies:
+ "@sinonjs/commons" "^1"
+ "@sinonjs/samsam" "^5.0.2"
+
+"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3":
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938"
+ integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==
+ dependencies:
+ "@sinonjs/commons" "^1.6.0"
+ lodash.get "^4.4.2"
+ type-detect "^4.0.8"
+
+"@sinonjs/text-encoding@^0.7.1":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
+ integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
+
"@storybook/addon-a11y@^5.3.19":
version "5.3.19"
resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-5.3.19.tgz#6a21d200c1e67362ae3680d3beb76bfb4ff6c508"
@@ -4199,6 +4237,11 @@ address@1.1.2, address@^1.0.1:
resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
+after@0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+ integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
+
agent-base@4, agent-base@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
@@ -4312,16 +4355,16 @@ ansi-align@^3.0.0:
dependencies:
string-width "^3.0.0"
+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"
@@ -4412,6 +4455,13 @@ app-root-dir@^1.0.2:
resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118"
integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=
+append-transform@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
+ integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
+ dependencies:
+ default-require-extensions "^3.0.0"
+
aproba@^1.0.3, aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -4422,6 +4472,11 @@ aproba@^2.0.0:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+archy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+ integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
+
are-we-there-yet@~1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
@@ -4480,6 +4535,11 @@ array-find-index@^1.0.1:
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+array-find@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8"
+ integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=
+
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -4561,6 +4621,11 @@ array.prototype.map@^1.0.1:
es-array-method-boxes-properly "^1.0.0"
is-string "^1.0.4"
+arraybuffer.slice@~0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
+ integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
+
arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@@ -4605,6 +4670,11 @@ assert@^1.1.1:
object-assign "^4.1.1"
util "0.10.3"
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
assign-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
@@ -4961,11 +5031,34 @@ babel-plugin-minify-type-constructors@^0.4.3:
dependencies:
babel-helper-is-void-0 "^0.4.3"
+babel-plugin-module-resolver@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.0.0.tgz#8f3a3d9d48287dc1d3b0d5595113adabd36a847f"
+ integrity sha512-3pdEq3PXALilSJ6dnC4wMWr0AZixHRM4utpdpBR9g5QG7B7JwWyukQv7a9hVxkbGFl+nQbrHDqqQOIBtTXTP/Q==
+ dependencies:
+ find-babel-config "^1.2.0"
+ glob "^7.1.6"
+ pkg-up "^3.1.0"
+ reselect "^4.0.0"
+ resolve "^1.13.1"
+
babel-plugin-named-asset-import@^0.3.1:
version "0.3.6"
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be"
integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==
+babel-plugin-optimize-clsx@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-optimize-clsx/-/babel-plugin-optimize-clsx-2.6.1.tgz#2c9b58811bb86553beedd03b69486d370700a7f5"
+ integrity sha512-uPatuZ4FhqsQ23IhoZNOVoVLCFYBvIwVgWJ4WdUbwaZvsooitwbbwwtQxQHljUiCpMEZGkVln/OLMIdwrlCs1g==
+ dependencies:
+ "@babel/generator" "^7.6.2"
+ "@babel/template" "^7.6.0"
+ "@babel/types" "^7.6.1"
+ find-cache-dir "^3.2.0"
+ lodash "^4.17.15"
+ object-hash "^2.0.3"
+
babel-plugin-react-docgen@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.1.0.tgz#1dfa447dac9ca32d625a123df5733a9e47287c26"
@@ -5134,6 +5227,11 @@ babylon@^6.18.0:
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+backo2@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+ integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+
bail@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
@@ -5144,11 +5242,21 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+base64-arraybuffer@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+ integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
+
base64-js@^1.0.2:
version "1.3.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+base64id@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
+ integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
+
base@^0.11.1:
version "0.11.2"
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
@@ -5184,6 +5292,13 @@ before-after-hook@^2.0.0:
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
+better-assert@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+ integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
+ dependencies:
+ callsite "1.0.0"
+
big.js@^3.1.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
@@ -5220,6 +5335,11 @@ bl@^4.0.1:
inherits "^2.0.4"
readable-stream "^3.4.0"
+blob@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
+ integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
+
bluebird@3.7.2, bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -5235,7 +5355,7 @@ bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
-body-parser@1.19.0:
+body-parser@1.19.0, body-parser@^1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -5306,7 +5426,7 @@ braces@^2.3.1, braces@^2.3.2:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@^3.0.1, braces@~3.0.2:
+braces@^3.0.1, braces@^3.0.2, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -5330,6 +5450,11 @@ browser-resolve@^1.11.3:
dependencies:
resolve "1.1.7"
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
@@ -5410,6 +5535,23 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5:
escalade "^3.0.1"
node-releases "^1.1.58"
+browserstack-local@^1.3.7:
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.4.5.tgz#115153ce1d08d58b7575ecf4381d54d10b42d2cf"
+ integrity sha512-0/VdSv2YVXmcnwBb64XThMvjM1HnZJnPdv7CUgQbC5y/N9Wsr0Fu+j1oknE9fC/VPx9CpoSC6CJ0kza42skMSA==
+ dependencies:
+ https-proxy-agent "^4.0.0"
+ is-running "^2.1.0"
+ ps-tree "=1.2.0"
+ temp-fs "^0.9.9"
+
+browserstack@~1.5.1:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.3.tgz#93ab48799a12ef99dbd074dd595410ddb196a7ac"
+ integrity sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==
+ dependencies:
+ https-proxy-agent "^2.2.1"
+
bs-logger@0.x:
version "0.2.6"
resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
@@ -5584,6 +5726,16 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
+caching-transform@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f"
+ integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==
+ dependencies:
+ hasha "^5.0.0"
+ make-dir "^3.0.0"
+ package-hash "^4.0.0"
+ write-file-atomic "^3.0.0"
+
call-me-maybe@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
@@ -5603,6 +5755,11 @@ caller-path@^2.0.0:
dependencies:
caller-callsite "^2.0.0"
+callsite@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+ integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
+
callsites@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
@@ -5740,6 +5897,23 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
+chai-dom@^1.8.2:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/chai-dom/-/chai-dom-1.8.2.tgz#e06353baeafa8fddaaabda96a67f859c111a3c7c"
+ integrity sha512-kk2SnCuJliouO5M58OjA7M8VXN338WAxHOm+LbpjeL09pJgRpXugSC5aj8uwFm/6Lmpcdtq7hf+DldTdBm5/Sw==
+
+chai@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
+ integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.2"
+ deep-eql "^3.0.1"
+ get-func-name "^2.0.0"
+ pathval "^1.1.0"
+ type-detect "^4.0.5"
+
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -5813,6 +5987,11 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+check-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
+ integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+
check-more-types@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
@@ -5830,6 +6009,21 @@ cheerio@^1.0.0-rc.3:
lodash "^4.15.0"
parse5 "^3.0.1"
+chokidar@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
+ integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
+ 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.3.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"
@@ -5849,10 +6043,10 @@ chokidar@^2.0.4, chokidar@^2.1.8:
optionalDependencies:
fsevents "^1.2.7"
-chokidar@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
- integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
+chokidar@^3.0.0, chokidar@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
+ integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
@@ -6128,7 +6322,7 @@ colorette@^1.2.0:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
-colors@^1.1.2:
+colors@^1.1.2, colors@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
@@ -6196,11 +6390,26 @@ compare-func@^1.3.1:
array-ify "^1.0.0"
dot-prop "^3.0.0"
-component-emitter@^1.2.1:
+component-bind@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+ integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
+
+component-emitter@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+
+component-emitter@^1.2.1, component-emitter@~1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+component-inherit@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+ integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
+
compressible@~2.0.16:
version "2.0.18"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
@@ -6271,6 +6480,16 @@ connect-history-api-fallback@^1.6.0:
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+connect@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
+ integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
+ dependencies:
+ debug "2.6.9"
+ finalhandler "1.1.2"
+ parseurl "~1.3.3"
+ utils-merge "1.0.1"
+
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -6408,6 +6627,11 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+ integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
@@ -6555,6 +6779,13 @@ create-react-context@0.3.0, create-react-context@^0.3.0:
gud "^1.0.0"
warning "^4.0.3"
+cross-env@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9"
+ integrity sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@@ -6566,7 +6797,7 @@ cross-spawn@6.0.5, 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.2:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -6842,6 +7073,11 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
+custom-event@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+ integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=
+
cwd@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567"
@@ -6900,6 +7136,16 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
+date-format@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf"
+ integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==
+
+date-format@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95"
+ integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==
+
dateformat@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
@@ -6917,27 +7163,27 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.
dependencies:
ms "2.0.0"
-debug@3.1.0:
+debug@3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
-debug@4, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
-debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
+debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
+debug@4, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
@@ -6956,13 +7202,6 @@ decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
-decamelize@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851"
- integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==
- dependencies:
- xregexp "^4.2.4"
-
decimal.js@^10.2.0:
version "10.2.0"
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
@@ -6978,6 +7217,13 @@ dedent@^0.7.0:
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+deep-eql@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
+ integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
+ dependencies:
+ type-detect "^4.0.0"
+
deep-equal@^1.0.1, deep-equal@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
@@ -7018,6 +7264,13 @@ default-gateway@^4.2.0:
execa "^1.0.0"
ip-regex "^2.1.0"
+default-require-extensions@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96"
+ integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==
+ dependencies:
+ strip-bom "^4.0.0"
+
defaults@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
@@ -7156,6 +7409,11 @@ dezalgo@^1.0.0:
asap "^2.0.0"
wrappy "1"
+di@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+ integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=
+
diff-sequences@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
@@ -7171,6 +7429,11 @@ diff-sequences@^26.0.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6"
integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==
+diff@4.0.2, diff@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -7279,6 +7542,16 @@ dom-helpers@^5.0.1:
"@babel/runtime" "^7.8.7"
csstype "^2.6.7"
+dom-serialize@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+ integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=
+ dependencies:
+ custom-event "~1.0.0"
+ ent "~2.2.0"
+ extend "^3.0.0"
+ void-elements "^2.0.0"
+
dom-serializer@0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
@@ -7526,6 +7799,55 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
+engine.io-client@~3.4.0:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.3.tgz#192d09865403e3097e3575ebfeb3861c4d01a66c"
+ integrity sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==
+ dependencies:
+ component-emitter "~1.3.0"
+ component-inherit "0.0.3"
+ debug "~4.1.0"
+ engine.io-parser "~2.2.0"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ ws "~6.1.0"
+ xmlhttprequest-ssl "~1.5.4"
+ yeast "0.1.2"
+
+engine.io-parser@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed"
+ integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==
+ dependencies:
+ after "0.8.2"
+ arraybuffer.slice "~0.0.7"
+ base64-arraybuffer "0.1.5"
+ blob "0.0.5"
+ has-binary2 "~1.0.2"
+
+engine.io@~3.4.0:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c"
+ integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==
+ dependencies:
+ accepts "~1.3.4"
+ base64id "2.0.0"
+ cookie "0.3.1"
+ debug "~4.1.0"
+ engine.io-parser "~2.2.0"
+ ws "^7.1.2"
+
+enhanced-resolve@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e"
+ integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.2.0"
+ tapable "^0.1.8"
+
enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d"
@@ -7542,6 +7864,11 @@ enquirer@^2.3.5:
dependencies:
ansi-colors "^4.1.1"
+ent@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+ integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
+
entities@^1.1.1, entities@^1.1.2, entities@~1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@@ -7702,6 +8029,11 @@ es5-shim@^4.5.13:
resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.14.tgz#90009e1019d0ea327447cb523deaff8fe45697ef"
integrity sha512-7SwlpL+2JpymWTt8sNLuC2zdhhc+wrfe5cMPI2j0o6WsPdfAiPwmFy2f0AocPB4RQVBOZ9kNTgi5YF7TdhkvEg==
+es6-error@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
es6-iterator@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
@@ -7810,6 +8142,22 @@ eslint-import-resolver-node@^0.3.3:
debug "^2.6.9"
resolve "^1.13.1"
+eslint-import-resolver-webpack@^0.12.2:
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee"
+ integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==
+ dependencies:
+ array-find "^1.0.0"
+ debug "^2.6.9"
+ enhanced-resolve "^0.9.1"
+ find-root "^1.1.0"
+ has "^1.0.3"
+ interpret "^1.2.0"
+ lodash "^4.17.15"
+ node-libs-browser "^1.0.0 || ^2.0.0"
+ resolve "^1.13.1"
+ semver "^5.7.1"
+
eslint-module-utils@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
@@ -8475,7 +8823,7 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
-finalhandler@~1.1.2:
+finalhandler@1.1.2, finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
@@ -8488,6 +8836,14 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
+find-babel-config@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
+ integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
+ dependencies:
+ json5 "^0.5.1"
+ path-exists "^3.0.0"
+
find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
@@ -8497,7 +8853,7 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
make-dir "^2.0.0"
pkg-dir "^3.0.0"
-find-cache-dir@^3.0.0, find-cache-dir@^3.3.1:
+find-cache-dir@^3.0.0, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
@@ -8542,6 +8898,14 @@ find-up@3.0.0, find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
+find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.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"
@@ -8557,14 +8921,6 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
-find-up@^4.0.0, find-up@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
findup-sync@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
@@ -8584,7 +8940,14 @@ flat-cache@^2.0.1:
rimraf "2.6.3"
write "1.0.3"
-flatted@^2.0.0:
+flat@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2"
+ integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==
+ dependencies:
+ is-buffer "~2.0.3"
+
+flatted@^2.0.0, flatted@^2.0.1, flatted@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
@@ -8629,6 +8992,14 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
+foreground-child@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
+ integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^3.0.2"
+
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -8657,6 +9028,11 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+format-util@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271"
+ integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==
+
format@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
@@ -8692,6 +9068,11 @@ from@~0:
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
+fromentries@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d"
+ integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==
+
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
@@ -8839,6 +9220,11 @@ get-caller-file@^2.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+get-func-name@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
+ integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
+
get-package-type@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
@@ -9009,7 +9395,7 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@^7.0.0, glob@^7.0.3, 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==
@@ -9181,6 +9567,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -9241,6 +9632,18 @@ has-ansi@^2.0.0:
dependencies:
ansi-regex "^2.0.0"
+has-binary2@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
+ integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
+ dependencies:
+ isarray "2.0.1"
+
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+ integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
+
has-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
@@ -9326,6 +9729,14 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
+hasha@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c"
+ integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==
+ dependencies:
+ is-stream "^2.0.0"
+ type-fest "^0.8.0"
+
hast-to-hyperscript@^7.0.0:
version "7.0.4"
resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz#7c4c037d9a8ea19b0a3fdb676a26448ad922353d"
@@ -9389,7 +9800,7 @@ hastscript@^5.0.0:
property-information "^5.0.0"
space-separated-tokens "^1.0.0"
-he@1.2.x, he@^1.1.0, he@^1.2.0:
+he@1.2.0, he@1.2.x, he@^1.1.0, he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
@@ -9646,7 +10057,7 @@ http-proxy-middleware@0.19.1:
lodash "^4.17.11"
micromatch "^3.1.10"
-http-proxy@^1.17.0:
+http-proxy@^1.17.0, http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
@@ -9669,7 +10080,7 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-https-proxy-agent@^2.2.3:
+https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3:
version "2.2.4"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
@@ -9855,6 +10266,11 @@ indexes-of@^1.0.1:
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+ integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
+
infer-owner@^1.0.3, infer-owner@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
@@ -9981,7 +10397,7 @@ internal-slot@^1.0.2:
has "^1.0.3"
side-channel "^1.0.2"
-interpret@^1.0.0, interpret@^1.4.0:
+interpret@^1.0.0, interpret@^1.2.0, interpret@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
@@ -10094,7 +10510,7 @@ is-buffer@^1.0.2, is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-is-buffer@^2.0.0:
+is-buffer@^2.0.0, is-buffer@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
@@ -10405,6 +10821,11 @@ is-root@2.1.0:
resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==
+is-running@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-running/-/is-running-2.1.0.tgz#30a73ff5cc3854e4fc25490809e9f5abf8de09e0"
+ integrity sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=
+
is-set@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43"
@@ -10515,11 +10936,21 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+isarray@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
+ integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
+
isarray@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+isbinaryfile@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b"
+ integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -10560,11 +10991,18 @@ istanbul-lib-coverage@^2.0.5:
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49"
integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==
-istanbul-lib-coverage@^3.0.0:
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1:
version "3.0.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec"
integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==
+istanbul-lib-hook@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6"
+ integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==
+ dependencies:
+ append-transform "^2.0.0"
+
istanbul-lib-instrument@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630"
@@ -10588,6 +11026,19 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3:
istanbul-lib-coverage "^3.0.0"
semver "^6.3.0"
+istanbul-lib-processinfo@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c"
+ integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==
+ dependencies:
+ archy "^1.0.0"
+ cross-spawn "^7.0.0"
+ istanbul-lib-coverage "^3.0.0-alpha.1"
+ make-dir "^3.0.0"
+ p-map "^3.0.0"
+ rimraf "^3.0.0"
+ uuid "^3.3.3"
+
istanbul-lib-report@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
@@ -11517,6 +11968,14 @@ js-tokens@^3.0.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+js-yaml@3.13.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
js-yaml@^3.13.1:
version "3.14.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
@@ -11665,7 +12124,7 @@ json5@2.x, json5@^2.1.1, json5@^2.1.2:
dependencies:
minimist "^1.2.5"
-json5@^0.5.0:
+json5@^0.5.0, json5@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
@@ -11801,6 +12260,92 @@ jsx-ast-utils@^2.4.1:
array-includes "^3.1.1"
object.assign "^4.1.0"
+just-extend@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4"
+ integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==
+
+karma-browserstack-launcher@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/karma-browserstack-launcher/-/karma-browserstack-launcher-1.6.0.tgz#2f6000647073e77ae296653b8830b279669766ef"
+ integrity sha512-Y/UWPdHZkHIVH2To4GWHCTzmrsB6H7PBWy6pw+TWz5sr4HW2mcE+Uj6qWgoVNxvQU1Pfn5LQQzI6EQ65p8QbiQ==
+ dependencies:
+ browserstack "~1.5.1"
+ browserstack-local "^1.3.7"
+ q "~1.5.0"
+
+karma-chrome-launcher@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738"
+ integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==
+ dependencies:
+ which "^1.2.1"
+
+karma-mocha-reporter@^2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560"
+ integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA=
+ dependencies:
+ chalk "^2.1.0"
+ log-symbols "^2.1.0"
+ strip-ansi "^4.0.0"
+
+karma-mocha@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d"
+ integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==
+ dependencies:
+ minimist "^1.2.3"
+
+karma-sourcemap-loader@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8"
+ integrity sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=
+ dependencies:
+ graceful-fs "^4.1.2"
+
+karma-webpack@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-4.0.2.tgz#23219bd95bdda853e3073d3874d34447c77bced0"
+ integrity sha512-970/okAsdUOmiMOCY8sb17A2I8neS25Ad9uhyK3GHgmRSIFJbDcNEFE8dqqUhNe9OHiCC9k3DMrSmtd/0ymP1A==
+ dependencies:
+ clone-deep "^4.0.1"
+ loader-utils "^1.1.0"
+ neo-async "^2.6.1"
+ schema-utils "^1.0.0"
+ source-map "^0.7.3"
+ webpack-dev-middleware "^3.7.0"
+
+karma@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/karma/-/karma-5.1.0.tgz#deaa5f3939f75d7d78ded33283fa5f9bb67e9a05"
+ integrity sha512-I3aPbkuIbwuBo6wSog97P5WnnhCgUTsWTu/bEw1vZVQFbXmKO3PK+cfFhZioOgVtJAuQxoyauGNjnwXNHMCxbw==
+ dependencies:
+ body-parser "^1.19.0"
+ braces "^3.0.2"
+ chokidar "^3.0.0"
+ colors "^1.4.0"
+ connect "^3.7.0"
+ di "^0.0.1"
+ dom-serialize "^2.2.1"
+ flatted "^2.0.2"
+ glob "^7.1.6"
+ graceful-fs "^4.2.4"
+ http-proxy "^1.18.1"
+ isbinaryfile "^4.0.6"
+ lodash "^4.17.15"
+ log4js "^6.2.1"
+ mime "^2.4.5"
+ minimatch "^3.0.4"
+ qjobs "^1.2.0"
+ range-parser "^1.2.1"
+ rimraf "^3.0.2"
+ socket.io "^2.3.0"
+ source-map "^0.6.1"
+ tmp "0.2.1"
+ ua-parser-js "0.7.21"
+ yargs "^15.3.1"
+
killable@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -12187,6 +12732,13 @@ lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
log-symbols@^2.1.0, log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
@@ -12201,6 +12753,17 @@ log-symbols@^4.0.0:
dependencies:
chalk "^4.0.0"
+log4js@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb"
+ integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==
+ dependencies:
+ date-format "^3.0.0"
+ debug "^4.1.1"
+ flatted "^2.0.1"
+ rfdc "^1.1.4"
+ streamroller "^2.2.4"
+
loglevel@^1.6.8:
version "1.6.8"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171"
@@ -12538,6 +13101,11 @@ memoizerific@^1.11.3:
dependencies:
map-or-similar "^1.5.0"
+memory-fs@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290"
+ integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA=
+
memory-fs@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -12690,7 +13258,7 @@ mime@1.6.0, mime@^1.4.1:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-mime@^2.0.3, mime@^2.4.4:
+mime@^2.0.3, mime@^2.4.4, mime@^2.4.5:
version "2.4.6"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
@@ -12769,7 +13337,7 @@ minimist-options@^4.0.2:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
-minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -12886,6 +13454,37 @@ mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
+mocha@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.0.1.tgz#fe01f0530362df271aa8f99510447bc38b88d8ed"
+ integrity sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==
+ dependencies:
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.3.1"
+ debug "3.2.6"
+ diff "4.0.2"
+ escape-string-regexp "1.0.5"
+ find-up "4.1.0"
+ glob "7.1.6"
+ growl "1.10.5"
+ he "1.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
+ minimatch "3.0.4"
+ ms "2.1.2"
+ object.assign "4.1.0"
+ promise.allsettled "1.0.2"
+ serialize-javascript "3.0.0"
+ strip-json-comments "3.0.1"
+ supports-color "7.1.0"
+ which "2.0.2"
+ wide-align "1.1.3"
+ workerpool "6.0.0"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
+
modify-values@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
@@ -12918,7 +13517,7 @@ ms@2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-ms@^2.0.0, ms@^2.1.1:
+ms@2.1.2, ms@^2.0.0, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -13028,6 +13627,17 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+nise@^4.0.1:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd"
+ integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+ "@sinonjs/fake-timers" "^6.0.0"
+ "@sinonjs/text-encoding" "^0.7.1"
+ just-extend "^4.0.2"
+ path-to-regexp "^1.7.0"
+
no-case@^2.2.0:
version "2.3.2"
resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
@@ -13099,7 +13709,7 @@ node-int64@^0.4.0:
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-node-libs-browser@^2.2.1:
+"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
@@ -13156,6 +13766,13 @@ node-notifier@^7.0.0:
uuid "^7.0.3"
which "^2.0.2"
+node-preload@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
+ integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==
+ dependencies:
+ process-on-spawn "^1.0.0"
+
node-releases@^1.1.29, node-releases@^1.1.58:
version "1.1.58"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935"
@@ -13316,6 +13933,39 @@ nwsapi@^2.2.0:
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+nyc@^15.1.0:
+ version "15.1.0"
+ resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02"
+ integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==
+ dependencies:
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ caching-transform "^4.0.0"
+ convert-source-map "^1.7.0"
+ decamelize "^1.2.0"
+ find-cache-dir "^3.2.0"
+ find-up "^4.1.0"
+ foreground-child "^2.0.0"
+ get-package-type "^0.1.0"
+ glob "^7.1.6"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-hook "^3.0.0"
+ istanbul-lib-instrument "^4.0.0"
+ istanbul-lib-processinfo "^2.0.2"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.0.2"
+ make-dir "^3.0.0"
+ node-preload "^0.2.1"
+ p-map "^3.0.0"
+ process-on-spawn "^1.0.0"
+ resolve-from "^5.0.0"
+ rimraf "^3.0.0"
+ signal-exit "^3.0.2"
+ spawn-wrap "^2.0.0"
+ test-exclude "^6.0.0"
+ yargs "^15.0.2"
+
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
@@ -13326,6 +13976,11 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+object-component@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+ integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
+
object-copy@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
@@ -13335,6 +13990,11 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
+object-hash@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
+ integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
+
object-inspect@^1.7.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
@@ -13360,7 +14020,7 @@ object-visit@^1.0.0:
dependencies:
isobject "^3.0.0"
-object.assign@^4.1.0:
+object.assign@4.1.0, object.assign@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
@@ -13680,6 +14340,16 @@ p-waterfall@^1.0.0:
dependencies:
p-reduce "^1.0.0"
+package-hash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506"
+ integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==
+ dependencies:
+ graceful-fs "^4.1.15"
+ hasha "^5.0.0"
+ lodash.flattendeep "^4.4.0"
+ release-zalgo "^1.0.0"
+
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
@@ -13822,6 +14492,20 @@ parse5@^3.0.1:
dependencies:
"@types/node" "*"
+parseqs@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+ integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
+ dependencies:
+ better-assert "~1.0.0"
+
+parseuri@0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+ integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
+ dependencies:
+ better-assert "~1.0.0"
+
parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -13932,6 +14616,11 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+pathval@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
+ integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
+
pause-stream@0.0.11:
version "0.0.11"
resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
@@ -13960,7 +14649,7 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2:
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1, picomatch@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
@@ -14039,6 +14728,13 @@ pkg-up@2.0.0:
dependencies:
find-up "^2.1.0"
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
pn@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
@@ -14595,7 +15291,7 @@ pretty-error@^2.0.2, pretty-error@^2.1.1:
renderkid "^2.0.1"
utila "~0.4"
-pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0:
+"pretty-format-v24@npm:pretty-format@24", pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
@@ -14654,6 +15350,13 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+process-on-spawn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93"
+ integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
+ dependencies:
+ fromentries "^1.2.0"
+
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@@ -14677,7 +15380,7 @@ promise-retry@^1.1.1:
err-code "^1.0.0"
retry "^0.10.0"
-promise.allsettled@^1.0.0:
+promise.allsettled@1.0.2, promise.allsettled@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9"
integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==
@@ -14784,7 +15487,7 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-ps-tree@1.2.0:
+ps-tree@1.2.0, ps-tree@=1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd"
integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==
@@ -14975,11 +15678,16 @@ puppeteer@^4.0.0:
unbzip2-stream "^1.3.3"
ws "^7.2.3"
-q@^1.1.2, q@^1.5.1:
+q@^1.1.2, q@^1.5.1, q@~1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+qjobs@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
+ integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==
+
qs@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
@@ -15569,6 +16277,13 @@ readdirp@^2.2.1:
micromatch "^3.1.10"
readable-stream "^2.0.2"
+readdirp@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
+ integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==
+ dependencies:
+ picomatch "^2.0.7"
+
readdirp@~3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
@@ -15757,6 +16472,13 @@ relateurl@0.2.x, relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+release-zalgo@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"
+ integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=
+ dependencies:
+ es6-error "^4.0.1"
+
remark-external-links@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-5.0.0.tgz#e7fc0e0cc4c92d33fb195b08ed1dc691fdb1689a"
@@ -15949,6 +16671,11 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+reselect@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
+ integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==
+
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
@@ -16021,7 +16748,7 @@ resolve@1.15.1:
dependencies:
path-parse "^1.0.6"
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.3.2:
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1:
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -16064,6 +16791,11 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+rfdc@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2"
+ integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==
+
rgb-regex@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@@ -16102,6 +16834,13 @@ rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
+rimraf@~2.5.2:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
+ integrity sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=
+ dependencies:
+ glob "^7.0.5"
+
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -16402,6 +17141,11 @@ send@0.17.1:
range-parser "~1.2.1"
statuses "~1.5.0"
+serialize-javascript@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e"
+ integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==
+
serialize-javascript@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
@@ -16603,6 +17347,19 @@ simplebar@^4.2.3:
lodash.throttle "^4.1.1"
resize-observer-polyfill "^1.5.1"
+sinon@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d"
+ integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==
+ dependencies:
+ "@sinonjs/commons" "^1.7.2"
+ "@sinonjs/fake-timers" "^6.0.1"
+ "@sinonjs/formatio" "^5.0.1"
+ "@sinonjs/samsam" "^5.0.3"
+ diff "^4.0.2"
+ nise "^4.0.1"
+ supports-color "^7.1.0"
+
sisteransi@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -16672,6 +17429,61 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
+socket.io-adapter@~1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9"
+ integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==
+
+socket.io-client@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4"
+ integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==
+ dependencies:
+ backo2 "1.0.2"
+ base64-arraybuffer "0.1.5"
+ component-bind "1.0.0"
+ component-emitter "1.2.1"
+ debug "~4.1.0"
+ engine.io-client "~3.4.0"
+ has-binary2 "~1.0.2"
+ has-cors "1.1.0"
+ indexof "0.0.1"
+ object-component "0.0.3"
+ parseqs "0.0.5"
+ parseuri "0.0.5"
+ socket.io-parser "~3.3.0"
+ to-array "0.1.4"
+
+socket.io-parser@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
+ integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
+ dependencies:
+ component-emitter "1.2.1"
+ debug "~3.1.0"
+ isarray "2.0.1"
+
+socket.io-parser@~3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a"
+ integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==
+ dependencies:
+ component-emitter "1.2.1"
+ debug "~4.1.0"
+ isarray "2.0.1"
+
+socket.io@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb"
+ integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==
+ dependencies:
+ debug "~4.1.0"
+ engine.io "~3.4.0"
+ has-binary2 "~1.0.2"
+ socket.io-adapter "~1.1.0"
+ socket.io-client "2.3.0"
+ socket.io-parser "~3.4.0"
+
sockjs-client@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
@@ -16793,6 +17605,18 @@ space-separated-tokens@^1.0.0, space-separated-tokens@^1.1.2:
resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
+spawn-wrap@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e"
+ integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==
+ dependencies:
+ foreground-child "^2.0.0"
+ is-windows "^1.0.2"
+ make-dir "^3.0.0"
+ rimraf "^3.0.0"
+ signal-exit "^3.0.2"
+ which "^2.0.1"
+
spawnd@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-4.4.0.tgz#bb52c5b34a22e3225ae1d3acb873b2cd58af0886"
@@ -17024,6 +17848,15 @@ stream-shift@^1.0.0:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+streamroller@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53"
+ integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==
+ dependencies:
+ date-format "^2.1.0"
+ debug "^4.1.1"
+ fs-extra "^8.1.0"
+
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -17237,6 +18070,11 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
+strip-json-comments@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
+ integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
+
strip-json-comments@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@@ -17396,6 +18234,13 @@ sugarss@^2.0.0:
dependencies:
postcss "^7.0.2"
+supports-color@7.1.0, supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ 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"
@@ -17422,13 +18267,6 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.0.0, supports-color@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
- integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
- 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"
@@ -17494,6 +18332,11 @@ table@^5.2.3, table@^5.4.6:
slice-ansi "^2.1.0"
string-width "^3.0.0"
+tapable@^0.1.8:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4"
+ integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=
+
tapable@^1.0.0, tapable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
@@ -17564,6 +18407,13 @@ temp-dir@^1.0.0:
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
+temp-fs@^0.9.9:
+ version "0.9.9"
+ resolved "https://registry.yarnpkg.com/temp-fs/-/temp-fs-0.9.9.tgz#8071730437870720e9431532fe2814364f8803d7"
+ integrity sha1-gHFzBDeHByDpQxUy/igUNk+IA9c=
+ dependencies:
+ rimraf "~2.5.2"
+
temp-write@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
@@ -17746,6 +18596,13 @@ tinycolor2@^1.4.1:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
+tmp@0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -17758,6 +18615,11 @@ tmpl@1.0.x:
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
+to-array@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+ integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
+
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
@@ -18006,7 +18868,7 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
-type-detect@4.0.8:
+type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
@@ -18031,7 +18893,7 @@ type-fest@^0.6.0:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
-type-fest@^0.8.1:
+type-fest@^0.8.0, type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
@@ -18107,7 +18969,7 @@ typescript@^3.8.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==
-ua-parser-js@^0.7.18:
+ua-parser-js@0.7.21, ua-parser-js@^0.7.18:
version "0.7.21"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
@@ -18490,7 +19352,7 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
-uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0:
+uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
@@ -18582,7 +19444,7 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-void-elements@^2.0.1:
+void-elements@^2.0.0, void-elements@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
@@ -18953,21 +19815,21 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- 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==
dependencies:
isexe "^2.0.0"
-wide-align@^1.1.0:
+which@^1.2.1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@1.1.3, wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
@@ -19030,6 +19892,11 @@ worker-rpc@^0.1.0:
dependencies:
microevent.ts "~0.1.1"
+workerpool@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58"
+ integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==
+
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@@ -19127,11 +19994,18 @@ ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
-ws@^7.0.0, ws@^7.2.3:
+ws@^7.0.0, ws@^7.1.2, ws@^7.2.3:
version "7.3.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
+ws@~6.1.0:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
+ integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
+ dependencies:
+ async-limiter "~1.0.0"
+
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
@@ -19142,12 +20016,10 @@ xmlchars@^2.1.1, xmlchars@^2.2.0:
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-xregexp@^4.2.4:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
- integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
- dependencies:
- "@babel/runtime-corejs3" "^7.8.3"
+xmlhttprequest-ssl@~1.5.4:
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+ integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
version "4.0.2"
@@ -19179,18 +20051,18 @@ yaml@^1.7.2:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
-yargs-parser@18.x, yargs-parser@^18.1.2, yargs-parser@^18.1.3:
- version "18.1.3"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
- integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^13.1.2:
- version "13.1.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
- integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+yargs-parser@18.x, yargs-parser@^18.1.2, yargs-parser@^18.1.3:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
@@ -19203,7 +20075,16 @@ yargs-parser@^15.0.1:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs@^13.3.2:
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
+ dependencies:
+ flat "^4.1.0"
+ lodash "^4.17.15"
+ yargs "^13.3.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"
integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
@@ -19236,13 +20117,13 @@ yargs@^14.2.2:
y18n "^4.0.0"
yargs-parser "^15.0.1"
-yargs@^15.3.1:
- version "15.4.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.0.tgz#53949fb768309bac1843de9b17b80051e9805ec2"
- integrity sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==
+yargs@^15.0.2, yargs@^15.3.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
dependencies:
cliui "^6.0.0"
- decamelize "^3.2.0"
+ decamelize "^1.2.0"
find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
@@ -19280,6 +20161,11 @@ yauzl@^2.10.0:
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"
+ integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
+
zwitch@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"