diff --git a/.gitignore b/.gitignore index fcdef2a..5d1f063 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,4 @@ yarn-error.log* # build node_modules -dist examples/dist diff --git a/dist/ScrollLock.js b/dist/ScrollLock.js new file mode 100644 index 0000000..e34409f --- /dev/null +++ b/dist/ScrollLock.js @@ -0,0 +1,98 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _exenv = require('exenv'); + +var _TouchScrollable = require('./TouchScrollable'); + +var _withLockSheet = require('./withLockSheet'); + +var _withLockSheet2 = _interopRequireDefault(_withLockSheet); + +var _withTouchListeners = require('./withTouchListeners'); + +var _withTouchListeners2 = _interopRequireDefault(_withTouchListeners); + +var _utils = require('./utils'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ScrollLock = function (_PureComponent) { + _inherits(ScrollLock, _PureComponent); + + function ScrollLock() { + _classCallCheck(this, ScrollLock); + + return _possibleConstructorReturn(this, (ScrollLock.__proto__ || Object.getPrototypeOf(ScrollLock)).apply(this, arguments)); + } + + _createClass(ScrollLock, [{ + key: 'componentDidMount', + value: function componentDidMount() { + if (!_exenv.canUseDOM) return; + this.initialHeight = window.innerHeight; + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + var offset = window.innerHeight - this.initialHeight; + + // adjust scroll if the window has been resized since the lock was engaged + // e.g. mobile safari dynamic chrome heights + if (offset) { + window.scrollTo(0, window.pageYOffset + offset); + } + + // reset the initial height in case this scroll lock is used again + this.initialHeight = window.innerHeight; + } + }, { + key: 'render', + value: function render() { + var children = this.props.children; + + + return children ? _react2.default.createElement( + _TouchScrollable.TouchScrollable, + null, + children + ) : null; + } + }]); + + return ScrollLock; +}(_react.PureComponent); + +// attach the stylesheet and inject styles on [un]mount + + +var compose = (0, _utils.pipe)(_withTouchListeners2.default, _withLockSheet2.default); +var SheetLock = compose(ScrollLock); + +// toggle the lock based on `isActive` prop +var LockToggle = function LockToggle(props) { + return props.isActive ? _react2.default.createElement(SheetLock, props) : props.children; +}; + +LockToggle.defaultProps = { + accountForScrollbars: true, + children: null, + isActive: true +}; + +exports.default = LockToggle; \ No newline at end of file diff --git a/dist/TouchScrollable.js b/dist/TouchScrollable.js new file mode 100644 index 0000000..7d22ca9 --- /dev/null +++ b/dist/TouchScrollable.js @@ -0,0 +1,73 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.TouchScrollable = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _exenv = require('exenv'); + +var _utils = require('./utils'); + +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TouchScrollable = exports.TouchScrollable = function (_PureComponent) { + _inherits(TouchScrollable, _PureComponent); + + function TouchScrollable() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, TouchScrollable); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = TouchScrollable.__proto__ || Object.getPrototypeOf(TouchScrollable)).call.apply(_ref, [this].concat(args))), _this), _this.getScrollableArea = function (ref) { + _this.scrollableArea = ref; + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(TouchScrollable, [{ + key: 'componentDidMount', + value: function componentDidMount() { + if (!_exenv.canUseEventListeners) return; + + this.scrollableArea.addEventListener('touchstart', _utils.preventInertiaScroll, _utils.listenerOptions); + this.scrollableArea.addEventListener('touchmove', _utils.allowTouchMove, _utils.listenerOptions); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (!_exenv.canUseEventListeners) return; + + this.scrollableArea.removeEventListener('touchstart', _utils.preventInertiaScroll, _utils.listenerOptions); + this.scrollableArea.removeEventListener('touchmove', _utils.allowTouchMove, _utils.listenerOptions); + } + }, { + key: 'render', + value: function render() { + var _props = this.props, + children = _props.children, + rest = _objectWithoutProperties(_props, ['children']); + + return typeof children === 'function' ? children(this.getScrollableArea) : (0, _react.cloneElement)(children, _extends({ ref: this.getScrollableArea }, rest)); + } + }]); + + return TouchScrollable; +}(_react.PureComponent); \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..13ddf24 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,14 @@ +import * as React from 'react'; + +interface OneChildrenElement { + children?: React.ReactElement; +} + +interface ScrollLockProps extends OneChildrenElement { + accountForScrollbars?: boolean; + isActive?: boolean; +} + +export default class ScrollLock extends React.Component {} + +export class TouchScrollable extends React.Component {} diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..5bd546f --- /dev/null +++ b/dist/index.js @@ -0,0 +1,25 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _ScrollLock = require('./ScrollLock'); + +Object.defineProperty(exports, 'default', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_ScrollLock).default; + } +}); + +var _TouchScrollable = require('./TouchScrollable'); + +Object.defineProperty(exports, 'TouchScrollable', { + enumerable: true, + get: function get() { + return _TouchScrollable.TouchScrollable; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js new file mode 100644 index 0000000..e39c621 --- /dev/null +++ b/dist/utils.js @@ -0,0 +1,151 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.pipe = exports.listenerOptions = undefined; +exports.preventTouchMove = preventTouchMove; +exports.allowTouchMove = allowTouchMove; +exports.preventInertiaScroll = preventInertiaScroll; +exports.isTouchDevice = isTouchDevice; +exports.camelToKebab = camelToKebab; +exports.parse = parse; +exports.getPadding = getPadding; +exports.getWindowHeight = getWindowHeight; +exports.getDocumentHeight = getDocumentHeight; +exports.makeStyleTag = makeStyleTag; +exports.injectStyles = injectStyles; +exports.insertStyleTag = insertStyleTag; + +var _exenv = require('exenv'); + +var listenerOptions = exports.listenerOptions = { + capture: false, + passive: false +}; + +// ============================== +// Touch Helpers +// ============================== + +function preventTouchMove(e) { + e.preventDefault(); + + return false; +} + +function allowTouchMove(e) { + var target = e.currentTarget; + + if (target.scrollHeight > target.clientHeight || target.scrollWidth > target.clientWidth) { + e.stopPropagation(); + return true; + } + + e.preventDefault(); + return false; +} + +function preventInertiaScroll() { + var top = this.scrollTop; + var totalScroll = this.scrollHeight; + var currentScroll = top + this.offsetHeight; + + if (top === 0) { + this.scrollTop = 1; + } else if (currentScroll === totalScroll) { + this.scrollTop = top - 1; + } +} + +// `ontouchstart` check works on most browsers +// `maxTouchPoints` works on IE10/11 and Surface +function isTouchDevice() { + if (!_exenv.canUseDOM) return false; + return 'ontouchstart' in window || navigator.maxTouchPoints; +} + +// ============================== +// Misc. +// ============================== + +function camelToKebab(str) { + return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); +} + +function parse(val) { + return isNaN(val) ? val : val + 'px'; +} + +// Take a list of functions and return a function that applies the list of +// functions from left to right + +var pipeFns = function pipeFns(a, b) { + return function () { + return b(a.apply(undefined, arguments)); + }; +}; +var pipe = exports.pipe = function pipe() { + for (var _len = arguments.length, fns = Array(_len), _key = 0; _key < _len; _key++) { + fns[_key] = arguments[_key]; + } + + return fns.reduce(pipeFns); +}; + +// ============================== +// Document Helpers +// ============================== + +function getPadding() { + if (!_exenv.canUseDOM) return 0; + + var paddingRight = parseInt(window.getComputedStyle(document.body).paddingRight, 10); + var scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; + + return paddingRight + scrollbarWidth; +} + +function getWindowHeight() { + var multiplier = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + + if (_exenv.canUseDOM) { + return window.innerHeight * multiplier; + } +} + +function getDocumentHeight() { + if (_exenv.canUseDOM) { + return document.body.clientHeight; + } +} + +// ============================== +// Style Sheets +// ============================== + +function makeStyleTag() { + if (!_exenv.canUseDOM) return; + + var tag = document.createElement('style'); + tag.type = 'text/css'; + tag.setAttribute('data-react-scrolllock', ''); + + return tag; +} +function injectStyles(tag, css) { + if (!_exenv.canUseDOM) return; + + if (tag.styleSheet) { + tag.styleSheet.cssText = css; + } else { + tag.appendChild(document.createTextNode(css)); + } +} +function insertStyleTag(tag) { + if (!_exenv.canUseDOM) return; + + var head = document.head || document.getElementsByTagName('head')[0]; + + head.appendChild(tag); +} \ No newline at end of file diff --git a/dist/withLockSheet.js b/dist/withLockSheet.js new file mode 100644 index 0000000..f5e2208 --- /dev/null +++ b/dist/withLockSheet.js @@ -0,0 +1,90 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +exports.default = withLockSheet; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _utils = require('./utils'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function withLockSheet(WrappedComponent) { + return function (_PureComponent) { + _inherits(SheetProvider, _PureComponent); + + function SheetProvider() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, SheetProvider); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = SheetProvider.__proto__ || Object.getPrototypeOf(SheetProvider)).call.apply(_ref, [this].concat(args))), _this), _this.addSheet = function () { + var styles = _this.getStyles(); + + var sheet = (0, _utils.makeStyleTag)(); + if (!sheet) return; + + (0, _utils.injectStyles)(sheet, styles); + (0, _utils.insertStyleTag)(sheet); + + _this.sheet = sheet; + }, _this.getStyles = function () { + var accountForScrollbars = _this.props.accountForScrollbars; + + + var height = (0, _utils.getDocumentHeight)(); + var paddingRight = accountForScrollbars ? (0, _utils.getPadding)() : null; + var styles = 'body {\n box-sizing: border-box !important;\n overflow: hidden !important;\n position: relative !important;\n ' + (height ? 'height: ' + height + 'px !important;' : '') + '\n ' + (paddingRight ? 'padding-right: ' + paddingRight + 'px !important;' : '') + '\n }'; + + return styles; + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(SheetProvider, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.addSheet(); + } + }, { + key: 'removeSheet', + value: function removeSheet() { + if (!this.sheet) return; + + // $FlowFixMe + this.sheet.parentNode.removeChild(this.sheet); + this.sheet = null; + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.removeSheet(); + } + }, { + key: 'render', + value: function render() { + return _react2.default.createElement(WrappedComponent, this.props); + } + }]); + + return SheetProvider; + }(_react.PureComponent); +} \ No newline at end of file diff --git a/dist/withTouchListeners.js b/dist/withTouchListeners.js new file mode 100644 index 0000000..6017697 --- /dev/null +++ b/dist/withTouchListeners.js @@ -0,0 +1,62 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +exports.default = withTouchListeners; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _exenv = require('exenv'); + +var _utils = require('./utils'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +// Mobile Safari ignores { overflow: hidden } declaration on the body, +// so we have to prevent touchmove events via JS +function withTouchListeners(WrappedComponent) { + return function (_PureComponent) { + _inherits(TouchProvider, _PureComponent); + + function TouchProvider() { + _classCallCheck(this, TouchProvider); + + return _possibleConstructorReturn(this, (TouchProvider.__proto__ || Object.getPrototypeOf(TouchProvider)).apply(this, arguments)); + } + + _createClass(TouchProvider, [{ + key: 'componentDidMount', + value: function componentDidMount() { + if (!_exenv.canUseDOM || !(0, _utils.isTouchDevice)()) return; + + document.addEventListener('touchmove', _utils.preventTouchMove, _utils.listenerOptions); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (!_exenv.canUseDOM || !(0, _utils.isTouchDevice)()) return; + + document.removeEventListener('touchmove', _utils.preventTouchMove, _utils.listenerOptions); + } + }, { + key: 'render', + value: function render() { + return _react2.default.createElement(WrappedComponent, this.props); + } + }]); + + return TouchProvider; + }(_react.PureComponent); +} \ No newline at end of file diff --git a/package.json b/package.json index 376572b..76a6979 100644 --- a/package.json +++ b/package.json @@ -41,11 +41,11 @@ "exenv": "^1.2.2" }, "peerDependencies": { - "react": "^16.3.0" + "react": "^17.0.2" }, "devDependencies": { "@changesets/cli": "^2.6.1", - "@types/react": "^16.8.20", + "@types/react": "^17.0.8", "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-eslint": "^9.0.0", @@ -68,8 +68,8 @@ "jest-cli": "^21.2.1", "prop-types": "^15.6.0", "raf": "^3.4.0", - "react": "^16.3.2", - "react-dom": "^16.3.2", + "react": "^17.0.2", + "react-dom": "^17.0.2", "react-prop-toggle": "^1.0.2", "style-loader": "^0.21.0", "webpack": "^4.5.0", diff --git a/src/utils.js b/src/utils.js index 5a41e9b..e4db06a 100644 --- a/src/utils.js +++ b/src/utils.js @@ -18,7 +18,8 @@ export function preventTouchMove(e) { export function allowTouchMove(e) { const target = e.currentTarget; - if (target.scrollHeight > target.clientHeight) { + if (target.scrollHeight > target.clientHeight + || target.scrollWidth > target.clientWidth) { e.stopPropagation(); return true; } diff --git a/yarn.lock b/yarn.lock index 57df34e..09e24d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -387,13 +387,19 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react@^16.8.20": - version "16.9.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.23.tgz#1a66c6d468ba11a8943ad958a8cb3e737568271c" - integrity sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw== +"@types/react@^17.0.8": + version "17.0.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.19.tgz#8f2a85e8180a43b57966b237d26a29481dacc991" + integrity sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A== dependencies: "@types/prop-types" "*" - csstype "^2.2.0" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/semver@^6.0.0": version "6.2.1" @@ -2941,10 +2947,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -csstype@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== +csstype@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== csv-generate@^3.2.4: version "3.2.4" @@ -8172,15 +8178,14 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -react-dom@^16.3.2: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" - integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.0" + scheduler "^0.20.2" react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0: version "16.13.0" @@ -8202,14 +8207,13 @@ react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.19.0" -react@^16.3.2: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" - integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" read-chunk@^2.1.0: version "2.1.0" @@ -8767,6 +8771,14 @@ scheduler@^0.19.0: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"