diff --git a/.babelrc.js b/.babelrc.js index 34be60e17..75c4651d4 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -14,6 +14,7 @@ if (env === 'commonjs' || env === 'es') { plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposal-class-properties', + '@babel/plugin-transform-flow-comments', ['flow-react-proptypes', {deadCode: true, useESModules: true}], ['transform-react-remove-prop-types', {mode: 'wrap'}], ], diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a37665a4..29ca76d81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ ## Changelog +##### NEXT + +- Update peer dependencies to allow React 17 ([levenleven](https://github.com/levenleven) - [#1625](https://github.com/bvaughn/react-virtualized/pull/1625)) +- Use DOM API instead of creating Trusted Types policy to append a markup ([shhnjk](https://github.com/shhnjk) - [#1627](https://github.com/bvaughn/react-virtualized/pull/1627)) +- Fix bug in WindowScroller::updatePosition ([yamadapc](https://github.com/yamadapc) - [#1642](https://github.com/bvaughn/react-virtualized/pull/1642), [#1648](https://github.com/bvaughn/react-virtualized/pull/1648)) +- Fix babel tranform es error ([fupengl](https://github.com/fupengl) - [#1651](https://github.com/bvaughn/react-virtualized/pull/1651)) +- Fix issue with unused import being emitted ([mewhhaha](https://github.com/mewhhaha) - [#1635](https://github.com/bvaughn/react-virtualized/pull/1635)) +- Fix grid roles for accessbility ([asnewman](https://github.com/asnewman) - [#1624](https://github.com/bvaughn/react-virtualized/pull/1624)) + ##### 9.22.3 - Add Trusted Types support ([shhnjk](https://github.com/shhnjk) - [#1614](https://github.com/bvaughn/react-virtualized/pull/1614)) diff --git a/docs/Grid.md b/docs/Grid.md index 20bec32e2..746fa6136 100644 --- a/docs/Grid.md +++ b/docs/Grid.md @@ -182,19 +182,19 @@ function cellRangeRenderer({ This is an advanced property. This function is responsible for calculating the number of cells to overscan before and after a specified range. By default, React Virtualized optimizes the number of cells to overscan based on scroll direction. If you'd like to customize this behavior, you may want to fork the [`defaultOverscanIndicesGetter`](https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/defaultOverscanIndicesGetter.js) function. -``` -function overscanIndicesGetter ({ - direction, // One of "horizontal" or "vertical" - cellCount, // Number of rows or columns in the current axis - scrollDirection, // 1 (forwards) or -1 (backwards) +```js +function overscanIndicesGetter({ + direction, // One of "horizontal" or "vertical" + cellCount, // Number of rows or columns in the current axis + scrollDirection, // 1 (forwards) or -1 (backwards) overscanCellsCount, // Maximum number of cells to over-render in either direction - startIndex, // Begin of range of visible cells - stopIndex // End of range of visible cells + startIndex, // Begin of range of visible cells + stopIndex, // End of range of visible cells }) { return { overscanStartIndex: Math.max(0, startIndex - overscanCellsCount), - overscanStopIndex: Math.min(cellCount - 1, stopIndex + overscanCellsCount) - } + overscanStopIndex: Math.min(cellCount - 1, stopIndex + overscanCellsCount), + }; } ``` diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js new file mode 100644 index 000000000..faea0850a --- /dev/null +++ b/jest-puppeteer.config.js @@ -0,0 +1,6 @@ +module.exports = { + launch: { + headless: process.env.HEADLESS !== 'false', + devtools: process.env.DEVTOOLS === 'true', + }, +}; diff --git a/package.json b/package.json index 34fd4f118..22dd71fef 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "@babel/plugin-proposal-class-properties": "^7.7.0", "@babel/plugin-transform-modules-commonjs": "^7.7.0", "@babel/plugin-transform-runtime": "^7.6.2", + "@babel/plugin-transform-flow-comments": "^7.12.13", "@babel/polyfill": "^7.7.0", "@babel/preset-env": "^7.7.1", "@babel/preset-flow": "^7.0.0", @@ -118,12 +119,12 @@ "prettier": "1.19.1", "pretty-quick": "^2.0.1", "puppeteer": "^2.0.0", - "react": "^16.11.0", + "react": "^17.0.1", "react-codemirror": "^1.0.0", - "react-dom": "^16.11.0", - "react-router": "^5.1.2", - "react-router-dom": "^5.1.2", - "react-test-renderer": "^16.11.0", + "react-dom": "^17.0.1", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-test-renderer": "^17.0.1", "rimraf": "^3.0.0", "rollup": "^1.26.5", "rollup-plugin-babel": "^4.3.3", @@ -146,8 +147,8 @@ "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha", - "react-dom": "^15.3.0 || ^16.0.0-alpha" + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" }, "browserify": { "transform": [ diff --git a/source/Grid/Grid.jest.js b/source/Grid/Grid.jest.js index 5d0e1b705..e030b9f16 100644 --- a/source/Grid/Grid.jest.js +++ b/source/Grid/Grid.jest.js @@ -1102,7 +1102,7 @@ describe('Grid', () => { }); }); - describe('styles, classNames, and ids', () => { + describe('styles, classNames, ids, and roles', () => { it('should use the expected global CSS classNames', () => { const rendered = findDOMNode(render(getMarkup())); expect(rendered.className).toEqual('ReactVirtualized__Grid'); @@ -1132,6 +1132,12 @@ describe('Grid', () => { .style.backgroundColor, ).toEqual('red'); }); + + it('should have the gridcell role', () => { + const containerStyle = {backgroundColor: 'red'}; + const rendered = findDOMNode(render(getMarkup({containerStyle}))); + expect(rendered.querySelectorAll('[role="gridcell"]').length).toEqual(20); + }); }); describe('onScroll', () => { diff --git a/source/Grid/Grid.js b/source/Grid/Grid.js index 1c97f9eb1..84ae0cb94 100644 --- a/source/Grid/Grid.js +++ b/source/Grid/Grid.js @@ -262,7 +262,7 @@ class Grid extends React.PureComponent { autoHeight: false, autoWidth: false, cellRangeRenderer: defaultCellRangeRenderer, - containerRole: 'rowgroup', + containerRole: 'row', containerStyle: {}, estimatedColumnSize: 100, estimatedRowSize: 30, diff --git a/source/Grid/defaultCellRangeRenderer.js b/source/Grid/defaultCellRangeRenderer.js index badf0082b..38caaac55 100644 --- a/source/Grid/defaultCellRangeRenderer.js +++ b/source/Grid/defaultCellRangeRenderer.js @@ -1,6 +1,7 @@ /** @flow */ import type {CellRangeRendererParams} from './types'; +import React from 'react'; /** * Default implementation of cellRangeRenderer used by Grid. @@ -138,6 +139,10 @@ export default function defaultCellRangeRenderer({ warnAboutMissingStyle(parent, renderedCell); } + if (!renderedCell.props.role) { + renderedCell = React.cloneElement(renderedCell, {role: 'gridcell'}); + } + renderedCells.push(renderedCell); } } diff --git a/source/WindowScroller/WindowScroller.header-resize.e2e.js b/source/WindowScroller/WindowScroller.header-resize.e2e.js new file mode 100644 index 000000000..23531309a --- /dev/null +++ b/source/WindowScroller/WindowScroller.header-resize.e2e.js @@ -0,0 +1,206 @@ +/** + * @jest-environment jest-environment-puppeteer + */ + +const bootstrap = async () => { + const page = await global.browser.newPage(); + const scripts = [ + './node_modules/react/umd/react.development.js', + './node_modules/react-dom/umd/react-dom.development.js', + './dist/umd/react-virtualized.js', + ]; + + for (const path of scripts) { + await page.addScriptTag({path}); + } + + return page; +}; + +const renderWindowScroller = updateScrollTopOnUpdatePosition => { + const {render} = window.ReactDOM; + const {createElement, useState, useEffect} = window.React; + const {WindowScroller} = window.ReactVirtualized; + + const container = document.createElement('div'); + container.id = 'container'; + document.body.appendChild(container); + document.body.style.margin = 0; + + function Header({height}) { + return createElement('div', {style: {height, backgroundColor: 'red'}}); + } + + function App() { + const [height, setHeight] = useState(100); + window.setHeaderHeight = setHeight; + useEffect(() => () => (window.setHeaderHeight = null)); + + return createElement( + 'div', + {}, + createElement(Header, {height}), + createElement( + WindowScroller, + { + updateScrollTopOnUpdatePosition, + ref: windowScroller => { + window.windowScroller = windowScroller; + }, + onScroll: window.scrollFn, + onResize: window.resizeFn, + }, + ({width, scrollTop}) => { + console.log({scrollTop}); + window.windowScrollerScrollTop = scrollTop; + return createElement('div', { + style: { + width, + height: 3000, + backgroundColor: 'yellow', + }, + }); + }, + ), + ); + } + + render( + createElement( + 'div', + {'data-test-id': 'main-container'}, + createElement(App, {}), + ), + container, + ); +}; + +jest.setTimeout(1200000); + +const delay = time => new Promise(resolve => setTimeout(resolve, time)); + +test('will react to header height updates if notified through updatePosition', async () => { + const page = await bootstrap(); + const scrollFn = jest.fn(); + const resizeFn = jest.fn(); + await page.exposeFunction('scrollFn', scrollFn); + await page.exposeFunction('resizeFn', resizeFn); + + await page.setViewport({width: 400, height: 600}); + await page.evaluate(renderWindowScroller, true); + + const el = await page.$('[data-test-id="main-container"]'); + expect(el).not.toBeNull(); + + await page.evaluate(() => window.scrollTo(0, 200)); + await delay(500); + + { + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(scrollTop).toEqual(100); + } + await delay(500); + + // Update the header height + await page.evaluate(() => { + console.log('change header height'); + window.setHeaderHeight(200); + }); + await delay(500); + + await page.evaluate(() => { + console.log('update position'); + window.windowScroller.updatePosition(); + }); + await delay(500); + + // Despite header updates, we'd expect the scrollTop to be the same. + { + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(scrollTop).toEqual(100); + } +}); + +test('will NOT react to header height updates if notified through updatePosition if `updateScrollTopOnUpdatePosition` is false', async () => { + const page = await bootstrap(); + const scrollFn = jest.fn(); + const resizeFn = jest.fn(); + await page.exposeFunction('scrollFn', scrollFn); + await page.exposeFunction('resizeFn', resizeFn); + + await page.setViewport({width: 400, height: 600}); + await page.evaluate(renderWindowScroller, false); + + const el = await page.$('[data-test-id="main-container"]'); + expect(el).not.toBeNull(); + + await page.evaluate(() => window.scrollTo(0, 200)); + await delay(500); + + { + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(scrollTop).toEqual(100); + } + await delay(500); + + // Update the header height + await page.evaluate(() => { + console.log('change header height'); + window.setHeaderHeight(200); + }); + await delay(500); + + await page.evaluate(() => { + console.log('update position'); + window.windowScroller.updatePosition(); + }); + await delay(500); + + // Despite header updates, we'd expect the scrollTop to be the same. + // As the fix is off, this will fail. + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(() => { + expect(scrollTop).toEqual(100); + }).toThrow(); +}); + +test('will properly process scroll events after header height updates', async () => { + const page = await bootstrap(); + const scrollFn = jest.fn(); + const resizeFn = jest.fn(); + await page.exposeFunction('scrollFn', scrollFn); + await page.exposeFunction('resizeFn', resizeFn); + + await page.setViewport({width: 400, height: 600}); + await page.evaluate(renderWindowScroller, true); + + const el = await page.$('[data-test-id="main-container"]'); + expect(el).not.toBeNull(); + + await page.evaluate(() => window.scrollTo(0, 200)); + await delay(500); + + { + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(scrollTop).toEqual(100); + } + await delay(500); + + // Update the header height + await page.evaluate(() => { + window.setHeaderHeight(200); + }); + await delay(500); + + await page.evaluate(() => { + window.windowScroller.updatePosition(); + }); + await delay(500); + // This is only 50px under the first position + await page.evaluate(() => window.scrollTo(0, 350)); + + { + const scrollTop = await page.evaluate(() => window.windowScrollerScrollTop); + expect(scrollTop).toEqual(150); + } +}); diff --git a/source/WindowScroller/WindowScroller.js b/source/WindowScroller/WindowScroller.js index f2ed26ead..58d785b68 100644 --- a/source/WindowScroller/WindowScroller.js +++ b/source/WindowScroller/WindowScroller.js @@ -47,6 +47,9 @@ type Props = { /** Width used for server-side rendering */ serverWidth: number, + + /** Force scrollTop updates when .updatePosition is called, fixing forced header height change updates */ + updateScrollTopOnUpdatePosition?: boolean, }; type State = { @@ -118,6 +121,11 @@ export default class WindowScroller extends React.PureComponent { width: dimensions.width, }); } + + if (this.props.updateScrollTopOnUpdatePosition === true) { + this.__handleWindowScrollEvent(); + this.__resetIsScrolling(); + } } componentDidMount() { diff --git a/source/WindowScroller/utils/onScroll.js b/source/WindowScroller/utils/onScroll.js index 112fe8ab2..503c098f2 100644 --- a/source/WindowScroller/utils/onScroll.js +++ b/source/WindowScroller/utils/onScroll.js @@ -1,4 +1,5 @@ // @flow +'no babel-plugin-flow-react-proptypes'; import { requestAnimationTimeout, diff --git a/yarn.lock b/yarn.lock index 98135a6c9..324e3f8e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,6 +45,15 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/generator@^7.12.13": + version "7.13.16" + resolved "https://registry.nlark.com/@babel/generator/download/@babel/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" + integrity sha1-C+/ChwMaIB2EzfwXO0azIK5HLRQ= + dependencies: + "@babel/types" "^7.13.16" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" @@ -185,6 +194,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.12.13": + version "7.13.0" + resolved "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha1-gGUmzhJa7QM3O8QWqCgyHjpqM68= + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -228,6 +242,11 @@ dependencies: "@babel/types" "^7.7.0" +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0= + "@babel/helper-wrap-function@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" @@ -339,6 +358,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-flow@^7.12.13": + version "7.12.13" + resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-flow/download/@babel/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha1-XfmWJQPAqckYOBySnVHU1pSefoY= + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-flow@^7.2.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz#5c9465bcd26354d5215294ea90ab1c706a571386" @@ -463,6 +489,15 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-flow-comments@^7.12.13": + version "7.12.13" + resolved "https://registry.nlark.com/@babel/plugin-transform-flow-comments/download/@babel/plugin-transform-flow-comments-7.12.13.tgz#b6f0de89ac4955572913f4af82f6b8ddbff38bf1" + integrity sha1-tvDeiaxJVVcpE/Svgva43b/zi/E= + dependencies: + "@babel/generator" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-flow" "^7.12.13" + "@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz#8110f153e7360cfd5996eee68706cfad92d85256" @@ -764,13 +799,20 @@ resolved "https://registry.yarnpkg.com/@babel/preset-stage-2/-/preset-stage-2-7.0.0.tgz#11ec31263c8466aad63829bba724607029ddf0a5" integrity sha512-A8ia2Wus0OAP6hh28ZgPSCBJEX3Jnql3kg9di/I+Lmg1gbJXgDZBrHr/UGZXl20Vi1lXgMuUq8c8J899KFr5gA== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw== dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.2.2", "@babel/template@^7.4.0", "@babel/template@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" @@ -804,6 +846,14 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.13.16": + version "7.13.17" + resolved "https://registry.nlark.com/@babel/types/download/@babel/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" + integrity sha1-SAEKEVyfunWItEN91oyUaQErOLQ= + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -4399,11 +4449,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" @@ -6448,14 +6493,13 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -7822,17 +7866,21 @@ react-codemirror@^1.0.0: lodash.isequal "^4.5.0" prop-types "^15.5.4" -react-dom@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.11.0.tgz#7e7c4a5a85a569d565c2462f5d345da2dd849af5" - integrity sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA== +react-dom@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" + integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.17.0" + scheduler "^0.20.1" + +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.11.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== @@ -7842,53 +7890,60 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-router-dom@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.1.2" + react-router "5.2.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2, react-router@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" + mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-test-renderer@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.11.0.tgz#72574566496462c808ac449b0287a4c0a1a7d8f8" - integrity sha512-nh9gDl8R4ut+ZNNb2EeKO5VMvTKxwzurbSMuGBoKtjpjbg8JK/u3eVPVNi1h1Ue+eYK9oSzJjb+K3lzLxyA4ag== +react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== dependencies: object-assign "^4.1.1" - prop-types "^15.6.2" - react-is "^16.8.6" - scheduler "^0.17.0" + react-is "^16.12.0 || ^17.0.0" -react@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb" - integrity sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g== +react-test-renderer@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3187e636c3063e6ae498aedf21ecf972721574c7" + integrity sha512-/dRae3mj6aObwkjCcxZPlxDFh73XZLgvwhhyON2haZGUEhiaY5EjfAdw+d/rQmlcFwdTpMXCSGVk374QbCTlrA== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.1" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.1" + +react@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" + integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" read-cache@^1.0.0: version "1.0.0" @@ -8009,6 +8064,11 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + regenerator-transform@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" @@ -8446,10 +8506,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" - integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== +scheduler@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" + integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -9274,7 +9334,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==