From 745487779d410c188833e9281fa0040262209d5f Mon Sep 17 00:00:00 2001 From: John Coburn Date: Fri, 21 Feb 2025 13:36:35 -0600 Subject: [PATCH] STCOM-1336 remove react-overlays dependency (#2429) ## [STCOM-1336](https://folio-org.atlassian.net/browse/STCOM-1336) This implements [STCOM-1339](https://folio-org.atlassian.net/browse/STCOM-1339), as it was a sub-task of this story. `react-overlays` hasn't been published in 2 years. After the modal refactor, the remaining bits were the `useRootClose` hook and an instance of `` - was a simple refactor - `React-DOM`'s base functionality for portals is all that's necessary there. - ~~I opted to pull in a new dependency - `usehooks-ts` instead of re-implementing `useRootClose` locally. [usehooks-ts](https://usehooks-ts.com/introduction) is a minimal, no-dependency lib with active development and a nice dev experience curtesy of TS! It is pre-transpiled to commonjs, of course... `useClickOutside` nicely replaced `onRootClose`.~~ - our own `useClickOutside` is implemented a bit differently, but served purpose just fine rather than taking on any dependency - and the logic is quite similar to that of the compound hook within `usehooks-ts`. Additionally - updated shared workflows to 1.9 so that tests can run! --- .github/workflows/ui.yml | 2 +- CHANGELOG.md | 2 + lib/Datepicker/tests/Datepicker-test.js | 3 +- lib/DropdownMenu/DropdownMenu.js | 13 ++-- lib/Selection/SelectionOverlay.js | 44 +++++++------ lib/Selection/tests/Selection-test.js | 25 +++++++ lib/Timepicker/TimeDropdown.js | 2 - lib/Timepicker/tests/Timepicker-test.js | 8 +-- package.json | 1 - util/RootCloseWrapper.js | 15 +++-- yarn.lock | 87 +++---------------------- 11 files changed, 82 insertions(+), 120 deletions(-) diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml index f86691061..de3959e6b 100644 --- a/.github/workflows/ui.yml +++ b/.github/workflows/ui.yml @@ -6,7 +6,7 @@ on: jobs: ui: - uses: folio-org/.github/.github/workflows/ui.yml@v1.5 + uses: folio-org/.github/.github/workflows/ui.yml@v1 if: github.ref_name == github.event.repository.default_branch || github.event_name != 'push' || github.ref_type == 'tag' secrets: inherit with: diff --git a/CHANGELOG.md b/CHANGELOG.md index b335c385c..400b00715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ * *BREAKING* remove deprecated props. Refs STCOM-1398. * Add marginTop0 prop to the MessageBanner component. Refs STCOM-1408. * Popper - hide overlay if popper anchor is scrolled out of the view. Refs STCOM-1386. +* Switch `useRootClose` hook to `useOClickOutside`. Refs STCOM-1339. +* Removed `react-overlays` dependency. Refs STCOM-1336. ## [12.2.0](https://github.com/folio-org/stripes-components/tree/v12.2.0) (2024-10-11) [Full Changelog](https://github.com/folio-org/stripes-components/compare/v12.1.0...v12.2.0) diff --git a/lib/Datepicker/tests/Datepicker-test.js b/lib/Datepicker/tests/Datepicker-test.js index 0bbde5ce6..c34f9a53a 100644 --- a/lib/Datepicker/tests/Datepicker-test.js +++ b/lib/Datepicker/tests/Datepicker-test.js @@ -18,6 +18,7 @@ import { converge, } from '@folio/stripes-testing'; import { mountWithContext, focusPrevious, focusNext } from '../../../tests/helpers'; +import { RoledHTML } from '../../../tests/helpers/localInteractors'; import Datepicker from '../Datepicker'; import { @@ -485,7 +486,7 @@ describe('Datepicker', () => { }); describe('clicking outside of calendar', () => { - beforeEach(() => document.body.click()); + beforeEach(() => RoledHTML({ tagName: 'BODY' }).click()); it('closes the calendar picker', () => calendar.absent()); }); }); diff --git a/lib/DropdownMenu/DropdownMenu.js b/lib/DropdownMenu/DropdownMenu.js index 12d1bf049..5853d4dc0 100644 --- a/lib/DropdownMenu/DropdownMenu.js +++ b/lib/DropdownMenu/DropdownMenu.js @@ -1,7 +1,8 @@ -import React, { cloneElement, useRef } from 'react'; +import React, { cloneElement, useRef, useCallback } from 'react'; import isBoolean from 'lodash/isBoolean'; -import useRootClose from 'react-overlays/useRootClose'; +import noop from 'lodash/noop'; import PropTypes from 'prop-types'; +import useClickOutside from '../../hooks/useClickOutside'; import separateComponentProps from '../../util/separateComponentProps'; import css from './DropdownMenu.css'; @@ -32,17 +33,15 @@ const DropdownMenu = ({ overrideStyle = {}, ...rest }) => { minWidth, onSelect, onSelectItem, - onToggle, + onToggle = noop, open, pullRight, width } = props; const ref = useRef(null); - - useRootClose(ref, onToggle, { - disabled: !open - }); + const handleClickOutside = useCallback((e, outside) => outside && onToggle(), [onToggle]); + useClickOutside(ref, open ? handleClickOutside : noop); const renderChildren = () => { // don't pass along props that we didn't receive. if the diff --git a/lib/Selection/SelectionOverlay.js b/lib/Selection/SelectionOverlay.js index 768f5a80c..a1dc88824 100644 --- a/lib/Selection/SelectionOverlay.js +++ b/lib/Selection/SelectionOverlay.js @@ -1,8 +1,9 @@ import React, { useEffect, useRef } from 'react'; +import { createPortal } from 'react-dom'; import PropTypes from 'prop-types'; -import Portal from 'react-overlays/Portal'; import SelectionList from './SelectionList'; import Popper, { OVERLAY_MODIFIERS } from '../Popper'; +import { OVERLAY_CONTAINER_ID } from '../../util/consts'; import css from './Selection.css'; @@ -23,7 +24,7 @@ const SelectionOverlay = ({ ...props }) => { const filterRef = useRef(null); - const getPortalElement = useRef(() => document.getElementById('OverlayContainer')).current; + const getPortalElement = useRef(() => document.getElementById(OVERLAY_CONTAINER_ID)).current; useEffect(() => { // if the overlay is open and focus is outside of it, move focus to the filter. @@ -57,26 +58,31 @@ const SelectionOverlay = ({ ); if (atSmallMedia) { + const portalContent = ( +
{ controlRef.current?.focus() }} + > +
+ {renderFilterInput(filterRef)} + {isOpen && selectList} +
+
+ ); + return (
{isOpen && - -
{ controlRef.current?.focus() }} - > -
- {renderFilterInput(filterRef)} - {isOpen && selectList} -
-
-
+ createPortal( + portalContent, + getPortalElement() + ) }
); diff --git a/lib/Selection/tests/Selection-test.js b/lib/Selection/tests/Selection-test.js index 2950c341a..567587d33 100644 --- a/lib/Selection/tests/Selection-test.js +++ b/lib/Selection/tests/Selection-test.js @@ -21,6 +21,7 @@ import { RoledHTML } from '../../../tests/helpers/localInteractors'; import Selection from '../Selection'; import SingleSelectionHarness from './SingleSelectionHarness'; import AsyncFilter from '../stories/AsyncFilter'; +import { OVERLAY_CONTAINER_ID } from '../../../util/consts'; const asyncSelectionList = SelectListInteractor.extend('selection list with loading') .filters({ @@ -774,4 +775,28 @@ describe('Selection', () => { it('displays resulting options', () => asyncSelectionList().is({ optionCount: 30 })); }) }) + + describe('small screens rendering', () => { + beforeEach(async () => { + viewport.set(300); + await mountWithContext( + <> +
+ + + ); + await selection.open(); + }); + + it('opens dropdown in overlayContainer', expectOpenedMenu); + + afterEach(() => { + viewport.reset(); + }); + }) + }); diff --git a/lib/Timepicker/TimeDropdown.js b/lib/Timepicker/TimeDropdown.js index 578370e28..a35bd064b 100644 --- a/lib/Timepicker/TimeDropdown.js +++ b/lib/Timepicker/TimeDropdown.js @@ -192,8 +192,6 @@ const TimeDropdown = ({ } }, [hourMax, hourMin, hoursFormat]); - useEffect(() => () => onHide(), []); // eslint-disable-line - const enterTime = (e, unit) => { if (unit === 'hour') { let parsedHour = parseInt(e.target.value, 10); diff --git a/lib/Timepicker/tests/Timepicker-test.js b/lib/Timepicker/tests/Timepicker-test.js index 32b284662..8f60e4bb0 100644 --- a/lib/Timepicker/tests/Timepicker-test.js +++ b/lib/Timepicker/tests/Timepicker-test.js @@ -31,7 +31,7 @@ dayjs.extend(utc); dayjs.extend(timeZone); // check for DST with respect to the timezone of the tests since different zones can observe DST differently. -const isDST = function (tz='UTC') { +const isDST = function (tz = 'UTC') { const julDate = '2022-07-20'; const janDate = '2022-01-01'; @@ -210,7 +210,7 @@ describe('Timepicker', () => { describe('selecting a time with timeZone prop (Los Angeles) (RFF)', () => { const tz = 'America/Los_Angeles'; - const testTime = isDST('America/Los_Angeles') ? '00:00:00.000Z' : '01:00:00.000Z';; + const testTime = isDST('America/Los_Angeles') ? '00:00:00.000Z' : '01:00:00.000Z'; let timeOutput = ''; beforeEach(async () => { timeOutput = ''; @@ -303,7 +303,7 @@ describe('Timepicker', () => { id="timepicker-dropdown-test" autoFocus /> -
+
anywhere else
); @@ -450,7 +450,7 @@ describe('Timepicker', () => { }); describe('clicking outside the dropdown', () => { - beforeEach(() => document.getElementById('anywhere-else').click()); + beforeEach(() => HTML({ id: 'anywhere-else' }).click()); it('should close the timepicker dropdown', () => timeDropdown.absent()); }); diff --git a/package.json b/package.json index 9757db444..6f3b30d8a 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,6 @@ "prop-types-extra": "^1.1.0", "query-string": "^8.1.0", "react-highlight-words": "^0.20.0", - "react-overlays": "^5.2.1", "react-quill": "^2.0.0", "react-transition-group": "^4.4.5", "react-virtualized-auto-sizer": "^1.0.2", diff --git a/util/RootCloseWrapper.js b/util/RootCloseWrapper.js index 91c6a1e0d..ad841c954 100644 --- a/util/RootCloseWrapper.js +++ b/util/RootCloseWrapper.js @@ -5,14 +5,17 @@ * It's only used for class components that does not support using the useRootClose hook. */ -import { forwardRef } from 'react'; +import { forwardRef, useCallback } from 'react'; import PropTypes from 'prop-types'; -import useRootClose from 'react-overlays/useRootClose'; +import noop from 'lodash/noop'; +import useClickOutside from '../hooks/useClickOutside'; -const RootCloseWrapper = forwardRef(({ children, onRootClose, disabled }, ref) => { - useRootClose(ref, onRootClose, { - disabled - }); +const RootCloseWrapper = forwardRef(({ children, onRootClose = noop, disabled }, ref) => { + const handleOutsideClick = useCallback((e, outside) => outside && onRootClose(e), [onRootClose]); + useClickOutside( + ref, + disabled ? noop : handleOutsideClick, + ); return children; }); diff --git a/yarn.lock b/yarn.lock index 7b2aa3bf4..ddb61f092 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1026,7 +1026,7 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== @@ -2629,11 +2629,6 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@popperjs/core@^2.11.6": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - "@radix-ui/number@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" @@ -3015,13 +3010,6 @@ uniqid "^5.4.0" uuid "^9.0.1" -"@restart/hooks@^0.4.7": - version "0.4.16" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" - integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== - dependencies: - dequal "^2.0.3" - "@shelex/allure-js-commons-browser@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@shelex/allure-js-commons-browser/-/allure-js-commons-browser-1.5.0.tgz#5ba3dfc25290567b24c9febf9c974abb2b35dadd" @@ -4598,7 +4586,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16", "@types/react@>=16.9.11": +"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16": version "19.0.8" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== @@ -4674,11 +4662,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== -"@types/warning@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" - integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== - "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -7423,7 +7406,7 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -dequal@^2.0.0, dequal@^2.0.2, dequal@^2.0.3: +dequal@^2.0.0, dequal@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -7609,7 +7592,7 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" -dom-helpers@^5.0.1, dom-helpers@^5.2.0: +dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -14055,25 +14038,6 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-lifecycles-compat@^3.0.4: - version "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-overlays@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b" - integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA== - dependencies: - "@babel/runtime" "^7.13.8" - "@popperjs/core" "^2.11.6" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - react-quill@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/react-quill/-/react-quill-2.0.0.tgz#67a0100f58f96a246af240c9fa6841b363b3e017" @@ -15301,16 +15265,7 @@ string-argv@0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15402,7 +15357,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15416,13 +15371,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -16214,16 +16162,6 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== -uncontrollable@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" - integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" ">=16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -16612,7 +16550,7 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -warning@^4.0.0, warning@^4.0.3: +warning@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== @@ -16872,7 +16810,7 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16890,15 +16828,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"