From 1fdae08984b2263a275ebeaad4f88c95fcb13f51 Mon Sep 17 00:00:00 2001 From: Olivier Tassinari Date: Sun, 26 Jul 2020 16:35:26 +0200 Subject: [PATCH] [test] Add e2e test suite --- .circleci/config.yml | 42 + .eslintrc.js | 12 +- .gitignore | 2 + .mocharc.js | 5 + babel.config.js | 81 ++ package.json | 26 + packages/grid/x-grid/rollup.config.js | 1 - packages/grid/x-grid/test/XGrid.test.tsx | 140 +++ packages/license/bin/license-gen-script.js | 4 +- test/karma.conf.js | 155 +++ test/karma.tests.js | 4 + test/utils/components.js | 38 + test/utils/createClientRender.js | 213 ++++ test/utils/createDOM.d.ts | 9 + test/utils/createDOM.js | 63 ++ test/utils/createMount.js | 91 ++ test/utils/createServerRender.js | 35 + test/utils/createShallow.js | 45 + test/utils/describeConformance.js | 226 ++++ test/utils/findOutermostIntrinsic.js | 19 + test/utils/findOutermostIntrinsic.test.js | 68 ++ test/utils/getClasses.js | 22 + test/utils/index.js | 8 + test/utils/init.d.ts | 51 + test/utils/init.js | 15 + test/utils/initMatchers.js | 303 ++++++ test/utils/initMatchers.test.js | 120 +++ test/utils/setup.js | 80 ++ test/utils/until.js | 28 + test/utils/until.test.js | 111 ++ tsconfig.json | 13 +- webpackBaseConfig.js | 42 + yarn.lock | 1136 +++++++++++++++++--- 33 files changed, 3071 insertions(+), 137 deletions(-) create mode 100644 .mocharc.js create mode 100644 babel.config.js create mode 100644 packages/grid/x-grid/test/XGrid.test.tsx create mode 100644 test/karma.conf.js create mode 100644 test/karma.tests.js create mode 100644 test/utils/components.js create mode 100644 test/utils/createClientRender.js create mode 100644 test/utils/createDOM.d.ts create mode 100644 test/utils/createDOM.js create mode 100644 test/utils/createMount.js create mode 100644 test/utils/createServerRender.js create mode 100644 test/utils/createShallow.js create mode 100644 test/utils/describeConformance.js create mode 100644 test/utils/findOutermostIntrinsic.js create mode 100644 test/utils/findOutermostIntrinsic.test.js create mode 100644 test/utils/getClasses.js create mode 100644 test/utils/index.js create mode 100644 test/utils/init.d.ts create mode 100644 test/utils/init.js create mode 100644 test/utils/initMatchers.js create mode 100644 test/utils/initMatchers.test.js create mode 100644 test/utils/setup.js create mode 100644 test/utils/until.js create mode 100644 test/utils/until.test.js create mode 100644 webpackBaseConfig.js 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"