From 0bbf550d441609e1b7c7db2c0edc3511c33cd678 Mon Sep 17 00:00:00 2001 From: shadowusr <58862284+shadowusr@users.noreply.github.com> Date: Tue, 30 Jul 2024 01:11:26 +0300 Subject: [PATCH] chore: migrate to react 18 (#582) * chore: migrate to react 18 --- .mocharc.js | 7 +- lib/adapters/test-result/testplane.ts | 2 +- .../components/bottom-progress-bar/index.jsx | 2 +- lib/static/components/bullet.jsx | 2 +- .../components/controls/common-controls.jsx | 3 +- .../components/controls/control-button.tsx | 2 +- lib/static/components/controls/menu-bar.jsx | 2 +- lib/static/components/details.jsx | 4 +- lib/static/components/extension-point.jsx | 2 +- .../components/header/summary/dbBtn.jsx | 19 +- .../icons/view-in-browser/index.jsx | 2 +- .../modals/screenshot-accepter/body.jsx | 2 +- .../modals/screenshot-accepter/index.jsx | 18 +- lib/static/components/progress-bar/index.jsx | 2 +- lib/static/components/retry-switcher/item.jsx | 2 +- .../components/section/body/description.jsx | 2 - lib/static/components/state/index.jsx | 2 +- .../state/screenshot/diff-circle.jsx | 9 +- .../state/screenshot/with-synced-scale.jsx | 164 +- lib/static/components/state/state-error.jsx | 2 +- lib/static/components/suites.jsx | 157 +- lib/static/gui.jsx | 8 +- lib/static/index.jsx | 8 +- lib/static/modules/default-state.ts | 1 + lib/static/styles.css | 8 +- package-lock.json | 5890 +++++++++-------- package.json | 27 +- .../tests/common-tinder/index.testplane.js | 8 +- test/func/tests/eye/index.testplane.js | 4 +- .../tests-menu-bar-plugin.testplane.js | 3 + .../chrome/menu bar plugins clicked.png | Bin 2732 -> 2640 bytes test/{ => setup}/assert-ext.js | 0 test/setup/configure-testing-library.js | 10 + test/{setup.js => setup/globals.js} | 10 +- test/{ => setup}/ts-node.js | 0 test/types.ts | 2 - test/unit/lib/static/components/.eslintrc.js | 3 + .../components/bottom-progress-bar/index.jsx | 8 +- test/unit/lib/static/components/bullet.jsx | 51 +- .../controls/accept-opened-button.jsx | 12 +- .../controls/browser-list/index.jsx | 55 +- .../controls/custom-gui-controls.jsx | 38 +- .../controls/find-same-diffs-button.jsx | 10 +- .../components/controls/gui-controls.jsx | 20 +- .../static/components/controls/menu-bar.jsx | 16 +- .../static/components/controls/run-button.jsx | 140 +- .../controls/show-checkboxes-input.jsx | 13 +- .../controls/strict-match-filter-input.jsx | 15 +- .../lib/static/components/custom-scripts.tsx | 22 +- test/unit/lib/static/components/details.jsx | 36 +- .../lib/static/components/error-boundary.jsx | 13 +- .../lib/static/components/extension-point.jsx | 9 +- .../static/components/group-tests/item.jsx | 68 +- .../modals/screenshot-accepter/body.jsx | 19 +- .../modals/screenshot-accepter/header.jsx | 319 +- .../modals/screenshot-accepter/index.jsx | 653 +- .../modals/screenshot-accepter/meta.jsx | 4 +- .../components/retry-switcher/index.jsx | 3 +- .../static/components/retry-switcher/item.jsx | 31 +- .../components/section/body/description.jsx | 25 +- .../components/section/body/history.jsx | 13 +- .../static/components/section/body/index.jsx | 15 +- .../section/body/meta-info/content.jsx | 33 +- .../section/body/meta-info/index.jsx | 11 +- .../static/components/section/body/tabs.jsx | 11 +- .../section/title/browser-skipped.jsx | 13 +- .../components/section/title/browser.jsx | 31 +- .../components/section/title/simple.jsx | 36 +- .../lib/static/components/state/index.jsx | 44 +- .../state/screenshot/diff-circle.jsx | 5 +- .../components/state/screenshot/full.jsx | 13 +- .../components/state/screenshot/resized.jsx | 13 +- .../static/components/state/state-error.jsx | 80 +- test/unit/lib/static/components/suites.jsx | 54 +- test/unit/lib/static/components/utils.jsx | 97 +- test/unit/lib/static/modules/actions.js | 4 +- .../static/modules/local-storage-wrapper.js | 4 +- test/unit/lib/static/modules/reducers/view.js | 4 +- .../unit/lib/static/modules/yandex-metrika.js | 4 +- 79 files changed, 4642 insertions(+), 3812 deletions(-) rename test/{ => setup}/assert-ext.js (100%) create mode 100644 test/setup/configure-testing-library.js rename test/{setup.js => setup/globals.js} (63%) rename test/{ => setup}/ts-node.js (100%) diff --git a/.mocharc.js b/.mocharc.js index 323c468cc..8872c14e6 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -3,5 +3,10 @@ module.exports = { extension: ["js", "jsx", "ts", "tsx"], recursive: true, - require: ["./test/ts-node", "./test/setup", "./test/assert-ext", "jsdom-global/register"], + require: [ + "./test/setup/ts-node", + "./test/setup/globals", + "./test/setup/assert-ext", + "./test/setup/configure-testing-library" + ], }; diff --git a/lib/adapters/test-result/testplane.ts b/lib/adapters/test-result/testplane.ts index 98efe2f4f..68c375863 100644 --- a/lib/adapters/test-result/testplane.ts +++ b/lib/adapters/test-result/testplane.ts @@ -32,7 +32,7 @@ export const getStatus = (eventName: ValueOf, events: Testp } else if (eventName === events.TEST_PENDING) { return TestStatus.SKIPPED; } else if (eventName === events.RETRY || eventName === events.TEST_FAIL) { - return hasUnrelatedToScreenshotsErrors(testResult.err!) ? TestStatus.ERROR : TestStatus.FAIL; + return hasUnrelatedToScreenshotsErrors(testResult.err as Error) ? TestStatus.ERROR : TestStatus.FAIL; } else if (eventName === events.TEST_BEGIN) { return TestStatus.RUNNING; } diff --git a/lib/static/components/bottom-progress-bar/index.jsx b/lib/static/components/bottom-progress-bar/index.jsx index 77498bd68..7afb73067 100644 --- a/lib/static/components/bottom-progress-bar/index.jsx +++ b/lib/static/components/bottom-progress-bar/index.jsx @@ -37,7 +37,7 @@ const BottomProgressBar = (props) => { BottomProgressBar.propTypes = { progressBar: PropTypes.object.isRequired, - visibleRootSuiteIds: PropTypes.arrayOf(PropTypes.number) + visibleRootSuiteIds: PropTypes.arrayOf(PropTypes.string) }; export default connect( diff --git a/lib/static/components/bullet.jsx b/lib/static/components/bullet.jsx index a937f4f61..6b5083fa3 100644 --- a/lib/static/components/bullet.jsx +++ b/lib/static/components/bullet.jsx @@ -16,7 +16,7 @@ const Bullet = ({status, onClick, className}) => { }); if (!isCheckbox) { - return
; + return
; } return
diff --git a/lib/static/components/controls/common-controls.jsx b/lib/static/components/controls/common-controls.jsx index 566cceed1..e2137f16f 100644 --- a/lib/static/components/controls/common-controls.jsx +++ b/lib/static/components/controls/common-controls.jsx @@ -18,8 +18,7 @@ class ControlButtons extends Component { view: PropTypes.shape({ expand: PropTypes.string.isRequired, viewMode: PropTypes.string.isRequired, - diffMode: PropTypes.string.isRequired, - changeViewMode: PropTypes.func.isRequired + diffMode: PropTypes.string.isRequired }), isStatisImageAccepterEnabled: PropTypes.bool, actions: PropTypes.object.isRequired diff --git a/lib/static/components/controls/control-button.tsx b/lib/static/components/controls/control-button.tsx index 73f992d30..8b2cd7bb9 100644 --- a/lib/static/components/controls/control-button.tsx +++ b/lib/static/components/controls/control-button.tsx @@ -4,7 +4,7 @@ import classNames from 'classnames'; import {Button} from '@gravity-ui/uikit'; interface ControlButtonProps { - label: string | Component; + label: React.ReactNode; title?: string; handler: () => void; isActive?: boolean; diff --git a/lib/static/components/controls/menu-bar.jsx b/lib/static/components/controls/menu-bar.jsx index 31eea1a5e..09e29684a 100644 --- a/lib/static/components/controls/menu-bar.jsx +++ b/lib/static/components/controls/menu-bar.jsx @@ -33,7 +33,7 @@ class MenuBar extends Component { } return ( -
+
( - + ); }); diff --git a/lib/static/components/icons/view-in-browser/index.jsx b/lib/static/components/icons/view-in-browser/index.jsx index a0a5fceb1..a85f1501f 100644 --- a/lib/static/components/icons/view-in-browser/index.jsx +++ b/lib/static/components/icons/view-in-browser/index.jsx @@ -45,7 +45,7 @@ class ViewInBrowser extends Component { onClick={this.onViewInBrowser} title="view in browser" target="_blank" - data-test-id='view-in-browser' rel="noreferrer" + data-qa='view-in-browser' rel="noreferrer" > ); } diff --git a/lib/static/components/modals/screenshot-accepter/body.jsx b/lib/static/components/modals/screenshot-accepter/body.jsx index 430ec4f45..925e03125 100644 --- a/lib/static/components/modals/screenshot-accepter/body.jsx +++ b/lib/static/components/modals/screenshot-accepter/body.jsx @@ -51,7 +51,7 @@ class ScreenshotAccepterBody extends Component { return (
- {testName} + {testName} {'/'} {browserName} {'/'} diff --git a/lib/static/components/modals/screenshot-accepter/index.jsx b/lib/static/components/modals/screenshot-accepter/index.jsx index bb561c9f0..f4f55a771 100644 --- a/lib/static/components/modals/screenshot-accepter/index.jsx +++ b/lib/static/components/modals/screenshot-accepter/index.jsx @@ -56,7 +56,7 @@ class ScreenshotAccepter extends Component { this.totalImagesCount = size(imagesByStateName); for (let i = 1; i <= PRELOAD_IMAGE_COUNT; i++) { - this._preloadAdjacentImages(i); + this._preloadAdjacentImages(activeImageIndex, stateNameImageIds, i); } } @@ -72,7 +72,7 @@ class ScreenshotAccepter extends Component { const images = this._getActiveImages(activeImageIndex); this.setState({retryIndex: images.length - 1, activeImageIndex}); - this._preloadAdjacentImages(); + this._preloadAdjacentImages(activeImageIndex, this.state.stateNameImageIds); }; onScreenshotAccept = async (imageId) => { @@ -117,7 +117,7 @@ class ScreenshotAccepter extends Component { stateNameImageIds: stateNameIds, retryIndex: newImages.length - 1 }); - this._preloadAdjacentImages(); + this._preloadAdjacentImages(activeImageIndex, stateNameIds); }; onScreenshotUndo = async () => { @@ -147,7 +147,7 @@ class ScreenshotAccepter extends Component { stateNameImageIds: previousStateNameImageId, retryIndex: images.length - 1 }); - this._preloadAdjacentImages(); + this._preloadAdjacentImages(ind, previousStateNameImageId); }; onShowMeta = () => { @@ -208,13 +208,13 @@ class ScreenshotAccepter extends Component { return imageId; } - _preloadAdjacentImages(offset = PRELOAD_IMAGE_COUNT) { - const screensCount = size(this.state.stateNameImageIds); - const previosImagesIndex = (screensCount + this.state.activeImageIndex - offset) % screensCount; - const nextImagesIndex = (this.state.activeImageIndex + offset) % screensCount; + _preloadAdjacentImages(activeImageIndex, stateNameImageIds, offset = PRELOAD_IMAGE_COUNT) { + const screensCount = size(stateNameImageIds); + const previosImagesIndex = (screensCount + activeImageIndex - offset) % screensCount; + const nextImagesIndex = (activeImageIndex + offset) % screensCount; [previosImagesIndex, nextImagesIndex].filter(ind => ind >= 0).forEach(preloadingImagesIndex => { - const stateNameImageId = this.state.stateNameImageIds[preloadingImagesIndex]; + const stateNameImageId = stateNameImageIds[preloadingImagesIndex]; const {expectedImg, actualImg, diffImg} = last(this.props.imagesByStateName[stateNameImageId]); [expectedImg, actualImg, diffImg].filter(Boolean).forEach(({path}) => preloadImage(path)); diff --git a/lib/static/components/progress-bar/index.jsx b/lib/static/components/progress-bar/index.jsx index b7d0d094d..61d286152 100644 --- a/lib/static/components/progress-bar/index.jsx +++ b/lib/static/components/progress-bar/index.jsx @@ -7,7 +7,7 @@ const ProgressBar = ({done, total, dataTestId}) => { const percent = (done / total).toFixed(2) * 100; return ( - + ); diff --git a/lib/static/components/retry-switcher/item.jsx b/lib/static/components/retry-switcher/item.jsx index 21ac03467..8c166199c 100644 --- a/lib/static/components/retry-switcher/item.jsx +++ b/lib/static/components/retry-switcher/item.jsx @@ -64,7 +64,7 @@ class RetrySwitcherItem extends Component { {'tab-switcher__button_non-matched': keyToGroupTestsBy && !matchedSelectedGroup} ); - return ; + return ; } } diff --git a/lib/static/components/section/body/description.jsx b/lib/static/components/section/body/description.jsx index 3eff6e1b7..c87385bad 100644 --- a/lib/static/components/section/body/description.jsx +++ b/lib/static/components/section/body/description.jsx @@ -1,5 +1,3 @@ -'use strict'; - import React, {Component} from 'react'; import Markdown from 'react-markdown'; import PropTypes from 'prop-types'; diff --git a/lib/static/components/state/index.jsx b/lib/static/components/state/index.jsx index 72300b741..b14ded48a 100644 --- a/lib/static/components/state/index.jsx +++ b/lib/static/components/state/index.jsx @@ -125,7 +125,7 @@ class State extends Component { isDisabled={isScreenshotAccepterDisabled} extendClassNames="screenshot-accepter__arrows-open-btn" handler={() => this.toggleModal()} - data-test-id="test-switch-accept-mode" + data-qa="test-switch-accept-mode" />
); diff --git a/lib/static/components/state/screenshot/diff-circle.jsx b/lib/static/components/state/screenshot/diff-circle.jsx index efb757dec..6655e43f0 100644 --- a/lib/static/components/state/screenshot/diff-circle.jsx +++ b/lib/static/components/state/screenshot/diff-circle.jsx @@ -2,7 +2,6 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; -import {keyframes} from 'styled-components'; import {CIRCLE_RADIUS} from '../../../../constants/defaults'; export default class DiffCircle extends Component { @@ -48,16 +47,10 @@ export default class DiffCircle extends Component { }; const radius = diffRect.minSize + CIRCLE_RADIUS; - const animation = keyframes` - 100% { - transform: scale(${radius / diffRect.minSize}) - } - `; - return (
toggleDiff()} >
diff --git a/lib/static/components/state/screenshot/with-synced-scale.jsx b/lib/static/components/state/screenshot/with-synced-scale.jsx index 424949bcd..34fda26a4 100644 --- a/lib/static/components/state/screenshot/with-synced-scale.jsx +++ b/lib/static/components/state/screenshot/with-synced-scale.jsx @@ -1,116 +1,116 @@ -import React, {Component} from 'react'; +import useResizeObserver from '@react-hook/resize-observer'; import PropTypes from 'prop-types'; -import ResizeObserver from 'rc-resize-observer'; - -export default (WrappedComponent) => class WithSyncedScale extends Component { - static propTypes = { - image1: PropTypes.shape({ - size: PropTypes.shape({ - width: PropTypes.number, - height: PropTypes.number - }) - }).isRequired, - image2: PropTypes.shape({ - size: PropTypes.shape({ - width: PropTypes.number, - height: PropTypes.number - }) - }).isRequired - }; - - constructor(props) { - super(props); +import React, {useEffect, useRef, useState} from 'react'; +export default (WrappedComponent) => { + function WithSyncedScale(props) { const {image1, image2} = props; - this._scaleFactor = 1; - this._shouldScale = image1.size.width !== image2.size.width; - this._isFirstImageWider = image1.size.width > image2.size.width; + const scaleFactor = useRef(1); + const shouldScale = useRef(image1.size.width !== image2.size.width); + const isFirstImageWider = useRef(image1.size.width > image2.size.width); - this.state = { + const [state, setState] = useState({ syncedImage1: { - containerRef: React.createRef(), + containerRef: useRef(null), width: image1.size.width }, syncedImage2: { - containerRef: React.createRef(), + containerRef: useRef(null), width: image2.size.width }, resizesNum: 0 - }; - } - - componentDidMount() { - this._handleResize(); - } + }); - _calcScaleFactor = () => { - if (!this._shouldScale) { - return this._scaleFactor; - } + const getRenderedImgWidth = (syncedImage) => { + return syncedImage.containerRef.current + ? syncedImage.containerRef.current.offsetWidth + : syncedImage.width; + }; - const {image1, image2} = this.props; - const {syncedImage1, syncedImage2} = this.state; + const _calcScaleFactor = () => { + if (!shouldScale.current) { + return scaleFactor.current; + } - const imgWidth = this._isFirstImageWider ? image1.size.width : image2.size.width; - const renderedImgWidth = this._isFirstImageWider - ? this.getRenderedImgWidth(syncedImage1) - : this.getRenderedImgWidth(syncedImage2); + const {image1, image2} = props; + const {syncedImage1, syncedImage2} = state; - return renderedImgWidth / imgWidth; - }; + const imgWidth = isFirstImageWider.current ? image1.size.width : image2.size.width; + const renderedImgWidth = isFirstImageWider.current + ? getRenderedImgWidth(syncedImage1) + : getRenderedImgWidth(syncedImage2); - _getScaledWidth = (image) => { - if (!this._shouldScale) { - return image.size.width; - } + return renderedImgWidth / imgWidth; + }; - const scaledWidth = Math.ceil(image.size.width * this._scaleFactor); + const _getScaledWidth = (image) => { + if (!shouldScale.current) { + return image.size.width; + } - return Math.min(scaledWidth, image.size.width); - }; + const scaledWidth = Math.ceil(image.size.width * scaleFactor.current); - getRenderedImgWidth(syncedImage) { - return syncedImage.containerRef.current - ? syncedImage.containerRef.current.offsetWidth - : syncedImage.width; - } + return Math.min(scaledWidth, image.size.width); + }; - _handleResize = () => { - if (!this._shouldScale) { - return; - } + const _handleResize = () => { + if (!shouldScale.current) { + return; + } + + const {image1, image2} = props; + scaleFactor.current = _calcScaleFactor(); + + setState({ + syncedImage1: { + ...state.syncedImage1, + width: isFirstImageWider.current ? image1.size.width : _getScaledWidth(image1) + }, + syncedImage2: { + ...state.syncedImage2, + width: isFirstImageWider.current ? _getScaledWidth(image2) : image2.size.width + }, + resizesNum: state.resizesNum + 1 + }); + }; - const {image1, image2} = this.props; - this._scaleFactor = this._calcScaleFactor(); + useEffect(() => { + _handleResize(); + }, []); - this.setState(prevState => ({ - syncedImage1: { - ...prevState.syncedImage1, - width: this._isFirstImageWider ? image1.size.width : this._getScaledWidth(image1) - }, - syncedImage2: { - ...prevState.syncedImage2, - width: this._isFirstImageWider ? this._getScaledWidth(image2) : image2.size.width - }, - resizesNum: prevState.resizesNum + 1 - })); - }; + const containerRef = useRef(null); + useResizeObserver(containerRef, _handleResize); - render() { - const {syncedImage1, syncedImage2, resizesNum} = this.state; + const {syncedImage1, syncedImage2, resizesNum} = state; return ( - +
- +
); } + + WithSyncedScale.propTypes = { + image1: PropTypes.shape({ + size: PropTypes.shape({ + width: PropTypes.number, + height: PropTypes.number + }) + }).isRequired, + image2: PropTypes.shape({ + size: PropTypes.shape({ + width: PropTypes.number, + height: PropTypes.number + }) + }).isRequired + }; + + return WithSyncedScale; }; diff --git a/lib/static/components/state/state-error.jsx b/lib/static/components/state/state-error.jsx index 3330c047a..9a17963f2 100644 --- a/lib/static/components/state/state-error.jsx +++ b/lib/static/components/state/state-error.jsx @@ -5,7 +5,7 @@ import {connect} from 'react-redux'; import {bindActionCreators} from 'redux'; import PropTypes from 'prop-types'; import {isEmpty, map, isFunction} from 'lodash'; -import ReactHtmlParser from 'react-html-parser'; +import ReactHtmlParser from 'html-react-parser'; import escapeHtml from 'escape-html'; import ansiHtml from 'ansi-html-community'; import * as actions from '../../modules/actions'; diff --git a/lib/static/components/suites.jsx b/lib/static/components/suites.jsx index 881ed5557..7a4fd1571 100644 --- a/lib/static/components/suites.jsx +++ b/lib/static/components/suites.jsx @@ -1,9 +1,9 @@ -import React, {Component} from 'react'; +import React, {useRef} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; import {isEmpty, flatMap, find, once, throttle} from 'lodash'; import {List, AutoSizer, CellMeasurer, CellMeasurerCache, WindowScroller} from 'react-virtualized'; -import ResizeObserver from 'rc-resize-observer'; +import useResizeObserver from '@react-hook/resize-observer'; import {bindActionCreators} from 'redux'; import * as actions from '../modules/actions'; @@ -11,27 +11,33 @@ import SectionCommon from './section/section-common'; import {ViewMode} from '../../constants/view-modes'; import {getVisibleRootSuiteIds} from '../modules/selectors/tree'; -class Suites extends Component { - static propTypes = { - // from store - visibleRootSuiteIds: PropTypes.arrayOf(PropTypes.string), - viewMode: PropTypes.string, - actions: PropTypes.object.isRequired, - testNameFilter: PropTypes.string, - strictMatchFilter: PropTypes.bool, - filteredBrowsers: PropTypes.arrayOf(PropTypes.objectOf({ - id: PropTypes.string, - versions: PropTypes.arrayOf(PropTypes.string) - })) - }; +function VirtualizedRow(props) { + const resizeObserverRef = useRef(null); + + useResizeObserver(resizeObserverRef, () => props.onResize); + + return
+
+ +
+
; +} - _suitesMeasurementCache = new CellMeasurerCache({ +VirtualizedRow.propTypes = { + onInit: PropTypes.func, + onResize: PropTypes.func, + style: PropTypes.object, + sectionProps: PropTypes.object +}; + +function Suites(props) { + const _suitesMeasurementCache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 30 }); - _renderRow = ({index, key, style, parent}) => { - const {visibleRootSuiteIds} = this.props; + const _renderRow = ({index, key, style, parent}) => { + const {visibleRootSuiteIds} = props; const suiteId = visibleRootSuiteIds[index]; const sectionProps = { key: suiteId, @@ -42,29 +48,25 @@ class Suites extends Component { return ( - {({measure}) => ( -
- - - -
- )} + {({measure, registerChild}) => { + return ; + }}
); }; - _recalculateBottomProgressBar = throttle(() => { - const {actions} = this.props; + const _recalculateBottomProgressBar = throttle(() => { + const {actions} = props; const nodes = Array.from(document.querySelectorAll('.virtualized__row')); let visibleNode = find(nodes.slice().reverse(), (node) => { const rect = node.getBoundingClientRect(); - const bottomViewportWindow = document.documentElement.clientHeight - this._suitesMeasurementCache.defaultHeight; + const bottomViewportWindow = document.documentElement.clientHeight - _suitesMeasurementCache.defaultHeight; return rect.top > 0 && rect.top <= bottomViewportWindow; }); @@ -86,10 +88,10 @@ class Suites extends Component { actions.updateBottomProgressBar({currentRootSuiteId: suiteId}); }, 100); - _calculateInitialBottomProgressBar = once(() => setTimeout(this._recalculateBottomProgressBar, 0)); + const _calculateInitialBottomProgressBar = once(() => setTimeout(_recalculateBottomProgressBar, 0)); - _getSelectedFiltersInfo() { - const {viewMode, filteredBrowsers, testNameFilter, strictMatchFilter} = this.props; + const _getSelectedFiltersInfo = () => { + const {viewMode, filteredBrowsers, testNameFilter, strictMatchFilter} = props; const msgs = []; if (testNameFilter) { @@ -106,52 +108,63 @@ class Suites extends Component { } return msgs; - } - - render() { - const {visibleRootSuiteIds} = this.props; + }; - if (isEmpty(visibleRootSuiteIds)) { - const selectedFiltersMsgs = this._getSelectedFiltersInfo(); + const {visibleRootSuiteIds} = props; - return
- There are no tests that match to selected filters: -
    - {selectedFiltersMsgs.map((msg, i) =>
  • {msg}
  • )} -
- Try to change your search filters to see tests. -
; - } + if (isEmpty(visibleRootSuiteIds)) { + const selectedFiltersMsgs = _getSelectedFiltersInfo(); - return ( -
- - {({height, isScrolling, onChildScroll, scrollTop}) => ( - - {({width}) => ( - - )} - - )} - -
- ); + return
+ There are no tests that match to selected filters: +
    + {selectedFiltersMsgs.map((msg, i) =>
  • {msg}
  • )} +
+ Try to change your search filters to see tests. +
; } + + return ( +
+ + {({height, isScrolling, onChildScroll, scrollTop, registerChild}) => ( + + {({width}) =>
el && registerChild(el)}> + +
} +
+ )} +
+
+ ); } +Suites.propTypes = { + // from store + visibleRootSuiteIds: PropTypes.arrayOf(PropTypes.string), + viewMode: PropTypes.string, + actions: PropTypes.object.isRequired, + testNameFilter: PropTypes.string, + strictMatchFilter: PropTypes.bool, + filteredBrowsers: PropTypes.arrayOf(PropTypes.shape({ + id: PropTypes.string, + versions: PropTypes.arrayOf(PropTypes.string) + })) +}; + export default connect( (state) => ({ visibleRootSuiteIds: getVisibleRootSuiteIds(state), diff --git a/lib/static/gui.jsx b/lib/static/gui.jsx index 41240faf0..2637afb6b 100644 --- a/lib/static/gui.jsx +++ b/lib/static/gui.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import ReactDOM from 'react-dom'; +import {createRoot} from 'react-dom/client'; import {Provider} from 'react-redux'; import store from './modules/store'; import Gui from './components/gui'; @@ -9,12 +9,12 @@ import '@gravity-ui/uikit/styles/fonts.css'; import '@gravity-ui/uikit/styles/styles.css'; const rootEl = document.getElementById('app'); +const root = createRoot(rootEl); -ReactDOM.render( +root.render( - , - rootEl + ); diff --git a/lib/static/index.jsx b/lib/static/index.jsx index c9bc4ecca..c4fda6fd6 100644 --- a/lib/static/index.jsx +++ b/lib/static/index.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import ReactDOM from 'react-dom'; +import {createRoot} from 'react-dom/client'; import {Provider} from 'react-redux'; import store from './modules/store'; import Report from './components/report'; @@ -9,12 +9,12 @@ import '@gravity-ui/uikit/styles/fonts.css'; import '@gravity-ui/uikit/styles/styles.css'; const rootEl = document.getElementById('app'); +const root = createRoot(rootEl); -ReactDOM.render( +root.render( - , - rootEl + ); diff --git a/lib/static/modules/default-state.ts b/lib/static/modules/default-state.ts index d0472dadf..e8172817a 100644 --- a/lib/static/modules/default-state.ts +++ b/lib/static/modules/default-state.ts @@ -37,6 +37,7 @@ export default Object.assign({config: configDefaults}, { }, results: { byId: {}, + stateById: {}, allIds: [] }, images: { diff --git a/lib/static/styles.css b/lib/static/styles.css index 50d7e1cd5..9deb01a4c 100644 --- a/lib/static/styles.css +++ b/lib/static/styles.css @@ -539,7 +539,7 @@ main.container { text-overflow: ellipsis; } -.copy-button { +.copy-button { margin-left: 2px; } @@ -882,6 +882,12 @@ a:active { background-color: #FF00FF; } +@keyframes diff-bubbles { + 100% { + transform: scale(var(--diff-bubbles-scale)) + } +} + .ui.loader { z-index: 50; } diff --git a/package-lock.json b/package-lock.json index 96062a993..16a0422d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "html-reporter", - "version": "10.5.0", + "version": "10.6.0", "license": "MIT", "workspaces": [ "test/func/fixtures/*", @@ -61,14 +61,16 @@ "@gravity-ui/components": "^3.7.0", "@gravity-ui/uikit": "^6.20.0", "@playwright/test": "^1.44.1", + "@react-hook/resize-observer": "^2.0.1", "@swc/core": "^1.3.64", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", "@types/babel__core": "^7.20.5", "@types/better-sqlite3": "^7.6.4", "@types/bluebird": "^3.5.3", "@types/chai": "^4.3.5", "@types/chai-as-promised": "^7.1.1", "@types/debug": "^4.1.8", - "@types/enzyme": "^3.10.13", "@types/escape-html": "^1.0.4", "@types/express": "4.16", "@types/fs-extra": "^7.0.0", @@ -89,6 +91,7 @@ "buffer": "^6.0.3", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", + "chai-dom": "^1.12.0", "classnames": "^2.2.5", "concurrently": "^7.6.0", "conventional-changelog-lint": "^1.0.1", @@ -97,8 +100,6 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.4", "esbuild": "^0.23.0", "eslint": "^8.43.0", "eslint-config-gemini-testing": "^2.8.0", @@ -107,7 +108,7 @@ "fork-ts-checker-webpack-plugin": "^9.0.0", "hermione-global-hook": "^1.0.1", "hermione-test-repeater": "^0.0.8", - "html-react-parser": "^0.4.0", + "html-react-parser": "^5.1.12", "html-reporter-basic-plugin": "file:test/func/packages/basic", "html-reporter-menu-bar-plugin": "file:test/func/packages/menu-bar", "html-reporter-redux-plugin": "file:test/func/packages/redux", @@ -120,12 +121,13 @@ "husky": "^0.11.9", "ignore-styles": "^5.0.1", "immer": "^7.0.15", - "jsdom": "^21.1.2", + "jsdom": "^24.1.1", "jsdom-global": "^3.0.2", "less": "^3.11.1", "less-loader": "^11.1.3", "mini-css-extract-plugin": "^2.7.6", - "mocha": "^10.2.0", + "mocha": "^10.7.0", + "msw": "^2.3.4", "npm-run-all": "^4.1.5", "nyc": "^14.1.1", "path-browserify": "^1.0.1", @@ -133,17 +135,15 @@ "prop-types": "^15.6.0", "proxyquire": "^1.7.11", "raf": "^3.4.0", - "rc-resize-observer": "^1.0.0", - "react": "^16.13.1", + "react": "^18.3.1", "react-checkbox-tree": "^1.8.0", "react-clipboard.js": "^1.1.2", - "react-dom": "^16.13.1", + "react-dom": "^18.3.1", "react-hotkeys": "^2.0.0", - "react-html-parser": "^2.0.2", "react-markdown": "^6.0.3", "react-redux": "^7.2.1", - "react-virtualized": "^9.22.3", - "reapop": "4.0.5", + "react-virtualized": "^9.22.5", + "reapop": "^4.2.2", "reduce-reducers": "^1.0.4", "redux": "^4.0.5", "redux-logger": "^3.0.6", @@ -151,12 +151,11 @@ "redux-thunk": "^2.2.0", "reselect": "^4.1.6", "rimraf": "^2.6.3", - "semantic-ui-react": "^1.2.1", + "semantic-ui-react": "^3.0.0-beta.2", "sinon": "^4.0.1", "standard-version": "^4.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.3", - "styled-components": "^3.4.10", "stylus": "^0.57.0", "stylus-loader": "^7.1.3", "terser-webpack-plugin": "^5.3.9", @@ -2112,20 +2111,20 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { "version": "7.24.7", @@ -2182,6 +2181,52 @@ "integrity": "sha512-SFBwUHMcb7TFFK5ld88+JhecoEun3/kHZ6KvLDjj3w5hv/tfRV8mtGHA8N42uMctXLF4bPEcr96xwXXcRFuweg==", "dev": true }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/statuses/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2757,30 +2802,16 @@ } }, "node_modules/@fluentui/react-component-event-listener": { - "version": "0.51.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.51.7.tgz", - "integrity": "sha512-NjVm+crN0T9A7vITL8alZeHnuV8zi2gos0nezU/2YOxaUAB9E4zKiPxt/6k5U50rJs/gj8Nu45iXxnjO41HbZg==", + "version": "0.63.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz", + "integrity": "sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==", "dev": true, "dependencies": { "@babel/runtime": "^7.10.4" }, "peerDependencies": { - "react": "^16.8.0 || ^17", - "react-dom": "^16.8.0 || ^17" - } - }, - "node_modules/@fluentui/react-component-ref": { - "version": "0.51.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.51.7.tgz", - "integrity": "sha512-CX27jVJYaFoBCWpuWAizQZ2se137ku1dmDyn8sw+ySNJa+kkQf7LnMydiPW5K7cRdUSqUJW3eS4EjKRvVAx8xA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.4", - "react-is": "^16.6.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17", - "react-dom": "^16.8.0 || ^17" + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" } }, "node_modules/@gemini-testing/commander": { @@ -2871,37 +2902,6 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@gravity-ui/uikit/node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dev": true, - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/@gravity-ui/uikit/node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -2947,6 +2947,134 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@inquirer/confirm": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", + "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", + "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", + "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3142,6 +3270,29 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "dev": true + }, + "node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", + "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nicolo-ribaudo/semver-v6": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", @@ -3183,6 +3334,28 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3345,18 +3518,50 @@ "node": ">=12" } }, + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "dev": true, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "dev": true, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/resize-observer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.1.tgz", + "integrity": "sha512-9PCX9grWfxdPizY8ohr+X4IkV1JhGMWr2Nm4ngbg6IcAIv0WBs7YoJcNBqYl22OqPHr5eOMItGcStZrmj2mbmQ==", + "dev": true, + "dependencies": { + "@juggle/resize-observer": "^3.3.1", + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, "node_modules/@semantic-ui-react/event-stack": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", - "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz", + "integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==", "dev": true, "dependencies": { "exenv": "^1.2.2", "prop-types": "^15.6.2" }, "peerDependencies": { - "react": "^16.0.0 || ^17.0.0", - "react-dom": "^16.0.0 || ^17.0.0" + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@sinclair/typebox": { @@ -3618,6 +3823,111 @@ "node": ">=14.16" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "peer": true + }, + "node_modules/@testing-library/react": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", + "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -3666,6 +3976,13 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3759,15 +4076,6 @@ "@types/chai": "*" } }, - "node_modules/@types/cheerio": { - "version": "0.22.31", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", - "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -3792,27 +4100,6 @@ "@types/ms": "*" } }, - "node_modules/@types/enzyme": { - "version": "3.10.13", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.13.tgz", - "integrity": "sha512-FCtoUhmFsud0Yx9fmZk179GkdZ4U9B0GFte64/Md+W/agx0L5SxsIIbhLBOxIb9y2UfBA4WQnaG1Od/UsUQs9Q==", - "dev": true, - "dependencies": { - "@types/cheerio": "*", - "@types/react": "^16" - } - }, - "node_modules/@types/enzyme/node_modules/@types/react": { - "version": "16.14.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz", - "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@types/escape-html": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", @@ -3897,9 +4184,9 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dev": true, "dependencies": { "@types/react": "*", @@ -4014,6 +4301,15 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", @@ -4021,9 +4317,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4084,20 +4380,19 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", - "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dev": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-redux": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.20.tgz", - "integrity": "sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw==", + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dev": true, "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", @@ -4115,12 +4410,6 @@ "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -4160,12 +4449,24 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, "node_modules/@types/tmp": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz", "integrity": "sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==", "dev": true }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", @@ -4184,6 +4485,12 @@ "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -7126,13 +7433,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -7170,40 +7470,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -7248,29 +7514,6 @@ "node": ">= 6.0.0" } }, - "node_modules/airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "dev": true, - "dependencies": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" - } - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -7718,13 +7961,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7805,56 +8051,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz", - "integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.find": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz", - "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", @@ -7887,17 +8083,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -7916,12 +8113,6 @@ "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -8019,10 +8210,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -9090,12 +9284,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9154,12 +9354,6 @@ "node": ">=0.10.0" } }, - "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", - "dev": true - }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -9240,6 +9434,18 @@ "chai": ">= 2.1.2 < 5" } }, + "node_modules/chai-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.0.tgz", + "integrity": "sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==", + "dev": true, + "engines": { + "node": ">= 0.12.0" + }, + "peerDependencies": { + "chai": ">= 3" + } + }, "node_modules/chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -9311,43 +9517,6 @@ "node": "*" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -9610,9 +9779,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -11667,16 +11836,6 @@ "sha.js": "^2.4.8" } }, - "node_modules/create-react-class": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", - "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", - "dev": true, - "dependencies": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -11788,18 +11947,6 @@ "node": "*" } }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, "node_modules/css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -11809,15 +11956,6 @@ "tiny-invariant": "^1.0.6" } }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -11961,17 +12099,6 @@ "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", "dev": true }, - "node_modules/css-to-react-native": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", - "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", - "dev": true, - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^3.3.0" - } - }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -12003,15 +12130,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -12133,17 +12251,23 @@ "dev": true }, "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, "dependencies": { "rrweb-cssom": "^0.6.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "node_modules/csstype": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", @@ -12190,17 +12314,67 @@ } }, "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/date-fns": { @@ -12456,17 +12630,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -13123,12 +13299,6 @@ "node": ">=8" } }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -13166,6 +13336,13 @@ "node": ">=0.10.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "peer": true + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -13221,19 +13398,6 @@ } ] }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/domhandler": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", @@ -13585,6 +13749,8 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -13594,6 +13760,8 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13643,98 +13811,6 @@ "node": ">=4" } }, - "node_modules/enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/enzyme-adapter-react-16": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", - "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", - "dev": true, - "dependencies": { - "enzyme-adapter-utils": "^1.14.0", - "enzyme-shallow-equal": "^1.0.4", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.values": "^1.1.2", - "prop-types": "^15.7.2", - "react-is": "^16.13.1", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "enzyme": "^3.0.0", - "react": "^16.0.0-0", - "react-dom": "^16.0.0-0" - } - }, - "node_modules/enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", - "dev": true, - "dependencies": { - "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", - "semver": "^5.7.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" - } - }, - "node_modules/enzyme-shallow-equal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", - "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", - "dev": true, - "dependencies": { - "has": "^1.0.3", - "object-is": "^1.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -13756,50 +13832,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -13808,11 +13891,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { + "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } }, "node_modules/es-module-lexer": { "version": "1.3.1", @@ -13820,27 +13916,39 @@ "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -14683,7 +14791,7 @@ "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", "dev": true }, "node_modules/expand-brackets": { @@ -15149,28 +15257,6 @@ "node": ">=0.8.0" } }, - "node_modules/fbjs": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", - "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", - "dev": true, - "dependencies": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "node_modules/fbjs/node_modules/core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -15734,9 +15820,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -16010,14 +16099,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16073,13 +16166,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -16569,7 +16663,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -16631,11 +16724,14 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", - "dev": true + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } }, "node_modules/handle-thing": { "version": "2.0.1", @@ -16683,6 +16779,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -16721,21 +16818,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -16755,12 +16851,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -16917,6 +17013,17 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -16926,6 +17033,12 @@ "he": "bin/he" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "node_modules/hermione-global-hook": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hermione-global-hook/-/hermione-global-hook-1.0.1.tgz", @@ -16986,114 +17099,99 @@ } }, "node_modules/html-dom-parser": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-0.1.3.tgz", - "integrity": "sha512-kGhjJDkfiA2/3y0gc2Bi+rseJWJSKz4CioS4EM+vN80fw863f1hn3G+7EaP0/benxceky4a8TzEeW6+dDjUh7A==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.9.tgz", + "integrity": "sha512-QGeoFYwgQ582EDvrBx0+ejIz76/LuQcwwkmSR4ueKncjl2yWbciA45Kfz/LrHvWR3CgtKnxKFkr4Mpq2Sh1QNg==", "dev": true, "dependencies": { - "domhandler": "2.3.0", - "htmlparser2": "3.9.1" + "domhandler": "5.0.3", + "htmlparser2": "9.1.0" } }, "node_modules/html-dom-parser/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/html-dom-parser/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/html-dom-parser/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/html-dom-parser/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, "node_modules/html-dom-parser/node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/html-dom-parser/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/html-dom-parser/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/html-dom-parser/node_modules/htmlparser2": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.1.tgz", - "integrity": "sha1-Yht6WLyazQA/evCiyaAKpnyFBdI=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "node_modules/html-dom-parser/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "dependencies": { - "whatwg-encoding": "^2.0.0" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/html-entities": { @@ -17130,17 +17228,39 @@ } }, "node_modules/html-react-parser": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-0.4.7.tgz", - "integrity": "sha512-h3EUYXqKXts68/ynQwH5ws57vg2P94VzvzpwVRwYgWjW+uEtkXDjOO8q/7UmfcGX4DFHJ69UlQJa1RoRXCTaPg==", + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.1.12.tgz", + "integrity": "sha512-OPv8fsIvxxv/+pLj9mYvyNu8PE5dPMowTRdd5VHpcoZpXlstp8eYCxQ5rzqAE5Tb75rhdiWUXnPltfb62zCVjg==", "dev": true, "dependencies": { - "html-dom-parser": "0.1.3", - "react-dom-core": "0.0.3", - "style-to-object": "0.2.2" + "domhandler": "5.0.3", + "html-dom-parser": "5.0.9", + "react-property": "2.0.2", + "style-to-js": "1.1.12" }, "peerDependencies": { - "react": "^0.14 || ^15 || ^16" + "@types/react": "0.14 || 15 || 16 || 17 || 18", + "react": "0.14 || 15 || 16 || 17 || 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/html-react-parser/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/html-reporter-basic-plugin": { @@ -17839,13 +17959,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -17965,14 +18085,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18095,6 +18217,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -18220,9 +18357,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -18231,6 +18368,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -18349,12 +18492,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18418,12 +18564,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -18505,16 +18651,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "dependencies": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -18907,43 +19043,38 @@ "dev": true }, "node_modules/jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", + "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", "dev": true, "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", + "nwsapi": "^2.2.12", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^2.11.2" }, "peerDependenciesMeta": { "canvas": { @@ -18960,16 +19091,16 @@ "jsdom": ">=10.0.0" } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "debug": "^4.3.4" }, "engines": { - "node": ">=0.4.0" + "node": ">= 14" } }, "node_modules/jsdom/node_modules/entities": { @@ -18984,6 +19115,32 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/jsdom/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -18997,9 +19154,9 @@ } }, "node_modules/jsdom/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -19473,12 +19630,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -19495,7 +19646,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true + "dev": true, + "optional": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -19686,6 +19838,16 @@ "yallist": "^3.0.2" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", @@ -20155,32 +20317,32 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz", + "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -20188,17 +20350,14 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -20214,6 +20373,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -20229,11 +20389,37 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -20272,6 +20458,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -20318,10 +20525,11 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -20335,18 +20543,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/mocha/node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -20386,15 +20582,6 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/mocha/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -20481,10 +20668,11 @@ } }, "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -20567,17 +20755,168 @@ "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, - "node_modules/moo": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", - "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", - "dev": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/msw": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", + "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/msw/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/msw/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/msw/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/msw/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/msw/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", @@ -20696,34 +21035,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/nearley/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -20886,16 +21197,6 @@ "node": ">=10.5.0" } }, - "node_modules/node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node_modules/node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -21191,9 +21492,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, "node_modules/nyc": { @@ -21390,9 +21691,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21435,13 +21739,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -21467,14 +21771,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -21660,6 +21965,12 @@ "node": ">=0.10.0" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -21943,21 +22254,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -22320,17 +22616,6 @@ "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==", "dev": true }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -22372,6 +22657,15 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -22993,12 +23287,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -23122,15 +23410,6 @@ "node": ">=0.4.0" } }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "dependencies": { - "asap": "~2.0.3" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -23142,17 +23421,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "dependencies": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", @@ -23455,25 +23723,6 @@ "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", "dev": true }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -23530,22 +23779,6 @@ "rc": "index.js" } }, - "node_modules/rc-resize-observer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.1.tgz", - "integrity": "sha512-OxO2mJI9e8610CAWBFfm52SPvWib0eNKjaSsRbbKHmLaJIxw944P+D61DlLJ/w2vuOjGNcalJu8VdqyNm/XCRg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/rc-slider": { "version": "10.6.2", "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", @@ -23585,14 +23818,12 @@ "dev": true }, "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -23659,51 +23890,16 @@ } }, "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/react-dom-core": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/react-dom-core/-/react-dom-core-0.0.3.tgz", - "integrity": "sha512-pMMNOU4Hhe/LmkGWMVOpQmPnKQo+bGaWY3Y0+OjXmsQVB5LJ3sr4hVCM/7MpcRGeEMcfaRaoHyiLhufzk/BL4w==", - "dev": true, - "dependencies": { - "react": "15" - }, - "optionalDependencies": { - "fbjs": "*", - "object-assign": "*" + "scheduler": "^0.23.2" }, "peerDependencies": { - "fbjs": "*", - "object-assign": "*" - } - }, - "node_modules/react-dom-core/node_modules/react": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/react/-/react-15.7.0.tgz", - "integrity": "sha512-5/MMRYmpmM0sMTHGLossnJCrmXQIiJilD6y3YN3TzAwGFj6zdnMtFv6xmi65PHKRV+pehIHpT7oy67Sr6s9AHA==", - "dev": true, - "dependencies": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - }, - "engines": { - "node": ">=0.10.0" + "react": "^18.3.1" } }, "node_modules/react-fast-compare": { @@ -23724,137 +23920,6 @@ "react": ">= 0.14.0" } }, - "node_modules/react-html-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/react-html-parser/-/react-html-parser-2.0.2.tgz", - "integrity": "sha512-XeerLwCVjTs3njZcgCOeDUqLgNIt/t+6Jgi5/qPsO/krUWl76kWKXMeVs2LhY2gwM6X378DkhLjur0zUQdpz0g==", - "dev": true, - "dependencies": { - "htmlparser2": "^3.9.0" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0-0" - } - }, - "node_modules/react-html-parser/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/react-html-parser/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/react-html-parser/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/react-html-parser/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/react-html-parser/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/react-html-parser/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/react-html-parser/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/react-html-parser/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/react-html-parser/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/react-html-parser/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react-html-parser/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -23912,41 +23977,30 @@ } }, "node_modules/react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "dev": true, "dependencies": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", + "react-fast-compare": "^3.0.1", "warning": "^4.0.2" }, "peerDependencies": { - "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" } }, - "node_modules/react-popper/node_modules/@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", - "dev": true, - "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": ">=0.14.0" - } + "node_modules/react-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", + "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==", + "dev": true }, "node_modules/react-redux": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz", - "integrity": "sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.15.4", @@ -23957,7 +24011,7 @@ "react-is": "^17.0.2" }, "peerDependencies": { - "react": "^16.8.3 || ^17" + "react": "^16.8.3 || ^17 || ^18" }, "peerDependenciesMeta": { "react-dom": { @@ -23974,25 +24028,10 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "node_modules/react-test-renderer": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", - "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "dev": true, "dependencies": { "@babel/runtime": "^7.5.5", @@ -24006,9 +24045,9 @@ } }, "node_modules/react-virtualized": { - "version": "9.22.3", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", - "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.7.2", @@ -24019,8 +24058,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" } }, "node_modules/react-virtualized-auto-sizer": { @@ -24178,18 +24217,18 @@ } }, "node_modules/reapop": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/reapop/-/reapop-4.0.5.tgz", - "integrity": "sha512-MelMeZ0YoUOvjwzzu1a3oZVA8wmcPOIBKLL25a1XiVrxpORvyYpLB4nrmqrycg3Bfd7jp+eRCg1CboE7S67S+g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/reapop/-/reapop-4.2.2.tgz", + "integrity": "sha512-pyiCVda0YAzXk727LEOYjAqqWn6xXmIacVXBGDRlq3RCWZixX7WhWS3E6yv2ZWBzEIbyXO0ZRmvxMYnuA3A7Qg==", "dev": true, "dependencies": { - "react-transition-group": "4.4.2" + "react-transition-group": "4.4.5" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.19.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/rechoir": { @@ -24259,12 +24298,6 @@ "redux": "^4" } }, - "node_modules/reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -24303,14 +24336,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -24627,21 +24661,11 @@ } }, "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true }, - "node_modules/rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "dependencies": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -24687,13 +24711,13 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -24725,15 +24749,18 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -24769,13 +24796,12 @@ } }, "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { @@ -24819,27 +24845,27 @@ } }, "node_modules/semantic-ui-react": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.3.1.tgz", - "integrity": "sha512-3EE8Cl2Tq9re+J5An8QOZHgjRJjHqNDBq+Aoaa0TLFnd79UgYzovJPQGy3AWIxgCkxDPj4c3yxl72ImumJLyeA==", + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-3.0.0-beta.2.tgz", + "integrity": "sha512-BFqd7dGPgXPbIkWkIzkPrPRBElf/iB4NKOSFl5tZwMEaIyGQXbvtVWHyOW0sMD2A/qZPgY2Wl/19GDc9JOg3ng==", "dev": true, "dependencies": { - "@babel/runtime": "^7.10.5", - "@fluentui/react-component-event-listener": "~0.51.1", - "@fluentui/react-component-ref": "~0.51.1", - "@semantic-ui-react/event-stack": "^3.1.0", + "@babel/runtime": "^7.23.7", + "@fluentui/react-component-event-listener": "~0.63.0", + "@popperjs/core": "^2.11.8", + "@semantic-ui-react/event-stack": "^3.1.3", "clsx": "^1.1.1", "keyboard-key": "^1.1.0", - "lodash": "^4.17.19", - "lodash-es": "^4.17.15", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "react-popper": "^1.3.7", + "react-is": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react-popper": "^2.3.0", "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.8.0", - "react-dom": "^16.8.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/semver": { @@ -24920,10 +24946,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -25008,6 +25035,22 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -26420,6 +26463,12 @@ "node": ">=0.2.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -26527,14 +26576,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -26544,28 +26594,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -26678,87 +26731,30 @@ "webpack": "^5.0.0" } }, - "node_modules/style-to-object": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.2.tgz", - "integrity": "sha512-GcbtvfsqyKmIPpHeOHZ5Rmwsx2MDJct4W9apmTGcbPTbpA2FcgTFl2Z43Hm4Qb61MWGPNK8Chki7ITiY7lLOow==", + "node_modules/style-to-js": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.12.tgz", + "integrity": "sha512-tv+/FkgNYHI2fvCoBMsqPHh5xovwiw+C3X0Gfnss/Syau0Nr3IqGOJ9XiOYXoPnToHVbllKFf5qCNFJGwFg5mg==", "dev": true, "dependencies": { - "css": "2.2.4" + "style-to-object": "1.0.6" } }, - "node_modules/styled-components": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.4.10.tgz", - "integrity": "sha512-TA8ip8LoILgmSAFd3r326pKtXytUUGu5YWuqZcOQVwVVwB6XqUMn4MHW2IuYJ/HAD81jLrdQed8YWfLSG1LX4Q==", + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "buffer": "^5.0.3", - "css-to-react-native": "^2.0.3", - "fbjs": "^0.8.16", - "hoist-non-react-statics": "^2.5.0", - "prop-types": "^15.5.4", - "react-is": "^16.3.1", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10", - "supports-color": "^3.2.3" - }, - "peerDependencies": { - "react": ">= 0.14.0 < 17.0.0-0" + "inline-style-parser": "0.2.3" } }, - "node_modules/styled-components/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styled-components/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "node_modules/style-to-object/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==", "dev": true }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/stylehacks": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", @@ -26775,21 +26771,6 @@ "postcss": "^8.2.15" } }, - "node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", - "dev": true - }, - "node_modules/stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "dev": true, - "peerDependencies": { - "stylis": "^3.5.0" - } - }, "node_modules/stylus": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", @@ -27467,6 +27448,16 @@ "resolved": "test/func/fixtures/testplane-gui", "link": true }, + "node_modules/testplane/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/testplane/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -27479,12 +27470,29 @@ "node": ">=4" } }, + "node_modules/testplane/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/testplane/node_modules/bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, + "node_modules/testplane/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/testplane/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -27499,6 +27507,18 @@ "node": ">=4" } }, + "node_modules/testplane/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/testplane/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -27523,6 +27543,40 @@ "ms": "2.0.0" } }, + "node_modules/testplane/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/testplane/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/testplane/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/testplane/node_modules/fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -27534,6 +27588,45 @@ "universalify": "^0.1.0" } }, + "node_modules/testplane/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/testplane/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/testplane/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/testplane/node_modules/looks-same": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/looks-same/-/looks-same-9.0.0.tgz", @@ -27584,18 +27677,198 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/testplane/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/testplane/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/testplane/node_modules/mocha/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/testplane/node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/testplane/node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/testplane/node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/testplane/node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/testplane/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/testplane/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/testplane/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/testplane/node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true }, + "node_modules/testplane/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/testplane/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/testplane/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/testplane/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -27611,6 +27884,16 @@ "node": ">=10" } }, + "node_modules/testplane/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/testplane/node_modules/sharp": { "version": "0.32.6", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", @@ -27634,6 +27917,34 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/testplane/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/testplane/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/testplane/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -27671,6 +27982,106 @@ "streamx": "^2.15.0" } }, + "node_modules/testplane/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/testplane/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/testplane/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/testplane/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/testplane/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/testplane/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/testplane/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/testplane/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -27882,15 +28293,15 @@ } }, "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "dependencies": { - "punycode": "^2.3.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/tr46/node_modules/punycode": { @@ -28107,29 +28518,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -28139,16 +28551,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -28158,25 +28571,25 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", - "dev": true - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -28196,25 +28609,6 @@ "node": ">=14.17" } }, - "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", @@ -28918,15 +29312,15 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "dependencies": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/wait-port": { @@ -30796,15 +31190,15 @@ } }, "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { @@ -30819,32 +31213,26 @@ "node": ">=0.10.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true - }, "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "dev": true, "dependencies": { - "tr46": "^4.1.1", + "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/which": { @@ -30881,16 +31269,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -30932,10 +31320,11 @@ } }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "5.1.0", @@ -31104,12 +31493,12 @@ } }, "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/xmlchars": { @@ -31299,6 +31688,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zip-stream": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", @@ -32790,17 +33191,17 @@ "dev": true }, "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" } } }, @@ -32850,6 +33251,50 @@ "integrity": "sha512-SFBwUHMcb7TFFK5ld88+JhecoEun3/kHZ6KvLDjj3w5hv/tfRV8mtGHA8N42uMctXLF4bPEcr96xwXXcRFuweg==", "dev": true }, + "@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "requires": { + "cookie": "^0.5.0" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + } + } + }, + "@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "requires": { + "statuses": "^2.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "requires": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -33157,24 +33602,14 @@ "dev": true }, "@fluentui/react-component-event-listener": { - "version": "0.51.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.51.7.tgz", - "integrity": "sha512-NjVm+crN0T9A7vITL8alZeHnuV8zi2gos0nezU/2YOxaUAB9E4zKiPxt/6k5U50rJs/gj8Nu45iXxnjO41HbZg==", + "version": "0.63.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz", + "integrity": "sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==", "dev": true, "requires": { "@babel/runtime": "^7.10.4" } }, - "@fluentui/react-component-ref": { - "version": "0.51.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.51.7.tgz", - "integrity": "sha512-CX27jVJYaFoBCWpuWAizQZ2se137ku1dmDyn8sw+ySNJa+kkQf7LnMydiPW5K7cRdUSqUJW3eS4EjKRvVAx8xA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.4", - "react-is": "^16.6.3" - } - }, "@gemini-testing/commander": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/@gemini-testing/commander/-/commander-2.15.3.tgz", @@ -33245,30 +33680,6 @@ "react-window": "^1.8.10", "tabbable": "^6.2.0", "tslib": "^2.6.2" - }, - "dependencies": { - "react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dev": true, - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - } } }, "@humanwhocodes/config-array": { @@ -33305,6 +33716,108 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@inquirer/confirm": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", + "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "dev": true, + "requires": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + } + }, + "@inquirer/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", + "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "dev": true, + "requires": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "dependencies": { + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "dev": true + }, + "@inquirer/type": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", + "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "dev": true, + "requires": { + "mute-stream": "^1.0.0" + }, + "dependencies": { + "mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true + } + } + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -33451,6 +33964,26 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "dev": true + }, + "@mswjs/interceptors": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", + "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "dev": true, + "requires": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + } + }, "@nicolo-ribaudo/semver-v6": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", @@ -33480,6 +34013,28 @@ "fastq": "^1.6.0" } }, + "@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "requires": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -33593,10 +34148,35 @@ } } }, + "@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "dev": true, + "requires": {} + }, + "@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "dev": true, + "requires": {} + }, + "@react-hook/resize-observer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.1.tgz", + "integrity": "sha512-9PCX9grWfxdPizY8ohr+X4IkV1JhGMWr2Nm4ngbg6IcAIv0WBs7YoJcNBqYl22OqPHr5eOMItGcStZrmj2mbmQ==", + "dev": true, + "requires": { + "@juggle/resize-observer": "^3.3.1", + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + } + }, "@semantic-ui-react/event-stack": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", - "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz", + "integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==", "dev": true, "requires": { "exenv": "^1.2.2", @@ -33747,6 +34327,74 @@ "defer-to-connect": "^2.0.1" } }, + "@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "peer": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true + }, + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "peer": true + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "peer": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "peer": true + } + } + }, + "@testing-library/react": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", + "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "requires": {} + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -33789,6 +34437,13 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "peer": true + }, "@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -33882,15 +34537,6 @@ "@types/chai": "*" } }, - "@types/cheerio": { - "version": "0.22.31", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", - "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -33915,29 +34561,6 @@ "@types/ms": "*" } }, - "@types/enzyme": { - "version": "3.10.13", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.13.tgz", - "integrity": "sha512-FCtoUhmFsud0Yx9fmZk179GkdZ4U9B0GFte64/Md+W/agx0L5SxsIIbhLBOxIb9y2UfBA4WQnaG1Od/UsUQs9Q==", - "dev": true, - "requires": { - "@types/cheerio": "*", - "@types/react": "^16" - }, - "dependencies": { - "@types/react": { - "version": "16.14.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz", - "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - } - } - }, "@types/escape-html": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", @@ -34022,9 +34645,9 @@ } }, "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dev": true, "requires": { "@types/react": "*", @@ -34139,6 +34762,15 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, + "@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", @@ -34146,9 +34778,9 @@ "dev": true }, "@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -34209,20 +34841,19 @@ "dev": true }, "@types/react": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", - "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dev": true, "requires": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/react-redux": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.20.tgz", - "integrity": "sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw==", + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dev": true, "requires": { "@types/hoist-non-react-statics": "^3.3.0", @@ -34240,12 +34871,6 @@ "@types/node": "*" } }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, "@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -34285,12 +34910,24 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, "@types/tmp": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz", "integrity": "sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==", "dev": true }, + "@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", @@ -34309,6 +34946,12 @@ "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, + "@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -36489,12 +37132,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -36520,33 +37157,6 @@ "integrity": "sha512-FsqWmApWGMGLKKNpHt12PMc5AK7BaZee0WRh04fCysmTzHe+rrKOa2MKjORhnzfpe4r0JnfdqHn02iDA9Dqj2A==", "dev": true }, - "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - }, - "dependencies": { - "acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "dev": true - }, - "acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "requires": { - "acorn": "^8.11.0" - } - } - } - }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -36581,23 +37191,6 @@ "debug": "4" } }, - "airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "dev": true, - "requires": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - } - }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -36935,13 +37528,13 @@ "dev": true }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-find-index": { @@ -37001,41 +37594,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "array.prototype.filter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz", - "integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "array.prototype.find": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz", - "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, "array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", @@ -37062,17 +37620,18 @@ } }, "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, @@ -37082,12 +37641,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -37172,10 +37725,13 @@ "dev": true }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "axios": { "version": "1.6.3", @@ -38025,12 +38581,15 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "caller-path": { @@ -38074,12 +38633,6 @@ "map-obj": "^1.0.0" } }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", - "dev": true - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -38139,6 +38692,13 @@ "check-error": "^1.0.2" } }, + "chai-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.0.tgz", + "integrity": "sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==", + "dev": true, + "requires": {} + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -38186,34 +38746,6 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - } - }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -38418,9 +38950,9 @@ } }, "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" }, "cli-width": { "version": "3.0.0", @@ -40077,16 +40609,6 @@ "sha.js": "^2.4.8" } }, - "create-react-class": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", - "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -40176,26 +40698,6 @@ "randomfill": "^1.0.3" } }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", @@ -40205,12 +40707,6 @@ "tiny-invariant": "^1.0.6" } }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", - "dev": true - }, "css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -40299,17 +40795,6 @@ "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", "dev": true }, - "css-to-react-native": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", - "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", - "dev": true, - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^3.3.0" - } - }, "css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -40420,12 +40905,20 @@ } }, "cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, "requires": { "rrweb-cssom": "^0.6.0" + }, + "dependencies": { + "rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + } } }, "csstype": { @@ -40465,14 +40958,46 @@ "dev": true }, "data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "requires": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + } + }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, "date-fns": { @@ -40664,14 +41189,13 @@ "dev": true }, "define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-properties": { @@ -41162,12 +41686,6 @@ } } }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -41202,6 +41720,13 @@ "esutils": "^2.0.2" } }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "peer": true + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -41244,15 +41769,6 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, "domhandler": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", @@ -41520,6 +42036,8 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, + "peer": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -41529,6 +42047,8 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -41565,78 +42085,6 @@ "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true }, - "enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - } - }, - "enzyme-adapter-react-16": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", - "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.14.0", - "enzyme-shallow-equal": "^1.0.4", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.values": "^1.1.2", - "prop-types": "^15.7.2", - "react-is": "^16.13.1", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.0" - } - }, - "enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", - "dev": true, - "requires": { - "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", - "semver": "^5.7.1" - } - }, - "enzyme-shallow-equal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", - "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object-is": "^1.1.2" - } - }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -41655,57 +42103,71 @@ } }, "es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.15" } }, - "es-array-method-boxes-properly": { + "es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-module-lexer": { "version": "1.3.1", @@ -41713,24 +42175,33 @@ "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -42352,7 +42823,7 @@ "exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", "dev": true }, "expand-brackets": { @@ -42745,29 +43216,6 @@ "websocket-driver": ">=0.5.1" } }, - "fbjs": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", - "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -43198,9 +43646,9 @@ } }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.6", @@ -43394,14 +43842,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-pkg-repo": { @@ -43439,13 +43888,14 @@ } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "get-uri": { @@ -43827,7 +44277,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -43876,10 +44325,10 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", + "graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", "dev": true }, "handle-thing": { @@ -43919,6 +44368,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -43945,18 +44395,17 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", @@ -43964,12 +44413,12 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "has-value": { @@ -44088,12 +44537,26 @@ "is-stream": "^1.0.1" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "hermione-global-hook": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hermione-global-hook/-/hermione-global-hook-1.0.1.tgz", @@ -44151,103 +44614,73 @@ } }, "html-dom-parser": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-0.1.3.tgz", - "integrity": "sha512-kGhjJDkfiA2/3y0gc2Bi+rseJWJSKz4CioS4EM+vN80fw863f1hn3G+7EaP0/benxceky4a8TzEeW6+dDjUh7A==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.9.tgz", + "integrity": "sha512-QGeoFYwgQ582EDvrBx0+ejIz76/LuQcwwkmSR4ueKncjl2yWbciA45Kfz/LrHvWR3CgtKnxKFkr4Mpq2Sh1QNg==", "dev": true, "requires": { - "domhandler": "2.3.0", - "htmlparser2": "3.9.1" + "domhandler": "5.0.3", + "htmlparser2": "9.1.0" }, "dependencies": { "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "htmlparser2": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.1.tgz", - "integrity": "sha1-Yht6WLyazQA/evCiyaAKpnyFBdI=", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } } } }, - "html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "dev": true, - "requires": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - } - }, "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "requires": { - "whatwg-encoding": "^2.0.0" + "whatwg-encoding": "^3.1.1" } }, "html-entities": { @@ -44278,14 +44711,26 @@ } }, "html-react-parser": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-0.4.7.tgz", - "integrity": "sha512-h3EUYXqKXts68/ynQwH5ws57vg2P94VzvzpwVRwYgWjW+uEtkXDjOO8q/7UmfcGX4DFHJ69UlQJa1RoRXCTaPg==", + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.1.12.tgz", + "integrity": "sha512-OPv8fsIvxxv/+pLj9mYvyNu8PE5dPMowTRdd5VHpcoZpXlstp8eYCxQ5rzqAE5Tb75rhdiWUXnPltfb62zCVjg==", "dev": true, "requires": { - "html-dom-parser": "0.1.3", - "react-dom-core": "0.0.3", - "style-to-object": "0.2.2" + "domhandler": "5.0.3", + "html-dom-parser": "5.0.9", + "react-property": "2.0.2", + "style-to-js": "1.1.12" + }, + "dependencies": { + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + } } }, "html-reporter-basic-plugin": { @@ -44841,13 +45286,13 @@ } }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -44934,14 +45379,13 @@ } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-arrayish": { @@ -45017,6 +45461,15 @@ "kind-of": "^6.0.0" } }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -45095,9 +45548,15 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, "is-number": { @@ -45182,12 +45641,12 @@ } }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-stream": { @@ -45230,12 +45689,12 @@ } }, "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" } }, "is-unicode-supported": { @@ -45293,16 +45752,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -45604,44 +46053,42 @@ "dev": true }, "jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", + "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", "dev": true, "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", + "nwsapi": "^2.2.12", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "dependencies": { - "acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "dev": true + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } }, "entities": { "version": "4.5.0", @@ -45649,6 +46096,26 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -45659,9 +46126,9 @@ } }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "requires": {} } @@ -46039,12 +46506,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -46061,7 +46522,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true + "dev": true, + "optional": true }, "lodash.isplainobject": { "version": "4.0.6", @@ -46222,6 +46684,13 @@ "yallist": "^3.0.2" } }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "peer": true + }, "magic-string": { "version": "0.30.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", @@ -46581,38 +47050,37 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz", + "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==", "dev": true, "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "dependencies": { "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "argparse": { @@ -46641,10 +47109,27 @@ "wrap-ansi": "^7.0.0" } }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true }, "emoji-regex": { @@ -46669,6 +47154,19 @@ "path-exists": "^4.0.0" } }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -46700,9 +47198,9 @@ } }, "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -46714,12 +47212,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -46744,15 +47236,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -46812,9 +47295,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } @@ -46887,17 +47370,122 @@ "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, - "moo": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", - "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "msw": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", + "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "dev": true, + "requires": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", @@ -46998,26 +47586,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -47153,16 +47721,6 @@ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "dev": true }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -47396,9 +47954,9 @@ "dev": true }, "nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, "nyc": { @@ -47559,9 +48117,9 @@ } }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "object-is": { "version": "1.1.5", @@ -47589,13 +48147,13 @@ } }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } @@ -47612,14 +48170,15 @@ } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.hasown": { @@ -47753,6 +48312,12 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -47979,21 +48544,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -48268,12 +48818,6 @@ "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==", "dev": true }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -48308,6 +48852,12 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -48767,12 +49317,6 @@ "postcss-selector-parser": "^6.0.5" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -48870,15 +49414,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -48890,17 +49425,6 @@ "react-is": "^16.13.1" } }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, "property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", @@ -49142,22 +49666,6 @@ "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", "dev": true }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -49205,18 +49713,6 @@ "strip-json-comments": "~2.0.1" } }, - "rc-resize-observer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.1.tgz", - "integrity": "sha512-OxO2mJI9e8610CAWBFfm52SPvWib0eNKjaSsRbbKHmLaJIxw944P+D61DlLJ/w2vuOjGNcalJu8VdqyNm/XCRg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - } - }, "rc-slider": { "version": "10.6.2", "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", @@ -49247,14 +49743,12 @@ } }, "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "loose-envify": "^1.1.0" } }, "react-beautiful-dnd": { @@ -49305,41 +49799,13 @@ } }, "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-dom-core": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/react-dom-core/-/react-dom-core-0.0.3.tgz", - "integrity": "sha512-pMMNOU4Hhe/LmkGWMVOpQmPnKQo+bGaWY3Y0+OjXmsQVB5LJ3sr4hVCM/7MpcRGeEMcfaRaoHyiLhufzk/BL4w==", - "dev": true, - "requires": { - "fbjs": "*", - "object-assign": "*", - "react": "15" - }, - "dependencies": { - "react": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/react/-/react-15.7.0.tgz", - "integrity": "sha512-5/MMRYmpmM0sMTHGLossnJCrmXQIiJilD6y3YN3TzAwGFj6zdnMtFv6xmi65PHKRV+pehIHpT7oy67Sr6s9AHA==", - "dev": true, - "requires": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - } - } + "scheduler": "^0.23.2" } }, "react-fast-compare": { @@ -49357,112 +49823,6 @@ "prop-types": "^15.6.1" } }, - "react-html-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/react-html-parser/-/react-html-parser-2.0.2.tgz", - "integrity": "sha512-XeerLwCVjTs3njZcgCOeDUqLgNIt/t+6Jgi5/qPsO/krUWl76kWKXMeVs2LhY2gwM6X378DkhLjur0zUQdpz0g==", - "dev": true, - "requires": { - "htmlparser2": "^3.9.0" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -49514,36 +49874,25 @@ } }, "react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "dev": true, "requires": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", + "react-fast-compare": "^3.0.1", "warning": "^4.0.2" - }, - "dependencies": { - "@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", - "dev": true, - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" - } - } } }, + "react-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", + "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==", + "dev": true + }, "react-redux": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz", - "integrity": "sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dev": true, "requires": { "@babel/runtime": "^7.15.4", @@ -49562,22 +49911,10 @@ } } }, - "react-test-renderer": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", - "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" - } - }, "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "dev": true, "requires": { "@babel/runtime": "^7.5.5", @@ -49587,9 +49924,9 @@ } }, "react-virtualized": { - "version": "9.22.3", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", - "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "dev": true, "requires": { "@babel/runtime": "^7.7.2", @@ -49733,12 +50070,12 @@ } }, "reapop": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/reapop/-/reapop-4.0.5.tgz", - "integrity": "sha512-MelMeZ0YoUOvjwzzu1a3oZVA8wmcPOIBKLL25a1XiVrxpORvyYpLB4nrmqrycg3Bfd7jp+eRCg1CboE7S67S+g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/reapop/-/reapop-4.2.2.tgz", + "integrity": "sha512-pyiCVda0YAzXk727LEOYjAqqWn6xXmIacVXBGDRlq3RCWZixX7WhWS3E6yv2ZWBzEIbyXO0ZRmvxMYnuA3A7Qg==", "dev": true, "requires": { - "react-transition-group": "4.4.2" + "react-transition-group": "4.4.5" } }, "rechoir": { @@ -49800,12 +50137,6 @@ "dev": true, "requires": {} }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -49838,14 +50169,15 @@ } }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "relateurl": { @@ -50095,21 +50427,11 @@ } }, "rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -50138,13 +50460,13 @@ "dev": true }, "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -50172,13 +50494,13 @@ } }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, @@ -50209,13 +50531,12 @@ } }, "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "schema-utils": { @@ -50252,22 +50573,22 @@ } }, "semantic-ui-react": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.3.1.tgz", - "integrity": "sha512-3EE8Cl2Tq9re+J5An8QOZHgjRJjHqNDBq+Aoaa0TLFnd79UgYzovJPQGy3AWIxgCkxDPj4c3yxl72ImumJLyeA==", + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-3.0.0-beta.2.tgz", + "integrity": "sha512-BFqd7dGPgXPbIkWkIzkPrPRBElf/iB4NKOSFl5tZwMEaIyGQXbvtVWHyOW0sMD2A/qZPgY2Wl/19GDc9JOg3ng==", "dev": true, "requires": { - "@babel/runtime": "^7.10.5", - "@fluentui/react-component-event-listener": "~0.51.1", - "@fluentui/react-component-ref": "~0.51.1", - "@semantic-ui-react/event-stack": "^3.1.0", + "@babel/runtime": "^7.23.7", + "@fluentui/react-component-event-listener": "~0.63.0", + "@popperjs/core": "^2.11.8", + "@semantic-ui-react/event-stack": "^3.1.3", "clsx": "^1.1.1", "keyboard-key": "^1.1.0", - "lodash": "^4.17.19", - "lodash-es": "^4.17.15", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "react-popper": "^1.3.7", + "react-is": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react-popper": "^2.3.0", "shallowequal": "^1.1.0" } }, @@ -50337,9 +50658,9 @@ } }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -50418,6 +50739,19 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -51564,6 +51898,12 @@ "integrity": "sha512-Y6IZaTVM80chcMe7j65Gl/0nmlNdtt+KWPle5YeCAjmsBfw+id2qdaJ5MDrxUq+OmHKab+jHe7mUjU/aNMSZZg==", "dev": true }, + "strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -51650,36 +51990,37 @@ } }, "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -51755,62 +52096,29 @@ "dev": true, "requires": {} }, - "style-to-object": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.2.tgz", - "integrity": "sha512-GcbtvfsqyKmIPpHeOHZ5Rmwsx2MDJct4W9apmTGcbPTbpA2FcgTFl2Z43Hm4Qb61MWGPNK8Chki7ITiY7lLOow==", + "style-to-js": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.12.tgz", + "integrity": "sha512-tv+/FkgNYHI2fvCoBMsqPHh5xovwiw+C3X0Gfnss/Syau0Nr3IqGOJ9XiOYXoPnToHVbllKFf5qCNFJGwFg5mg==", "dev": true, "requires": { - "css": "2.2.4" + "style-to-object": "1.0.6" } }, - "styled-components": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.4.10.tgz", - "integrity": "sha512-TA8ip8LoILgmSAFd3r326pKtXytUUGu5YWuqZcOQVwVVwB6XqUMn4MHW2IuYJ/HAD81jLrdQed8YWfLSG1LX4Q==", + "style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", "dev": true, "requires": { - "buffer": "^5.0.3", - "css-to-react-native": "^2.0.3", - "fbjs": "^0.8.16", - "hoist-non-react-statics": "^2.5.0", - "prop-types": "^15.5.4", - "react-is": "^16.3.1", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10", - "supports-color": "^3.2.3" + "inline-style-parser": "0.2.3" }, "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } } } }, @@ -51824,19 +52132,6 @@ "postcss-selector-parser": "^6.0.4" } }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", - "dev": true - }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "dev": true, - "requires": {} - }, "stylus": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", @@ -52323,6 +52618,12 @@ "yallist": "3.1.1" }, "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -52332,12 +52633,27 @@ "color-convert": "^1.9.0" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -52349,6 +52665,17 @@ "supports-color": "^5.3.0" } }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -52373,6 +52700,28 @@ "ms": "2.0.0" } }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -52384,6 +52733,30 @@ "universalify": "^0.1.0" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "looks-same": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/looks-same/-/looks-same-9.0.0.tgz", @@ -52429,18 +52802,132 @@ } } }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, "node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -52450,6 +52937,15 @@ "lru-cache": "^6.0.0" } }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "sharp": { "version": "0.32.6", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", @@ -52466,6 +52962,23 @@ "tunnel-agent": "^0.6.0" } }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -52497,6 +53010,76 @@ "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -52685,12 +53268,12 @@ } }, "tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "requires": { - "punycode": "^2.3.0" + "punycode": "^2.3.1" }, "dependencies": { "punycode": { @@ -52839,58 +53422,57 @@ } }, "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", - "dev": true - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -52903,12 +53485,6 @@ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true - }, "uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", @@ -53463,12 +54039,12 @@ } }, "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "requires": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" } }, "wait-port": { @@ -54880,9 +55456,9 @@ "dev": true }, "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "requires": { "iconv-lite": "0.6.3" @@ -54899,25 +55475,19 @@ } } }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true - }, "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true }, "whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "dev": true, "requires": { - "tr46": "^4.1.1", + "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" } }, @@ -54949,16 +55519,16 @@ "dev": true }, "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" } }, "wildcard": { @@ -54988,9 +55558,9 @@ } }, "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "wrap-ansi": { @@ -55124,9 +55694,9 @@ "requires": {} }, "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true }, "xmlchars": { @@ -55277,6 +55847,12 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, + "yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true + }, "zip-stream": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", diff --git a/package.json b/package.json index c4e4c4fdb..8b57ca40f 100644 --- a/package.json +++ b/package.json @@ -126,14 +126,16 @@ "@gravity-ui/components": "^3.7.0", "@gravity-ui/uikit": "^6.20.0", "@playwright/test": "^1.44.1", + "@react-hook/resize-observer": "^2.0.1", "@swc/core": "^1.3.64", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", "@types/babel__core": "^7.20.5", "@types/better-sqlite3": "^7.6.4", "@types/bluebird": "^3.5.3", "@types/chai": "^4.3.5", "@types/chai-as-promised": "^7.1.1", "@types/debug": "^4.1.8", - "@types/enzyme": "^3.10.13", "@types/escape-html": "^1.0.4", "@types/express": "4.16", "@types/fs-extra": "^7.0.0", @@ -154,6 +156,7 @@ "buffer": "^6.0.3", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", + "chai-dom": "^1.12.0", "classnames": "^2.2.5", "concurrently": "^7.6.0", "conventional-changelog-lint": "^1.0.1", @@ -162,8 +165,6 @@ "crypto-browserify": "^3.12.0", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.4", "esbuild": "^0.23.0", "eslint": "^8.43.0", "eslint-config-gemini-testing": "^2.8.0", @@ -172,7 +173,7 @@ "fork-ts-checker-webpack-plugin": "^9.0.0", "hermione-global-hook": "^1.0.1", "hermione-test-repeater": "^0.0.8", - "html-react-parser": "^0.4.0", + "html-react-parser": "^5.1.12", "html-reporter-basic-plugin": "file:test/func/packages/basic", "html-reporter-menu-bar-plugin": "file:test/func/packages/menu-bar", "html-reporter-redux-plugin": "file:test/func/packages/redux", @@ -185,12 +186,13 @@ "husky": "^0.11.9", "ignore-styles": "^5.0.1", "immer": "^7.0.15", - "jsdom": "^21.1.2", + "jsdom": "^24.1.1", "jsdom-global": "^3.0.2", "less": "^3.11.1", "less-loader": "^11.1.3", "mini-css-extract-plugin": "^2.7.6", - "mocha": "^10.2.0", + "mocha": "^10.7.0", + "msw": "^2.3.4", "npm-run-all": "^4.1.5", "nyc": "^14.1.1", "path-browserify": "^1.0.1", @@ -198,17 +200,15 @@ "prop-types": "^15.6.0", "proxyquire": "^1.7.11", "raf": "^3.4.0", - "rc-resize-observer": "^1.0.0", - "react": "^16.13.1", + "react": "^18.3.1", "react-checkbox-tree": "^1.8.0", "react-clipboard.js": "^1.1.2", - "react-dom": "^16.13.1", + "react-dom": "^18.3.1", "react-hotkeys": "^2.0.0", - "react-html-parser": "^2.0.2", "react-markdown": "^6.0.3", "react-redux": "^7.2.1", - "react-virtualized": "^9.22.3", - "reapop": "4.0.5", + "react-virtualized": "^9.22.5", + "reapop": "^4.2.2", "reduce-reducers": "^1.0.4", "redux": "^4.0.5", "redux-logger": "^3.0.6", @@ -216,12 +216,11 @@ "redux-thunk": "^2.2.0", "reselect": "^4.1.6", "rimraf": "^2.6.3", - "semantic-ui-react": "^1.2.1", + "semantic-ui-react": "^3.0.0-beta.2", "sinon": "^4.0.1", "standard-version": "^4.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.3", - "styled-components": "^3.4.10", "stylus": "^0.57.0", "stylus-loader": "^7.1.3", "terser-webpack-plugin": "^5.3.9", diff --git a/test/func/tests/common-tinder/index.testplane.js b/test/func/tests/common-tinder/index.testplane.js index b79b13075..fe113144b 100644 --- a/test/func/tests/common-tinder/index.testplane.js +++ b/test/func/tests/common-tinder/index.testplane.js @@ -44,13 +44,13 @@ describe('Tinder mode', () => { describe(`accepting screenshot`, () => { beforeEach(async ({browser}) => { - const testFullName = await browser.$('span[data-test-id="screenshot-accepter-test-name"]').getText(); + const testFullName = await browser.$('span[data-qa="screenshot-accepter-test-name"]').getText(); const acceptButton = await browser.$('button[data-qa="screenshot-accepter-accept"]'); await acceptButton.click(); await browser.waitUntil(async () => { - const progress = await browser.$('span[data-test-id="screenshot-accepter-progress-bar"]').getAttribute('data-content'); + const progress = await browser.$('span[data-qa="screenshot-accepter-progress-bar"]').getAttribute('data-content'); return progress === '1/2'; }, {interval: 100}); @@ -97,7 +97,7 @@ describe('Tinder mode', () => { await acceptButton.click(); await browser.waitUntil(async () => { - const progress = await browser.$('span[data-test-id="screenshot-accepter-progress-bar"]').getAttribute('data-content'); + const progress = await browser.$('span[data-qa="screenshot-accepter-progress-bar"]').getAttribute('data-content'); return progress === '1/2'; }, {interval: 100}); @@ -124,7 +124,7 @@ describe('Tinder mode', () => { await acceptButton.click(); await browser.waitUntil(async () => { - const progress = await browser.$('span[data-test-id="screenshot-accepter-progress-bar"]').getAttribute('data-content'); + const progress = await browser.$('span[data-qa="screenshot-accepter-progress-bar"]').getAttribute('data-content'); return progress === `${i}/2`; }, {interval: 100}); diff --git a/test/func/tests/eye/index.testplane.js b/test/func/tests/eye/index.testplane.js index e34def25f..7a4d45f39 100644 --- a/test/func/tests/eye/index.testplane.js +++ b/test/func/tests/eye/index.testplane.js @@ -13,7 +13,7 @@ describe('View in browser button behavior', () => { }); it('should have correct link on startup', async ({browser}) => { - const eyeElement = await browser.$('a[data-test-id="view-in-browser"]'); + const eyeElement = await browser.$('a[data-qa="view-in-browser"]'); const link = await eyeElement.getAttribute('href'); expect(link).toBe('https://example.com:123/fixtures/testplane-eye/index.html'); @@ -25,7 +25,7 @@ describe('View in browser button behavior', () => { baseHostInput.setValue('http://some-host.dev:33'); await browser.keys([Key.Enter]); - const eyeElement = await browser.$('a[data-test-id="view-in-browser"]'); + const eyeElement = await browser.$('a[data-qa="view-in-browser"]'); const link = await eyeElement.getAttribute('href'); expect(link).toBe('http://some-host.dev:33/fixtures/testplane-eye/index.html'); diff --git a/test/func/tests/plugins/tests-menu-bar-plugin.testplane.js b/test/func/tests/plugins/tests-menu-bar-plugin.testplane.js index c0987bec1..2efe28d05 100644 --- a/test/func/tests/plugins/tests-menu-bar-plugin.testplane.js +++ b/test/func/tests/plugins/tests-menu-bar-plugin.testplane.js @@ -12,6 +12,9 @@ describe('Test menu bar plugin', function() { await browser.$(selector).waitForDisplayed(); await browser.$(selector).click(); await browser.$(menuSelector).waitForDisplayed(); + + // Pause prevents flaky screenshots due to dropdown shadow rendering. No, screenshot delay doesn't help. + await browser.pause(1000); await browser.assertView('menu bar plugins clicked', [selector, menuSelector]); }); }); diff --git a/test/func/tests/screens/3144090/chrome/menu bar plugins clicked.png b/test/func/tests/screens/3144090/chrome/menu bar plugins clicked.png index 8bb948aae0f6330b23ffa6ccf45aa1a5f0b3fd2c..c8f5b615026a5da7af1c49898259a8b5359bd113 100644 GIT binary patch delta 2561 zcma)8XHe4#9tFgOK|ppBgwPa^x{Cor4Fr%Ty=ayWqBNgf17g(}F$b!>h*K^IwxnnE8I}hxXD&S7<_~mE> zq-r_(xtcAm&-d5-7=)x&I9c!@$pM@ea^pAc8(`qeffwT{$rDDnw$?JEVY2YUFj7D6 zCB3v}8HBUwpoKU*G1Vz?S6!$LXeP`AI22STAUFwVq>N@?$I_c7Mz-Wn!D1ny4437(kYiChu>|*muZ5?M0RJ31Ipgwb z1VkPAUTv`2Svyq7RV={|)S0g$q|=?yYnU2m29prvuMO?)uB)qSrZ9972=g1~(o(*E zCk4;5SlB#e$FUune-C$Oj4KILIE`?3c6WF8ljf$Uv*l_x!ee602S?ZA9PP4>l5WkY z!btCx(c`hMuH1`&9Vid9+8FrUWka=n(S_^}F_J+#5|u+T6{-fnm$bi=(4ITmNEU zU;u+y5RX;vm;q)FR*E{4gX9{+h39_0Y>fR!VBz zHSp^d>ZBQ$L?){~A?4S<|1{h}r4|l9qWM==SEm7TN8i0;VrzpBXf)c&%11mefmIq< z`>=@J784QSXleO|$(4n`{f?cvOH2NzIt}stm8jOg_U#A9$DcB}-;UlS8AWL5`F)+3 zo12*6tZo`psEgU~^@q1nirt`s0Gd^aJ@WmF6OdDtYDSXmT-L)Q7fLxXd3guEtD~z6 ztXg#k9RL~GHj3+>v3o9er%gFubotRb?g~Tj@}g>Th>pyyNJN&tF5Z?Z82377K5S;w zs1WI1tRgh}DPW+ia=HEr9}|6=C;YU(gIK~jPRO&3?S#|B4))ffk>F{iQ?4QZr*%Wq zxNFYMVQLpLq0j+BYkSoc;Fo+_- zPA&68lUmJ9Yi9;0`gte{<AN96L+;>Oi0D6HTAq3BMp2IX-T&)e*9S)cX7ql1{OJ^4SawNM0o9z)g5%c z8Dos9W*g+j+s^+WKvm24dJ)J%Uhauy)hJzM{IiPG;{kTm4X_}3CB`QAnP~-&%6Q0g zCl#yQzNp|r1?##QkWj$WN)>47qLZ4l3fRlez`TMd8x9VYN2^Sja-3eI4OO_EBbYT_ zfTjCh@fYp)_){k1Wj63X5&r_z76+i%*Mowu65&ympG6bpyr5P}btt!pkA*_{4pfZ9 z(4enk(a|^8wuC4V4Oizv=qjldeTYaL6(4@7NU z>SJ$liIMZk&!AOROUJ`yTceiwMd)@xNM2rQQH+#al33S1pFc$3zu$6TP8Gjdx3H7%dixGmW^;;{c+cZ3 z`e>JsclJKhINeFG$z2ZvmiuF<5>rrbv+6=opQxP&(mhd)wdMA%`GnAr%S1)*&8|>JsjBv1 z5i1AQ_3fR&)_}CDx+Fx^p+H*KLkkhzhalt)d5$Az9q^^#&)VtV0EN|GIcS;XX5 zYY5lkFyO8-`FKeo_}=adZM2T}3Pp_#kIRzzgyEKX_@XAE`%9pvM?d$A`$2Q=i%2h& zMEseEf3O?Z7Fm(NC^vj|T}B|H+uo%u#&GZL8UNKwbPXeiiTy*&@Kny#VWAUh3EaTw zyt;^;l35^m0|h&tzjtnL&axxf`z*RTmgVU_0D7Ej=#B)D z-Fz+*q(UFTsf99BAAn)W^??cS`1w7nS)I(IOmrn{7>tN@}o8W%&%zl4&C|Jlr;6aMCXPT)=!Eyp(7m)Jux+7B5 SGJ87pc&sfP%ob;7;DT(&S`KgCE2%Z8B2&5j3td^dF`Sw))%3nAu}js zU#A(yHY8gU#xjWP8N73@_v3lb*WdHp_x*hMU-$JN5_~6=4&b)uI>W}shEM|Tgl)=lOPX*lSgah|{G^f0Y&FWIxUPx1++BG0FMbn6S|6`~hQaW)tZ)!v^* z4jvy4wn*Lyh=pIQcYA4=k+P<%)$n@vAE6f`Vd7==(>U z=P4ttOLPy@A{`ToT;{t8Mll7g!hBXV!C3k6V>|rT^C;(wmfIRSI_0$GkmibVP>a*0 zbwP{;BNMjT)ZENS`<=erRX;rZG6|sc*86r=+4#8i=gFZV7f(+EsJJ<`b8T(yaJy|- zq`Isub_pgr-QBIfimRwN`nh;&=KtGoUD*)Fk(@jXrnXRd5b15AIx&rA9vADLC#`?$ zI9hWXT@p0r%?QPjBAs9+Ed_GtU%08>*7kDga=8ZQ~ zmV|Da@T=B-DH$jzS*%e!LqQT{eR{yE*~Co{nQAyA0xBeKrpB8sfk+wpbTB?=;Ij>e zaOHW)!dh*pc9x-XLvVb#CFBgcugp%vYzExP62`)37r_pkB#*_raR%RB+5Z9}2!X0Z zNYV@*TyAcpPh8wiQ~>gL33DCrvYzu=or^Mm%AZh(3A!mhs|q9Y?~?X_6-0)KY>vB0 zn#7D|KmN^t7ou=f_wiR}4TVzIb9iB8ZC|po9G6I(>%-bFGTikVi9HW_y13wR%GviS^vuA*Nl|cISz=F# ze4==ENJ7cS@>|9C!-@E{P7yx$3Kl1g^O?!BA^6-sq{Cj#!0GoxE@E^i75@g%e%W*KvPfc>ZZV5sY=#KB&!Zrppji$%6B{O<) zAK=bXzEhlH8tpzcFR_b_OZ{8bj{Heh3)Y{Y)2BdX)Kv{$yp zgAoz5tv=#mw$quSnz5(e+)hs~Z?uX@Mhdo`h*m#P(NgcWBeqF%>c&tlsuo5Uqem-@ z$gG5uV|2Q42U8n%IN^Miaaomo&2V#TM!42jeC!ZCuwy_ouiN9VL{U*g^ITD}0gT!k>rt`@0*d}A z+X%>UQq%TjemXgD>j|sAg0y1V*jp&&XvDFkt(+}dQD)H1ws_g==0)`r4S)SEOy;wi&pFp*Mv=WOOchF#@{Y@X8( zbDb^w)(Dod8@}S+OY}J(EfZnSi2drQ#-B}pg(vj%7rw(LSo*p|-A%dCo!_UMs_FNM zUb?M>IUAL5!F)7DjA+ehXXoNDo~Wy9PnCGGRDd`w!@1N&G8!IlQf%j^$+H*DvAjWn@y*5Ez4`~ z@E>0HyAeaCK0jc%Z}eaOc=`-KHr4ccE#2CPkq8^(mHvlLVHFelADij_YBtfOrM{<32UnSucB-8F>Sb~KM_&9@KRM~=!GrE-n03;9)B$?DBZ1%REHFL{>l0aO@ z1dcA{t {}; require.extensions['.css'] = () => {}; require.extensions['.less'] = () => {}; chai.use(require('chai-as-promised')); +chai.use(require('chai-dom')); sinon.assert.expose(chai.assert, {prefix: ''}); -require('app-module-path').addPath(path.resolve(__dirname, '..')); +require('app-module-path').addPath(path.resolve(__dirname, '..', '..')); diff --git a/test/ts-node.js b/test/setup/ts-node.js similarity index 100% rename from test/ts-node.js rename to test/setup/ts-node.js diff --git a/test/types.ts b/test/types.ts index 001511930..90ab8f01d 100644 --- a/test/types.ts +++ b/test/types.ts @@ -1,10 +1,8 @@ import type sinon from 'sinon'; import {assert as chaiAssert} from 'chai'; -import {mount as enzymeMount} from 'enzyme'; declare global { const assert: typeof chaiAssert & sinon.SinonAssert & { calledOnceWith(spyOrSpyCall: sinon.SinonSpy | sinon.SinonSpyCall, ...args: TArgs): void; }; - const mount: typeof enzymeMount; } diff --git a/test/unit/lib/static/components/.eslintrc.js b/test/unit/lib/static/components/.eslintrc.js index 7e90dbb7a..abe6e56b6 100644 --- a/test/unit/lib/static/components/.eslintrc.js +++ b/test/unit/lib/static/components/.eslintrc.js @@ -4,5 +4,8 @@ module.exports = { extends: 'plugin:react/recommended', globals: { mount: false + }, + env: { + browser: true } }; diff --git a/test/unit/lib/static/components/bottom-progress-bar/index.jsx b/test/unit/lib/static/components/bottom-progress-bar/index.jsx index 2a63433cd..581a7d4c9 100644 --- a/test/unit/lib/static/components/bottom-progress-bar/index.jsx +++ b/test/unit/lib/static/components/bottom-progress-bar/index.jsx @@ -30,7 +30,7 @@ describe(' component', () => { visibleRootSuiteIds: ['id1', 'id2', 'id3', 'id4', 'id5'] }); - assert.equal(component.find('.bottom-progress-bar__progress-bar').prop('style').width, '0%'); + assert.equal(component.container.querySelector('.bottom-progress-bar__progress-bar').style.width, '0%'); }); it('50%', () => { @@ -39,7 +39,7 @@ describe(' component', () => { visibleRootSuiteIds: ['id1', 'id2', 'id3', 'id4', 'id5'] }); - assert.equal(component.find('.bottom-progress-bar__progress-bar').prop('style').width, '50%'); + assert.equal(component.container.querySelector('.bottom-progress-bar__progress-bar').style.width, '50%'); }); it('100%', () => { @@ -48,7 +48,7 @@ describe(' component', () => { visibleRootSuiteIds: ['id1', 'id2', 'id3', 'id4', 'id5'] }); - assert.equal(component.find('.bottom-progress-bar__progress-bar').prop('style').width, '100%'); + assert.equal(component.container.querySelector('.bottom-progress-bar__progress-bar').style.width, '100%'); }); }); @@ -58,6 +58,6 @@ describe(' component', () => { visibleRootSuiteIds: ['id1', 'id2', 'id3'] }); - assert.equal(component.find('.bottom-progress-bar__counter').text(), 'id2 (2 suite of 3)'); + assert.equal(component.container.querySelector('.bottom-progress-bar__counter').textContent, 'id2 (2 suite of 3)'); }); }); diff --git a/test/unit/lib/static/components/bullet.jsx b/test/unit/lib/static/components/bullet.jsx index 0e24eb479..b021eecd5 100644 --- a/test/unit/lib/static/components/bullet.jsx +++ b/test/unit/lib/static/components/bullet.jsx @@ -1,6 +1,8 @@ -import React from 'react'; +import {render} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import {expect} from 'chai'; import proxyquire from 'proxyquire'; -import {CHECKED, UNCHECKED, INDETERMINATE} from 'lib/constants/checked-statuses'; +import React from 'react'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -18,51 +20,28 @@ describe('', () => { it('should render simple bullet if checkboxes are disabled', () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([false]); - const component = mount(); + const component = render(); - assert.isTrue(component.find('.bullet_type-simple').exists()); + expect(component.getByTestId('bullet-icon')).to.exist; }); it('should render checkbox bullet if checkboxes are enabled', () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - const component = mount(); + const component = render(); - assert.isTrue(component.find('.bullet_type-checkbox').exists()); + expect(component.getByRole('checkbox')).to.exist; }); - describe('', () => { - beforeEach(() => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - }); - - it('should be "checked" if status is CHECKED', () => { - const component = mount(); - - assert.isTrue(component.find('.g-checkbox_checked').exists()); - }); - - it('should be "indeterminate" if status is INDETERMINATE', () => { - const component = mount(); - - assert.isTrue(component.find('.g-checkbox_indeterminate').exists()); - }); - - it('should be "unchecked" if status is UNCHECKED', () => { - const component = mount(); - - assert.isTrue(component.find('label.g-checkbox').exists()); - assert.isFalse(component.find('label.g-checkbox').hasClass('.g-checkbox_checked')); - assert.isFalse(component.find('label.g-checkbox').hasClass('.g-checkbox_indeterminate')); - }); + it('should call "onClick" callback', async () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - it('should call "onClick" callback', () => { - const onClickStub = sandbox.stub(); - const component = mount(); + const user = userEvent.setup(); + const onClickStub = sandbox.stub(); + const component = render(); - component.find('label.g-checkbox').simulate('click'); + await user.click(component.getByRole('checkbox')); - assert.calledOnce(onClickStub); - }); + assert.calledOnce(onClickStub); }); }); diff --git a/test/unit/lib/static/components/controls/accept-opened-button.jsx b/test/unit/lib/static/components/controls/accept-opened-button.jsx index 757c822be..7bca54964 100644 --- a/test/unit/lib/static/components/controls/accept-opened-button.jsx +++ b/test/unit/lib/static/components/controls/accept-opened-button.jsx @@ -1,6 +1,7 @@ import React from 'react'; import proxyquire from 'proxyquire'; import {mkState, mkConnectedComponent} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -28,7 +29,7 @@ describe('', () => { const component = mkConnectedComponent(, state); - assert.isTrue(component.find('[label="Accept opened"]').prop('isDisabled')); + assert.isTrue(component.getByRole('button').disabled); }); it('should be disabled while processing something', () => { @@ -38,7 +39,7 @@ describe('', () => { const component = mkConnectedComponent(, state); - assert.isTrue(component.find('[label="Accept opened"]').prop('isDisabled')); + assert.isTrue(component.getByRole('button').disabled); }); it('should be enabled if acceptable opened images are present', () => { @@ -48,16 +49,17 @@ describe('', () => { const component = mkConnectedComponent(, state); - assert.isFalse(component.find('[label="Accept opened"]').prop('isDisabled')); + assert.isFalse(component.getByRole('button').disabled); }); - it('should call "acceptOpened" action on click', () => { + it('should call "acceptOpened" action on click', async () => { + const user = userEvent.setup(); const state = mkState({initialState: {processing: false}}); const acceptableOpenedImageIds = ['img-id-1']; selectors.getAcceptableOpenedImageIds.withArgs(state).returns(acceptableOpenedImageIds); const component = mkConnectedComponent(, state); - component.find('[label="Accept opened"]').simulate('click'); + await user.click(component.getByRole('button')); assert.calledOnceWith(actionsStub.acceptOpened, acceptableOpenedImageIds); }); diff --git a/test/unit/lib/static/components/controls/browser-list/index.jsx b/test/unit/lib/static/components/controls/browser-list/index.jsx index 764894a31..07e23c28a 100644 --- a/test/unit/lib/static/components/controls/browser-list/index.jsx +++ b/test/unit/lib/static/components/controls/browser-list/index.jsx @@ -1,26 +1,44 @@ +import {expect} from 'chai'; import React from 'react'; import BrowserList from '../../../../../../../lib/static/components/controls/browser-list'; import {ThemeProvider} from '@gravity-ui/uikit'; +import {render} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); + let mutationObserverOriginal; - afterEach(() => sandbox.restore()); + beforeEach(() => { + mutationObserverOriginal = global.MutationObserver; + global.MutationObserver = class { + constructor() {} + disconnect() {} + observe() {} + }; + }); + + afterEach(() => { + sandbox.restore(); + global.MutationObserver = mutationObserverOriginal; + }); - it('should not contain selected items', () => { + it('should not contain selected items', async () => { + const user = userEvent.setup(); const props = { available: [ {id: 'bro1'}, {id: 'bro2'} ] }; - const component = mount(); - component.first().find('.g-select-control__button').simulate('click'); + const component = render(); + + await user.click(component.getByRole('combobox')); - assert.equal(component.first().find('.g-list__items .g-list__item_selected').length, 0); + expect(component.container.querySelector('.g-list__items .g-list__item_selected')).to.not.exist; }); - it('should contain selected items', () => { + it('should contain selected items', async () => { const props = { available: [ {id: 'bro1', versions: ['unknown']}, @@ -32,15 +50,14 @@ describe('', () => { {id: 'bro3', versions: ['unknown']} ] }; - const component = mount(); - component.first().find('.g-select-control__button').simulate('click'); + const component = render(); - assert.equal(component.first().find('.g-list__items .g-list__item_selected').length, 2); - assert.equal(component.first().find('.g-list__items .g-list__item_selected .browserlist__row_content').at(0).text(), 'bro2'); - assert.equal(component.first().find('.g-list__items .g-list__item_selected .browserlist__row_content').at(1).text(), 'bro3'); + expect(component.getByRole('combobox').textContent).to.equal('bro2, bro3'); + expect(component.getByText('2', {selector: 'span'})).to.exist; }); it('should create groups for versions', async () => { + const user = userEvent.setup(); const props = { available: [ {id: 'bro1', versions: ['v1', 'v2', 'v3']} @@ -51,13 +68,15 @@ describe('', () => { onChange: () => {} }; - const component = mount(); - component.first().find('.g-select-control__button').simulate('click'); + const component = render(); + + await user.click(component.getByRole('combobox')); - assert.equal(component.find('.g-select-list__group-label-content').at(0).text(), 'bro1'); + assert.equal(component.container.querySelector('.g-select-list__group-label-content').textContent, 'bro1'); }); - it('should trigger "change" event with selected browsers and versions', () => { + it('should trigger "change" event with selected browsers and versions', async () => { + const user = userEvent.setup(); const props = { available: [ {id: 'bro'}, @@ -71,10 +90,10 @@ describe('', () => { ], onChange: sandbox.spy() }; - const component = mount(); + const component = render(); - component.first().find('.g-select-control__button').simulate('click'); - component.first().find('.g-popup .g-select-list__option').last().simulate('click'); + await user.click(component.getByRole('combobox')); + await user.click(component.getByText((_, el) => el.textContent.includes('v3'), {selector: '[role=option]'})); assert.equal(props.onChange.callCount, 2); assert.deepEqual(props.onChange.lastCall.lastArg, [ diff --git a/test/unit/lib/static/components/controls/custom-gui-controls.jsx b/test/unit/lib/static/components/controls/custom-gui-controls.jsx index 9c2970b58..22571412f 100644 --- a/test/unit/lib/static/components/controls/custom-gui-controls.jsx +++ b/test/unit/lib/static/components/controls/custom-gui-controls.jsx @@ -1,7 +1,8 @@ +import {expect} from 'chai'; import React from 'react'; -import {Button} from 'semantic-ui-react'; import proxyquire from 'proxyquire'; import {mkConnectedComponent} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -26,7 +27,7 @@ describe('', () => { it('should display nothing if custom-gui-config is empty', () => { const component = mkConnectedComponent(, mkInitialState({})); - assert.equal(component.html().length, 0); + assert.equal(component.container.innerHTML.length, 0); }); it('should display nothing if control type is not supported', () => { @@ -36,7 +37,7 @@ describe('', () => { ] })); - assert.equal(component.html().length, 0); + assert.equal(component.container.innerHTML.length, 0); }); it('should display buttons from custom-gui-config', () => { @@ -46,17 +47,23 @@ describe('', () => { ] })); - assert.equal(component.find(Button).length, 1); + expect(component.getByRole('button')).to.exist; }); it('should display radiobuttons from custom-gui-config', () => { const component = mkConnectedComponent(, mkInitialState({ 'some-section': [ - {type: 'radiobutton'} + { + type: 'radiobutton', controls: [ + {label: 'opt-1', value: 'val-1', active: false}, + {label: 'opt-2', value: 'val-2', active: true} + ] + } ] })); - assert.equal(component.find(Button.Group).length, 1); + expect(component.getByText('opt-1', {selector: 'button'})).to.exist; + expect(component.getByText('opt-2', {selector: 'button'})).to.exist; }); ['button', 'radiobutton'].forEach((controlType) => { @@ -69,7 +76,7 @@ describe('', () => { }] })); - assert.equal(component.children().find(Button).length, 2); + assert.equal(component.getAllByRole('button').length, 2); }); it(`should give all ${controlType}s correct labels`, () => { @@ -80,8 +87,8 @@ describe('', () => { }] })); - assert.equal(component.children().find('[content="foo"]').length, 1); - assert.equal(component.children().find('[content="bar"]').length, 1); + expect(component.getByText('foo', {selector: 'button'})).to.exist; + expect(component.getByText('bar', {selector: 'button'})).to.exist; }); it(`should give all ${controlType}s correct values`, () => { @@ -95,11 +102,12 @@ describe('', () => { }] })); - assert.equal(component.children().find('[content="foo"]').prop('value'), 'foo-value'); - assert.equal(component.children().find('[content="bar"]').prop('value'), 'bar-value'); + expect(component.getByText('foo', {selector: 'button'}).value).to.equal('foo-value'); + expect(component.getByText('bar', {selector: 'button'}).value).to.equal('bar-value'); }); - it('should run custom action on click', () => { + it('should run custom action on click', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, mkInitialState({ 'some-section': [{ type: `${controlType}`, @@ -107,7 +115,7 @@ describe('', () => { }] })); - component.children().find(Button).simulate('click'); + await user.click(component.getByRole('button')); assert.calledOnceWith(actionsStub.runCustomGuiAction); }); @@ -123,8 +131,8 @@ describe('', () => { }] })); - assert.isTrue(component.children().find('[content="foo"]').prop('active')); - assert.isFalse(component.children().find('[content="bar"]').prop('active')); + expect(component.getByText('foo', {selector: 'button'}).classList.contains('active')).to.be.true; + expect(component.getByText('bar', {selector: 'button'}).classList.contains('active')).to.be.false; }); }); }); diff --git a/test/unit/lib/static/components/controls/find-same-diffs-button.jsx b/test/unit/lib/static/components/controls/find-same-diffs-button.jsx index 040696313..e284c2e6f 100644 --- a/test/unit/lib/static/components/controls/find-same-diffs-button.jsx +++ b/test/unit/lib/static/components/controls/find-same-diffs-button.jsx @@ -2,6 +2,7 @@ import React from 'react'; import proxyquire from 'proxyquire'; import {defaults} from 'lodash'; import {mkState, mkConnectedComponent} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -47,16 +48,17 @@ describe('', () => { it('should be disabled if passed prop "isDisabled" is true', () => { const component = mkFindSameDiffsButton({isDisabled: true}); - assert.isTrue(component.find('[data-qa="find-same-diffs"]').prop('disabled')); + assert.isTrue(component.getByTestId('find-same-diffs').disabled); }); it('should be enabled if passed prop "isDisabled" is false', () => { const component = mkFindSameDiffsButton({isDisabled: false}); - assert.isFalse(component.find('[data-qa="find-same-diffs"]').prop('disabled')); + assert.isFalse(component.getByTestId('find-same-diffs').disabled); }); - it('should call "findSameDiffs" action on click', () => { + it('should call "findSameDiffs" action on click', async () => { + const user = userEvent.setup(); const initialState = { tree: { browsers: { @@ -76,7 +78,7 @@ describe('', () => { , {state} ); - component.find('[data-qa="find-same-diffs"]').simulate('click'); + await user.click(component.getByTestId('find-same-diffs')); assert.calledOnceWith(actionsStub.findSameDiffs, 'img-1', failedOpenedImageIds, 'yabro'); }); diff --git a/test/unit/lib/static/components/controls/gui-controls.jsx b/test/unit/lib/static/components/controls/gui-controls.jsx index f28d75102..7571971f5 100644 --- a/test/unit/lib/static/components/controls/gui-controls.jsx +++ b/test/unit/lib/static/components/controls/gui-controls.jsx @@ -1,6 +1,7 @@ import React from 'react'; import proxyquire from 'proxyquire'; import {mkConnectedComponent} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -48,8 +49,8 @@ describe('', () => { initialState: {running: false, stopping: false} }); - const stop = component.find('[label="Stop tests"]'); - assert.isTrue(stop.prop('isDisabled')); + const stop = component.getByText((_, el) => el.textContent === 'Stop tests', {selector: 'button'}); + assert.isTrue(stop.disabled); }); describe ('should be disabled when tests are', () => { @@ -58,8 +59,8 @@ describe('', () => { initialState: {running: true, stopping: false} }); - const stop = component.find('[label="Stop tests"]'); - assert.isFalse(stop.prop('isDisabled')); + const stop = component.getByText((_, el) => el.textContent === 'Stop tests', {selector: 'button'}); + assert.isFalse(stop.disabled); }); it('stopping', () => { @@ -67,17 +68,20 @@ describe('', () => { initialState: {running: true, stopping: true} }); - const stop = component.find('[label="Stop tests"]'); - assert.isTrue(stop.prop('isDisabled')); + const stop = component.getByText((_, el) => el.textContent === 'Stop tests', {selector: 'button'}); + assert.isTrue(stop.disabled); }); }); - it('should call "stopTests" action on click', () => { + it('should call "stopTests" action on click', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, { initialState: {running: true} }); + const stop = component.getByText((_, el) => el.textContent === 'Stop tests', {selector: 'button'}); + + await user.click(stop); - component.find('[label="Stop tests"]').simulate('click'); assert.calledOnce(actionsStub.stopTests); }); }); diff --git a/test/unit/lib/static/components/controls/menu-bar.jsx b/test/unit/lib/static/components/controls/menu-bar.jsx index 624394a57..f6dfd61ce 100644 --- a/test/unit/lib/static/components/controls/menu-bar.jsx +++ b/test/unit/lib/static/components/controls/menu-bar.jsx @@ -1,25 +1,27 @@ +import {expect} from 'chai'; import React from 'react'; import {mkConnectedComponent} from '../utils'; import MenuBar from 'lib/static/components/controls/common-controls'; +import userEvent from '@testing-library/user-event'; describe('', () => { - it('should show passed items as links in dropdown menu', () => { + it('should show passed items as links in dropdown menu', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, { initialState: {apiValues: {extraItems: {some: 'link'}}} }); - component.find('button.menu-bar__dropdown').simulate('click'); - const item = component.first().find('.menu-bar__content_item').first(); - assert.equal(item.text(), 'some'); - assert.equal(item.first().props().children.props.href, 'link'); + await user.click(component.getByRole('button')); + + expect(component.getByText('some')).to.exist; + expect(component.getByText('some').href).to.equal('http://localhost/link'); }); it('should not show dropdown menu if extra items are not passed', () => { const component = mkConnectedComponent(, { initialState: {apiValues: {extraItems: {}}} }); - const dropdown = component.find('.button.menu-bar__dropdown').first(); - assert.equal(dropdown.length, 0); + expect(component.queryByRole('button')).to.not.exist; }); }); diff --git a/test/unit/lib/static/components/controls/run-button.jsx b/test/unit/lib/static/components/controls/run-button.jsx index dac4ac51f..ed70ee66e 100644 --- a/test/unit/lib/static/components/controls/run-button.jsx +++ b/test/unit/lib/static/components/controls/run-button.jsx @@ -1,11 +1,12 @@ import React from 'react'; import proxyquire from 'proxyquire'; import {mkConnectedComponent, mkState} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); - let RunButton, useLocalStorageStub, actionsStub, selectorsStub, writeValueStub; + let RunButton, useLocalStorageStub, actionsStub, selectorsStub, writeValueStub, mutationObserverOriginal; beforeEach(() => { writeValueStub = sandbox.stub(); @@ -26,6 +27,18 @@ describe('', () => { '../../../modules/selectors/tree': selectorsStub, '../../../modules/actions': actionsStub }).default; + + mutationObserverOriginal = global.MutationObserver; + global.MutationObserver = class { + constructor() {} + disconnect() {} + observe() {} + }; + }); + + afterEach(() => { + sandbox.restore(); + global.MutationObserver = mutationObserverOriginal; }); it('should be disabled if no suites to run', () => { @@ -33,7 +46,7 @@ describe('', () => { initialState: {tree: {suites: {allRootIds: []}}, processing: false} }); - assert.isTrue(component.find('button.run-button__button').prop('disabled')); + assert.isTrue(component.getByRole('button').disabled); }); it('should be enabled if suites exist to run', () => { @@ -41,7 +54,7 @@ describe('', () => { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - assert.isFalse(component.find('button.run-button__button').prop('disabled')); + assert.isFalse(component.getByRole('button').disabled); }); it('should be disabled while processing something', () => { @@ -49,7 +62,7 @@ describe('', () => { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: true} }); - assert.isTrue(component.find('button.run-button__button').prop('disabled')); + assert.isTrue(component.getByRole('button').disabled); }); it('should run all tests with "autoRun" prop', () => { @@ -60,38 +73,43 @@ describe('', () => { assert.calledOnce(actionsStub.runAllTests); }); - it('should call "runAllTests" action on "Run all tests" click', () => { + it('should call "runAllTests" action on "Run all tests" click', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - component.find('button.run-button__button').simulate('click'); + await user.click(component.getByRole('button')); assert.calledOnce(actionsStub.runAllTests); }); - it('should call "runFailedTests" action on "Run failed tests" click', () => { + it('should call "runFailedTests" action on "Run failed tests" click', async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('RunMode', 'Failed').returns(['Failed', () => {}]); const failedTests = [{testName: 'suite test', browserName: 'yabro'}]; const state = mkState({initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false}}); selectorsStub.getFailedTests.withArgs(state).returns(failedTests); const component = mkConnectedComponent(, {state}); - component.find({children: 'Failed Tests'}).simulate('click'); - component.find('button.run-button__button').simulate('click'); + await user.click(component.getByRole('combobox')); + await user.click(component.getByText('Failed Tests', {selector: '[role=combobox] > *'})); + await user.click(component.getByRole('button')); assert.calledOnceWith(actionsStub.runFailedTests, failedTests); }); - it('should call "retrySuite" action on "Run checked tests" click', () => { + it('should call "retrySuite" action on "Run checked tests" click', async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('RunMode', 'Failed').returns(['Checked', () => {}]); const checkedTests = [{testName: 'suite test', browserName: 'yabro'}]; const state = mkState({initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false}}); selectorsStub.getCheckedTests.withArgs(state).returns(checkedTests); const component = mkConnectedComponent(, {state}); - component.find({children: 'Checked Tests'}).simulate('click'); - component.find('button.run-button__button').simulate('click'); + await user.click(component.getByRole('combobox')); + await user.click(component.getByText('Checked Tests', {selector: '[role=combobox] > *'})); + await user.click(component.getByRole('button')); assert.calledOnceWith(actionsStub.retrySuite, checkedTests); }); @@ -102,7 +120,7 @@ describe('', () => { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false, running: true} }); - assert.equal(component.find('button.run-button__button').text(), 'Running'); + assert.equal(component.getByRole('button').textContent, 'Running'); }); it('should be "Run all tests" by default if there is no checked tests', () => { @@ -111,7 +129,7 @@ describe('', () => { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - assert.equal(component.find('div.run-button__dropdown').text(), 'All Tests'); + assert.equal(component.getByRole('combobox').textContent, 'All Tests'); }); it('should switch to "Run checked tests" if there are checked tests', () => { @@ -125,104 +143,48 @@ describe('', () => { }); describe('localStorage', () => { - it('should save "Run all tests" if picked', () => { + it('should save "Run all tests" if picked', async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('RunMode', 'Failed').returns(['Failed', writeValueStub]); selectorsStub.getCheckedTests.returns([{testName: 'testName', browserName: 'browserName'}]); selectorsStub.getFailedTests.returns([{testName: 'testName', browserName: 'browserName'}]); const component = mkConnectedComponent(, { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - component.first().find('button.g-select-control__button').simulate('click'); - component.first().findWhere(node => node.text() === 'All Tests' && node.hasClass('g-list__item')).simulate('click'); + + await user.click(component.getByRole('combobox')); + await user.click(component.getByText('All Tests', {selector: '[role=option] *'})); + await user.click(component.getByRole('button')); + assert.calledWith(writeValueStub, 'All'); }); - it('should save "Run failed tests" if picked', () => { + it('should save "Run failed tests" if picked', async () => { + const user = userEvent.setup(); selectorsStub.getFailedTests.returns([{testName: 'testName', browserName: 'browserName'}]); const component = mkConnectedComponent(, { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - component.first().find('button.g-select-control__button').simulate('click'); - component.first().findWhere(node => node.text() === 'Failed Tests' && node.hasClass('g-list__item')).simulate('click'); + await user.click(component.getByRole('combobox')); + await user.click(component.getByText('Failed Tests', {selector: '[role=option] *'})); + await user.click(component.getByRole('button')); + assert.calledOnceWith(writeValueStub, 'Failed'); }); - it('should save "Run checked tests" if picked', () => { + it('should save "Run checked tests" if picked', async () => { + const user = userEvent.setup(); selectorsStub.getCheckedTests.returns([{testName: 'testName', browserName: 'browserName'}]); const component = mkConnectedComponent(, { initialState: {tree: {suites: {allRootIds: ['suite']}}, processing: false} }); - component.first().find('button.g-select-control__button').simulate('click'); - component.first().findWhere(node => node.text() === 'Checked Tests' && node.hasClass('g-list__item')).simulate('click'); - assert.calledWith(writeValueStub, 'Checked'); - }); - }); - - describe('Popup', () => { - describe('should be hidden', () => { - it('if processing', () => { - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: ['suite']}}, processing: true} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); - - it('if no suites', () => { - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: []}}, processing: false} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); - - it('if there are no checked and failed tests', () => { - selectorsStub.getCheckedTests.returns([]); - selectorsStub.getFailedTests.returns([]); + await user.click(component.getByRole('combobox')); + await user.click(component.getByText('Checked Tests', {selector: '[role=option] *'})); + await user.click(component.getByRole('button')); - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: ['suite']}}, processing: false} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); - - it('if checkboxes are hidden and no failed tests', () => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([false]); - selectorsStub.getCheckedTests.returns([{testName: 'testName', browserName: 'browserName'}]); - selectorsStub.getFailedTests.returns([]); - - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: ['suite']}}, processing: false} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); - }); - - describe('should be shown', () => { - it('if failed suites exist', () => { - selectorsStub.getFailedTests.returns([{testName: 'testName', browserName: 'browserName'}]); - - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: ['suite']}}, processing: false} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); - - it('if checked suites exist and checkboxes are shown', () => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - selectorsStub.getCheckedTests.returns([{testName: 'testName', browserName: 'browserName'}]); - - const component = mkConnectedComponent(, { - initialState: {tree: {suites: {allRootSuiteIds: ['suite']}}, processing: false} - }); - - assert.isFalse(component.find('.run-mode').exists()); - }); + assert.calledWith(writeValueStub, 'Checked'); }); }); }); diff --git a/test/unit/lib/static/components/controls/show-checkboxes-input.jsx b/test/unit/lib/static/components/controls/show-checkboxes-input.jsx index acac69748..1d5f69033 100644 --- a/test/unit/lib/static/components/controls/show-checkboxes-input.jsx +++ b/test/unit/lib/static/components/controls/show-checkboxes-input.jsx @@ -1,5 +1,7 @@ import React from 'react'; import proxyquire from 'proxyquire'; +import {render} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -21,17 +23,18 @@ describe('', () => { it(`should set checkbox to ${checked ? '' : 'un'}checked if showCheckboxes is ${checked ? '' : 'not '}set`, () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([checked, () => {}]); - const component = mount(); + const component = render(); - assert.equal(component.find('input[type="checkbox"]').prop('checked'), checked); + assert.equal(component.getByRole('switch').checked, checked); }); - it(`should call hook handler on ${checked ? '' : 'un'}checked click`, () => { + it(`should call hook handler on ${checked ? '' : 'un'}checked click`, async () => { + const user = userEvent.setup(); const hookHandler = sandbox.stub(); useLocalStorageStub.withArgs('showCheckboxes', false).returns([checked, hookHandler]); - const component = mount(); + const component = render(); - component.find('input[type="checkbox"]').simulate('change'); + await user.click(component.getByRole('switch')); assert.calledOnceWith(hookHandler, !checked); }); diff --git a/test/unit/lib/static/components/controls/strict-match-filter-input.jsx b/test/unit/lib/static/components/controls/strict-match-filter-input.jsx index 7f4060e0d..b35ec1d1d 100644 --- a/test/unit/lib/static/components/controls/strict-match-filter-input.jsx +++ b/test/unit/lib/static/components/controls/strict-match-filter-input.jsx @@ -1,6 +1,7 @@ import React from 'react'; import {mkConnectedComponent} from '../utils'; import proxyquire from 'proxyquire'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -25,7 +26,7 @@ describe('', () => { initialState: {view: {strictMatchFilter: true}} }); - assert.isTrue(component.find('input[type="checkbox"]').prop('checked')); + assert.isTrue(component.getByRole('switch').checked); }); it('should set checkbox to unchecked when prop is set to false', () => { @@ -33,25 +34,27 @@ describe('', () => { initialState: {view: {strictMatchFilter: false}} }); - assert.isFalse(component.find('input[type="checkbox"]').prop('checked')); + assert.isFalse(component.getByRole('switch').checked); }); - it('should call initiate setStrictMatchFilter action with false', () => { + it('should call initiate setStrictMatchFilter action with false', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, { initialState: {view: {strictMatchFilter: false}} }); - component.find('input[type="checkbox"]').simulate('change'); + await user.click(component.getByRole('switch')); assert.calledOnceWith(actionsStub.setStrictMatchFilter, true); }); - it('should call initiate setStrictMatchFilter action with true', () => { + it('should call initiate setStrictMatchFilter action with true', async () => { + const user = userEvent.setup(); const component = mkConnectedComponent(, { initialState: {view: {strictMatchFilter: true}} }); - component.find('input[type="checkbox"]').simulate('change'); + await user.click(component.getByRole('switch')); assert.calledOnceWith(actionsStub.setStrictMatchFilter, false); }); diff --git a/test/unit/lib/static/components/custom-scripts.tsx b/test/unit/lib/static/components/custom-scripts.tsx index 821714ccd..31629a16c 100644 --- a/test/unit/lib/static/components/custom-scripts.tsx +++ b/test/unit/lib/static/components/custom-scripts.tsx @@ -1,5 +1,7 @@ +import {expect} from 'chai'; import React from 'react'; import CustomScripts from 'lib/static/components/custom-scripts'; +import {render} from '@testing-library/react'; describe('', () => { it('should render component for scripts', () => { @@ -7,10 +9,8 @@ describe('', () => { scripts: [function(): void {}] }; - const component = mount(); - const node = component.find('.custom-scripts'); - - assert.lengthOf(node, 1); + const component = render(); + expect(component.container.querySelector('.custom-scripts')).to.exist; }); it('should not render component if no scripts to inject', () => { @@ -18,10 +18,8 @@ describe('', () => { scripts: [] }; - const component = mount(); - const node = component.find('.custom-scripts'); - - assert.lengthOf(node, 0); + const component = render(); + expect(component.container.querySelector('.custom-scripts')).to.not.exist; }); it('should wrap function with IIFE', () => { @@ -29,8 +27,8 @@ describe('', () => { scripts: [function foo(): void {}] }; - const component = mount(); - const script = component.text(); + const component = render(); + const script = component.container.textContent; assert.equal(script, '(function foo() {})();'); }); @@ -43,8 +41,8 @@ describe('', () => { ] }; - const component = mount(); - const script = component.text(); + const component = render(); + const script = component.container.textContent; assert.equal(script, '(function foo() {})();(function bar() {})();'); }); diff --git a/test/unit/lib/static/components/details.jsx b/test/unit/lib/static/components/details.jsx index 679129c7a..eae489a2a 100644 --- a/test/unit/lib/static/components/details.jsx +++ b/test/unit/lib/static/components/details.jsx @@ -1,5 +1,7 @@ import React from 'react'; import Details from 'lib/static/components/details'; +import {render} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; describe('
', () => { const sandbox = sinon.sandbox.create(); @@ -12,8 +14,8 @@ describe('
', () => { content: 'foo bar' }; - const component = mount(
); - const title = component.find('.details__summary').text(); + const component = render(
); + const title = component.container.querySelector('.details__summary').textContent; assert.equal(title, props.title); }); @@ -24,8 +26,8 @@ describe('
', () => { content: '' }; - const component = mount(
); - const text = component.find('div.details').text(); + const component = render(
); + const text = component.container.querySelector('div.details').textContent; assert.equal(text, 'some-title'); }); @@ -41,37 +43,39 @@ describe('
', () => { }; }); - it('should call on click in title', () => { - const component = mount(
); + it('should call on click in title', async () => { + const user = userEvent.setup(); + const component = render(
); - component.find('.details__summary').simulate('click'); + await user.click(component.container.querySelector('.details__summary')); assert.calledOnce(props.onClick); }); - it('should call with changed state on each call', () => { - const component = mount(
); + it('should call with changed state on each call', async () => { + const user = userEvent.setup(); + const component = render(
); - component.find('.details__summary') - .simulate('click') - .simulate('click'); + await user.click(component.container.querySelector('.details__summary')); + await user.click(component.container.querySelector('.details__summary')); assert.calledWith(props.onClick.firstCall, {isOpened: true}); assert.calledWith(props.onClick.secondCall, {isOpened: false}); }); }); - it('should render html, if specified', () => { + it('should render html, if specified', async () => { + const user = userEvent.setup(); const props = { title: 'some-title', content: '
some content
', asHtml: true }; - const component = mount(
); - component.find('.details__summary').simulate('click'); + const component = render(
); + await user.click(component.container.querySelector('.details__summary')); const expectedHtml = '
' + props.content + '
'; - assert.equal(component.find('.details__content').html(), expectedHtml); + assert.equal(component.container.querySelector('.details__content').parentNode.innerHTML, expectedHtml); }); }); diff --git a/test/unit/lib/static/components/error-boundary.jsx b/test/unit/lib/static/components/error-boundary.jsx index f16cb1604..c00671ca8 100644 --- a/test/unit/lib/static/components/error-boundary.jsx +++ b/test/unit/lib/static/components/error-boundary.jsx @@ -1,5 +1,6 @@ import React from 'react'; import ErrorBoundary from 'lib/static/components/error-boundary'; +import {render} from '@testing-library/react'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -11,8 +12,8 @@ describe('', () => { afterEach(() => sandbox.restore()); it('should render child component if it is ok', () => { - const component = mount(ok text); - const textContent = component.text(); + const component = render(ok text); + const textContent = component.container.textContent; assert.equal(textContent, 'ok text'); }); @@ -21,12 +22,12 @@ describe('', () => { const FailingComponent = function() { throw new Error('Failed functional component.'); }; - const component = mount( + const component = render( ); - const textContent = component.text(); + const textContent = component.container.textContent; assert.equal(textContent, ''); }); @@ -35,13 +36,13 @@ describe('', () => { const FailingComponent = function() { throw new Error('Failed functional component.'); }; - const component = mount( + const component = render( ignored text ); - const textContent = component.text(); + const textContent = component.container.textContent; assert.equal(textContent, 'fallback text'); }); diff --git a/test/unit/lib/static/components/extension-point.jsx b/test/unit/lib/static/components/extension-point.jsx index 00ac2e687..8fea3f51a 100644 --- a/test/unit/lib/static/components/extension-point.jsx +++ b/test/unit/lib/static/components/extension-point.jsx @@ -1,5 +1,6 @@ import React from 'react'; import proxyquire from 'proxyquire'; +import {render} from '@testing-library/react'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -42,22 +43,22 @@ describe('', () => { afterEach(() => sandbox.restore()); it('should skip plugin components composition when extension point does not match', () => { - const component = mount( + const component = render( child ); - assert.strictEqual(component.first().html(), 'child'); + assert.strictEqual(component.container.innerHTML, 'child'); }); it('should render combined plugin components on matching extension point', () => { - const component = mount( + const component = render( child ); - assert.strictEqual(component.first().html(), '
Before
child
After
'); + assert.strictEqual(component.container.innerHTML, '
Before
child
After
'); }); }); diff --git a/test/unit/lib/static/components/group-tests/item.jsx b/test/unit/lib/static/components/group-tests/item.jsx index fb8e6a97d..257c2e44a 100644 --- a/test/unit/lib/static/components/group-tests/item.jsx +++ b/test/unit/lib/static/components/group-tests/item.jsx @@ -1,11 +1,11 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaultsDeep, set} from 'lodash'; -import {Checkbox} from '@gravity-ui/uikit'; -import {CHECKED, UNCHECKED, INDETERMINATE} from 'lib/constants/checked-statuses'; -import {isCheckboxChecked} from 'lib/common-utils'; +import {CHECKED, UNCHECKED} from 'lib/constants/checked-statuses'; import {mkConnectedComponent} from 'test/unit/lib/static/components/utils'; import {mkStateTree} from 'test/unit/lib/static/state-utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -40,50 +40,64 @@ describe('', () => { }); describe('', () => { - [true, false].forEach(show => { - it(`should ${show ? '' : 'not '}exist if "showCheckboxes" is ${show ? '' : 'not '}set`, () => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([show]); + it(`should exist if "showCheckboxes" is set`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - const component = mkGroupTestsItemComponent(); + const component = mkGroupTestsItemComponent(); - assert.equal(component.find(Checkbox).exists(), show); - }); + expect(component.queryByRole('checkbox')).to.exist; + }); + + it(`should not exist if "showCheckboxes" is not set`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([false]); + + const component = mkGroupTestsItemComponent(); + + expect(component.queryByRole('checkbox')).to.not.exist; }); - it('should not be checked when no childs checked', () => { + it('should not be checked when no children are checked', () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const browserIds = ['b1']; const browsersStateById = {'b1': {shouldBeChecked: UNCHECKED}}; const component = mkGroupTestsItemComponent(browserIds, browsersStateById); - assert.equal(component.find(Checkbox).prop('checked'), UNCHECKED); + assert.isFalse(component.getByRole('checkbox').checked); }); - [ - {checked: INDETERMINATE, state: 'indeterminate', childChecked: 'some'}, - {checked: CHECKED, state: 'checked', childChecked: 'all'} - ].forEach(({checked, state, childChecked}) => { - it(`should be ${state} when ${childChecked} child checked`, () => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - const browserIds = ['b1', 'b2']; - const browsersStateById = { - 'b1': {checkStatus: CHECKED}, - 'b2': {checkStatus: checked === CHECKED ? CHECKED : UNCHECKED} - }; - const component = mkGroupTestsItemComponent(browserIds, browsersStateById); + it(`should be indeterminate when some children are checked`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); + const browserIds = ['b1', 'b2']; + const browsersStateById = { + 'b1': {checkStatus: CHECKED}, + 'b2': {checkStatus: UNCHECKED} + }; + const component = mkGroupTestsItemComponent(browserIds, browsersStateById); - assert.equal(component.find(Checkbox).prop('checked'), isCheckboxChecked(checked)); - }); + assert.isTrue(component.getByRole('checkbox').indeterminate); + }); + + it(`should be checked when all children are checked`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); + const browserIds = ['b1', 'b2']; + const browsersStateById = { + 'b1': {checkStatus: CHECKED}, + 'b2': {checkStatus: CHECKED} + }; + const component = mkGroupTestsItemComponent(browserIds, browsersStateById); + + assert.isTrue(component.getByRole('checkbox').checked); }); [CHECKED, UNCHECKED].forEach(checked => { - it(`should call "toggleBrowserCheckbox" action with ${checked ? 'un' : ''}checked state on click`, () => { + it(`should call "toggleBrowserCheckbox" action with ${checked ? 'un' : ''}checked state on click`, async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const browserIds = ['b1']; const browsersStateById = {'b1': {checkStatus: checked}}; const component = mkGroupTestsItemComponent(browserIds, browsersStateById); - component.find(Checkbox).simulate('click'); + await user.click(component.getByRole('checkbox')); assert.calledOnceWith(actionsStub.toggleGroupCheckbox, { browserIds: ['b1'], diff --git a/test/unit/lib/static/components/modals/screenshot-accepter/body.jsx b/test/unit/lib/static/components/modals/screenshot-accepter/body.jsx index 2cc82ce5f..1904800cb 100644 --- a/test/unit/lib/static/components/modals/screenshot-accepter/body.jsx +++ b/test/unit/lib/static/components/modals/screenshot-accepter/body.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import {defaults} from 'lodash'; import proxyquire from 'proxyquire'; @@ -68,11 +69,7 @@ describe('', () => { it('should render completion information if "image" is not passed', () => { const component = mkBodyComponent({image: null}); - assert.equal( - component.find('.screenshot-accepter__completion-info').text(), - 'All screenshots are accepted. Well done! 🎉' - ); - assert.isEmpty(component.find('.screenshot-accepter__title')); + expect(component.getByText('All screenshots are accepted. Well done! 🎉')).to.exist; }); it('should render full title of image state with image description', () => { @@ -83,10 +80,8 @@ describe('', () => { const component = mkBodyComponent({image}, {tree}); - assert.equal( - component.find('.screenshot-accepter__title').text(), - 'suite/yabro/state (expected, actual, diff)' - ); + expect(component.container.querySelector('.screenshot-accepter__title').textContent) + .to.equal('suite/yabro/state (expected, actual, diff)'); }); describe('no reference image error', () => { @@ -119,10 +114,8 @@ describe('', () => { const component = mkBodyComponent({image}, {tree}); - assert.equal( - component.find('.screenshot-accepter__title').text(), - 'suite/yabro/state (actual)' - ); + expect(component.container.querySelector('.screenshot-accepter__title').textContent) + .to.equal('suite/yabro/state (actual)'); }); }); diff --git a/test/unit/lib/static/components/modals/screenshot-accepter/header.jsx b/test/unit/lib/static/components/modals/screenshot-accepter/header.jsx index 92024f61b..b0ec107a7 100644 --- a/test/unit/lib/static/components/modals/screenshot-accepter/header.jsx +++ b/test/unit/lib/static/components/modals/screenshot-accepter/header.jsx @@ -1,84 +1,74 @@ -import React from 'react'; +import userEvent from '@testing-library/user-event'; +import {expect} from 'chai'; import {defaults} from 'lodash'; -import proxyquire from 'proxyquire'; -import {mkConnectedComponent} from '../../utils'; +import React from 'react'; import {DiffModes} from 'lib/constants'; +import ScreenshotAccepterHeader from 'lib/static/components/modals/screenshot-accepter/header'; +import { + addBrowserToTree, addResultToTree, + addSuiteToTree, generateResultId, + mkConnectedComponent, + mkEmptyTree, + mkRealStore, + renderWithStore +} from '../../utils'; describe('', () => { const sandbox = sinon.sandbox.create(); - let ScreenshotAccepterHeader, RetrySwitcher, GlobalHotKeys, events; - const mkKeyDownEvent = (opts = {}) => { - return {...opts, preventDefault: () => {}}; + const DEFAULT_PROPS = { + view: {diffMode: DiffModes.THREE_UP_SCALED}, + actions: {changeDiffMode: sinon.stub().returns({type: 'some-type'})}, + totalImages: 2, + acceptedImages: 0, + images: [{ + id: 'default-image-id', + parentId: 'default-result-id' + }], + stateNameImageIds: ['default-browser default-state-name'], + retryIndex: 0, + showMeta: false, + activeImageIndex: 0, + staticImageAccepter: {accepterDelayedImages: []}, + onShowMeta: () => {}, + onClose: () => {}, + onRetryChange: () => {}, + onActiveImageChange: () => {}, + onScreenshotAccept: () => {}, + onScreenshotUndo: () => {} }; const mkHeaderComponent = (props = {}) => { - props = defaults(props, { - view: {diffMode: DiffModes.THREE_UP_SCALED}, - actions: {changeDiffMode: sinon.stub().returns({type: 'some-type'})}, - totalImages: 2, - acceptedImages: 0, - images: [{ - id: 'default-image-id', - parentId: 'default-result-id' - }], - stateNameImageIds: ['default-browser default-state-name'], - retryIndex: 0, - showMeta: false, - activeImageIndex: 0, - staticImageAccepter: {accepterDelayedImages: []}, - onShowMeta: () => {}, - onClose: () => {}, - onRetryChange: () => {}, - onActiveImageChange: () => {}, - onScreenshotAccept: () => {}, - onScreenshotUndo: () => {} - }); + props = defaults(props, DEFAULT_PROPS); return mkConnectedComponent(); }; - beforeEach(() => { - events = {}; - global.window.addEventListener = sandbox.stub().callsFake((event, cb) => { - events[event] = cb; - }); - - RetrySwitcher = sandbox.stub().returns(null); - GlobalHotKeys = sandbox.stub().returns(null); - - ScreenshotAccepterHeader = proxyquire('lib/static/components/modals/screenshot-accepter/header', { - 'react-hotkeys': {GlobalHotKeys}, - '../../retry-switcher': {default: RetrySwitcher} - }).default; - }); - afterEach(() => { - global.window.addEventListener = () => {}; sandbox.restore(); }); [ { btnName: 'Arrow Up', - btnClass: '.screenshot-accepter__arrow-up-btn' + btnTitle: 'Show previous image' }, { btnName: 'Arrow Down', - btnClass: '.screenshot-accepter__arrow-down-btn' + btnTitle: 'Show next image' } - ].forEach(({btnName, btnClass}) => { + ].forEach(({btnName, btnTitle}) => { describe(`"${btnName}" button`, () => { it('should be disabled if the current image is the last', () => { const component = mkHeaderComponent({stateNameImageIds: ['state1']}); - assert.isTrue(component.find(`button${btnClass}`).prop('disabled')); + assert.isTrue(component.getByTitle(btnTitle, {exact: false}).disabled); }); it('should be disabled if there are no images left', () => { const component = mkHeaderComponent({stateNameImageIds: []}); - assert.isTrue(component.find(`button${btnClass}`).prop('disabled')); + assert.isTrue(component.getByTitle(btnTitle, {exact: false}).disabled); }); }); }); @@ -96,7 +86,8 @@ describe('', () => { expectedActiveImageIndex: 2 } ].forEach(({name, activeImageIndex, expectedActiveImageIndex}) => { - it(`should call "onActiveImageChange" ${name} on click`, () => { + it(`should call "onActiveImageChange" ${name} on click`, async () => { + const user = userEvent.setup(); const onActiveImageChange = sandbox.stub(); const component = mkHeaderComponent({ activeImageIndex, @@ -104,7 +95,7 @@ describe('', () => { onActiveImageChange }); - component.find('button.screenshot-accepter__arrow-up-btn').simulate('click'); + await user.click(component.getByTitle('Show previous image', {exact: false})); assert.calledOnceWith(onActiveImageChange, expectedActiveImageIndex); }); @@ -122,16 +113,16 @@ describe('', () => { expectedActiveImageIndex: 2 } ].forEach(({name, activeImageIndex, expectedActiveImageIndex}) => { - it(`should call "onActiveImageChange" ${name} on press on related keys`, () => { + it(`should call "onActiveImageChange" ${name} on press on related keys`, async () => { + const user = userEvent.setup(); const onActiveImageChange = sandbox.stub(); - const component = mkHeaderComponent({ + mkHeaderComponent({ activeImageIndex, stateNameImageIds: ['state1', 'state2', 'state3'], onActiveImageChange }); - const {PREV_SCREENSHOT: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowUp}'); assert.calledOnceWith(onActiveImageChange, expectedActiveImageIndex); }); @@ -151,7 +142,8 @@ describe('', () => { expectedActiveImageIndex: 0 } ].forEach(({name, activeImageIndex, expectedActiveImageIndex}) => { - it(`should call "onActiveImageChange" ${name} on click`, () => { + it(`should call "onActiveImageChange" ${name} on click`, async () => { + const user = userEvent.setup(); const onActiveImageChange = sandbox.stub(); const component = mkHeaderComponent({ activeImageIndex, @@ -159,7 +151,7 @@ describe('', () => { onActiveImageChange }); - component.find('button.screenshot-accepter__arrow-down-btn').simulate('click'); + await user.click(component.getByTitle('Show next image', {exact: false})); assert.calledOnceWith(onActiveImageChange, expectedActiveImageIndex); }); @@ -177,16 +169,16 @@ describe('', () => { expectedActiveImageIndex: 0 } ].forEach(({name, activeImageIndex, expectedActiveImageIndex}) => { - it(`should call "onActiveImageChange" ${name} on press on related keys`, () => { + it(`should call "onActiveImageChange" ${name} on press on related keys`, async () => { + const user = userEvent.setup(); const onActiveImageChange = sandbox.stub(); - const component = mkHeaderComponent({ + mkHeaderComponent({ activeImageIndex, stateNameImageIds: ['state1', 'state2', 'state3'], onActiveImageChange }); - const {NEXT_SCREENSHOT: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowDown}'); assert.calledOnceWith(onActiveImageChange, expectedActiveImageIndex); }); @@ -197,152 +189,203 @@ describe('', () => { it('should be disabled if passed empty "images" array', () => { const component = mkHeaderComponent({images: []}); - assert.isTrue(component.find('[data-qa="screenshot-accepter-accept"]').prop('disabled')); + assert.isTrue(component.getByTestId('screenshot-accepter-accept').disabled); }); it('should be enabled if passed not empty "images" array', () => { const component = mkHeaderComponent({images: [{id: 'img-1', parentId: 'res-1'}]}); - assert.isFalse(component.find('[data-qa="screenshot-accepter-accept"]').prop('disabled')); + assert.isFalse(component.getByTestId('screenshot-accepter-accept').disabled); }); - it('should call "onScreenshotAccept" handler with current image id on click', () => { + it('should call "onScreenshotAccept" handler with current image id on click', async () => { + const user = userEvent.setup(); const onScreenshotAccept = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + const component = renderWithStore(, store); - component.find('[data-qa="screenshot-accepter-accept"]').simulate('click'); + await user.click(component.getByTestId('screenshot-accepter-accept')); assert.calledOnceWith(onScreenshotAccept, 'img-2'); }); - it('should call "onScreenshotAccept" handler with current image id on press on related keys', () => { + it('should call "onScreenshotAccept" handler with current image id on press on related keys', async () => { + const user = userEvent.setup(); const onScreenshotAccept = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + renderWithStore(, store); - const {ACCEPT_SCREENSHOT: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{Enter}'); assert.calledOnceWith(onScreenshotAccept, 'img-2'); }); }); describe(' component', () => { - it('should render with correct props', () => { + it('should render correctly', () => { const onRetryChange = sandbox.stub(); - mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + const component = renderWithStore(, store); - assert.calledOnceWith(RetrySwitcher, { - title: 'Switch to selected attempt (left: ←,a; right: →,d)', - resultIds: ['res-1', 'res-2'], - retryIndex: 0, - onChange: onRetryChange - }); + expect(component.queryAllByTitle('Switch to selected attempt (left: ←,a; right: →,d)').length).to.equal(2); }); - it('should call "onRetryChange" handler on call "onChange" prop with new retry index', () => { + it('should call "onRetryChange" handler on call "onChange" prop with new retry index', async () => { + const user = userEvent.setup(); const onRetryChange = sandbox.stub(); - mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + const component = renderWithStore(, store); - RetrySwitcher.firstCall.args[0].onChange(1); + await user.click(component.getByText('1', {selector: 'button[data-qa="retry-switcher"] > *'})); - assert.calledOnceWith(onRetryChange, 1); + assert.calledOnceWith(onRetryChange, 0); }); describe('on press on related keys', () => { - it('should call "onRetryChange" with previous retry index', () => { + it('should call "onRetryChange" with previous retry index', async () => { + const user = userEvent.setup(); const onRetryChange = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + renderWithStore(, store); - const {PREV_RETRY: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowLeft}'); assert.calledOnceWith(onRetryChange, 0); }); - it('should call "onRetryChange" with last retry index if current retry is first', () => { + it('should call "onRetryChange" with last retry index if current retry is first', async () => { + const user = userEvent.setup(); const onRetryChange = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + renderWithStore(, store); - const {PREV_RETRY: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowLeft}'); assert.calledOnceWith(onRetryChange, 1); }); - }); - describe('on press on related keys', () => { - it('should call "onRetryChange" with next retry index', () => { + it('should call "onRetryChange" with next retry index', async () => { + const user = userEvent.setup(); const onRetryChange = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + renderWithStore(, store); - const {NEXT_RETRY: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowRight}'); assert.calledOnceWith(onRetryChange, 1); }); - it('should call "onRetryChange" with first retry index if current retry is last', () => { + it('should call "onRetryChange" with first retry index if current retry is last', async () => { + const user = userEvent.setup(); const onRetryChange = sandbox.stub(); - const component = mkHeaderComponent({ + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + const store = mkRealStore({initialState: {tree}}); + + renderWithStore(, store); - const {NEXT_RETRY: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{ArrowRight}'); assert.calledOnceWith(onRetryChange, 0); }); @@ -350,18 +393,16 @@ describe('', () => { }); describe('"Show meta" button', () => { - const metaSelector = '[label="Show meta"]'; - it('should be disabled if there are no images to accept', () => { const component = mkHeaderComponent({images: []}); - assert.isTrue(component.find(metaSelector).prop('isDisabled')); + assert.isTrue(component.getByTitle('Show test meta info').disabled); }); it('should be enabled if passed not empty "images" array', () => { const component = mkHeaderComponent({images: [{id: 'img-1', parentId: 'res-1'}]}); - assert.isFalse(component.find(metaSelector).prop('isDisabled')); + assert.isFalse(component.getByTitle('Show test meta info').disabled); }); }); @@ -369,35 +410,37 @@ describe('', () => { it('should be disabled if no screenshotes were accepted', () => { const component = mkHeaderComponent({acceptedImages: 0}); - assert.isTrue(component.find('button.screenshot-accepter__undo-btn').prop('disabled')); + assert.isTrue(component.getByTestId('screenshot-accepter-undo').disabled); }); - it('should call "onScreenshotUndo" handler on click', () => { + it('should call "onScreenshotUndo" handler on click', async () => { + const user = userEvent.setup(); const onScreenshotUndo = sandbox.stub(); const component = mkHeaderComponent({onScreenshotUndo, acceptedImages: 1}); - component.find('[data-qa="screenshot-accepter-undo"]').simulate('click'); + await user.click(component.getByTestId('screenshot-accepter-undo')); assert.calledOnce(onScreenshotUndo); }); }); describe('"Close screenshot accepting mode" button', () => { - it('should call "onClose" handler on click', () => { + it('should call "onClose" handler on click', async () => { + const user = userEvent.setup(); const onClose = sandbox.stub(); const component = mkHeaderComponent({onClose}); - component.find('button.screenshot-accepter__arrows-close-btn').simulate('click'); + await user.click(component.getByTestId('screenshot-accepter-switch-accept-mode')); assert.calledOnce(onClose); }); - it('should call "onClose" handler on press on related keys', () => { + it('should call "onClose" handler on press on related keys', async () => { + const user = userEvent.setup(); const onClose = sandbox.stub(); - const component = mkHeaderComponent({onClose}); + mkHeaderComponent({onClose}); - const {CLOSE_MODAL: handler} = component.find(GlobalHotKeys).prop('handlers'); - handler(mkKeyDownEvent()); + await user.keyboard('{Esc}'); assert.calledOnce(onClose); }); diff --git a/test/unit/lib/static/components/modals/screenshot-accepter/index.jsx b/test/unit/lib/static/components/modals/screenshot-accepter/index.jsx index 11a916843..1ffaf6736 100644 --- a/test/unit/lib/static/components/modals/screenshot-accepter/index.jsx +++ b/test/unit/lib/static/components/modals/screenshot-accepter/index.jsx @@ -1,406 +1,417 @@ +import userEvent from '@testing-library/user-event'; +import {expect} from 'chai'; +import {http, HttpResponse} from 'msw'; +import {setupServer} from 'msw/node'; import React from 'react'; -import ReactDOM from 'react-dom'; -import {defaults} from 'lodash'; import proxyquire from 'proxyquire'; import {EXPAND_ALL} from 'lib/constants/expand-modes'; -import {mkConnectedComponent} from '../../utils'; +import { + addBrowserToTree, + addImageToTree, + addResultToTree, + addSuiteToTree, generateImageId, + mkEmptyTree, mkRealStore, renderWithStore +} from '../../utils'; + +const handlers = [ + http.post('/reference-data-to-update', () => { + return HttpResponse.json({}); + }), + http.post('/update-reference', () => { + return HttpResponse.json([{ + images: [{id: 'test-1 bro-1 0 state-1', stateName: 'state-1'}] + }]); + }), + http.post('/undo-accept-images', () => { + return HttpResponse.json({}); + }) +]; + +const server = setupServer(...handlers); describe('', () => { const sandbox = sinon.sandbox.create(); - let ScreenshotAccepter, ScreenshotAccepterHeader, ScreenshotAccepterMeta, ScreenshotAccepterBody; - let actionsStub, selectors, parentNode, preloadImageStub; - - const mkResult = (opts) => { - const result = defaults(opts, { - id: 'default-result-id', - parentId: 'default-bro-id', - imageIds: [] - }); - - return {[result.id]: result}; - }; + let ScreenshotAccepter; + let preloadImageStub; - const mkImage = (opts) => { - return defaults(opts, { - id: 'default-image-id', - parentId: 'default-result-id', - stateName: 'default-state-name' - }); - }; - - const mkStateTree = ({resultsById = {}} = {}) => { - return { - results: {byId: resultsById} - }; - }; - - const mkScreenshotAccepterComponent = (props = {}, initialState = {}) => { - if (!global.Element.prototype.scrollTo) { - global.Element.prototype.scrollTo = () => {}; // scrollTo isn't implemented in JSDOM - } - props = defaults(props, { - image: mkImage(), - onClose: sandbox.stub() - }); - initialState = defaults(initialState, { - tree: mkStateTree(), - view: {expand: EXPAND_ALL} - }); + before(() => server.listen()); - return mkConnectedComponent(, {initialState}); - }; + after(() => server.close()); beforeEach(() => { - actionsStub = { - changeDiffMode: sandbox.stub().returns({type: 'some-type'}), - screenshotAccepterAccept: sandbox.stub().returns({type: 'some-type'}), - undoAcceptImage: sandbox.stub().returns({type: 'some-type'}), - applyDelayedTestResults: sandbox.stub().returns({type: 'some-type'}) - }; - - selectors = { - getAcceptableImagesByStateName: sandbox.stub().returns({}) - }; + global.Element.prototype.scrollTo = () => {}; - parentNode = { - scrollTo: sandbox.stub() - }; - - ScreenshotAccepterHeader = sandbox.stub().returns(null); - ScreenshotAccepterMeta = sandbox.stub().returns(null); - ScreenshotAccepterBody = sandbox.stub().returns(null); - - sandbox.stub(ReactDOM, 'findDOMNode').returns({parentNode}); preloadImageStub = sandbox.stub(); ScreenshotAccepter = proxyquire('lib/static/components/modals/screenshot-accepter', { - './header': {default: ScreenshotAccepterHeader}, - './meta': {default: ScreenshotAccepterMeta}, - './body': {default: ScreenshotAccepterBody}, - '../../../modules/actions': actionsStub, - '../../../modules/selectors/tree': selectors, '../../../modules/utils': {preloadImage: preloadImageStub} }).default; }); - afterEach(() => sandbox.restore()); - - describe('"ScreenshotAccepterHeader"', () => { - it('should render with correct props', () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); - - mkScreenshotAccepterComponent({image}, {tree}); - - assert.calledWithMatch( - ScreenshotAccepterHeader, - { - actions: { - changeDiffMode: sinon.match.func - }, - view: { - diffMode: '3-up' - }, - images: [image], - stateNameImageIds: ['bro-1 plain'], - retryIndex: 0, - activeImageIndex: 0, - showMeta: false, - acceptedImages: 0, - totalImages: 1, - onClose: sinon.match.func, - onRetryChange: sinon.match.func, - onActiveImageChange: sinon.match.func, - onScreenshotAccept: sinon.match.func, - onScreenshotUndo: sinon.match.func, - onShowMeta: sinon.match.func - } - ); - }); - - describe('"onRetryChange" handler', () => { - it('should change retry index on call', () => { - const image1 = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const image2 = mkImage({id: 'img-2', parentId: 'res-2', stateName: 'plain'}); - const resultsById = { - ...mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}), - ...mkResult({id: 'res-2', parentId: 'bro-1', imageIds: ['img-2']}) - }; - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image1, image2]}); - - mkScreenshotAccepterComponent({image: image1}, {tree}); - ScreenshotAccepterHeader.firstCall.args[0].onRetryChange(1); + afterEach(() => { + sandbox.restore(); + server.resetHandlers(); + }); - assert.calledWithMatch(ScreenshotAccepterHeader.firstCall, {retryIndex: 0}); - assert.calledWithMatch(ScreenshotAccepterHeader.secondCall, {retryIndex: 1}); - }); + it('should render header with correct images counter', () => { + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); - - describe('"onActiveImageChange" handler', () => { - [ - { - name: 'retry index on last in active images', - expectedFirst: {retryIndex: 0}, - expectedSecond: {retryIndex: 0} - }, - { - name: 'active image index on passed', - expectedFirst: {activeImageIndex: 0}, - expectedSecond: {activeImageIndex: 1} - } - ].forEach(({name, expectedFirst, expectedSecond}) => { - it(`should change ${name}`, () => { - const image1 = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const image2 = mkImage({id: 'img-2', parentId: 'res-2', stateName: 'plain2'}); - const resultsById = { - ...mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}), - ...mkResult({id: 'res-2', parentId: 'bro-1', imageIds: ['img-2']}) - }; - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({ - 'bro-1 plain': [image1], - 'bro-1 plain2': [image2] - }); - - mkScreenshotAccepterComponent({image: image1}, {tree}); - ScreenshotAccepterHeader.firstCall.args[0].onActiveImageChange(1); - - assert.calledWithMatch(ScreenshotAccepterHeader.firstCall, expectedFirst); - assert.calledWithMatch(ScreenshotAccepterHeader.secondCall, expectedSecond); - }); - }); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-2', + expectedImgPath: 'img2-expected.png', + actualImgPath: 'img2-actual.png', + diffImgPath: 'img2-diff.png' }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - describe('"onScreenshotAccept" handler', () => { - it('should call "screenshotAccepterAccept" action', async () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); + const component = renderWithStore(, store); - mkScreenshotAccepterComponent({image}, {tree}); - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotAccept('img-1'); + expect(component.getByTestId('screenshot-accepter-progress-bar').dataset.content).to.equal('0/2'); + }); - assert.calledOnceWith(actionsStub.screenshotAccepterAccept, 'img-1'); - }); + it('should change attempt by clicking on retry-switcher', async () => { + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 1}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 1, + stateName: 'state-1', + expectedImgPath: 'img2-expected.png', + actualImgPath: 'img2-actual.png', + diffImgPath: 'img2-diff.png' + }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 1, stateName: 'state-1'}); - describe('"onShowMeta" handler', () => { - it('should invert state "showMeta"', () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); - - mkScreenshotAccepterComponent({image}, {tree}); + const component = renderWithStore(, store); + // By default, last failed attempt is selected. We select first one. + await user.click(component.getByText('1', {selector: 'button[data-qa="retry-switcher"] > *'})); - ScreenshotAccepterHeader.firstCall.args[0].onShowMeta(); + const imageElements = component.getAllByRole('img'); + imageElements.every(imageElement => expect(imageElement.src).to.include('img1')); + }); - assert.calledTwice(ScreenshotAccepterHeader); - assert.calledWith(ScreenshotAccepterHeader.secondCall, sinon.match({ - showMeta: true - })); - }); + it('should change image by clicking on "next" button', async () => { + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-2', + expectedImgPath: 'img2-expected.png', + actualImgPath: 'img2-actual.png', + diffImgPath: 'img2-diff.png' + }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - describe('"onScreenshotUndo" handler', () => { - it('should call "undoAcceptImages" action', async () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); - mkScreenshotAccepterComponent({image}, {tree}); - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotAccept('img-1'); - - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotUndo(); + const component = renderWithStore(, store); + await user.click(component.getByTitle('Show next image', {exact: false})); - assert.calledOnceWith(actionsStub.undoAcceptImage, sinon.match.any, {skipTreeUpdate: true}); - }); - }); + const imageElements = component.getAllByRole('img'); + imageElements.every(imageElement => expect(imageElement.src).to.include('img2')); }); - describe('"ScreenshotAccepterMeta"', () => { - it('should render with correct props', () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); - - mkScreenshotAccepterComponent({image}, {tree}); - - assert.calledOnceWith( - ScreenshotAccepterMeta, - { - showMeta: false, - image - } - ); + it('should show a success message after accepting last screenshot', async () => { + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); - }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - describe('"ScreenshotAccepterBody"', () => { - it('should render body with "image" props', () => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); + const component = renderWithStore(, store); + await user.click(component.getByText('Accept', {selector: 'button > *'})); - mkScreenshotAccepterComponent({image}, {tree}); + await component.findByText('All screenshots are accepted', {exact: false, timeout: 1500}); + }); - assert.calledOnceWith(ScreenshotAccepterBody, {image}); + it('should should display meta info', async () => { + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0, metaInfo: { + key1: 'some-value-1', + key2: 'some-value-2' + }}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - describe('"onRetryChange" handler', () => { - it('should change passed image on switch retry index', () => { - const image1 = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const image2 = mkImage({id: 'img-2', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1', 'img-2']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image1, image2]}); + const component = renderWithStore(, store); + await user.click(component.getByText('Show meta', {selector: 'button > *'})); - mkScreenshotAccepterComponent({image: image1}, {tree}); - ScreenshotAccepterHeader.firstCall.args[0].onRetryChange(1); + expect(component.getByText('some-value-1')).to.exist; + expect(component.getByText('some-value-2')).to.exist; + }); - assert.calledWithMatch(ScreenshotAccepterBody.firstCall, {image: image1}); - assert.calledWithMatch(ScreenshotAccepterBody.secondCall, {image: image2}); - }); + it('should return to original state after clicking "undo"', async () => { + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + actualImgPath: 'img1-actual.png', + diffImgPath: 'img1-diff.png' }); + const store = mkRealStore({initialState: {tree}}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - describe('"onActiveImageChange" handler', () => { - it('should change passed image on switch to the next image', () => { - const image1 = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const image2 = mkImage({id: 'img-2', parentId: 'res-2', stateName: 'plain2'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1', 'img-2']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({ - 'bro-1 plain': [image1], - 'bro-1 plain2': [image2] - }); + const component = renderWithStore(, store); + await user.click(component.getByText('Accept', {selector: 'button > *'})); + await user.click(component.getByText('Undo', {selector: 'button > *'})); - mkScreenshotAccepterComponent({image: image1}, {tree}); - ScreenshotAccepterHeader.firstCall.args[0].onActiveImageChange(1); + expect(component.getByTestId('screenshot-accepter-progress-bar').dataset.content).to.equal('0/1'); + const imageElements = component.getAllByRole('img'); + imageElements.every(imageElement => expect(imageElement.src).to.include('img1')); + }); - assert.calledWithMatch(ScreenshotAccepterBody.firstCall, {image: image1}); - assert.calledWithMatch(ScreenshotAccepterBody.secondCall, {image: image2}); + describe('exiting from screenshot accepter', () => { + const mkDispatchInterceptorMiddleware = (interceptor) => { + return () => { + return function wrapDispatch(next) { + return function handler(action) { + interceptor(action); + next(action); + }; + }; + }; + }; + + it('should not apply delayed test result, if no screens were accepted', async () => { + const reduxAction = sinon.stub(); + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + diffImgPath: 'img1-diff.png', + actualImgPath: 'img1-actual.png' }); - }); - }); - describe('onClose', () => { - beforeEach(() => { - const image = mkImage({id: 'img-1', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: 'bro-1', imageIds: ['img-1']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns({'bro-1 plain': [image]}); + const middleware = mkDispatchInterceptorMiddleware(reduxAction); + const store = mkRealStore({initialState: {tree, view: {expand: EXPAND_ALL}}, middlewares: [middleware]}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - mkScreenshotAccepterComponent({image}, {tree}); - }); + const component = renderWithStore(, store); - it('should not apply delayed test result, if no screens were accepted', () => { - ScreenshotAccepterHeader.firstCall.args[0].onClose(); + await user.click(component.getByTitle('Close mode with fast screenshot accepting', {exact: false})); - assert.notCalled(actionsStub.applyDelayedTestResults); + assert.neverCalledWith(reduxAction, sinon.match({type: 'APPLY_DELAYED_TEST_RESULTS'})); }); it('should apply delayed test result, if some screens were accepted', async () => { - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotAccept('img-1'); + const reduxAction = sinon.stub(); + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + diffImgPath: 'img1-diff.png', + actualImgPath: 'img1-actual.png' + }); + + const middleware = mkDispatchInterceptorMiddleware(reduxAction); + const store = mkRealStore({initialState: {tree, view: {expand: EXPAND_ALL}}, middlewares: [middleware]}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); - ScreenshotAccepterHeader.firstCall.args[0].onClose(); + const component = renderWithStore(, store); - assert.calledOnce(actionsStub.applyDelayedTestResults); + await user.click(component.getByText('Accept', {selector: 'button > *'})); + await user.click(component.getByTitle('Close mode with fast screenshot accepting', {exact: false})); + + assert.calledWith(reduxAction, sinon.match({type: 'APPLY_DELAYED_TEST_RESULTS'})); }); it('should not apply delayed test result, if it is cancelled by "Undo"', async () => { - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotAccept('img-1'); - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotUndo(); + const reduxAction = sinon.stub(); + const user = userEvent.setup(); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-1', + expectedImgPath: 'img1-expected.png', + diffImgPath: 'img1-diff.png', + actualImgPath: 'img1-actual.png' + }); + + const middleware = mkDispatchInterceptorMiddleware(reduxAction); + const store = mkRealStore({initialState: {tree, view: {expand: EXPAND_ALL}}, middlewares: [middleware]}); + const currentImageId = generateImageId({suiteName: 'test-1', browserName: 'bro-1', attempt: 0, stateName: 'state-1'}); + + const component = renderWithStore(, store); - ScreenshotAccepterHeader.firstCall.args[0].onClose(); + await user.click(component.getByText('Accept', {selector: 'button > *'})); + await user.click(component.getByText('Undo', {selector: 'button > *'})); + await user.click(component.getByTitle('Close mode with fast screenshot accepting', {exact: false})); - assert.notCalled(actionsStub.applyDelayedTestResults); + assert.neverCalledWith(reduxAction, sinon.match({type: 'APPLY_DELAYED_TEST_RESULTS'})); }); }); - describe('should preload images', () => { - const mkImgPath_ = (label, imageId) => `${label}-${imageId}`; - const mkBrowserId_ = (fullName, browserName) => `${fullName} ${browserName}`; - const mkStateName_ = (browserId, stateName) => `${browserId} ${stateName}`; - const mkImgId_ = (browserId, retry, state) => `${browserId} ${retry} ${state}`; - const mkImg_ = (label, imageId) => ({path: mkImgPath_(label, imageId)}); - - const mkImgs_ = (id) => ({ - id, - actualImg: mkImg_('actual', id), - expectedImg: mkImg_('expected', id), - diffImg: mkImg_('diff', id) - }); + describe('images preloading', () => { + let component; const eachLabel_ = (cb) => ['expected', 'actual', 'diff'].forEach(cb); beforeEach(() => { - const browserIds = Array(10).fill(0).map((_, ind) => mkBrowserId_(`test-${ind + 1}`, 'bro-1')); - const image = mkImage({id: 'img-2', parentId: 'res-1', stateName: 'plain'}); - const resultsById = mkResult({id: 'res-1', parentId: mkBrowserId_('test-2', 'bro-1'), imageIds: ['img-2']}); - const tree = mkStateTree({resultsById}); - selectors.getAcceptableImagesByStateName.returns(browserIds.reduce((acc, browserId) => { - const stateName = mkStateName_(browserId, 'plain'); - const images = [1, 2].map(retry => mkImgs_(mkImgId_(browserId, retry, 'plain'))); - - acc[stateName] = images; - - return acc; - }, {})); + const tree = mkEmptyTree(); + addSuiteToTree({tree, suiteName: 'test-1'}); + addBrowserToTree({tree, suiteName: 'test-1', browserName: 'bro-1'}); + addResultToTree({tree, suiteName: 'test-1', browserName: 'bro-1', attempt: 0}); + for (let i = 1; i <= 10; i++) { + addImageToTree({ + tree, + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: `state-${i}`, + expectedImgPath: `img${i}-expected.png`, + diffImgPath: `img${i}-diff.png`, + actualImgPath: `img${i}-actual.png` + }); + } + const store = mkRealStore({initialState: {tree, view: {expand: EXPAND_ALL}}}); + + const currentImageId = generateImageId({ + suiteName: 'test-1', + browserName: 'bro-1', + attempt: 0, + stateName: 'state-5' + }); - mkScreenshotAccepterComponent({image}, {tree}); + component = renderWithStore(, store); }); - it('from adjacent screens', () => { - [9, 10, 1, 3, 4, 5].forEach(ind => { + it('should preload 3 adjacent images on mount', () => { + // Current image is 5. + [2, 3, 4, 6, 7, 8].forEach(ind => { eachLabel_(label => { - const browserId = mkBrowserId_(`test-${ind}`, 'bro-1'); - const imageId = mkImgId_(browserId, 2, 'plain'); - const imagePath = mkImgPath_(label, imageId); - - assert.calledWith(preloadImageStub, imagePath); + assert.calledWith(preloadImageStub, `img${ind}-${label}.png`); }); }); }); - it('only from last retry', () => { - eachLabel_(label => { - const browserId = mkBrowserId_(`test-${3}`, 'bro-1'); - const firstImageId = mkImgId_(browserId, 1, 'plain'); - const secondImageId = mkImgId_(browserId, 2, 'plain'); - - assert.neverCalledWith(preloadImageStub, mkImgPath_(label, firstImageId)); - assert.calledWith(preloadImageStub, mkImgPath_(label, secondImageId)); + it('should not preload other images', () => { + [1, 9, 10].forEach(ind => { + eachLabel_(label => { + assert.neverCalledWith(preloadImageStub, `img${ind}-${label}.png`); + }); }); }); - it('on active image change', () => { - const browserId = mkBrowserId_('test-6', 'bro-1'); - const imageId = mkImgId_(browserId, 2, 'plain'); - - eachLabel_(label => assert.neverCalledWith(preloadImageStub, mkImgPath_(label, imageId))); - - ScreenshotAccepterHeader.firstCall.args[0].onActiveImageChange(2); + it('should preload one more image when switching to next image', async () => { + const user = userEvent.setup(); + await user.click(component.getByTitle('Show next image', {exact: false})); - eachLabel_(label => assert.calledWith(preloadImageStub, mkImgPath_(label, imageId))); + eachLabel_(label => { + assert.calledWith(preloadImageStub, `img9-${label}.png`); + }); }); - it('on image accept', async () => { - const preloadingBrowserId = mkBrowserId_('test-6', 'bro-1'); - const preloadingImageId = mkImgId_(preloadingBrowserId, 2, 'plain'); - const acceptingBrowserId = mkBrowserId_('test-2', 'bro-1'); - const acceptingImageId = mkImgId_(acceptingBrowserId, 2, 'plain'); + it('should preload one more image after accepting', async () => { + const user = userEvent.setup(); + await user.click(component.getByText('Accept', {selector: 'button > *'})); - eachLabel_(label => assert.neverCalledWith(preloadImageStub, mkImgPath_(label, preloadingImageId))); - - await ScreenshotAccepterHeader.firstCall.args[0].onScreenshotAccept(acceptingImageId); - - eachLabel_(label => assert.calledWith(preloadImageStub, mkImgPath_(label, preloadingImageId))); + eachLabel_(label => { + assert.calledWith(preloadImageStub, `img9-${label}.png`); + }); }); }); }); diff --git a/test/unit/lib/static/components/modals/screenshot-accepter/meta.jsx b/test/unit/lib/static/components/modals/screenshot-accepter/meta.jsx index aef254321..cb6bbe121 100644 --- a/test/unit/lib/static/components/modals/screenshot-accepter/meta.jsx +++ b/test/unit/lib/static/components/modals/screenshot-accepter/meta.jsx @@ -27,7 +27,7 @@ describe('', () => { image: {id: 'some-id'} }); - assert.isEmpty(component.html()); + assert.isEmpty(component.container.innerHTML); }); it('if "image" property is empty', () => { @@ -36,7 +36,7 @@ describe('', () => { image: null }); - assert.isEmpty(component.html()); + assert.isEmpty(component.container.innerHTML); }); }); }); diff --git a/test/unit/lib/static/components/retry-switcher/index.jsx b/test/unit/lib/static/components/retry-switcher/index.jsx index 61700f452..93fd5d18d 100644 --- a/test/unit/lib/static/components/retry-switcher/index.jsx +++ b/test/unit/lib/static/components/retry-switcher/index.jsx @@ -1,3 +1,4 @@ +import {render} from '@testing-library/react'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaults} from 'lodash'; @@ -13,7 +14,7 @@ describe('', () => { onChange: sinon.stub() }); - return mount(); + return render(); }; beforeEach(() => { diff --git a/test/unit/lib/static/components/retry-switcher/item.jsx b/test/unit/lib/static/components/retry-switcher/item.jsx index 7ad67e30d..f70b53011 100644 --- a/test/unit/lib/static/components/retry-switcher/item.jsx +++ b/test/unit/lib/static/components/retry-switcher/item.jsx @@ -1,9 +1,11 @@ +import {expect} from 'chai'; import React from 'react'; import {defaults} from 'lodash'; import RetrySwitcherItem from 'lib/static/components/retry-switcher/item'; import {FAIL, ERROR, SUCCESS} from 'lib/constants/test-statuses'; import {mkConnectedComponent} from '../utils'; import {ErrorName} from 'lib/errors'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -58,8 +60,7 @@ describe('', () => { const component = mkRetrySwitcherItem({resultId: 'result-1', isActive: true}, initialState); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find(`button.tab-switcher__button_status_${FAIL}`), 1); + expect(component.container.querySelector(`button[data-qa="retry-switcher"].tab-switcher__button_status_${FAIL}`)).to.exist; }); }); @@ -77,8 +78,7 @@ describe('', () => { const component = mkRetrySwitcherItem({resultId: 'result-1', isActive: true}, initialState); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find(`button.tab-switcher__button_status_${FAIL}_${ERROR}`), 1); + expect(component.container.querySelector(`button[data-qa="retry-switcher"].tab-switcher__button_status_${FAIL}_${ERROR}`)).to.exist; }); it('without non matched class if group is not selected', () => { @@ -94,8 +94,8 @@ describe('', () => { const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 0); + expect(component.container.querySelector('button[data-qa="retry-switcher"]')).to.exist; + expect(component.container.querySelector('button[data-qa="retry-switcher"].tab-switcher__button_non-matched')).to.not.exist; }); it('without non matched class if group is selected and result is matched on it', () => { @@ -111,8 +111,8 @@ describe('', () => { const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 0); + expect(component.container.querySelector('button[data-qa="retry-switcher"]')).to.exist; + expect(component.container.querySelector('button[data-qa="retry-switcher"].tab-switcher__button_non-matched')).to.not.exist; }); it('with non matched class if group is selected but result is not matched on it', () => { @@ -128,8 +128,8 @@ describe('', () => { const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find('button.tab-switcher__button_non-matched'), 1); + expect(component.container.querySelector('button[data-qa="retry-switcher"]')).to.exist; + expect(component.container.querySelector('button[data-qa="retry-switcher"].tab-switcher__button_non-matched')).to.exist; }); }); @@ -146,23 +146,22 @@ describe('', () => { }; const component = mkRetrySwitcherItem({resultId: 'result-1'}, initialState); - const text = component.find('button.tab-switcher__button').text(); - assert.equal(text, 100500); + expect(component.getByText('100500', {selector: 'button[data-qa="retry-switcher"] > *'})).to.exist; }); it('should render button with correct active class name', () => { const component = mkRetrySwitcherItem({isActive: true}); - assert.lengthOf(component.find('button.tab-switcher__button'), 1); - assert.lengthOf(component.find('button.tab-switcher__button_active'), 1); + expect(component.container.querySelector('button[data-qa="retry-switcher"].tab-switcher__button_active')).to.exist; }); - it('should call "onClick" handler on click in button', () => { + it('should call "onClick" handler on click in button', async () => { + const user = userEvent.setup(); const onClick = sinon.stub(); const component = mkRetrySwitcherItem({onClick}); - component.find('button.tab-switcher__button').simulate('click'); + await user.click(component.getByTestId('retry-switcher')); assert.calledOnceWith(onClick); }); diff --git a/test/unit/lib/static/components/section/body/description.jsx b/test/unit/lib/static/components/section/body/description.jsx index 764ebf76a..cc6f5814f 100644 --- a/test/unit/lib/static/components/section/body/description.jsx +++ b/test/unit/lib/static/components/section/body/description.jsx @@ -1,3 +1,5 @@ +import userEvent from '@testing-library/user-event'; +import {expect} from 'chai'; import React from 'react'; import Description from 'lib/static/components/section/body/description'; import {mkConnectedComponent} from '../../utils'; @@ -7,30 +9,29 @@ describe('', () => { return mkConnectedComponent(, {}); }; - it('should render component', () => { - const component = mkDescriptionComponent('simple text'); + it('should render component', async () => { + const user = userEvent.setup(); - const descContent = component.find(Description).prop('content'); + const component = mkDescriptionComponent('simple text'); + await user.click(component.getByText('Description')); - assert.equal(descContent, 'simple text'); + expect(component.getByText('simple text')).to.exist; }); it('should render with "Description" title', () => { const component = mkDescriptionComponent('simple text'); - const detailsTitle = component.find('Details').prop('title'); - - assert.equal(detailsTitle, 'Description'); + expect(component.getByText('Description', {exact: false})).to.exist; }); - it('should render markdown syntax', () => { + it('should render markdown syntax', async () => { + const user = userEvent.setup(); const component = mkDescriptionComponent('### simple text'); - const detailsSummary = component.find('.details__summary'); - detailsSummary.simulate('click'); + await user.click(component.getByText('Description')); - const detailsContent = component.find('.details__content'); + const transformedMarkdown = component.getByText('simple text').parentNode.innerHTML; - assert.isTrue(detailsContent.contains(

simple text

)); + expect(transformedMarkdown).to.equal('

simple text

'); }); }); diff --git a/test/unit/lib/static/components/section/body/history.jsx b/test/unit/lib/static/components/section/body/history.jsx index da1eebd92..bc49f33f5 100644 --- a/test/unit/lib/static/components/section/body/history.jsx +++ b/test/unit/lib/static/components/section/body/history.jsx @@ -1,7 +1,9 @@ +import {expect} from 'chai'; import React from 'react'; import {defaultsDeep, set} from 'lodash'; import History from 'lib/static/components/section/body/history'; import {mkConnectedComponent} from '../../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const mkHistoryComponent = (props = {}, initialState = {}) => { @@ -17,17 +19,18 @@ describe('', () => { const component = mkHistoryComponent({resultId: 'default-result'}, initialState); - assert.equal(component.find('.history').length, 0); + expect(component.queryByText('History', {selector: '.details__summary'})).to.not.exist; }); - it('should render history if exists', () => { + it('should render history if exists', async () => { + const user = userEvent.setup(); const initialState = set({}, 'tree.results.byId.default-result.history', ['some-history']); const component = mkHistoryComponent({resultId: 'default-result'}, initialState); - component.find('.details__summary').simulate('click'); + await user.click(component.getByText('History')); - assert.equal(component.find('.history-item').text(), 'some-history'); + expect(component.getByText('some-history')).to.exist; }); it('should render with "History" title', () => { @@ -35,6 +38,6 @@ describe('', () => { const component = mkHistoryComponent({resultId: 'default-result'}, initialState); - assert.equal(component.find('.details__summary').text(), 'History'); + expect(component.getByText('History', {selector: '.details__summary'})).to.exist; }); }); diff --git a/test/unit/lib/static/components/section/body/index.jsx b/test/unit/lib/static/components/section/body/index.jsx index 0532a7c0c..ef6f6b004 100644 --- a/test/unit/lib/static/components/section/body/index.jsx +++ b/test/unit/lib/static/components/section/body/index.jsx @@ -1,8 +1,10 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaults} from 'lodash'; import {mkConnectedComponent} from '../../utils'; import {mkStateTree} from '../../../state-utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -41,33 +43,34 @@ describe('', () => { it('should render if "gui" is running', () => { const component = mkBodyComponent({}, {gui: true}); - assert.equal(component.find('.button_type_suite-controls').first().text(), 'Retry'); + expect(component.getByText('Retry', {selector: 'button > *'})).to.exist; }); it('should not render if "gui" is not running', () => { const component = mkBodyComponent({}, {gui: false}); - assert.lengthOf(component.find('.button_type_suite-controls'), 0); + expect(component.container.querySelector('.button_type_suite-controls')).to.not.exist; }); it('should be disabled while tests running', () => { const component = mkBodyComponent({}, {running: true}); - assert.isTrue(component.find('[data-qa="test-retry"]').prop('disabled')); + assert.isTrue(component.getByTestId('test-retry').disabled); }); it('should be enabled if tests are not started yet', () => { const component = mkBodyComponent({}, {running: false}); - assert.isFalse(component.find('[data-qa="test-retry"]').prop('disabled')); + assert.isFalse(component.getByTestId('test-retry').disabled); }); - it('should call action "retryTest" on "handler" prop calling', () => { + it('should call action "retryTest" on "handler" prop calling', async () => { + const user = userEvent.setup(); const testName = 'suite test'; const browserName = 'yabro'; const component = mkBodyComponent({testName, browserName}, {running: false}); - component.find('[data-qa="test-retry"]').simulate('click'); + await user.click(component.getByTestId('test-retry')); assert.calledOnceWith(actionsStub.retryTest, {testName, browserName}); }); diff --git a/test/unit/lib/static/components/section/body/meta-info/content.jsx b/test/unit/lib/static/components/section/body/meta-info/content.jsx index 124be3f0b..fb501df42 100644 --- a/test/unit/lib/static/components/section/body/meta-info/content.jsx +++ b/test/unit/lib/static/components/section/body/meta-info/content.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import {defaultsDeep} from 'lodash'; import MetaInfoContent from 'lib/static/components/section/body/meta-info/content'; @@ -65,12 +66,10 @@ describe('', () => { ]; const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree, apiValues}); - const metaItems = component.find('.meta-info__item'); - assert.equal(metaItems.length, expectedMetaInfo.length); - metaItems.forEach((node, i) => { - assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]); - assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]); + expectedMetaInfo.forEach((node) => { + expect(component.getByText(node[0])).to.exist; + expect(component.getByText(node[1])).to.exist; }); }); @@ -103,12 +102,10 @@ describe('', () => { ]; const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree}); - const metaItems = component.find('.meta-info__item'); - assert.equal(metaItems.length, expectedMetaInfo.length); - metaItems.forEach((node, i) => { - assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]); - assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]); + expectedMetaInfo.forEach((node) => { + expect(component.getByText(node[0])).to.exist; + expect(component.getByText(node[1])).to.exist; }); }); @@ -141,12 +138,10 @@ describe('', () => { ]; const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree}); - const metaItems = component.find('.meta-info__item'); - assert.equal(metaItems.length, expectedMetaInfo.length); - metaItems.forEach((node, i) => { - assert.equal(node.find('.gc-definition-list__term-wrapper').text(), expectedMetaInfo[i][0]); - assert.equal(node.find('.gc-definition-list__definition').text(), expectedMetaInfo[i][1]); + expectedMetaInfo.forEach((node) => { + expect(component.getByText(node[0])).to.exist; + expect(component.getByText(node[1])).to.exist; }); }); @@ -157,7 +152,7 @@ describe('', () => { file: 'test/file' }, metaInfoBaseUrls: {file: 'base/path'}, - expectedFileUrl: 'base/path/test/file' + expectedFileUrl: 'http://localhost/base/path/test/file' }, { type: 'url', @@ -230,9 +225,9 @@ describe('', () => { const config = {metaInfoBaseUrls: stub.metaInfoBaseUrls}; const component = mkMetaInfoContentComponent({resultId: 'some-result'}, {tree, config}); - assert.equal(component.find('.meta-info__item:first-child .gc-definition-list__term-wrapper').text(), `file`); - assert.equal(component.find('.meta-info__item:first-child .gc-definition-list__definition').text(), `${stub.metaInfo.file}`); - assert.equal(component.find('.meta-info__item:first-child a').prop('href'), stub.expectedFileUrl); + expect(component.getByText('file')).to.exist; + expect(component.getByText(stub.metaInfo.file)).to.exist; + expect(component.getByText(stub.metaInfo.file).href).to.equal(stub.expectedFileUrl); }); }); }); diff --git a/test/unit/lib/static/components/section/body/meta-info/index.jsx b/test/unit/lib/static/components/section/body/meta-info/index.jsx index e74b52cb6..fee48d867 100644 --- a/test/unit/lib/static/components/section/body/meta-info/index.jsx +++ b/test/unit/lib/static/components/section/body/meta-info/index.jsx @@ -2,6 +2,7 @@ import React from 'react'; import {defaultsDeep} from 'lodash'; import proxyquire from 'proxyquire'; import {mkConnectedComponent} from '../../../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -31,10 +32,11 @@ describe('', () => { }; describe('"MetaInfoContent"', () => { - it('should render with correct props', () => { + it('should render with correct props', async () => { + const user = userEvent.setup(); const component = mkMetaInfoComponent({resultId: 'some-result'}); - component.find('.details__summary').simulate('click'); + await user.click(component.getByText('Meta')); assert.calledOnceWith( MetaInfoContent, @@ -44,10 +46,11 @@ describe('', () => { }); describe('"toggleMetaInfo" action', () => { - it('should call on click in details', () => { + it('should call on click in details', async () => { + const user = userEvent.setup(); const component = mkMetaInfoComponent(); - component.find('.details__summary').simulate('click'); + await user.click(component.getByText('Meta')); assert.calledOnceWith(actionsStub.toggleMetaInfo); }); diff --git a/test/unit/lib/static/components/section/body/tabs.jsx b/test/unit/lib/static/components/section/body/tabs.jsx index b1e4c8b25..729d25f1f 100644 --- a/test/unit/lib/static/components/section/body/tabs.jsx +++ b/test/unit/lib/static/components/section/body/tabs.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaultsDeep} from 'lodash'; @@ -48,7 +49,7 @@ describe('', () => { const component = mkTabs({result}); - assert.lengthOf(component.find('.tab'), 0); + expect(component.container.querySelector('.tab')).to.not.exist; assert.notCalled(State); }); @@ -57,7 +58,7 @@ describe('', () => { const component = mkTabs({result}); - assert.lengthOf(component.find('.tab'), 1); + expect(component.container.querySelector('.tab')).to.exist; assert.calledOnceWith(State, {result, imageId: null}); }); @@ -66,7 +67,7 @@ describe('', () => { const component = mkTabs({result}); - assert.lengthOf(component.find('.tab'), 2); + expect(component.container.querySelectorAll('.tab').length).to.equal(2); assert.calledTwice(State); assert.calledWith(State.firstCall, {result, imageId: 'img-1'}); assert.calledWith(State.secondCall, {result, imageId: 'img-2'}); @@ -77,7 +78,7 @@ describe('', () => { const component = mkTabs({result}); - assert.lengthOf(component.find('.tab'), 1); + expect(component.container.querySelector('.tab')).to.exist; assert.calledOnceWith(State, {result, imageId: 'img-1'}); }); @@ -86,7 +87,7 @@ describe('', () => { const component = mkTabs({result}); - assert.lengthOf(component.find('.tab'), 2); + expect(component.container.querySelectorAll('.tab').length).to.equal(2); assert.calledTwice(State); assert.calledWith(State.firstCall, {result, imageId: 'img-1'}); assert.calledWith(State.secondCall, {result, imageId: null}); diff --git a/test/unit/lib/static/components/section/title/browser-skipped.jsx b/test/unit/lib/static/components/section/title/browser-skipped.jsx index f95914c23..53354940a 100644 --- a/test/unit/lib/static/components/section/title/browser-skipped.jsx +++ b/test/unit/lib/static/components/section/title/browser-skipped.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import {defaults} from 'lodash'; import proxyquire from 'proxyquire'; @@ -5,6 +6,7 @@ import {mkConnectedComponent} from 'test/unit/lib/static/components/utils'; import {mkBrowser, mkResult, mkStateTree} from 'test/unit/lib/static/state-utils'; import {SKIPPED} from 'lib/constants/test-statuses'; import {CHECKED, UNCHECKED} from 'lib/constants/checked-statuses'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -46,12 +48,17 @@ describe('', () => { const component = mkBrowserSkippedTitleComponent({browserId: 'yabro'}, {tree}); - assert.equal(component.find('input[type="checkbox"]').exists(), show); + if (show) { + expect(component.queryByRole('checkbox')).to.exist; + } else { + expect(component.queryByRole('checkbox')).to.not.exist; + } }); }); [CHECKED, UNCHECKED].forEach(checked => { - it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} stat on click`, () => { + it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} stat on click`, async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const browsersById = mkBrowser({id: 'yabro', name: 'yabro', resultIds: ['default_res']}); const resultsById = mkResult({id: 'default_res', status: SKIPPED, skipReason: 'some-reason'}); @@ -59,7 +66,7 @@ describe('', () => { const tree = mkStateTree({browsersById, resultsById, browsersStateById}); const component = mkBrowserSkippedTitleComponent({browserId: 'yabro'}, {tree}); - component.find('input[type="checkbox"]').simulate('click'); + await user.click(component.queryByRole('checkbox')); assert.calledOnceWith(actionsStub.toggleBrowserCheckbox, { suiteBrowserId: 'yabro', diff --git a/test/unit/lib/static/components/section/title/browser.jsx b/test/unit/lib/static/components/section/title/browser.jsx index b5ced7878..135b74c40 100644 --- a/test/unit/lib/static/components/section/title/browser.jsx +++ b/test/unit/lib/static/components/section/title/browser.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import {defaults} from 'lodash'; import proxyquire from 'proxyquire'; @@ -7,6 +8,7 @@ import {SUCCESS} from 'lib/constants/test-statuses'; import {ViewMode} from 'lib/constants/view-modes'; import {EXPAND_ALL} from 'lib/constants/expand-modes'; import {CHECKED, UNCHECKED} from 'lib/constants/checked-statuses'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -60,12 +62,17 @@ describe('', () => { const component = mkBrowserTitleComponent({browserId: 'yabro'}, {tree}); - assert.equal(component.find('input[type="checkbox"]').exists(), show); + if (show) { + expect(component.queryByRole('checkbox')).to.exist; + } else { + expect(component.queryByRole('checkbox')).to.not.exist; + } }); }); [CHECKED, UNCHECKED].forEach(checked => { - it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} state on click`, () => { + it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} state on click`, async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const browsersById = mkBrowser({id: 'yabro', name: 'yabro', resultIds: ['default_res']}); const resultsById = mkResult({id: 'default_res', status: SUCCESS, skipReason: 'some-reason'}); @@ -73,25 +80,28 @@ describe('', () => { const tree = mkStateTree({browsersById, resultsById, browsersStateById}); const component = mkBrowserTitleComponent({browserId: 'yabro'}, {tree}); - component.find('input[type="checkbox"]').simulate('click'); + await user.click(component.queryByRole('checkbox')); assert.calledOnceWith(actionsStub.toggleBrowserCheckbox, { suiteBrowserId: 'yabro', checkStatus: checked ? UNCHECKED : CHECKED }); - }); + }, `should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} state on click`); }); }); describe('', () => { - it('should call action "onCopyTestLink" on click', () => { + it('should call action "onCopyTestLink" on click', async () => { + window.prompt = sinon.stub(); + const user = userEvent.setup(); + const browsersById = mkBrowser({id: 'yabro', name: 'yabro', resultIds: ['default_res']}); const resultsById = mkResult({id: 'default_res', status: SUCCESS, skipReason: 'some-reason'}); const browsersStateById = {'yabro': {checkStatus: UNCHECKED}}; const tree = mkStateTree({browsersById, resultsById, browsersStateById}); const component = mkBrowserTitleComponent({browserId: 'yabro'}, {tree}); - component.find('button').simulate('click'); + await user.click(component.queryByRole('button')); assert.calledOnce(actionsStub.copyTestLink); assert.calledWithExactly(actionsStub.copyTestLink); @@ -106,7 +116,7 @@ describe('', () => { mkBrowserTitleComponent({browserId: 'yabro', browserName: 'yabro'}, {tree}); assert.calledOnce(queryParams.appendQuery); - assert.calledWithExactly(queryParams.appendQuery, 'about:blank', { + assert.calledWithExactly(queryParams.appendQuery, 'http://localhost/', { browser: 'yabro', testNameFilter: 'test', strictMatchFilter: true, @@ -117,15 +127,16 @@ describe('', () => { }); }); - it('should call "toggleBrowserSection" action on click in browser title', () => { + it('should call "toggleBrowserSection" action on click in browser title', async () => { + const user = userEvent.setup(); const handler = sandbox.stub(); const browsersById = mkBrowser({id: 'yabro', name: 'yabro', resultIds: ['res-1'], parentId: 'test'}); - const browsersStateById = {'yabro': {shouldBeShown: true, shouldBeOpened: false}}; + const browsersStateById = {'yabro': {shouldBeShown: true, shouldBeOpened: false, checkStatus: 0}}; const resultsById = mkResult({id: 'res-1', status: SUCCESS}); const tree = mkStateTree({browsersById, browsersStateById, resultsById}); const component = mkBrowserTitleComponent({browserId: 'yabro', browserName: 'yabro', handler}, {tree}); - component.find('.section__title').simulate('click'); + await user.click(component.getByText('default_title')); assert.calledOnce(handler); }); diff --git a/test/unit/lib/static/components/section/title/simple.jsx b/test/unit/lib/static/components/section/title/simple.jsx index 9ddd81288..1d4b3de55 100644 --- a/test/unit/lib/static/components/section/title/simple.jsx +++ b/test/unit/lib/static/components/section/title/simple.jsx @@ -1,11 +1,12 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaultsDeep, set} from 'lodash'; import {mkConnectedComponent} from 'test/unit/lib/static/components/utils'; import {mkStateTree} from 'test/unit/lib/static/state-utils'; import {CHECKED, UNCHECKED, INDETERMINATE} from 'lib/constants/checked-statuses'; -import {Checkbox, Spin} from '@gravity-ui/uikit'; import {TestStatus} from 'lib/constants'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -45,54 +46,61 @@ describe('', () => { it('should show spinner if running', () => { const component = mkSuiteTitleComponent(CHECKED, TestStatus.RUNNING); - assert.equal(component.find(Spin).length, 1); + expect(component.container.querySelector('.g-spin')).to.exist; }); it('should not show spinner if not running', () => { const component = mkSuiteTitleComponent(CHECKED, TestStatus.IDLE); - assert.equal(component.find(Spin).length, 0); + expect(component.container.querySelector('.g-spin')).to.not.exist; }); }); describe('', () => { - [CHECKED, UNCHECKED].forEach(show => { - it(`should ${show ? '' : 'not '}exist if "showCheckboxes" is ${show ? '' : 'not '}set`, () => { - useLocalStorageStub.withArgs('showCheckboxes', false).returns([show]); + it(`should exist if "showCheckboxes" is set`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); - const component = mkSuiteTitleComponent(); + const component = mkSuiteTitleComponent(); - assert.equal(component.find(Checkbox).exists(), +show); - }); + expect(component.queryByRole('checkbox')).to.exist; + }); + + it(`should not exist if "showCheckboxes" is not set`, () => { + useLocalStorageStub.withArgs('showCheckboxes', false).returns([false]); + + const component = mkSuiteTitleComponent(); + + expect(component.queryByRole('checkbox')).to.not.exist; }); it('should not be checked', () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const component = mkSuiteTitleComponent(UNCHECKED); - assert.equal(component.find(Checkbox).prop('checked'), UNCHECKED); + expect(component.queryByRole('checkbox').checked).to.equal(false); }); it(`should be indeterminate`, () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const component = mkSuiteTitleComponent(INDETERMINATE); - assert.isTrue(component.find(Checkbox).prop('indeterminate')); + expect(component.queryByRole('checkbox').indeterminate).to.equal(true); }); it(`should be checked`, () => { useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const component = mkSuiteTitleComponent(CHECKED); - assert.equal(component.find(Checkbox).prop('checked'), CHECKED); + expect(component.queryByRole('checkbox').checked).to.equal(true); }); [CHECKED, UNCHECKED].forEach(checked => { - it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} state on click`, () => { + it(`should call "toggleBrowserCheckbox" action with ${checked ? 'unchecked' : 'checked'} state on click`, async () => { + const user = userEvent.setup(); useLocalStorageStub.withArgs('showCheckboxes', false).returns([true]); const component = mkSuiteTitleComponent(checked); - component.find(Checkbox).simulate('click'); + await user.click(component.queryByRole('checkbox')); assert.calledOnceWith(actionsStub.toggleSuiteCheckbox, { suiteId: 'suiteId', diff --git a/test/unit/lib/static/components/state/index.jsx b/test/unit/lib/static/components/state/index.jsx index 48d8a6a60..292824527 100644 --- a/test/unit/lib/static/components/state/index.jsx +++ b/test/unit/lib/static/components/state/index.jsx @@ -1,3 +1,4 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {set, defaults, defaultsDeep} from 'lodash'; @@ -5,6 +6,7 @@ import {SUCCESS, FAIL, ERROR, UPDATED} from 'lib/constants/test-statuses'; import {EXPAND_ALL} from 'lib/constants/expand-modes'; import {types as modalTypes} from 'lib/static/components/modals'; import {mkConnectedComponent} from '../utils'; +import userEvent from '@testing-library/user-event'; describe('', () => { const sandbox = sinon.sandbox.create(); @@ -65,7 +67,7 @@ describe('', () => { it('should not render button in static report', () => { const stateComponent = mkStateComponent({}, {gui: false}); - assert.lengthOf(stateComponent.find('[data-qa="test-accept"]'), 0); + expect(stateComponent.queryByTestId('test-accept')).to.not.exist; }); it('should render button in gui report if image is acceptable', () => { @@ -82,7 +84,7 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, {gui: true, ...initialState}); - assert.lengthOf(stateComponent.find('[data-qa="test-accept"]'), 1); + expect(stateComponent.getByTestId('test-accept')).to.exist; }); it('should not render button if image is not acceptable', () => { @@ -99,7 +101,7 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isEmpty(stateComponent.find('[data-qa="test-accept"]')); + expect(stateComponent.queryByTestId('test-accept')).to.not.exist; }); it('should be enabled if image is acceptable', () => { @@ -116,10 +118,11 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isFalse(stateComponent.find('[data-qa="test-accept"]').prop('disabled')); + assert.isFalse(stateComponent.queryByTestId('test-accept').disabled); }); - it('should call "acceptTest" action on button click', () => { + it('should call "acceptTest" action on button click', async () => { + const user = userEvent.setup(); const image = {stateName: 'some-name', status: FAIL}; const initialState = { tree: { @@ -132,7 +135,7 @@ describe('', () => { utilsStub.isAcceptable.withArgs(image).returns(true); const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - stateComponent.find('[data-qa="test-accept"]').simulate('click'); + await user.click(stateComponent.queryByTestId('test-accept')); assert.calledOnceWith(actionsStub.acceptTest, 'img-id'); }); @@ -152,7 +155,7 @@ describe('', () => { }; const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isFalse(stateComponent.find('[data-qa="test-undo"]').exists()); + expect(stateComponent.queryByTestId('test-undo')).to.not.exist; }); it('should not exist, if not gui', () => { @@ -168,10 +171,11 @@ describe('', () => { }); const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isFalse(stateComponent.find('[data-qa="test-undo"]').exists()); + expect(stateComponent.queryByTestId('test-undo')).to.not.exist; }); - it('should call "undoAcceptImages" action on button click', () => { + it('should call "undoAcceptImages" action on button click', async () => { + const user = userEvent.setup(); const image = {stateName: 'some-name', status: UPDATED}; const initialState = { gui: true, @@ -184,7 +188,7 @@ describe('', () => { }; const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - stateComponent.find('[data-qa="test-undo"]').simulate('click'); + await user.click(stateComponent.queryByTestId('test-undo')); assert.calledOnceWith(actionsStub.undoAcceptImage, 'img-id'); }); @@ -256,7 +260,7 @@ describe('', () => { it('should not render button', () => { const stateComponent = mkStateComponent({}, {gui: false}); - assert.lengthOf(stateComponent.find('[label$="Switch accept mode"]'), 0); + expect(stateComponent.queryByText('Switch accept mode', {selector: 'label'})).to.not.exist; }); it('should not call "getLastImageByStateName" selector', () => { @@ -281,7 +285,7 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, {gui: true, ...initialState}); - assert.lengthOf(stateComponent.find('button[title="Open mode with fast screenshot accepting"]'), 1); + expect(stateComponent.getByTitle('Open mode with fast screenshot accepting')).to.exist; }); it('should not call "getLastImageByStateName" selector if image id is not passed', () => { @@ -306,7 +310,7 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isTrue(stateComponent.find('[title="Open mode with fast screenshot accepting"]').first().prop('isDisabled')); + assert.isTrue(stateComponent.getByTitle('Open mode with fast screenshot accepting').disabled); }); it('should be disabled if last image is not acceptable', () => { @@ -325,7 +329,7 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isTrue(stateComponent.find('[title="Open mode with fast screenshot accepting"]').first().prop('isDisabled')); + assert.isTrue(stateComponent.getByTitle('Open mode with fast screenshot accepting').disabled); }); it('should be enabled if last image is acceptable', () => { @@ -343,10 +347,11 @@ describe('', () => { const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - assert.isFalse(stateComponent.find('[title="Open mode with fast screenshot accepting"]').first().prop('isDisabled')); + assert.isFalse(stateComponent.getByTitle('Open mode with fast screenshot accepting').disabled); }); - it('should call "openModal" action on button click', () => { + it('should call "openModal" action on button click', async () => { + const user = userEvent.setup(); const image = {stateName: 'some-name', status: FAIL}; const initialState = { tree: { @@ -360,7 +365,7 @@ describe('', () => { getLastImageByStateName.returns(image); const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - stateComponent.find('[title="Open mode with fast screenshot accepting"]').first().simulate('click'); + await user.click(stateComponent.getByTitle('Open mode with fast screenshot accepting')); assert.calledOnceWith(actionsStub.openModal, { id: modalTypes.SCREENSHOT_ACCEPTER, @@ -373,7 +378,8 @@ describe('', () => { }); describe('"toggleStateResult" action', () => { - it('should call on click in state name', () => { + it('should call on click in state name', async () => { + const user = userEvent.setup(); const image = {stateName: 'some-name', status: SUCCESS}; const initialState = { tree: { @@ -386,7 +392,7 @@ describe('', () => { }; const stateComponent = mkStateComponent({imageId: 'img-id'}, initialState); - stateComponent.find('.state-title').simulate('click'); + await user.click(stateComponent.getByText('some-name')); assert.calledOnceWith( actionsStub.toggleStateResult, diff --git a/test/unit/lib/static/components/state/screenshot/diff-circle.jsx b/test/unit/lib/static/components/state/screenshot/diff-circle.jsx index b366e6273..9810419b3 100644 --- a/test/unit/lib/static/components/state/screenshot/diff-circle.jsx +++ b/test/unit/lib/static/components/state/screenshot/diff-circle.jsx @@ -1,3 +1,4 @@ +import {fireEvent} from '@testing-library/react'; import React from 'react'; import DiffCircle from 'lib/static/components/state/screenshot/diff-circle'; import {mkConnectedComponent} from '../../utils'; @@ -18,7 +19,7 @@ describe('DiffCircle component', () => { /> ); - const {width, height, top, left} = stateComponent.find('.diff-circle').prop('style'); + const {width, height, top, left} = stateComponent.container.querySelector('.diff-circle').style; assert.deepEqual({width, height, top, left}, {width: '1px', height: '1px', top: '15px', left: '15px'}); }); @@ -35,7 +36,7 @@ describe('DiffCircle component', () => { /> ); - stateComponent.find('.diff-circle').prop('onAnimationEnd')(); + fireEvent.animationEnd(stateComponent.container.querySelector('.diff-circle')); assert.calledOnce(toggleDiff); }); diff --git a/test/unit/lib/static/components/state/screenshot/full.jsx b/test/unit/lib/static/components/state/screenshot/full.jsx index 272d9b607..3d76799bb 100644 --- a/test/unit/lib/static/components/state/screenshot/full.jsx +++ b/test/unit/lib/static/components/state/screenshot/full.jsx @@ -1,20 +1,21 @@ +import {render} from '@testing-library/react'; import React from 'react'; import FullScreenshot from 'lib/static/components/state/screenshot/full'; describe('"FullScreenshot" component', () => { it('should encode symbols in path', () => { - const screenshotComponent = mount(); + const screenshotComponent = render(); - const image = screenshotComponent.find('img'); + const image = screenshotComponent.getByRole('img'); - assert.equal(image.getDOMNode().src, 'images/%24/path'); + assert.include(image.src, 'images/%24/path'); }); it('should replace backslashes with slashes for screenshots', () => { - const screenshotComponent = mount(); + const screenshotComponent = render(); - const image = screenshotComponent.find('img'); + const image = screenshotComponent.getByRole('img'); - assert.equal(image.getDOMNode().src, 'images/path'); + assert.include(image.src, 'images/path'); }); }); diff --git a/test/unit/lib/static/components/state/screenshot/resized.jsx b/test/unit/lib/static/components/state/screenshot/resized.jsx index 7964a4e02..cded95c11 100644 --- a/test/unit/lib/static/components/state/screenshot/resized.jsx +++ b/test/unit/lib/static/components/state/screenshot/resized.jsx @@ -1,20 +1,21 @@ +import {render} from '@testing-library/react'; import React from 'react'; import ResizedScreenshot from 'lib/static/components/state/screenshot/resized'; describe('"ResizedScreenshot" component', () => { it('should encode symbols in path', () => { - const screenshotComponent = mount(); + const screenshotComponent = render(); - const image = screenshotComponent.find('img'); + const image = screenshotComponent.getByRole('img'); - assert.equal(image.getDOMNode().src, 'images/%24/path'); + assert.include(image.src, 'images/%24/path'); }); it('should replace backslashes with slashes for screenshots', () => { - const screenshotComponent = mount(); + const screenshotComponent = render(); - const image = screenshotComponent.find('img'); + const image = screenshotComponent.getByRole('img'); - assert.equal(image.getDOMNode().src, 'images/path'); + assert.include(image.src, 'images/path'); }); }); diff --git a/test/unit/lib/static/components/state/state-error.jsx b/test/unit/lib/static/components/state/state-error.jsx index 79b580e09..784e32408 100644 --- a/test/unit/lib/static/components/state/state-error.jsx +++ b/test/unit/lib/static/components/state/state-error.jsx @@ -1,3 +1,5 @@ +import userEvent from '@testing-library/user-event'; +import {expect} from 'chai'; import React from 'react'; import {defaults} from 'lodash'; import proxyquire from 'proxyquire'; @@ -35,7 +37,9 @@ describe(' component', () => { }).default; }); - afterEach(() => sandbox.restore()); + afterEach(() => { + sandbox.restore(); + }); describe('"errorPatterns" is not specified', () => { it('should render error "message" and "stack" if "errorPatterns" is empty', () => { @@ -43,67 +47,72 @@ describe(' component', () => { const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns: []}}); - assert.equal(component.find('.error__item').at(0).text(), 'message: some-msg'); - assert.equal(component.find('.error__item').at(1).text(), 'stack: some-stack'); + expect(component.getByText('some-msg')).to.exist; + expect(component.getByText('some-stack')).to.exist; }); - it('should break error fields by line break', () => { + it('should break error fields by line break', async () => { + const user = userEvent.setup(); const error = {message: 'msg-title\nmsg-content'}; const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns: []}}); - component.find('.details__summary').first().simulate('click'); + await user.click(component.getByText('message', {exact: false})); - assert.equal(component.find('.details__summary').first().text(), 'message: msg-title'); - assert.equal(component.find('.details__content').first().text(), 'msg-content'); + expect(component.getByText('msg-title', {selector: '.details__summary'})).to.exist; + expect(component.getByText('msg-content', {selector: '.details__content>*'})).to.exist; }); - it(`should not break error fields if theirs length is less than ${ERROR_TITLE_TEXT_LENGTH} charachters`, () => { + it(`should not break error fields if theirs length is less than ${ERROR_TITLE_TEXT_LENGTH} characters`, () => { const error = {message: Array(ERROR_TITLE_TEXT_LENGTH - 1).join('a')}; const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns: []}}); - assert.equal(component.find('.error__item').first().text(), `message: ${error.message}`); + expect(component.getByText(error.message, {selector: '.error__item'})).to.exist; }); - it(`should break error fields by spaces if theirs length more than ${ERROR_TITLE_TEXT_LENGTH} characters`, () => { + it(`should break error fields by spaces if theirs length more than ${ERROR_TITLE_TEXT_LENGTH} characters`, async () => { + const user = userEvent.setup(); const messageTitle = Array(ERROR_TITLE_TEXT_LENGTH - 50).join('a'); const messageContent = Array(ERROR_TITLE_TEXT_LENGTH).join('b'); const error = {message: `${messageTitle} ${messageContent}`}; const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns: []}}); - component.find('.details__summary').first().simulate('click'); + await user.click(component.getByText('message', {exact: false})); - assert.equal(component.find('.details__summary').first().text(), `message: ${messageTitle}`); - assert.equal(component.find('.details__content').first().text(), messageContent); + expect(component.getByText(messageTitle, {selector: '.details__summary'})).to.exist; + expect(component.getByText(messageContent, {selector: '.details__content>*'})).to.exist; }); }); describe('"errorPatterns" is specified', () => { - it('should render error "message" with starting "name" of "errorPattern" prop', () => { + it('should render error "message" with starting "name" of "errorPattern" prop', async () => { + const user = userEvent.setup(); const error = {message: 'some-msg'}; const errorPatterns = [{name: 'some-name'}]; const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns}}); - component.find('.details__summary').first().simulate('click'); + await user.click(component.getByText('message', {exact: false})); - assert.equal(component.find('.details__summary').first().text(), 'message: some-name'); - assert.equal(component.find('.details__content').first().text(), 'some-msg'); + expect(component.getByText('some-name', {selector: '.details__summary'})).to.exist; + expect(component.getByText('some-msg', {selector: '.details__content>*'})).to.exist; }); - it('should render "hint" as html string', () => { + it('should render "hint" as html string', async () => { + const user = userEvent.setup(); const error = {message: 'some-msg'}; const errorPatterns = [{name: 'some-name', hint: 'some-hint'}]; const component = mkStateErrorComponent({result: {error}}, {config: {errorPatterns}}); - component.find('.details__summary').last().simulate('click'); + await user.click(component.getByText('hint', {exact: false})); - assert.equal(component.find('.details__summary').at(1).text(), 'hint: show more'); - assert.equal(component.find('.details__content .foo-bar').text(), ['some-hint']); + expect(component.getByText('show more')).to.exist; + expect(component.getByText('some-hint')).to.exist; }); }); describe('error snippet', () => { - it('should be rendered in div tags', () => { + it('should be rendered in div tags', async () => { + const user = userEvent.setup(); const error = {snippet: `\x1B[90m . | // /some-file-path.js\x1B[39m")} . | 9 | some line @@ -111,14 +120,16 @@ describe(' component', () => { `}; const component = mkStateErrorComponent({result: {error}}); - component.find('.details__summary').last().simulate('click'); + await user.click(component.getByText('stack', {exact: false})); + const errorStackHtml = component.container.querySelector('.details__content').parentNode.innerHTML; - assert.isTrue(component.find('.details__content').html().startsWith('
')); - assert.isTrue(component.find('.details__content').html().includes('some line')); - assert.isTrue(component.find('.details__content').html().endsWith('
')); + assert.isTrue(errorStackHtml.startsWith('
')); + assert.isTrue(errorStackHtml.includes('some line')); + assert.isTrue(errorStackHtml.endsWith('
')); }); - it('should resolve colors', () => { + it('should resolve colors', async () => { + const user = userEvent.setup(); const error = {snippet: `\x1B[90m . | // /some-file-path.js\x1B[39m)} . | 9 | some line @@ -126,13 +137,15 @@ describe(' component', () => { `}; const component = mkStateErrorComponent({result: {error}}); - component.find('.details__summary').last().simulate('click'); + await user.click(component.getByText('stack', {exact: false})); + const errorStackHtml = component.container.querySelector('.details__content').parentNode.innerHTML; const expectedSpan = ' . | // /some-file-path.js'; - assert.isTrue(component.find('.details__content').html().includes(expectedSpan)); + assert.isTrue(errorStackHtml.includes(expectedSpan)); }); - it('should escape html', () => { + it('should escape html', async () => { + const user = userEvent.setup(); const error = {snippet: `\x1B[90m . | // /some-file-path.js\x1B[39m")} . | 9 | some @@ -140,10 +153,11 @@ describe(' component', () => { `}; const component = mkStateErrorComponent({result: {error}}); - component.find('.details__summary').last().simulate('click'); + await user.click(component.getByText('stack', {exact: false})); + const errorStackHtml = component.container.querySelector('.details__content').parentNode.innerHTML; - assert.isFalse(component.find('.details__content').html().includes('some')); - assert.isTrue(component.find('.details__content').html().includes('some<line>')); + assert.isFalse(errorStackHtml.includes('some')); + assert.isTrue(errorStackHtml.includes('some<line>')); }); }); }); diff --git a/test/unit/lib/static/components/suites.jsx b/test/unit/lib/static/components/suites.jsx index 154ac77bd..4b5d41da3 100644 --- a/test/unit/lib/static/components/suites.jsx +++ b/test/unit/lib/static/components/suites.jsx @@ -1,14 +1,17 @@ +import {expect} from 'chai'; import React from 'react'; import proxyquire from 'proxyquire'; import {defaultsDeep} from 'lodash'; -import {List} from 'react-virtualized'; import {mkConnectedComponent} from './utils'; import {ViewMode} from 'lib/constants/view-modes'; describe('', () => { const sandbox = sinon.sandbox.create(); - let Suites, SectionCommon, getVisibleRootSuiteIds; + let Suites, getVisibleRootSuiteIds; + const originalOffsetHeight = Object.getOwnPropertyDescriptor(global.HTMLElement.prototype, 'offsetHeight'); + const originalOffsetWidth = Object.getOwnPropertyDescriptor(global.HTMLElement.prototype, 'offsetWidth'); + const originalResizeObserver = window.ResizeObserver; const mkSuitesComponent = (initialState = {}) => { initialState = defaultsDeep(initialState, { @@ -21,39 +24,60 @@ describe('', () => { }; beforeEach(() => { - SectionCommon = sinon.stub().returns(null); + Object.defineProperty(global.HTMLElement.prototype, 'offsetHeight', {configurable: true, value: 50}); + Object.defineProperty(global.HTMLElement.prototype, 'offsetWidth', {configurable: true, value: 50}); + + window.ResizeObserver = sinon.stub(); + window.ResizeObserver.prototype.observe = sinon.stub(); + window.ResizeObserver.prototype.unobserve = sinon.stub(); + window.ResizeObserver.prototype.disconnect = sinon.stub(); + getVisibleRootSuiteIds = sinon.stub().returns([]); Suites = proxyquire('lib/static/components/suites', { - './section/section-common': {default: SectionCommon}, '../modules/selectors/tree': {getVisibleRootSuiteIds} }).default; }); - afterEach(() => sandbox.restore()); + afterEach(() => { + Object.defineProperty(global.HTMLElement.prototype, 'offsetHeight', originalOffsetHeight); + Object.defineProperty(global.HTMLElement.prototype, 'offsetWidth', originalOffsetWidth); + + window.ResizeObserver = originalResizeObserver; + + sandbox.restore(); + }); it('should not render List component if there are no visible root suite ids', () => { getVisibleRootSuiteIds.returns([]); const component = mkSuitesComponent(); - assert.equal(component.find(List).length, 0); + expect(component.getByText('There are no tests', {exact: false})).to.exist; }); - it('should render few section common components', () => { + it('should render few section common components', async () => { if (!global.SVGElement) { global.SVGElement = global.HTMLElement; // Without this line test throws an error "ReferenceError: SVGElement is not defined" } getVisibleRootSuiteIds.returns(['suite-id-1', 'suite-id-2']); - const component = mkSuitesComponent(); - const listComponent = component.find(List); - - mount(listComponent.prop('rowRenderer')({index: 0, key: 0, style: {}, parent: {}})); - mount(listComponent.prop('rowRenderer')({index: 1, key: 1, style: {}, parent: {}})); + const component = mkSuitesComponent({ + tree: { + suites: { + byId: { + 'suite-id-1': {name: 'Suite 1', status: 'success'}, + 'suite-id-2': {name: 'Suite 2', status: 'success'} + }, + stateById: { + 'suite-id-1': {shouldBeShown: true, shouldBeOpened: false}, + 'suite-id-2': {shouldBeShown: true, shouldBeOpened: false} + } + } + } + }); - assert.calledTwice(SectionCommon); - assert.calledWith(SectionCommon.firstCall, {suiteId: 'suite-id-1', sectionRoot: true}); - assert.calledWith(SectionCommon.secondCall, {suiteId: 'suite-id-2', sectionRoot: true}); + expect(await component.findByText('Suite 1', {exact: false})).to.exist; + expect(await component.findByText('Suite 2', {exact: false})).to.exist; }); }); diff --git a/test/unit/lib/static/components/utils.jsx b/test/unit/lib/static/components/utils.jsx index 26c5634e3..dd182c7a3 100644 --- a/test/unit/lib/static/components/utils.jsx +++ b/test/unit/lib/static/components/utils.jsx @@ -1,9 +1,15 @@ +import {ThemeProvider} from '@gravity-ui/uikit'; +import {render} from '@testing-library/react'; import React from 'react'; import _ from 'lodash'; import configureStore from 'redux-mock-store'; import {Provider} from 'react-redux'; import defaultState from 'lib/static/modules/default-state'; -import {ThemeProvider} from '@gravity-ui/uikit'; +import {TestStatus} from 'lib/constants'; +import {applyMiddleware, createStore} from 'redux'; +import thunk from 'redux-thunk'; +import reducer from 'lib/static/modules/reducers'; +import localStorage from 'lib/static/modules/middlewares/local-storage'; exports.mkState = ({initialState} = {}) => { return _.defaultsDeep(initialState, defaultState); @@ -16,9 +22,96 @@ exports.mkStore = ({initialState, state} = {}) => { return mockStore(readyState); }; +exports.mkRealStore = ({initialState, middlewares = []}) => { + return createStore(reducer, exports.mkState({initialState}), applyMiddleware(thunk, localStorage, ...middlewares)); +}; + +exports.generateBrowserId = ({suiteName, browserName}) => + `${suiteName} ${browserName}`; + +exports.generateResultId = ({suiteName, browserName, attempt}) => + `${exports.generateBrowserId({suiteName, browserName})} ${attempt}`; + +exports.generateImageId = ({suiteName, browserName, attempt, stateName}) => + `${exports.generateResultId({suiteName, browserName, attempt})} ${stateName}`; + +exports.mkEmptyTree = () => _.cloneDeep(defaultState.tree); + +exports.addSuiteToTree = ({tree, suiteName}) => { + tree.suites.byId[suiteName] = {id: suiteName}; +}; + +exports.addBrowserToTree = ({tree, suiteName, browserName}) => { + const fullId = `${suiteName} ${browserName}`; + + tree.browsers.byId[fullId] = { + id: browserName, + name: browserName, + parentId: suiteName, + resultIds: [], + imageIds: [] + }; + tree.browsers.stateById[fullId] = {shouldBeShown: true}; +}; + +exports.addResultToTree = ({tree, suiteName, browserName, attempt, metaInfo = {}}) => { + const browserId = `${suiteName} ${browserName}`; + const fullId = `${browserId} ${attempt}`; + + tree.results.byId[fullId] = { + id: fullId, + parentId: browserId, + attempt, + imageIds: [], + metaInfo + }; + tree.results.stateById[fullId] = {}; + + tree.browsers.byId[browserId].resultIds.push(fullId); +}; + +exports.addImageToTree = ({tree, suiteName, browserName, attempt, stateName, status = TestStatus.FAIL, expectedImgPath, actualImgPath, diffImgPath}) => { + const browserId = `${suiteName} ${browserName}`; + const resultId = `${browserId} ${attempt}`; + const fullId = `${resultId} ${stateName}`; + + tree.images.byId[fullId] = { + id: fullId, + parentId: resultId, + stateName, + status + }; + + if (expectedImgPath) { + tree.images.byId[fullId].expectedImg = { + path: expectedImgPath, + size: {height: 1, width: 2} + }; + } + if (actualImgPath) { + tree.images.byId[fullId].actualImg = { + path: actualImgPath, + size: {height: 1, width: 2} + }; + } + if (diffImgPath) { + tree.images.byId[fullId].diffImg = { + path: diffImgPath, + size: {height: 1, width: 2} + }; + } + + tree.browsers.byId[browserId].imageIds.push(fullId); + tree.results.byId[resultId].imageIds.push(fullId); +}; + +exports.renderWithStore = (component, store) => { + return render({component}); +}; + exports.mkConnectedComponent = (Component, state) => { const store = exports.mkStore(state); - return mount({Component}); + return render({Component}); }; exports.mkImg_ = (opts = {}) => { diff --git a/test/unit/lib/static/modules/actions.js b/test/unit/lib/static/modules/actions.js index 756560dc5..a49c4751e 100644 --- a/test/unit/lib/static/modules/actions.js +++ b/test/unit/lib/static/modules/actions.js @@ -169,11 +169,13 @@ describe('lib/static/modules/actions', () => { let fetchDataFromDatabasesStub; let mergeDatabasesStub; let actions; + let originalWindow; beforeEach(() => { fetchDataFromDatabasesStub = sandbox.stub().resolves(); mergeDatabasesStub = sandbox.stub().resolves(); + originalWindow = global.window; global.window = { data: { apiValues: {toolName: ToolName.Testplane} @@ -195,7 +197,7 @@ describe('lib/static/modules/actions', () => { afterEach(() => { sandbox.restore(); - global.window = undefined; + global.window = originalWindow; }); it('should fetch databaseUrls.json for default html page', async () => { diff --git a/test/unit/lib/static/modules/local-storage-wrapper.js b/test/unit/lib/static/modules/local-storage-wrapper.js index 37fe97894..b3133efc3 100644 --- a/test/unit/lib/static/modules/local-storage-wrapper.js +++ b/test/unit/lib/static/modules/local-storage-wrapper.js @@ -3,13 +3,15 @@ import {mkStorage} from '../../../utils'; describe('lib/static/modules/local-storage-wrapper', () => { const prefix = 'html-reporter'; + let originalWindow = global.window; beforeEach(() => { + originalWindow = global.window; global.window = {localStorage: mkStorage()}; }); afterEach(() => { - global.window = undefined; + global.window = originalWindow; }); describe('setItem', () => { diff --git a/test/unit/lib/static/modules/reducers/view.js b/test/unit/lib/static/modules/reducers/view.js index 05bb8042b..675b5028c 100644 --- a/test/unit/lib/static/modules/reducers/view.js +++ b/test/unit/lib/static/modules/reducers/view.js @@ -8,9 +8,11 @@ import {mkStorage} from '../../../../utils'; describe('lib/static/modules/reducers/view', () => { let baseUrl; + let originalWindow; beforeEach(() => { baseUrl = 'http://localhost/'; + originalWindow = global.window; global.window = { location: { href: new URL(baseUrl) @@ -20,7 +22,7 @@ describe('lib/static/modules/reducers/view', () => { }); afterEach(() => { - global.window = undefined; + global.window = originalWindow; }); [actionNames.INIT_GUI_REPORT, actionNames.INIT_STATIC_REPORT].forEach((type) => { diff --git a/test/unit/lib/static/modules/yandex-metrika.js b/test/unit/lib/static/modules/yandex-metrika.js index 83086a79d..fa98f0020 100644 --- a/test/unit/lib/static/modules/yandex-metrika.js +++ b/test/unit/lib/static/modules/yandex-metrika.js @@ -2,13 +2,15 @@ import YandexMetrika from 'lib/static/modules/yandex-metrika'; describe('YandexMetrika', () => { const sandbox = sinon.createSandbox(); + let originalWindow; beforeEach(() => { + originalWindow = global.window; global.window = {ym: sandbox.stub()}; }); afterEach(() => { - global.window = undefined; + global.window = originalWindow; sandbox.restore(); });